Skip to content

Commit b303ddf

Browse files
committed
Release v1.24.1 — sanitized source snapshot (2026-07-24)
1 parent f565a97 commit b303ddf

198 files changed

Lines changed: 3287 additions & 529 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,56 @@
22

33
All notable changes to SuperBased Observer are documented here.
44

5+
## [1.24.1] — 2026-07-24
6+
7+
### Added
8+
9+
- **feat(terminal): generic terminal→session correlation sweep.** Closes the
10+
Session Cockpit gap where only claude-code (out-of-band, 0.95 confidence)
11+
and codex (rollout discovery, 0.75) could link a dashboard-launched
12+
terminal to its observer session — every other launcher stayed
13+
uncorrelated. A 10s daemon-side, tool-agnostic discovery pass
14+
(`termsvc.Correlate`) now links any LIVE uncorrelated run to a UNIQUE
15+
candidate session (matched on tool + project root + a launch-time window
16+
of [−5s, +30m]) at `SourceDiscovered` 0.75 confidence — unique-or-abstain
17+
with a 2-tick dwell before committing a link, and tick-wide abstention on
18+
any unsound tick (hit caps, transient failures) rather than a partial or
19+
best-guess link. Both sides are revalidated immediately before a link
20+
commits; store queries use julianday-precise window arithmetic;
21+
dashboard-handoff runs are resolved via the source session's own project
22+
root; a new integration reverse map (launcher-verb → tool) normalizes the
23+
match. Open Session Cockpit panels self-heal through the existing 15s
24+
link poll — no frontend change needed.
25+
- **feat(dashboard): themed tooltips.** Finished the migration to the
26+
existing floating-ui `Tooltip` primitive across the sidebar collapsed
27+
rail, terminal toolbars (⊙ Session/Files/Git, focus/grid/minimize/close,
28+
size-mode, standing-secret), the Launch Dock, and the New Terminal
29+
dialog — aria-labels preserved or added throughout, and the Playwright
30+
specs flipped from `title` to `aria-label` assertions in lockstep. Native
31+
`<option>` titles are deliberately kept as-is, and the terminal-resize
32+
modal hint deliberately stays a native `title` (a persistent tooltip
33+
hovering a live terminal is worse than a native one).
34+
- **feat(dashboard): Tailscale setup flow.** The Configuration card's "Pair
35+
a device" action now gates on tailnet reachability: disabled with the
36+
exact missing step plus a "Go to Tailscale setup" scroll-link when the
37+
tailnet is known-unreachable, and enabled-with-caution when serve status
38+
can't be detected on older Tailscale CLIs. Device-side guidance was added
39+
to the serve-active step and the QR reveal ("install Tailscale on your
40+
phone/device and sign into the same tailnet", with iOS/Android/download
41+
links). The HTTPS-consent (`enable_url`) path now states plainly that
42+
approval alone does not start serving, and offers a Retry serve action.
43+
`docs/remote-access.md` updated to match.
44+
45+
### Notes
46+
47+
- Adversarial review: two codex GPT-5.6 passes (all findings fixed) plus an
48+
independent Claude Opus pass (verdict SHIP; its remaining findings —
49+
bounding the forward correlation window at 30 minutes, reconciling the
50+
remote-language e2e case, reverting the resize-hint tooltip, and a
51+
watcher-lag accessibility fix — were all applied). codex usage stayed
52+
capped through this work (resets 2026-07-28); the Opus substitution was
53+
operator-approved.
54+
555
## [1.24.0] — 2026-07-24
656

757
### Added

browser-extension/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"manifest_version": 3,
33
"name": "SuperBased Observer — Browser Capture",
4-
"version": "1.24.0",
4+
"version": "1.24.1",
55
"description": "Opt-in, passive observability of your own AI chatbot web usage (ChatGPT, Claude, Perplexity, Gemini, Copilot). Captures per-turn metadata + estimated tokens locally; nothing leaves your machine except to your local observer daemon.",
66
"minimum_chrome_version": "111",
77
"permissions": [

cmd/observer/attach_standalone.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import (
77
"log/slog"
88
"os"
99
"path/filepath"
10+
"sync"
1011
"time"
1112

1213
"github.com/marmutapp/superbased-observer/internal/attachsock"
1314
"github.com/marmutapp/superbased-observer/internal/config"
15+
"github.com/marmutapp/superbased-observer/internal/git"
1416
"github.com/marmutapp/superbased-observer/internal/intelligence/dashboard"
1517
"github.com/marmutapp/superbased-observer/internal/remotenotify"
1618
"github.com/marmutapp/superbased-observer/internal/store"
@@ -230,6 +232,52 @@ func buildTerminalStack(cfg config.Config, database *sql.DB, logger *slog.Logger
230232
// mutually referential — the same shape as the OnExit/scanHub closures).
231233
launcher.correlate = svc.Correlate
232234

235+
// Generic terminal-run discovery sweep (Session Cockpit part C). A
236+
// daemon-resident, tool-AGNOSTIC pass that periodically links a LIVE
237+
// uncorrelated run to a UNIQUE candidate observer session — agreeing on tool +
238+
// git root + launch time, unique-or-abstain, held across a dwell — at
239+
// termrun.SourceDiscovered (0.75). It closes the correlation gap for every
240+
// launcher that has no OOB id echo (only claude-code and codex correlate
241+
// today; every other launcher's Session Cockpit otherwise waits forever). It
242+
// reads the SAME svc seams the OOB path uses (HandleForRun = liveness truth;
243+
// ProjectRoot = the validated launch dir; Correlate = the one scored-link
244+
// seam) so a stale crash-orphan run from a previous boot simply misses the
245+
// live-handle lookup and is skipped. Gated on a wired DB, and run on its OWN
246+
// context so the stack's close func can stop it FIRST — before the H2 shutdown
247+
// stamps and mgr.Shutdown() — so no in-flight tick write can race the
248+
// defer-LIFO DB close (the same ordering discipline the H2 stamps rely on).
249+
stopDiscover := func() {}
250+
if database != nil {
251+
disc := newTerminalDiscoverer(
252+
store.New(database),
253+
svc.HandleForRun,
254+
svc.SessionLinkForRun,
255+
svc.ProjectRoot,
256+
svc.Correlate,
257+
func(dir string) string {
258+
info, gerr := git.Resolve(dir)
259+
if gerr != nil {
260+
return dir // unreadable dir: fall back to the raw path (store filter still applies)
261+
}
262+
return info.Root
263+
},
264+
nil, // now → time.Now (the link timestamp is now().UTC())
265+
logger,
266+
defaultTerminalDiscoverConfig(),
267+
)
268+
dctx, dcancel := context.WithCancel(context.Background())
269+
var dwg sync.WaitGroup
270+
dwg.Add(1)
271+
go func() {
272+
defer dwg.Done()
273+
disc.run(dctx)
274+
}()
275+
stopDiscover = func() {
276+
dcancel()
277+
dwg.Wait()
278+
}
279+
}
280+
233281
// F4 agent-status hub: fuses the feed (OSC hints + OOB/lifecycle) with
234282
// termsession output-recency/exit into a per-run status. Gated by
235283
// [terminal.status].enabled; when off, no provider is wired (endpoints 503).
@@ -320,6 +368,11 @@ func buildTerminalStack(cfg config.Config, database *sql.DB, logger *slog.Logger
320368
resumeAuthority: resumeAuthority,
321369
reclaimOnInput: cfg.Terminal.Attach.ReclaimOnInput,
322370
close: func() {
371+
// Stop the discovery sweep FIRST — before ANY DB write below and before
372+
// mgr.Shutdown() — and WAIT for its goroutine to drain, so no in-flight
373+
// tick's Correlate write can race the defer-LIFO DB close that start.go
374+
// runs after this. No-op when no DB was wired.
375+
stopDiscover()
323376
// H2: stamp every LIVE attach run 'daemon_shutdown' SYNCHRONOUSLY,
324377
// BEFORE mgr.Shutdown() kills the PTYs (whose async OnExit would
325378
// otherwise race the DB close) and before start.go's defer-LIFO closes

0 commit comments

Comments
 (0)