Skip to content

Commit 16904c5

Browse files
committed
Polish oida release and macOS shell
1 parent 32a3327 commit 16904c5

48 files changed

Lines changed: 2248 additions & 1336 deletions

Some content is hidden

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

.github/workflows/ci.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ jobs:
1818
- name: Install uv
1919
uses: astral-sh/setup-uv@v5
2020

21+
# NOTE: the `akousma` dependency is an editable uv path source pointing at
22+
# ../earworm/packages/py-akousma. On a bare checkout this sync fails unless
23+
# the earworm repo is checked out as a sibling directory first.
2124
- name: Install Python dependencies
2225
run: uv sync --extra dev
2326

27+
# pytest collects the unittest.TestCase suite too; one runner is enough.
2428
- name: Run Python tests
25-
run: |
26-
uv run python -m unittest discover -s tests
27-
uv run pytest -q
29+
run: uv run pytest -q
2830

2931
- name: Compile Python modules
3032
run: uv run python -m compileall -q oida harness bench_adapter scripts tests

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ __pycache__/
99
*.egg-info/
1010
.playwright-cli/
1111
test-results/
12+
*.log
13+
*.bak
14+
*.backup
15+
*.orig
16+
docs/review-*.md
17+
*.session.json
1218
sessions/*/
1319
sessions/*.json
1420
journals/*.md

CHANGELOG.md

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

33
## 0.2.0 - Unreleased
44

5+
- **Floating listener redesigned**: the macOS floating listener is no longer a
6+
window. It is a borderless, transparent, non-activating panel whose visible
7+
body is the listening-result box itself — the reading is always shown, with a
8+
small reactive waveform in its corner that animates only while listening.
9+
Every control floats just outside the box and fades in on hover: listening
10+
mode at the top-left, close at the top-right, and source / Listen / control
11+
center in a row below. The box and its type are larger than the prior card,
12+
and it drags from the box. The box stays empty until something is actually
13+
heard, and the mode (preset) control matches the size of the row below it.
14+
(An earlier take on this rebuild used a Metal shader orb; that was dropped in
15+
favor of the box-centric layout.)
16+
- **Dashboard restyled flat and grey, then re-laid-out**: one continuous
17+
surface instead of white cards (sections separated by hairlines, no shadows,
18+
flush to the width); no green anywhere. The Listen surface is now two lines —
19+
source + its config (capture / input / file) on one line with the Skills /
20+
Engine / Path controls as segmented tabs at the top-right (each toggling a
21+
panel), and the grey Listen button beside the route presets on the next line.
22+
Presets and the result actions (Ask, Remember, Wiki, JSON, and the germ
23+
handoff) are borderless icon+word buttons. The claim groups (Hypotheses,
24+
Heard, Interpreted, Measured, Undetermined, Memory) are tabs below the
25+
reading. Source descriptions, the preset hint, and the evidence-level chip
26+
were removed; the header is just the wordmark and the daemon address sits in
27+
the footer as `host:port`. Skills / Engine / Path open as **modal dialogs**
28+
(not inline). The source row is one line — source tabs plus their config; in
29+
System the buffer length reads `Buffer: 10sec` (no route text), and in Mic
30+
the input list loads by default (no Devices button) with a small icon monitor
31+
toggle. Selects use the app font, not a mono face.
32+
- **Native top bar**: the mac window is just the embedded dashboard with one
33+
top-right bar of icon buttons, split into two groups of three — Skills /
34+
Engine / Path (each opens its modal in the page via `evaluateJavaScript`) and
35+
the shell actions floating-listener / reload / browser (or Start daemon when
36+
offline). Icons get a subtle hover wash. The shell injects `window.__oidaNative`
37+
so the page hides its own browser-only panel icons.
38+
- **Dashboard reorganized into an Obsidian-style three-rail shell**: collapse
39+
toggles live in the top corners (state persists). The **left rail** carries
40+
the source tabs (System / Mic / File) and their config at its top, then
41+
Recent and Memory; the **right rail** carries the tool icons at its top —
42+
Skills / Engine / Path, plus (inside the native app) floating-listener /
43+
reload / browser — then the claim Breakdown as a vertical nav. The center is
44+
the reading, usable with either rail collapsed, and the rails stay rails at
45+
native-window widths instead of stacking full-width. The foot reads like an
46+
agent chatbox: Remember / Wiki / JSON / germ as icon+word actions at the
47+
bottom-left (germ opens a Sound / Prompt / Lineage menu), the listening mode
48+
as a quiet borderless selector, and **Listen as a round dark send-style
49+
button** at the bottom-right. The Ask button, page footer, and wordmark are
50+
gone — the daemon address, audio path, and API/health links moved into the
51+
Engine modal — and opening any panel modal closes whichever was open.
52+
- **Native shell is chrome-free**: the capsule top bar was removed; the page's
53+
right rail hosts the shell actions, which post back over a
54+
`oidaShell` script-message bridge (reload reloads the WebView directly). The
55+
only native overlay left is a Start-daemon card when the daemon is offline.
56+
- Floating listener: the status dot in the box footer was removed (the status
57+
word and corner waveform remain), and the listening-mode button is a
58+
rectangular frost tile with the same rounding and margins as the buttons
59+
under the box.
60+
- **Shell refinements**: the rails are drag-resizable (widths persist) with
61+
Obsidian-style panel toggles in the top corners; the sources are icons whose
62+
config always fits the rail (including the mic meter); memory search is an
63+
icon. The claim Breakdown is stacked collapsible sections, all expanded by
64+
default. The result actions condensed into one **export menu** at the box's
65+
bottom-right — Remember, Expand on Wiki, Export JSON, Generate derived sound,
66+
Convert listening to prompt (Lineage removed) — next to the Skills icon, the
67+
quiet mode selector, and Listen. Two corner buttons float over everything:
68+
a configuration menu bottom-left (Engine / Path / Reload / Open in browser)
69+
and, inside the native app, the floating-listener toggle bottom-right.
70+
- **App icon**: a minimal abstract listening mark — a single bold two-hump sine
71+
wave on a charcoal squircle, transparent corners. Sourced from
72+
`apps/macos/Resources/AppIcon.svg`, shipped as `AppIcon.icns`, and staged into
73+
the bundle by both packaging scripts.
74+
- **germ handoff fixed and surfaced**: `/germ/handoff` was unusable (with
75+
`from __future__ import annotations` FastAPI could not resolve the
76+
function-local request model and degraded the JSON body to a query param);
77+
the model is now module-scoped. The dashboard gained the three germ buttons
78+
(Sound / Prompt / Lineage) that persist an akousma to the shared store and
79+
deep-link germ; origins are normalized to the akousma vocabulary; opt-in
80+
song identification (`OIDA_SONGID=1`) now enriches handoff records.
81+
- Dashboard hardening: SSE events from other surfaces no longer stomp a local
82+
mic recording (orphaned hot mic); mic streams are released when MediaRecorder
83+
fails and on page hide; duplicate render/refresh after each listen removed;
84+
engine fold no longer rebuilds every 20 s (dropdown-closing); phase guards on
85+
drop/file/path during a running listen; capture-cancel sends the request id;
86+
the 15 s "no capture yet" hint verifies with the daemon before flipping to an
87+
error; SSE reconnects after a permanently closed stream; recording shows
88+
elapsed time; JSON view gained copy; Ask cannot double-submit via Enter.
89+
- Dashboard accessibility and polish: visible focus rings, AA-passing text
90+
tones, radio semantics + arrow-key navigation for source/preset groups, a
91+
live daemon status label, meter semantics, reduced-motion-aware scrolling,
92+
evidence-level chip colors for all levels, `dsp only` no longer styled as an
93+
error, dead CSS removed, tags overflow as `+n`.
94+
- Backend correctness: memory list/limit now ordered by `createdAt` (was
95+
filename-random); `OIDA_MOSS_PREWARM` precedence fixed (legacy `HMM_`/`AEAR_`
96+
could override it); `OIDA_REQUIRE_MODEL` accepts true/yes/on; per-listen DSP
97+
inspection memoized (a listen decoded and hashed the same file 2–3×); ffmpeg
98+
conversion gets a timeout; `/sonicfield/reveal` containment can no longer be
99+
bypassed by sibling directories; corrupt memory/generation/conversation
100+
records return 4xx instead of 500; `/health` `legacy_name` reports
101+
`hmm, aear`; `/api` lists the capture-request, engine-model, status, and germ
102+
routes; double prewarm race closed.
103+
- macOS shell: native capture filenames had a corrupted date pattern from the
104+
rename (`HOidassSSS`); the shell now reads `OIDA_AUTH_TOKEN` first; the
105+
managed daemon is stopped on app quit (its pipes died with the app and the
106+
orphan would crash on SIGPIPE); transient refresh errors keep recent/pinned
107+
history; hotkey signature renamed `HMMK``OIDA`.
108+
- MCP tools renamed to canonical `oida_*` with `hmm_*`/`aear_*`/`ear_*` aliases
109+
kept and the previously undeclared `aear_live_*` aliases declared.
110+
- Environment/docs unification: project scripts export `OIDA_*` names (legacy
111+
still honored), release smoke reads the `*_SERVER_URL` chain and cleans its
112+
prompt record from the daemon data dir, README/SECURITY/shell docs are
113+
rewritten OIDA-first and match current behavior, CI/local checks run the
114+
suite once via pytest, and the server-integration tests isolate ambient
115+
`OIDA_*`/`HMM_*`/`AEAR_*` variables.
116+
5117
- **Renamed the project `hmm``oída`** (part of the Sonic Field "sonic
6118
evolution"). Python package `aear``oida`; primary CLI `oida`
7119
(`oida-daemon`), with `hmm`/`aear` kept as aliases. Environment variables use

0 commit comments

Comments
 (0)