Skip to content
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
78e92f5
feat(daemon): add space.github.health integration snapshot RPC
lsm Jul 22, 2026
42fd1b2
feat(web): add GitHub integration health panel
lsm Jul 22, 2026
6e72b02
fix: address review feedback on GitHub health panel
lsm Jul 22, 2026
b0331f8
fix: webhook check age + cross-space stale-snapshot race in health panel
lsm Jul 22, 2026
8d5c661
fix: do not badge a space Healthy when polling is globally disabled
lsm Jul 22, 2026
dc26a70
fix: judge health by real delivery semantics, not just configured rows
lsm Jul 22, 2026
3598545
fix: exclude toggled-off webhooks from the live-delivery rollup
lsm Jul 22, 2026
7a6dd03
fix: honor the parent disabled lock on the health panel Refresh button
lsm Jul 22, 2026
3809a96
fix: badge a polling-only space Down when its token is rejected
lsm Jul 22, 2026
9dd7a61
fix: honor poll interval on Poll now and track polling accessibility
lsm Jul 26, 2026
0df79cf
Merge branch 'dev' into space/add-github-event-integration-health-panel
lsm Jul 30, 2026
9ecc8b9
fix: refine GitHub health badge accuracy (round 10 review)
lsm Jul 30, 2026
0c1cf0d
fix: clear rate-limit cooldown on credential change + round-12 P2 triage
lsm Jul 30, 2026
715148a
Merge branch 'dev' into space/add-github-event-integration-health-panel
lsm Jul 31, 2026
962a2a6
fix: round-13 GitHub health accuracy — stale-state, races, fetch hard…
lsm Jul 31, 2026
dab716e
fix: round-14 health accuracy — poll mutex, partial 403s, per-repo we…
lsm Aug 1, 2026
99ec541
fix: P0 scheduled-polling dies after one cycle + lifecycle test
lsm Aug 1, 2026
65f1b61
fix: round-16 health accuracy — source filter, accessibility, waterma…
lsm Aug 1, 2026
89aebe8
fix: round-17 health accuracy — rate-limit auth, reaction staleness, …
lsm Aug 1, 2026
d03842c
fix: round-18 health accuracy — credential race, source-before-limit,…
lsm Aug 1, 2026
9132cd5
fix: round-19 — bound poll fetches, reactions-never-succeeded, webhoo…
lsm Aug 1, 2026
7f5fbf7
fix: treat a headerless secondary-rate-limit /user 403 as transient
lsm Aug 1, 2026
83c4f55
fix: round-21 — validation cooldown race, mixed-mode auth, per-repo r…
lsm Aug 1, 2026
e8540c7
test: cover server-side reactions.staleRepoCount (per-repo masking)
lsm Aug 1, 2026
5bcb102
fix: round-22 — mount nonce, check-run partial errors, credential pol…
lsm Aug 1, 2026
4fd85db
fix: round-23 — discard superseded-credential cursor errors, server-c…
lsm Aug 1, 2026
6cdb009
test: cover stale-credential cursor-commit guard for poll errors
lsm Aug 1, 2026
e896987
Merge branch 'dev' into space/add-github-event-integration-health-panel
lsm Aug 1, 2026
af5bc68
fix: round-26 — GitHub health snapshot accuracy (6 review fixes)
lsm Aug 1, 2026
6de167d
fix: round-26 — health panel sibling lock during re-register + period…
lsm Aug 1, 2026
a9e1a35
fix: round-27 — close reactionsFullyPolled gap + cache token status f…
lsm Aug 1, 2026
cad9caa
fix: round-27 — health panel: lightweight periodic refresh, foregroun…
lsm Aug 1, 2026
a7c2a67
fix: round-28 — discard superseded /user validation, expire webhook c…
lsm Aug 1, 2026
0f2dcb8
fix: round-28 — health panel: foreground-safe silent refresh, broader…
lsm Aug 1, 2026
a8d3194
fix: round-29 — recheck credential after validation body consumption,…
lsm Aug 1, 2026
8dd15b0
fix: round-29 — health panel: never-successful poll not live, webhook…
lsm Aug 1, 2026
4d9fff5
fix: round-30 — webhook server timeout, reusable-hook recovery, parti…
lsm Aug 1, 2026
fb0817a
fix: round-30 — health panel: never-polled per-repo liveness, stale-s…
lsm Aug 1, 2026
7d5fac4
fix: round-31 — per-repo polling staleness + cache-generation recheck…
lsm Aug 1, 2026
a849711
fix: round-31 — health panel: degrade on per-repo polling staleness
lsm Aug 1, 2026
0b50a44
fix: round-32 — mark timed-out webhook updates uncertain
lsm Aug 1, 2026
0434c8e
fix: round-32 — health panel: release parent lock on unmount, keep ra…
lsm Aug 1, 2026
bc0d786
fix: round-33 — gate the cooldown Down→Degraded rule on the polling path
lsm Aug 1, 2026
27fba5d
fix: round-34 — POST-timeout uncertainty, token-cache TTL, rate-limit…
lsm Aug 1, 2026
e3bd3b0
fix: round-34 — health panel: cooldown recovery requires polling enabled
lsm Aug 1, 2026
dd6cd27
fix: round-35 — credential-scoped access hardening + webhook-error pr…
lsm Aug 1, 2026
7f2fe70
fix: round-35 — health panel: gate polling signals on active polling,…
lsm Aug 1, 2026
107de62
fix: round-36 — record incomplete-cycle diagnostics, expose true rece…
lsm Aug 1, 2026
54a5e09
fix: round-36 — health panel: show true failure count, don't let cool…
lsm Aug 1, 2026
7b7419b
fix: round-37 — one-time gen clear, DELETE timeout, rate-limited poll…
lsm Aug 2, 2026
e583046
fix: round-38 — durable credential fingerprint for access-scoping
lsm Aug 2, 2026
a2f9725
fix: round-39 — SHA-256 fingerprint, dead-code cleanup, recordPollFai…
lsm Aug 2, 2026
82d7166
fix: round-40 — fingerprint read race, recordPollFailure accessible-g…
lsm Aug 2, 2026
699528e
fix: round-41 — checkWebhook preserves uncertainty, partial rate-limi…
lsm Aug 2, 2026
f0e97dd
fix: round-42 — conditional credential reset, delivery-count index, s…
lsm Aug 2, 2026
d50085d
fix: round-43 — move delivery index to migration 164, fix no-hub stal…
lsm Aug 2, 2026
92f53b1
fix: guard migration 164 with table-exists check (no table in minimal…
lsm Aug 2, 2026
5f86b95
fix: round-44 — surface non-rate-limit poll errors, honor installatio…
lsm Aug 2, 2026
5bc922b
fix: round-45 — final fingerprint recheck, deletion-uncertainty resol…
lsm Aug 2, 2026
ba3d40e
fix: round-46 — deletion-uncertainty resolution on delivery, cache pe…
lsm Aug 2, 2026
e12f148
fix: round-47 — exact permission-403 match, loop fingerprint read unt…
lsm Aug 2, 2026
1a8ace4
Merge remote-tracking branch 'origin/dev' into space/add-github-event…
lsm Aug 2, 2026
882703a
fix: round-48 — cap fingerprint retries, read repos after awaits
lsm Aug 2, 2026
b8837ee
fix: round-49 — move state_updated index to migration 165 (164 collis…
lsm Aug 2, 2026
f2bcc60
fix: round-50 — invalidate snapshot on foreground no-hub refresh
lsm Aug 2, 2026
4ff96eb
fix: round-51 — disable Poll now when snapshot is stale
lsm Aug 2, 2026
f63bf44
fix: round-52 — bump health nonce on the no-hub refresh path (P1)
lsm Aug 2, 2026
a40b95f
fix: round-53 — declare webhookLastCheckedAt in RPC type, treat exhau…
lsm Aug 2, 2026
a22b859
test: round-54 — regression test for exhausted fingerprint retries
lsm Aug 2, 2026
58c3b7f
test: round-55 — fix exhausted-fingerprint test to be sentinel-sensit…
lsm Aug 2, 2026
2665845
fix: round-56 — gate Poll now on spaceId, synchronous busy notificati…
lsm Aug 2, 2026
86faf59
fix: update getTokenStatus env-var test to expect validatedFingerprint
lsm Aug 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,29 @@ export interface PollCursor {
* Committed into `endpointLastSeenAt` only once the endpoint backlog clears.
*/
endpointPendingLastSeenAt?: Record<string, number>;
/**
* Set when the most recent poll cycle could not access this repo (e.g. a
* valid-but-unauthorized PAT returning 403/404 on every endpoint), and cleared
* on a cycle that reached any accessible (200/304) endpoint. Used by the
* health rollup so a polling repo that cannot publish is not treated as a
* live delivery path. Null/absent before the first poll or after a rate-limit
* break with no access attempt.
*/
lastPollError?: string | null;
/**
* Set when the most recent cycle reached some endpoints but a later required
* one failed (partial access — e.g. a fine-grained PAT with issue-comment but
* no pull-request access). Cleared on a fully successful or fully failed
* cycle. Partial traffic still publishes, so this is a Degraded, not Down.
*/
lastPartialPollError?: string | null;
/**
* Wall-clock epoch of the most recent cycle that actually issued a reaction
* request (not merely a poll that advanced lastPollAt). Reactions are skipped
* when the rate-limit budget is tight, so lastPollAt would otherwise over-
* state reaction freshness.
*/
lastReactionPollAt?: number | null;
}

export interface GitHubWatchedRepo {
Expand Down
Loading