Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,22 @@

## Unreleased

## 2.1.1

**Maintenance.** Fixes a recurring meetings-batch error and clears a batch of small audit/doc items.

### Fixed

- **Meeting batch no longer retries content-less meetings forever.** A meeting Quill has neither minutes nor a transcript for (aborted/duplicate stub recordings) used to re-queue and re-fail on every batch run, so "Run batch now" and the after-hours scheduler kept reporting errors (e.g. "processed 0 of 5, 5 errors"). Such meetings are now marked skipped (`data/meeting_skips.jsonl`) and excluded from future queues — but only when the meeting is older than 2 days, so a just-ended meeting whose transcript is still syncing keeps retrying. LLM/provider failures are never skip-marked. The batch result now reports a `skipped` count, and per-meeting error reasons remain in `logs/daemon.log`.
- The `open_chat` hotkey default is now `Ctrl+Alt+C` (`^!c`) everywhere. The retired `Ctrl+Shift+T` (`^+t`) still lingered as a fallback in the first-run wizard, the daemon's config snapshot, and the dashboard hotkey field, so a fresh config could surface the colliding old binding.

### Internal / docs

- First-run wizard text updated ("Open chat popup" → "Open chat") — the tkinter chat popup was retired in 2.0.
- Installer bootstrapper (`bootstrap.cmd`) no longer prints a hardcoded stale version in its build banner.
- README dashboard tab list corrected (added **Benchmark** → 8 tabs).
- New seed-vs-schema drift guard test (`test_config_seeds`) freezes the known delta between the shipped first-run seed and `DEFAULT_CONFIG`.

## 2.1.0

**Meetings, on your own time.** Flowkey can now read your local Quill meetings and answer questions about them on the local model — and an after-hours scheduler pre-computes each meeting's digest (summary / goals / action items) during your idle window, so daytime reads are instant.
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Flowkey is a Windows desktop assistant that adds local-LLM hotkeys for grammar f

Everything runs locally through [FastFlowLM](https://fastflowlm.com) (AMD Ryzen AI NPU) or, on machines without the NPU, through [Ollama](https://ollama.com) (CPU/GPU) as a secondary provider. No cloud service, analytics, or telemetry is used by the app.

Current version: `2.1.0`
Current version: `2.1.1`

## What's new in 2.1

Expand Down Expand Up @@ -112,7 +112,7 @@ Prefix tip: put the keyword on the first line of your selection — `prompt: rou

The dashboard is a web page served by the local daemon — open it from the tray menu ("Dashboard") or browse to `http://127.0.0.1:52650/`. It is loopback-only and works in any browser.

- **Tabs:** Overview, Chat, Telemetry, History, Notes, Meetings, Config.
- **Tabs:** Overview, Chat, Telemetry, History, Notes, Meetings, Config, Benchmark.
- **Theme:** auto-follows your OS day/night setting; the topbar button cycles auto → light → dark.
- **Custom modes:** Config → Custom modes lets you add your own `prefix:` commands (id + system prompt). Changes apply to the running app within a second.
- **Models:** pull models with live progress — pick a suggestion or type any name (on Ollama, anything from the [library](https://ollama.com/library) works); set active, remove. Suggestions are hardware-aware: detected RAM/VRAM caps the model size (e.g. 32 GB RAM → ~4B on the NPU; 8 GB VRAM → ~9B on the GPU), oversized models are hidden, and free-typing one asks before pulling.
Expand Down
22 changes: 12 additions & 10 deletions SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Caveman-encoded (compression, not amputation). Paths / ids / action names / numb
- LLM: FastFlowLM NPU @ `:52625` | Ollama @ `:11434`, OpenAI-compat `POST /v1/chat/completions`
- dashboard: daemon-served `scripts/ui/web/{index.html,app.js,styles.css}`, CSP `default-src 'self'`
- paths: `scripts/paths.py` → USER_ROOT/{config,data,logs}; `_version.py` = version src of truth
- version: `2.1.0` merged to `main`, tag/installer/Release NOT yet cut; public `2.0.0`; repo `agr77one/Fastflow`
- version: `2.1.1` (this branch, maintenance); `2.1.0` released (tag on `7835d4b`); repo `agr77one/Fastflow`
- run tree = `flowkey-pub2` (worktree, branch `live`=origin/main). old `FastFlowPrompt_Local_Setup`=1.5.0 stale.

## §I interfaces
Expand All @@ -30,15 +30,15 @@ Caveman-encoded (compression, not amputation). Paths / ids / action names / numb
- action: `quill_search_meetings {query,limit}` → `{meetings:[{id,title,date,duration,participants,url}]}`
- action: `meeting_overview` → `{enabled,reachable,today:{count,minutes},week:{count,minutes}}`
- action: `meeting_process {meeting_id,title,date,url}` → digest rec (writes `meeting_digests.jsonl`)
- action: `meeting_batch_run {max_per_run?}` → `{ok,processed,queued,errors}`; `meeting_batch_status` → status
- action: `meeting_batch_run {max_per_run?}` → `{ok,processed,queued,errors,skipped}`; `meeting_batch_status` → status
- action: `meeting_digest_get {meeting_id}` → `{found,digest_md,...}`; `meeting_digests_list` → `{digests,count}`
- action: `meeting_ask {meeting_id,question}` → `{ok,answer,source,seconds}`
- action: `meeting_actions_list {range:week|month}` → `{range,items:[{id,text,owner,status,...}],counts}`
- action: `meeting_action_set_status {id,status:pending|accepted|rejected}` → `{ok}`
- action: `meeting_week_summary {week_offset}` → `{ok,week_label,meeting_count,summary}`
- mcp: Quill @ `http://127.0.0.1:19532/mcp` — Streamable-HTTP, SSE `data:`, `Mcp-Session-Id` header; init→notifications/initialized→tools/call
- cmd: `flm serve <model> --pmode turbo --host 127.0.0.1 --port 52625`
- data: `data/{meeting_digests,meeting_action_status,notifications,chat_threads}.jsonl`
- data: `data/{meeting_digests,meeting_action_status,meeting_skips,notifications,chat_threads}.jsonl`
- autostart: HKCU Run `FastFlowPrompt` → bundled `AutoHotkey64.exe` + `grammarFix.ahk`; `FlowkeyGitSync` → `sync.ps1`
- sched: Windows task `FlowkeyGitSync` daily 12:00 → `sync.ps1` (ff-only pull, guarded)
- ACTIONS count = 73
Expand Down Expand Up @@ -67,6 +67,7 @@ Caveman-encoded (compression, not amputation). Paths / ids / action names / numb
- V20: change gates ! pass: `ruff check scripts tests`, `pytest`, `node --check scripts/ui/web/app.js`, AHK parse-check (PowerShell `/ErrorStdOut`)
- V21: local data (config/data/logs/vendor/certs) ∈ `.gitignore` ∴ pull moves code only, never user data
- V22: `sync.ps1` ∃ uncommitted tracked changes → skip pull (⊥ clobber un-pushed WIP)
- V23: meeting `NoContentError` & age ≥ 2d → skip-marker (`meeting_skips.jsonl`) ∴ ⊥ re-queue ever; age < 2d → retry (Quill transcript may still sync); non-content errors ⊥ skip-mark. batch errors → `daemon.log` only (⊥ UI panel, per user)

## §T tasks

Expand All @@ -78,20 +79,20 @@ T3|x|notifications gate+log+panel (`ffp_notifications`)|V8,V9,V10
T4|x|Quill meetings + after-hours digest scheduler (`ffp_quill`,`ffp_meetings`)|V11,V12,V14
T5|x|overview meeting hours + action-item board + weekly review|V15,V16
T6|x|git autosync: `sync.ps1` + daily task + autostart→flowkey-pub2|V21,V22
T7|~|2.1.0 release held on `release/v2.1.0` → land after user test|V18,V19
T7|x|2.1.0 released (tag on `7835d4b`); 2.1.1 maintenance batch on `fix/2.1.1-meeting-skip-and-audit`|V18,V19
T8|.|installer clean-VM smoke test|—
T9|.|[AUDIT] dead-code: unused daemon helper + 2 AHK wrappers + stale chat-popup config key + obsolete settings ref in test fixture + deprecated install shims|—
T10|x|[AUDIT-P1] autostart: unify 3 divergent Run keys (daemon/src-installer/pkg-installer) → single HKCU entry|V20,B6
T11|.|[AUDIT] old open_chat default `^+t` still appears in first-run + web config fallback → replace with `^!c`|B5
T12|.|[AUDIT] first-run seed thinner than DEFAULT_CONFIG schema → add seed-vs-schema drift guard (compare keys on first-run copy)|—
T13|.|[AUDIT] installer bootstrap wrapper hardcodes old installer filename → derive from `_version.py`|V18
T11|x|[AUDIT] old open_chat default `^+t` in first-run + `grammar_fix` snapshot + web config fallback → all `^!c` (2.1.1)|B5
T12|x|[AUDIT] seed thinner than DEFAULT_CONFIG (deep-merge fills at runtime ∴ harmless) → drift guard freezes known delta in `test_config_seeds` (2.1.1)|—
T13|x|[AUDIT] `bootstrap.cmd` hardcoded stale `1.6.0` in build banner → version-neutral `<version>` (2.1.1)|V18
T14|.|[AUDIT] quality-gate gaps: installer policy drift, autostart reg-name drift, bootstrap output name, README/dashboard tab count|V20
T15|.|[DOCS] dashboard docs: 7 tabs listed, live = 8 (add Benchmark)|—
T15|x|[DOCS] dashboard docs: 7 tabs 8 (added Benchmark) in README (2.1.1)|—
T16|x|[DOCS] autostart docs conflict: main says no machine-wide entry; installer docs+impl still describe it → align on HKCU-only|B6
T17|.|[DOCS] installer layout: build script says flattened, installer.md still shows nested layout|—
T18|.|[DOCS] provider roadmap marks selector/status UX incomplete → update to reflect it exists|—
T19|.|[DOCS] first-run wizard text: "chat popup" + retired hotkey → update to current|B5
T20|.|[DOCS] daemon log location stale in docs → update to current path|—
T19|x|[DOCS] first-run wizard text "chat popup" → "Open chat" + hotkey now `^!c` (2.1.1)|B5
T20|x|[DOCS] daemon log location — audited 2.1.1: no stale ref in README/docs; nothing to change|—
```

## §B bugs
Expand All @@ -104,4 +105,5 @@ B3|2026-06|autostart → stale tree / empty `flowkey-public`|repoint HKCU Run
B4|2026-06|install launch: AHK called `.py`, shipped only `.exe`|flatten bundle to {app} + AHK→exe bridge (PR #19)
B5|2026-06|`Ctrl+Shift+T` open_chat collided w/ browser reopen-tab|default → `^!c`; tray label = configured hotkey
B6|2026-07|3 divergent autostart Run keys: daemon HKCU\Run\FastFlowPrompt, `install.ps1` HKCU\Run\Flowkey (different name!), `installer.iss` optional HKLM\Run\Flowkey → toggle blind to other 2, could double-launch|unify on HKCU\Run\FastFlowPrompt everywhere; drop installer.iss HKLM task; uninstall now cleans the HKCU value; guarded by `test_installer_autostart.py`
B7|2026-07|"Run batch now" → "0 of 5, 5 errors" ∀ run: 5 Quill stub recordings (⊥ minutes ⊥ transcript) re-queued forever ∵ idempotency = digest_exists only|typed `NoContentError` → skip store `meeting_skips.jsonl` (age ≥ 2d guard) + `skipped` count in result; queue checks digest ∧ skip; reasons stay in daemon.log|V23
```
2 changes: 1 addition & 1 deletion installer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ Steps the script runs:
3. Download `vendor\ahk\AutoHotkey64.exe` if missing (`-BundleAhk`)
4. Download `vendor\flm\flm-setup.exe` if missing (`-BundleFlm`)
5. Run `pyinstaller --clean --noconfirm fastflowprompt.spec` → `dist\FastFlowPrompt\`
6. Run `iscc installer.iss` → `out\Flowkey-Setup-2.1.0.exe`
6. Run `iscc installer.iss` → `out\Flowkey-Setup-<version>.exe`
7. Run `sign.ps1` against the output (`-Sign`)

Debug flags:
Expand Down
4 changes: 2 additions & 2 deletions installer/bootstrap.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ echo.
echo This will:
echo 1. Install Python, Inno Setup, and pyinstaller if missing (via winget)
echo 2. Download AutoHotkey v2 and the FastFlowLM installer
echo 3. Build out\Flowkey-Setup-1.6.0.exe (~50 MB)
echo 3. Build out\Flowkey-Setup-^<version^>.exe (version from scripts\_version.py)
echo.
echo First run can take 5-10 minutes. Re-runs are much faster.
echo.
Expand All @@ -37,7 +37,7 @@ if "%EXITCODE%"=="0" (
echo The installer is at:
echo %~dp0..\out\
echo.
echo Look for Flowkey-Setup-1.6.0.exe and double-click it
echo Look for Flowkey-Setup-^<version^>.exe and double-click it
echo to install the app.
) else (
echo === BUILD FAILED (exit %EXITCODE%) ===
Expand Down
2 changes: 1 addition & 1 deletion installer/installer.iss
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
#define AppURL "https://github.com/agr77one/Fastflow"
#define AppExeName "Flowkey.exe" ; symbolic — actual launchers below
; Keep in lockstep with scripts\_version.py.
#define AppVersion "2.1.0"
#define AppVersion "2.1.1"

[Setup]
AppId={{8A4F1E6C-9B3D-4E62-9F7A-FASTFLOW140}}
Expand Down
2 changes: 1 addition & 1 deletion installer/sign.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
.EXAMPLE
# Sign the installer
$env:FFP_SIGN_PFX_PASSWORD = "ChangeMe!"
.\sign.ps1 -FilePath ..\out\Flowkey-Setup-2.1.0.exe
.\sign.ps1 -FilePath ..\out\Flowkey-Setup-2.1.1.exe
#>

[CmdletBinding(DefaultParameterSetName = "Sign")]
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "fastflowprompt"
version = "2.1.0"
version = "2.1.1"
description = "Local-LLM-powered grammar fix, prompt rewrite, chat, and dashboard for Windows."
readme = "README.md"
requires-python = ">=3.11"
Expand Down
2 changes: 1 addition & 1 deletion scripts/_version.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""Single source of truth for the app version. Read by grammar_fix.py."""

__version__ = "2.1.0"
__version__ = "2.1.1"
Loading