Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
335 commits
Select commit Hold shift + click to select a range
baeaa4b
Document incremental mypy typing policy in CONTRIBUTING.md
subindevs Jun 14, 2026
0b4927f
Fix mypy errors in gently/harness/bridge.py
subindevs Jun 14, 2026
b4dc3b7
Fix implicit-Optional parameter defaults across 45 modules
subindevs Jun 14, 2026
06ced01
Add StoreProtocol for ContextStore memory mixins, fix remaining type …
subindevs Jun 14, 2026
4e24a92
Type the tool-execution context dict, clearing gently.app.tools.* myp…
subindevs Jun 14, 2026
b6d9e59
Address PR #48 review findings: fix view_image None-client crash and …
subindevs Jun 15, 2026
7da8443
mypy: pin to 2.1.0 across CI/pre-commit/dev; fix missed implicit-Opti…
pskeshu Jun 15, 2026
97e3d25
Merge pull request #48 from subindevs/46-gradual-mypy-typing
pskeshu Jun 15, 2026
4530ab1
UX v2 Phase 0: unify connection status across the three indicators
pskeshu Jun 11, 2026
4571a58
UX v2 Phase 1 (scaffold): add GENTLY_UX_V2 feature flag
pskeshu Jun 11, 2026
17e66cb
UX v2 Phase 1: dual-render agent asks (chat transcript + main stage)
pskeshu Jun 11, 2026
52503e7
UX v2 Phase 2: grouped rail nav + session-context strip (behind flag)
pskeshu Jun 11, 2026
288f97b
UX v2 Phase 3a: inference-first plan mode (model-driven, with provena…
pskeshu Jun 11, 2026
e947506
UX v2 Phase 3b: surface inferred imaging spec + per-field provenance …
pskeshu Jun 11, 2026
2387225
UX v2 Phase 4: co-editable shared-visibility surface (the agent's min…
pskeshu Jun 11, 2026
e8ce2bf
UX v2 Phase 4 follow-up: show an empty-state for the agent's-view panel
pskeshu Jun 12, 2026
c98a33f
Put the free-the-port command in the "port in use" error
pskeshu Jun 12, 2026
927900a
UX v2 Phase 5: Experiment view shows real tactics only — drop stubbed…
pskeshu Jun 12, 2026
f69bc4e
UX v2 Phase 6 (step 1): flip GENTLY_UX_V2 default ON, keep v1 fallback
pskeshu Jun 12, 2026
e4de3a1
UX v2: agent-first landing → in-page plan wizard (flag-gated)
pskeshu Jun 12, 2026
37bc534
Add UX v2 entry-paradigm prototype + migration plan (design reference)
pskeshu Jun 12, 2026
6c6bc70
Detectors: forced-tool structured output for hatching + verifier
pskeshu Jun 12, 2026
4910d06
Fix recurring port-8080 false positive: SO_REUSEADDR on the viz prefl…
pskeshu Jun 12, 2026
5ee9e32
chore: gitignore the stray D:/ storage dir
pskeshu Jun 12, 2026
a8fd3e5
UX v2 landing: fix welcome→plan jump, dark mode, and the entry flow
pskeshu Jun 12, 2026
1cefe2f
UX v2: agent-activity events + GFM markdown rendering
pskeshu Jun 12, 2026
64f9338
Models: migrate to Fable 5 / Opus 4.8 / Sonnet 4.6 with refusal+400 f…
pskeshu Jun 12, 2026
0457975
Add UX v2 landing screenshot for the PR
pskeshu Jun 12, 2026
b526b23
lint: conform UX v2 + model-migration code to #47 ruff tooling
pskeshu Jun 14, 2026
ec64daf
Models: revert main tier from Fable 5 to Opus 4.8
pskeshu Jun 14, 2026
d5dac56
UX v2: expandable tool cards show full (bounded) tool results
pskeshu Jun 15, 2026
d777cdd
Release 0.22.0: finalize version, changelog, ignore stray runtime dir
pskeshu Jun 15, 2026
d77bb12
README: bump status to 0.22.0
pskeshu Jun 15, 2026
a26ee99
WIP: 3D optical-space view in the Devices tab
pskeshu Jun 15, 2026
91ec6d2
docs: UX v2 interaction-flow / IA audit
pskeshu Jun 16, 2026
9edb766
UX v2 P0: live-stream the agent turn + show reasoning during the wait
pskeshu Jun 16, 2026
f209874
Fix create/update_plan_item crash when spec/references passed as JSON…
pskeshu Jun 16, 2026
144d8dd
UX v2: add a concision/communication-style section to the plan-mode p…
pskeshu Jun 16, 2026
d061e9d
UX v2: run independent read-only tool calls concurrently
pskeshu Jun 16, 2026
a779901
Fix create_plan_item crash when phase_number is a string
pskeshu Jun 16, 2026
06741eb
Restrict tool concurrency to read-only tools; nudge batched plan-item…
pskeshu Jun 16, 2026
faee181
UX v2: plan-done state + restructured THE PLAN panel
pskeshu Jun 16, 2026
f6f2ba3
UX v2: drop wrap-up reasoning litter from the plan feed
pskeshu Jun 16, 2026
b8df610
UX v2: export-plan button replaces the end-of-plan prose upsell
pskeshu Jun 16, 2026
dedc418
Design doc: active shared lab notebook (memory model)
pskeshu Jun 16, 2026
e89161f
plan: notebook foundation (Note model + NotebookStore) — increment 1 …
pskeshu Jun 16, 2026
60cd40a
feat(notebook): unified Note model + dict serialization
pskeshu Jun 16, 2026
d15607d
feat(notebook): NotebookStore write_note/get_note with atomic YAML
pskeshu Jun 16, 2026
5225811
feat(notebook): rebuildable reverse-indexes by strain/embryo/thread
pskeshu Jun 16, 2026
9ba23c9
feat(notebook): query_notes by kind/author/status/scope
pskeshu Jun 16, 2026
458810a
feat(notebook): link_notes + supersede_note (append-only history)
pskeshu Jun 16, 2026
fed6821
plan: notebook producer bridge (apply_updates -> notebook)
pskeshu Jun 16, 2026
9ca5593
feat(notebook): Observation/Learning -> Note converters
pskeshu Jun 16, 2026
19c2ff4
feat(notebook): FileContextStore.notebook lazy property
pskeshu Jun 16, 2026
9224b0f
feat(notebook): apply_updates mirrors observations & learnings into n…
pskeshu Jun 16, 2026
03ea7c6
plan: notebook read API
pskeshu Jun 16, 2026
7d51e20
feat(notebook): read API — GET /api/notebook/notes + /notes/{id}
pskeshu Jun 16, 2026
1a0121d
feat(notebook): read API — GET /api/notebook/threads with counts
pskeshu Jun 16, 2026
0760578
feat(notebook): Notebook tab (read view) in LIBRARY rail
pskeshu Jun 16, 2026
1c87896
plan: notebook live edge (Agent's view recent notes)
pskeshu Jun 16, 2026
9b28fa8
feat(notebook): limit param on GET /api/notebook/notes
pskeshu Jun 16, 2026
b643972
feat(notebook): Agent's-view live edge — recent notes section → Noteb…
pskeshu Jun 16, 2026
814e322
plan: ask the notebook (increment 2 backend)
pskeshu Jun 16, 2026
8928084
feat(notebook): ask backend — select_notes retrieval + forced-tool gr…
pskeshu Jun 16, 2026
13b4dd2
feat(notebook): POST /api/notebook/ask — grounded notebook Q&A
pskeshu Jun 16, 2026
c7be82a
feat(notebook): 'Ask the notebook' box on the Notebook tab
pskeshu Jun 16, 2026
ecd5239
feat(imaging): Run button on actionable imaging plan items
pskeshu Jun 16, 2026
71ac0ea
integration: ux-v2 + memory-model (notebook) + imaging-triggers (run …
pskeshu Jun 16, 2026
6eac3e6
deps: declare opencv-python-headless (cv2) as a runtime dependency
pskeshu Jun 16, 2026
0d01229
fix(dispim): correct stage-position read keys; bottom camera never us…
pskeshu Jun 16, 2026
9abcf6e
chore(deps): lock opencv-python-headless (uv.lock sync)
pskeshu Jun 16, 2026
33ce5b0
fix(timelapse): accept comma-separated embryo_ids string in start()
pskeshu Jun 16, 2026
d4496a3
fix: bump __version__ to 0.22.0 to match release
pskeshu Jun 16, 2026
abb11fb
fix(web): emit unpadded embryo ids to match the live convention
pskeshu Jun 16, 2026
68a7833
lint: wrap long lines + ruff-format notebook modules (E501)
pskeshu Jun 16, 2026
909e240
mypy: clear gently/mesh/* type errors (Phase 4 of #49)
subindevs Jun 16, 2026
4126f77
mypy: clear gently/core/* (except legacy store) type errors (#49)
subindevs Jun 16, 2026
1dfd591
mypy: clear gently/harness/* type errors (#49)
subindevs Jun 17, 2026
4f864d0
mypy: clear gently/app/* type errors (#49)
subindevs Jun 17, 2026
31ba4b1
Merge remote-tracking branch 'upstream/development' into integration/…
pskeshu Jun 17, 2026
d2d61b8
feat(notebook): record_note tool — agent writes human notes to the no…
pskeshu Jun 17, 2026
83b825f
feat(plans): live plan UI — PLAN_UPDATED event + campaigns.js refresh…
pskeshu Jun 17, 2026
e1f698e
fix(plans): reliable session↔item linking, one item ↔ many sessions (…
pskeshu Jun 17, 2026
a3b649c
lint: ruff-format file_store.py (fixes CI format check on integration)
pskeshu Jun 17, 2026
0d1cdeb
feat(plans): plan narrative in agent context + fix provenance spec-ta…
pskeshu Jun 17, 2026
bb54ab6
Connection D: editable/fillable imaging specs in the plan inspector
pskeshu Jun 17, 2026
eb2c3f3
mypy: clear gently/hardware/* type errors (#49)
subindevs Jun 17, 2026
2be3587
mypy: clear gently library modules (ui, ml, eval, analysis, organisms…
subindevs Jun 17, 2026
87a52c5
Move hardware-control stack into default-on device dependency group
schneidermc Jun 17, 2026
44d9f2b
Merge pull request #61 from gently-project/device-dependency-group
pskeshu Jun 25, 2026
4d503f8
docs(temperature): design spec for temperature interface (sub-project A)
pskeshu Jun 27, 2026
d1c881f
docs(temperature): TDD implementation plan for temperature interface …
pskeshu Jun 27, 2026
06a5883
feat(temperature): session-scoped temperature.jsonl store on FileStore
pskeshu Jun 27, 2026
3279c8f
feat(temperature): add TEMPERATURE_UPDATE event type
pskeshu Jun 27, 2026
81bba23
feat(temperature): TemperatureSampler service (poll/persist/emit @1Hz)
pskeshu Jun 27, 2026
122a580
feat(temperature): start/stop TemperatureSampler with the agent
pskeshu Jun 27, 2026
1a062c2
feat(temperature): GET /api/temperature/{session}/history backfill route
pskeshu Jun 27, 2026
a8e9817
feat(temperature): stamp latest reading into burst + volume metadata
pskeshu Jun 27, 2026
e21b567
feat(temperature): live SVG temperature graph on the Devices tab
pskeshu Jun 27, 2026
0daebda
fix(temperature): idempotent graph init + theme setpoint color + labe…
pskeshu Jun 27, 2026
1f6c7fa
docs(temperature): correct EventType auto() example in plan
pskeshu Jun 27, 2026
60e63dd
fix(temperature): events-tab exclusion, burst-stamp test, invalidate …
pskeshu Jun 27, 2026
a79a957
fix(temperature): root-level temp graph colors for portability
pskeshu Jun 28, 2026
339cc7c
docs(manual-mode): design spec for SPIM single-slice live view (B1)
pskeshu Jun 28, 2026
2041c3a
docs(manual-mode): B1 plan (7 tasks) + ASIdiSPIM two-camera model app…
pskeshu Jun 28, 2026
ec917e0
feat(manual-mode): add LIGHTSHEET_FRAME event type + frontend exclusion
pskeshu Jun 28, 2026
0ec20c2
feat(manual-mode): device-layer lightsheet live streamer (continuous …
pskeshu Jun 28, 2026
2c2cc95
feat(manual-mode): client stream_lightsheet + set_lightsheet_live_params
pskeshu Jun 28, 2026
8b86000
feat(manual-mode): LightSheetStreamMonitor bridge + agent wiring
pskeshu Jun 28, 2026
d641fa4
feat(manual-mode): require_control proxy routes for lightsheet live +…
pskeshu Jun 28, 2026
84a659d
fix(manual-mode): laser/off uses Laser ALL OFF config + expose laser …
pskeshu Jun 28, 2026
481d8bb
mypy: clear final cluster + remove the last overrides (#49)
subindevs Jun 28, 2026
9917e12
feat(manual-mode): Manual view — SPIM live canvas, galvo/piezo/exposu…
pskeshu Jun 28, 2026
c69c1ae
Restore dependencies accidentally stripped in 2be3587
subindevs Jun 28, 2026
37f9156
ci: add deps-installed mypy job (non-blocking)
subindevs Jun 28, 2026
c749223
fix(manual-mode): init temperature graph per-view in switchView (sing…
pskeshu Jun 28, 2026
5e12b60
docs(manual-mode): lightsheet FPS measurement protocol + transport de…
pskeshu Jun 28, 2026
804e370
Merge pull request #62 from subindevs/49-mypy-clear-overrides
pskeshu Jun 28, 2026
779e6c6
fix(manual-mode): brightfield-safe + focal-plane-correct acquire, seq…
pskeshu Jun 28, 2026
909aacc
docs(tactic): spec + plan for temp-change burst tactic (C, 6 tasks)
pskeshu Jun 28, 2026
7ec42d0
feat(tactic): timeline event types for temp-change burst protocol
pskeshu Jun 28, 2026
5412c30
feat(tactic): thread laser_config through BurstAcquisition + queue_bu…
pskeshu Jun 28, 2026
030a443
feat(tactic): wait_for_temperature_lock poll helper
pskeshu Jun 28, 2026
28abaa1
feat(tactic): temp-change burst protocol driver (brightfield before/d…
pskeshu Jun 28, 2026
6af4396
feat(tactic): run_temp_change_burst_protocol agent tool
pskeshu Jun 28, 2026
c986c92
feat(tactic): surface temp-protocol band + setpoint changes in strate…
pskeshu Jun 28, 2026
dc03872
fix(tactic): correct event docstrings, guard against concurrent timel…
pskeshu Jun 28, 2026
59c429a
docs(operations): spec + plan for Operations tab (D, 4 tasks)
pskeshu Jun 28, 2026
95f9126
feat(operations): rename Experiment tab to Operations (label only)
pskeshu Jun 28, 2026
380336f
feat(operations): emit burst phase in BURST_START + record in snapshot
pskeshu Jun 28, 2026
2a3d8b0
feat(operations): tactic band — protocol pill + setpoint markers + ph…
pskeshu Jun 28, 2026
6003b8e
docs(operations): redesign D as operation-spine (data-driven + scenar…
pskeshu Jun 28, 2026
b8da138
feat(operations): discard swimlane tactic-band (replaced by operation…
pskeshu Jun 28, 2026
22d9b06
docs(operations): v3 spec — agent-authored typed Operation Plan (DRAF…
pskeshu Jun 28, 2026
9d0c7d8
docs(operations): v3 plan — agent-authored Operation Plan (5 tasks, b…
pskeshu Jun 28, 2026
192fe97
feat(operations): OperationPlan store domain in FileContextStore
pskeshu Jun 28, 2026
1472dd0
feat(operations): declare_operation_plan typed agent tool
pskeshu Jun 28, 2026
f0d09bd
docs(operations): add execution-linkage tasks (transition_tactic, too…
pskeshu Jun 28, 2026
a75d23f
feat(operations): GET /api/operation_plan/{session} route
pskeshu Jun 28, 2026
84f5f17
docs(operations): add plan-item↔operation linkage tasks (tactical out…
pskeshu Jun 28, 2026
66a40d1
feat(operations): transition_tactic store helper
pskeshu Jun 28, 2026
224d865
feat(operations): link execution tools to plan tactics via tactic_id
pskeshu Jun 28, 2026
c445f6c
docs(sdd): Task 7 report — tactic_id threading
pskeshu Jun 28, 2026
442265f
feat(operations): OperationPlanUpdater — execution events transition …
pskeshu Jun 28, 2026
152837e
feat(operations): plan-item tactical outline (plan tactics with the i…
pskeshu Jun 28, 2026
16a85a3
feat(operations): seed Operation Plan goal + planned tactics from the…
pskeshu Jun 28, 2026
5d16f34
feat(operations): operation-spine renderer + plan scenario library (d…
pskeshu Jun 28, 2026
e65834d
feat(operations): live telemetry binding + event-driven refresh
pskeshu Jun 28, 2026
ab4395c
fix(operations): wire seeding + agent plan guidance + queue_burst gua…
pskeshu Jun 28, 2026
f4ab606
fix(operations): surface bound live.* telemetry, paused state styling…
pskeshu Jun 28, 2026
b98a041
chore: untrack SDD scratch doc accidentally committed
pskeshu Jun 28, 2026
3a2bda6
chore: gitignore .superpowers SDD scratch (untrack accidentally-commi…
pskeshu Jun 28, 2026
286e95e
docs(tactics-library): spec + plan (G, 3 tasks) — save/reuse typed ta…
pskeshu Jun 28, 2026
126de2c
feat(tactics-library): tactic-library store domain (save/list/get/apply)
pskeshu Jun 28, 2026
e25798d
feat(tactics-library): save/list/apply_tactic agent tools
pskeshu Jun 28, 2026
0dcfdca
feat(tactics-library): GET /api/tactic_library route
pskeshu Jun 28, 2026
4703f91
fix(tactics-library): scope round-trip test + preserve rationale + de…
pskeshu Jun 28, 2026
df7cf8e
docs(d2): embryo roles/strain + multi-embryo observability spec + wra…
pskeshu Jun 28, 2026
cc77f0f
docs(d2): implementation plan (4 tasks) — strain field, roles-as-use,…
pskeshu Jun 28, 2026
3ad9afe
feat(d2): per-embryo strain field
pskeshu Jun 28, 2026
d14c6de
feat(d2): roles-as-use — add lineaging + subject/reference class
pskeshu Jun 28, 2026
f48b206
docs(sdd): d2-task-2 report
pskeshu Jun 28, 2026
a697a68
feat(d2): /api/roles route + role-scoped tactic scope resolver
pskeshu Jun 28, 2026
b1a47ce
feat(d2): Operations roster lens — embryos by role + strain
pskeshu Jun 29, 2026
866d4e0
fix(d2): surface strain through timelapse_tracker + rename _rosterEmb…
pskeshu Jun 29, 2026
4353c10
chore(d2): untrack .superpowers SDD scratch (committed by a subagent)
pskeshu Jun 29, 2026
a7e41e5
docs(f): session↔plans link/delink spec + plan (4 tasks); base plans …
pskeshu Jun 29, 2026
775392b
feat(f): unlink_plan_item_session + get_plan_items_for_session
pskeshu Jun 29, 2026
26ea06a
feat(f): session↔plan link/delink endpoints
pskeshu Jun 29, 2026
73edb37
feat(f): Plans-tab session link/delink controls
pskeshu Jun 29, 2026
3bfe8e5
feat(f): session Linked-plans panel (link/delink)
pskeshu Jun 29, 2026
e2b7e48
fix(f): item-scoped POST response + delink-failure re-render + defens…
pskeshu Jun 29, 2026
99540bd
docs: add F + B2 to the wrap-up PR plan stack
pskeshu Jun 29, 2026
1f743ce
docs(b2): dual-camera + laser-preset + timelapse-form spec + plan (3 …
pskeshu Jun 29, 2026
340ab96
feat(b2): laser-preset browser (set proxy + manual-mode dropdown)
pskeshu Jun 29, 2026
4ba1d05
feat(b2): dual-camera config (HamCam2 + side selector)
pskeshu Jun 29, 2026
5f7011e
feat(b2): manual timelapse-config form (start proxy + rail panel)
pskeshu Jun 29, 2026
65525e9
fix(b2): style the timelapse panel (define ls-collapsible/ls-sub-* in…
pskeshu Jun 29, 2026
860f5f2
fix(manual): single LED toggle + laser on/off toggle (replace two-but…
pskeshu Jun 29, 2026
225de14
feat(operations): pin plan kind/scope/state schema in guidance + norm…
pskeshu Jun 29, 2026
a1c8170
fix(device): bound live-view memory (cap+drain+snap mode) + side-B ga…
pskeshu Jun 29, 2026
656e974
feat(manual): timelapse config as an accordion with active/inactive s…
pskeshu Jun 29, 2026
29fa9e4
feat(gallery): top-level Gallery tab + volume-acquired confirmation
pskeshu Jun 29, 2026
020feac
feat(operations): set-up-an-operation CTA in the idle state (agent-fi…
pskeshu Jun 29, 2026
537f414
style: ruff check + format — lint clean
pskeshu Jun 29, 2026
e2b03c5
fix(tests): annotate test-stub Optionals for mypy
pskeshu Jun 29, 2026
deaaffa
feat(launch): --no-auth flag + quiet temperature-sampler backoff when…
pskeshu Jun 29, 2026
c50cab0
docs: document --no-auth launch flag in README
pskeshu Jun 29, 2026
3a85449
fix(chat): ask renders main-stage only + waiting-for-answer state (no…
pskeshu Jun 29, 2026
e9900c3
feat(operations): expandable spine tactic cards (rationale/scope/stru…
pskeshu Jun 29, 2026
55cdb39
feat(operations): guidance — plan calibration/reference roles + tacti…
pskeshu Jun 29, 2026
6797e0a
fix(live-view): throttle SPIM live stream to prevent GPU TDR freeze
pskeshu Jun 29, 2026
b34143c
fix(devices): stop Δt label jitter shaking the LIVE badge / room-ligh…
pskeshu Jun 29, 2026
e2d1a7a
feat(manual-view): reorganize lightsheet controls into a no-scroll 2-…
pskeshu Jun 29, 2026
3887f97
refactor(manual-view): remove dead CAM LED button
pskeshu Jun 29, 2026
eaa1d50
fix(web): stop acquire routes returning raw numpy arrays (500 on Snap…
pskeshu Jun 29, 2026
e17280a
Merge remote-tracking branch 'origin/development' into feature/temper…
pskeshu Jun 30, 2026
60b948e
feat(devices): Map-view embryo detect + single-source-of-truth list +…
pskeshu Jun 30, 2026
6ffe1f9
docs(spec): bottom-cam→SPIM Operator surface design (sub-project A)
pskeshu Jun 30, 2026
223812c
feat(operate): backend — fenced Z read/nudge, agent-free marking conf…
pskeshu Jun 30, 2026
7a95f04
feat(operate): Operate view — guided bottom-cam → SPIM operator surface
pskeshu Jun 30, 2026
d1662dd
feat(operate): B — capture marking as localization labels
pskeshu Jun 30, 2026
47bb84f
feat(operate): C — passive focus-trace logging + offline validation
pskeshu Jun 30, 2026
ecfcb60
feat(operate): redesign as 'The Operator Spine' — uncluttered, legibl…
pskeshu Jun 30, 2026
522e25b
refactor(devices): remove duplicate Map-view Detect panel — Detect li…
pskeshu Jun 30, 2026
7bd39ce
docs(spec): Operate → tactics/timelapse integration design (Phase C Run)
pskeshu Jun 30, 2026
f8175b2
feat(operate): Phase C 'Run' — marking→imaging handoff (Phase 1)
pskeshu Jun 30, 2026
178f872
feat(operate): Phase 2 — Mode B emits a real tactic + tactic_id symmetry
pskeshu Jun 30, 2026
030feae
feat(operate): Phase 3 — Tactic Executor + library/oneshot/plan/agent…
pskeshu Jun 30, 2026
2d4e959
fix(operate): resolve 8 confirmed code-review findings
pskeshu Jun 30, 2026
765c4dd
Merge remote-tracking branch 'upstream/feature/temperature-operations…
pskeshu Jul 1, 2026
c02d52d
docs(spec): settings panel — editable ACUITYnano thermalizer + config…
pskeshu Jul 1, 2026
b47ab66
feat(settings): editable ACUITYnano thermalizer + effective-config vi…
pskeshu Jul 1, 2026
1a0f129
fix(settings): resolve 4 confirmed thermalizer code-review findings
pskeshu Jul 1, 2026
eb63cbe
feat(settings): Phase 2 — rig-wide dashboard defaults + restart-requi…
pskeshu Jul 1, 2026
703db32
fix(settings): drop dead settings.py knobs from editors + group the A…
pskeshu Jul 1, 2026
76c3224
perf(file_store): O(1) prediction_id via bounded tail read
pskeshu Jul 1, 2026
c478a40
docs: concurrency & runtime architecture overview
pskeshu Jul 1, 2026
d5d2c1a
fix(web): quiet 503 for laser-configs/cameras when device layer is of…
pskeshu Jul 1, 2026
fb0e13e
feat(web): friendly login hint when a control action is denied (403)
pskeshu Jul 1, 2026
33635d7
feat(temperature): bundle ACUITYnano serial SDK in-repo
pskeshu Jul 2, 2026
c49e524
build(deps): move hardware-control stack into default-on `device` group
pskeshu Jul 2, 2026
7136498
fix(operate): correct marking stage origin + SAM room-light fallback
pskeshu Jul 2, 2026
236e940
feat(operate): add per-embryo piezo-galvo calibration step
pskeshu Jul 2, 2026
565593c
fix(devices-map): frame marked embryos so they aren't clipped off-map
pskeshu Jul 2, 2026
d846dcd
fix(tools): coerce string tool args to annotated scalar types; quiet …
pskeshu Jul 9, 2026
8687721
Merge upstream/development into feature/temperature-operations-all
pskeshu Jul 11, 2026
08a6752
fix(lint): resolve post-merge ruff-format and mypy errors
pskeshu Jul 11, 2026
ebb545c
Merge pull request #72 from gently-project/feature/temperature-operat…
pskeshu Jul 11, 2026
31730bd
Agent chat UI improvements (#60) — rebased onto current development
pskeshu Jul 12, 2026
2604eda
Merge pull request #60 from gently-project/agent-ui-improvements
pskeshu Jul 12, 2026
554cb7a
chore(types): fix all 200 mypy-strict errors across the repo
pskeshu Jul 12, 2026
3fe6e80
fix(types): avoid _tifffile no-redef in imaging.py (deps-less mypy)
pskeshu Jul 12, 2026
11633fb
style: ruff format imaging.py
pskeshu Jul 12, 2026
0536ee3
Merge pull request #83 from gently-project/chore/mypy-strict-green
pskeshu Jul 12, 2026
dbdc959
docs(launcher): parked design — unified launcher + bare-basic launch …
pskeshu Jul 2, 2026
8ad9035
docs(launcher): credit Magdalena + open questions to fold in (initial…
pskeshu Jul 2, 2026
caa0d57
docs(launcher): future direction — Windows desktop app (Electron shell)
pskeshu Jul 2, 2026
e2aa54f
feat(launcher): scaffold DeviceLayerSupervisor + launch gate (RFC #78)
pskeshu Jul 12, 2026
cdd0eb3
feat(devices+desktop): device-layer supervision panel + Tauri desktop…
pskeshu Jul 12, 2026
461c93e
feat(launcher+desktop): --reload dev flag + npm scripts + dev workflo…
pskeshu Jul 12, 2026
eaa778f
feat(desktop): hide backend console window + document desktop app in …
pskeshu Jul 12, 2026
8eaab88
fix(lint+types): satisfy ruff + mypy on the device-layer code (RFC #78)
pskeshu Jul 12, 2026
ab2bf58
feat(launcher): entry-point gate + startup-progress pipeline (RFC #78)
pskeshu Jul 12, 2026
a5bdf4f
feat(launcher): dashboard boot banner following the device-layer boot…
pskeshu Jul 12, 2026
a066606
feat(launcher): auto-detect GPU for SAM + Device-layer Settings secti…
pskeshu Jul 12, 2026
63579e7
feat(launcher): pragmatic microscope reconnect when gate starts devic…
pskeshu Jul 12, 2026
574d1e8
fix(desktop): compile + run on Linux dev machines
pskeshu Jul 13, 2026
c4c8b00
fix(boot-banner): Details dismisses the landing overlay before switch…
pskeshu Jul 13, 2026
5997354
Merge pull request #78 from gently-project/feature/unified-launcher
pskeshu Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
67 changes: 67 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: Lint

on:
push:
branches: [main, development]
pull_request:

jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"

- name: Install ruff
run: pip install ruff

- name: ruff check
run: ruff check .

- name: ruff format check
run: ruff format --check .

# Fast baseline mypy without project deps. With ignore_missing_imports,
# third-party imports fall back to Any, so this is the weaker check — kept
# as the required gate because it needs no heavy install and stays green.
# The stronger, deps-installed run lives in the mypy-strict job below.
# Pin to match the pre-commit mirrors-mypy rev and the pyproject dev
# group so CI, local commits, and `uv sync` never run different mypys.
- name: Install mypy
run: pip install mypy==2.1.0

- name: mypy (deps-less)
run: mypy .

# Deps-installed mypy: with the real third-party packages present (numpy,
# anthropic, …) mypy resolves their actual types instead of Any, surfacing
# genuine mismatches the deps-less run above cannot see. This is what a
# contributor gets from `uv run mypy .` after `uv sync` (see CONTRIBUTING.md).
# Non-blocking for now (continue-on-error) while the remaining deps-only
# errors are worked through — flip this to a required gate once it is clean.
mypy-strict:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4

# gently-perception is not on PyPI; it is installed editable from a sibling
# clone (see [tool.uv.sources]), so `uv sync` fails without it.
- name: Clone gently-perception sibling
run: git clone --depth 1 https://github.com/gently-project/gently-perception.git ../gently-perception

- name: Install uv
uses: astral-sh/setup-uv@v5
with:
python-version: "3.10"
enable-cache: true

- name: uv sync
run: uv sync

- name: mypy (deps-installed)
run: uv run mypy .
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,13 @@ electron/
/stage_definitions_for_review.txt
gently/ui/tui/node_modules/
gently/ui/tui/dist/

# Stray local storage: GENTLY_STORAGE_PATH default (D:\Gently3) resolves
# literally to ./D:/ under the repo on Linux. Not data we track.
/D:/
.superpowers/

# Runtime operator overrides (written by the Settings panel)
config/config.local.yml
config/settings.local.yml
config/dashboard_defaults.json
16 changes: 16 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.17 # run `pre-commit autoupdate` to pin to latest
hooks:
- id: ruff
args: [--fix]
- id: ruff-format

- repo: https://github.com/pre-commit/mirrors-mypy
# Keep in sync with the mypy pin in pyproject.toml dev group and
# .github/workflows/lint.yml. Run `pre-commit autoupdate` to bump.
rev: v2.1.0
hooks:
- id: mypy
pass_filenames: false
args: ["."]
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.11
46 changes: 46 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,52 @@ Net: ~3,500 lines removed across P6–P7.

---

## v0.22.0

File-based storage, a redesigned web UI, new hardware, and the tooling to
keep it all honest.

**File-based storage (Gently3)**
Retired the SQLite databases. All state now lives as human-browsable files
under `D:\Gently3\` — sessions, embryos, volumes, projections, traces,
campaigns, learnings, agent memory, all YAML/JSONL/TIFF.
- `FileStore` replaces `GentlyStore`; `FileContextStore` replaces the
`agent_mind.db` `ContextStore`. Drop-in API replacements.
- A root `gently.yaml` manifest documents the layout for humans and agents.
- YAML parses are cached in `FileContextStore` — fixes slow Plans/campaign
loading.

**Web UI redesign**
- Agent chat became a docked, sliding side panel (overlay + pin-to-dock)
instead of owning the screen.
- Added a Home landing tab; the chat no longer auto-runs the startup wizard.
- Login is non-blocking — a "Continue in view-only" escape hatch.
- Recent images aggregate across previous sessions.

**Hardware**
- Integrated the ACUITYnano temperature controller (config, web control,
SDKs) with a live HiveMQ cloud SIM for hardware-free testing.
- Added the SPIM-head F-drive device, hard limits, and focus/align plans.
- Room-light toggle and a device-layer terminal UI.

**Agent + perception**
- Integrated the agent with perception: pull tool, prompt context, event
bridge, wake-router.
- Live acquisition control with observable, permissioned autonomy and a
refreshed prompt.
- Retired napari from the agent; added web-chat autocomplete and pruned
dead tools.

**Tooling and environment**
- Added ruff lint/format tooling and fixed all violations.
- Adopted incremental mypy typing — config, CI, pre-commit wiring, and a
documented policy in `CONTRIBUTING.md`; pinned mypy to 2.1.0.
- Switched environment setup to uv with an offline/UI-only launch path;
pinned pymmcore to device-interface 70.
- Relicensed and updated the author list.

---

## Notes on how we think about this

Things we've learned building this, roughly in order:
Expand Down
45 changes: 45 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,51 @@ Perception is handled by `gently-perception` (separate repo: `pskeshu/gently-per

The device layer runs as a separate process (`python start_device_layer.py`). It communicates with the agent via HTTP. Bluesky plans require ophyd device name kwargs (e.g. `xy_stage='xy_stage'`, `volume_scanner='volume_scanner'`) — these must match the device names registered in `device_factory.py`.

## Desktop App (Tauri)

Gently can run as a Windows desktop app — a thin Tauri (WebView2) shell in
`desktop/` that OWNS the Python backend. It spawns `launch_gently.py --no-browser`,
shows a splash, then renders the live web UI (`http://localhost:8080`) in a native
window. The Python-served web UI stays the single source of truth — no app logic
lives in the shell. Full detail: `desktop/README.md`.

### Build / run
```
cd desktop
npm install # once — restores the Tauri CLI
npm run dev # dev: build + launch (spawns the backend for you)
npm run build # release: NSIS installer under src-tauri/target/release/bundle/
```
Prereqs: Rust (MSVC toolchain), the repo's uv `.venv`, WebView2 runtime (inbox on
Win 11). The **release** exe (`src-tauri/target/release/gently-desktop.exe`) is what
the Desktop shortcut points at; rebuild with `npm run build` to refresh it.

### Key pieces
- `desktop/src-tauri/src/main.rs` — spawns the backend, waits for the server,
navigates the window to it, owns teardown.
- **No orphans:** the spawned Python (and its device-layer grandchild) run in a
Windows Job Object with `KILL_ON_JOB_CLOSE`, so quitting/crashing the shell reaps
the whole tree.
- **No console window:** the backend is spawned with `CREATE_NO_WINDOW` in release
(the device-layer supervisor does the same); `tauri dev` keeps the console so
logs stay visible while developing.

### Editing code — what reflects
- **Web UI** (`gently/ui/web/templates`, `static/js`, `static/css`): refresh the
window (Ctrl+R) — served live by Python, no rebuild.
- **Python backend**: restart it, or run with `--reload`
(`launch_gently.py --reload`, or `GENTLY_LAUNCH_ARGS="--reload …"`) to auto-restart
on `gently/*.py` changes, then Ctrl+R. Whole-backend restart — not for live hardware.
- **Rust shell / `tauri.conf.json`**: `npm run dev` auto-rebuilds and relaunches.

### Shell env config (read by `main.rs`)
`GENTLY_HOME` (repo dir), `GENTLY_PYTHON` (interpreter), `GENTLY_LAUNCH_ARGS`
(extra `launch_gently` args), `VIZ_PORT` (default 8080), `GENTLY_DEVICE_LAYER_SCRIPT`.

### Deferred
Bundling the Python env (torch/anthropic/perception) for a redistributable
installer — today's build launches the repo's `.venv`, so it's single-machine.

## Debugging Data Sources

- **Agent logs**: `D:\Gently3\logs\gently_*.log`
Expand Down
72 changes: 72 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Contributing to Gently

## Code quality toolchain

This project uses [ruff](https://docs.astral.sh/ruff/) for linting and formatting, and
[mypy](https://mypy-lang.org/) for type checking, enforced automatically before every
commit via [pre-commit](https://pre-commit.com/).

### First-time setup

Install the dev dependencies (includes ruff, mypy, and pre-commit):

```bash
uv sync
```

Then install the pre-commit hooks:

```bash
pre-commit install
```

From this point on, ruff runs on staged files and mypy runs across the whole
project whenever you `git commit`.

### Running manually

To check all files at once (useful before opening a PR):

```bash
pre-commit run --all-files
```

Or run the tools directly:

```bash
ruff check . # lint
ruff format . # format in-place
```

### Keeping hooks up to date

To update hook versions to their latest releases:

```bash
pre-commit autoupdate
```

### Type checking

Run mypy the same way pre-commit and CI do:

```bash
mypy .
```

The codebase is being typed incrementally (see issue #46). Modules with
pre-existing errors are listed in the `[[tool.mypy.overrides]]` block in
`pyproject.toml` with `ignore_errors = true`, so `mypy .` passes today even
though not every module is fully typed yet.

Policy for working with this list:

- **New modules** must pass `mypy .` cleanly — do not add them to the
overrides list.
- **PRs that substantively touch a module on the overrides list** should fix
that module's type errors and remove it from the list as part of the
change.

### CI

Every pull request runs the lint job (`.github/workflows/lint.yml`), which checks ruff lint and formatting and runs mypy across the entire project. Fix any failures locally with `pre-commit run --all-files` before pushing.
Loading
Loading