@pellux/goodvibes-tui 1.18.0 → 1.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,170 @@ All notable changes to GoodVibes TUI.
4
4
 
5
5
  ---
6
6
 
7
+ ## [1.19.1] — 2026-07-16
8
+
9
+ ### Changes
10
+ - 7e97ce37 deps: adopt SDK 1.10.1 and consume the exported voice-setup composer
11
+
12
+ ## [1.19.0] — 2026-07-16
13
+
14
+ ### Changes
15
+ - 654eae83 deps: adopt published SDK 1.10.0 and regenerate operator contract artifact
16
+ - a7055269 docs: regenerate command reference + foundation artifacts for the new surfaces
17
+ - 17bcce8a voice setup: live per-component install progress
18
+ - cd1d1889 extract knowledge + voice-setup construction to hold services.ts under the 800-line cap
19
+ - 6eabbe16 compose the memory governor + managed voice provisioning in the daemon
20
+ - 4ea80514 voice status: render the real STT enums honestly
21
+ - c7c99a05 memory: doctor/status surface + pressure notice over ops.memory.get
22
+ - 49b5ac83 voice settings: size-labeled local-engine setup offer beside ElevenLabs
23
+ - f2bf0bb6 voice: /voice setup + /voice status one-act over the managed local-voice verbs
24
+ - f7bb30f6 changelog: macOS in-app fleet coverage, regeneration backups, provenance-gated replacement, kept promises, honest not-probed
25
+ - c26ad724 cli: not-probed is a tri-state on control-plane status and listener test — never a definite reachable:false
26
+ - 50e10f36 installer: the macOS in-app fleet is reachable — both LaunchAgent identities, structural plist provenance, zero silence on pinned plists
27
+ - ac27ebdd installer: replace-broken gate at every call site, backups before fingerprint regeneration, promises fulfilled on transfer refusal
28
+ - 576b3665 changelog: modern-systemd vocabulary, fielded pinned-unit repair, never-touch hand-written units, honest bind displays
29
+ - e63581be cli: every display surface routes endpoint bindings through one formatter seam
30
+ - 4c3c471e installer: hand-written units survive the corpse state untouched; launchd cannot-ask is never free-to-kill
31
+ - 1d3b42d8 installer: re-derive fielded pinned-endpoint units on upgrade (systemd + launchd, transfer + plain paths)
32
+ - 49fa896e tri-state honesty for modern systemd and flapping probes: rc-4 'no such unit' is ABSENT, a failed MainPID query is UNKNOWN
33
+ - 0019f2bf runtime: split the startup reconcile into legacy-daemon-reconcile.ts
34
+ - 3986860e changelog: config-derived units, fail-safe installer, serving-proof reconcile
35
+ - 9433bb11 installer: fail-safe on unknown service state, config-derived unit, endpoint-aware retirement, launchd run-state parity
36
+ - 5b66a3a1 daemon: endpoint-serving proof + never-stop-a-running-daemon on the reconcile; config-derived unit content; display parity flags
37
+ - eba26f90 changelog: describe the hardened migration, reconcile guards, and bind-honest banner
38
+ - b7e7a36e daemon: serving-proof + self-kill guards on the reconcile, timeout-bounded systemctl, bind-honest banner
39
+ - b10000df installer: supervised transfer for the legacy-active upgrade state, exit-status-checked retirement, quoting, launchd analog
40
+ - e55eb1e7 changelog: installer unit unification, honest daemon startup, legacy-unit reconcile
41
+ - 366560a0 daemon: honest startup identity and unattended legacy-unit reconcile
42
+ - 615d60aa installer: unify the daemon service on the canonical goodvibes.service unit
43
+
44
+ ## [Unreleased]
45
+
46
+ ### Fixed
47
+ - Installer now creates one daemon service unit that matches the app. The curl
48
+ installer used to write a `goodvibes-daemon.service` unit with a bare launch
49
+ command (no arguments), while the in-app service setup manages a
50
+ `goodvibes.service` unit launched with `--daemon-home`/`--hostname`/`--port`.
51
+ On upgrade a host could end up running both, and the extra bare unit booted a
52
+ second daemon that fought the real one for the same port. The installer now
53
+ writes only `goodvibes.service` with the same launch arguments the app uses,
54
+ and its create, restart, and uninstall paths all target that one name.
55
+ - Installer upgrade path migrates the old unit safely. When the daemon is
56
+ actively running under a leftover installer-created `goodvibes-daemon.service`
57
+ (the common upgrade state), the installer now performs a supervised transfer:
58
+ it writes the canonical unit, stops the old one, starts the new one, verifies
59
+ it is actually active, and only then disables and removes the old unit. If
60
+ the new unit fails to come up, everything rolls back and the old unit keeps
61
+ running. Every stop/disable checks its exit status — a failed disable (for
62
+ example, no user service bus) leaves the unit file in place and says so,
63
+ instead of removing it behind a false "disabled + removed" message. A
64
+ hand-written unit of that name (no installer marker) is never removed, an
65
+ unreadable one is reported as unreadable, and `GOODVIBES_RESTART_DAEMON=0`
66
+ now also keeps the migration from stopping a running unit. The installer's
67
+ process-restart fallback no longer kills a systemd-supervised daemon, and
68
+ paths with spaces are quoted in the generated unit. macOS gets the same
69
+ upgrade: an installer-managed LaunchAgent with the old bare launch command is
70
+ regenerated to the argument-driven form.
71
+ - Daemon startup prints an honest one-line identity. Launching the daemon binary
72
+ now prints its real version plus the home directory, host, and port it will
73
+ actually bind — the host/port come from the same resolution the bind path
74
+ uses (including the `hostMode` setting and port fallbacks), so the banner can
75
+ no longer claim a loopback bind while listening on every interface, or print
76
+ `port=0`. It points at the `install-service` command, replacing a startup
77
+ banner that could show a wrong `0.0.0` version. Version resolution is
78
+ hardened so a compiled binary can never pick up an unrelated `package.json`'s
79
+ placeholder version.
80
+ - Daemon self-heals the two-unit state at startup, carefully. If the daemon
81
+ finds a redundant installer-created `goodvibes-daemon.service` still enabled
82
+ beside its own unit, it disables and removes it and records what it did — but
83
+ only after verifying the canonical unit is genuinely serving (active with a
84
+ live main process), never from inside the old unit itself (it will not
85
+ disable the unit supervising its own process), never while the old unit has
86
+ a running daemon of its own (a running second daemon might be the one your
87
+ clients reach — retiring it needs the deliberate `migrate-service` command),
88
+ and only once the endpoint clients resolve from settings is confirmed to be
89
+ answering. The unit file is removed only after the disable actually
90
+ succeeded; a disable that times out is re-inspected and reported as exactly
91
+ what was confirmed, never a blanket claim. Refusals are logged with a reason,
92
+ the configured service name and the login home directory are used (custom
93
+ setups reconcile too), and every check runs with a per-call timeout plus one
94
+ overall time budget so even a slow service manager can never stall daemon
95
+ startup. A hand-written unit is only reported, never touched.
96
+ - Service units no longer pin the network endpoint. Both the installer and the
97
+ in-app service setup now write a unit that launches the daemon with only its
98
+ home directory; the daemon reads the configured interface mode, host, and
99
+ port from settings at startup. A host configured for network access or a
100
+ non-default port keeps that endpoint across upgrades — previously an upgrade
101
+ could silently pin the daemon back to loopback and the default port while
102
+ reporting success.
103
+ - Installer understands modern systemd's answers. Current systemd (verified on
104
+ systemd 260) reports "no such unit" with a distinct exit code that older
105
+ releases did not use; the installer now reads that as the affirmative "this
106
+ unit does not exist" — which permits writing the unit and migrating — instead
107
+ of refusing the whole upgrade with a false "service manager unreachable"
108
+ message. Transitional unit states (starting, stopping) are read as the unit
109
+ existing, and the same discipline applies to the daemon's startup check: a
110
+ service query that fails or times out is treated as unanswered, never as
111
+ "the old service is stopped".
112
+ - Existing installs with a pinned network endpoint get fixed on upgrade. Units
113
+ written by earlier releases baked the interface and port into the launch
114
+ command, silently overriding later settings changes on every boot. The
115
+ installer now regenerates recognizably product-managed units (and the macOS
116
+ LaunchAgent) to the settings-driven launch during upgrade; hand-written units
117
+ are never rewritten — they get a clear notice instead, and the migration
118
+ refuses to move a running daemon onto a hand-written unit with pinned flags.
119
+ - Hand-written service units are never modified, even broken ones. A
120
+ hand-written unit whose launch binary no longer exists is left exactly as it
121
+ is (no disable, no rename, no replacement unit written over it) with an
122
+ honest note about how to fix it.
123
+ - macOS installs made by the app itself now get every upgrade repair. The
124
+ in-app service setup registers the daemon under its own LaunchAgent name and
125
+ file, which the installer previously never looked at: pinned endpoints there
126
+ survived every upgrade silently, and the upgrade's restart path could kill
127
+ and orphan a daemon supervised under that name. The installer now handles
128
+ both LaunchAgent identities, restarts either in place, recognizes
129
+ product-installed launch files by their launch command when no marker is
130
+ present, and never stays silent about a launch file that pins the endpoint —
131
+ it is either regenerated (with a timestamped backup and a receipt) or called
132
+ out with instructions.
133
+ - Regenerating a recognized service unit always keeps a backup. A unit
134
+ identified as product-written by its description line may still carry user
135
+ customizations (proxy environment lines, a different binary path); the prior
136
+ file is saved as a timestamped backup next to the original, named in the
137
+ output, before any rewrite.
138
+ - No service unit is replaced unless it is provably platform-managed. The
139
+ broken-unit replacement path (for units whose launch binary vanished) now
140
+ checks provenance at every entry point — a hand-written daemon or agent unit
141
+ is never disabled, renamed, or replaced, even when broken; the installer
142
+ never writes agent units, so it never replaces one.
143
+ - The upgrade promise is always kept. When the installer defers a daemon
144
+ restart to the migration step and the migration then declines (for example, a
145
+ hand-written unit with pinned endpoint flags is in the way), the old unit is
146
+ restarted in place so the freshly installed binary actually starts serving,
147
+ with the reason explained.
148
+ - "Not probed" is reported as exactly that. Control-plane status and the
149
+ listener test no longer show "reachable: no" (or machine-readable false) for
150
+ an endpoint they deliberately did not probe; the output says it was not
151
+ probed and why.
152
+ - Status displays never invent a bind address. Every command that shows an
153
+ endpoint (status, doctor, control-plane status, web, listener test, service
154
+ posture, surfaces) now goes through one shared formatter: an unrecognized
155
+ interface mode is reported as exactly that — with a doctor finding naming the
156
+ fix — instead of being displayed as a definite loopback bind, and such
157
+ endpoints are never port-probed.
158
+ - Installer treats "cannot ask the service manager" as a hard stop. When
159
+ systemd cannot be reached (for example, a session without a user bus), the
160
+ installer no longer guesses: nothing is stopped, killed, or removed, and it
161
+ prints what to run once a normal session is available. The process-restart
162
+ fallback now checks per-process supervision by asking systemd which unit owns
163
+ the process — any unit name counts, and an unanswerable check counts as
164
+ supervised. macOS gets the same discipline: a loaded LaunchAgent is restarted
165
+ in place through launchd, an agent the user deliberately stopped is never
166
+ started by an upgrade, and rollbacks restore the exact pre-upgrade enablement
167
+ state.
168
+
169
+ ---
170
+
7
171
  ## [1.18.0] — 2026-07-14
8
172
 
9
173
  ### Changes
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/mgd34msu/goodvibes-tui/actions/workflows/ci.yml/badge.svg)](https://github.com/mgd34msu/goodvibes-tui/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![Version](https://img.shields.io/badge/version-1.18.0-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
5
+ [![Version](https://img.shields.io/badge/version-1.19.1-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
6
6
 
7
7
  A terminal-native AI coding, operations, automation, knowledge, and integration console with a typed runtime, omnichannel surfaces, structured memory/knowledge, and a raw ANSI renderer.
8
8