@pellux/goodvibes-tui 1.17.0 → 1.19.0

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.
Files changed (104) hide show
  1. package/CHANGELOG.md +208 -0
  2. package/README.md +1 -1
  3. package/docs/foundation-artifacts/operator-contract.json +5025 -1636
  4. package/package.json +7 -7
  5. package/src/cli/endpoints.ts +50 -4
  6. package/src/cli/help.ts +29 -2
  7. package/src/cli/management-commands.ts +99 -23
  8. package/src/cli/management.ts +0 -2
  9. package/src/cli/service-posture.ts +5 -3
  10. package/src/cli/status.ts +27 -6
  11. package/src/cli/surface-command.ts +29 -15
  12. package/src/core/consolidation-receipt.ts +41 -0
  13. package/src/core/conversation-rendering.ts +14 -5
  14. package/src/core/memory-diagnostics-gateway.ts +99 -0
  15. package/src/core/memory-provenance.ts +67 -0
  16. package/src/core/memory-status.ts +118 -0
  17. package/src/core/pairing-devices.ts +49 -0
  18. package/src/core/pairing-handoff.ts +101 -0
  19. package/src/core/pairing-offers.ts +83 -0
  20. package/src/core/pairing-origin.ts +78 -0
  21. package/src/core/pairing-tailscale-gateway.ts +56 -0
  22. package/src/core/power-chip-source.ts +91 -0
  23. package/src/core/power-status.ts +95 -0
  24. package/src/core/stable-host.ts +171 -0
  25. package/src/core/stream-event-wiring.ts +21 -0
  26. package/src/core/turn-budget-outcome.ts +60 -0
  27. package/src/core/turn-cancellation.ts +39 -0
  28. package/src/core/turn-event-wiring.ts +6 -0
  29. package/src/core/voice-provision-gateway.ts +202 -0
  30. package/src/core/voice-provision-status.ts +197 -0
  31. package/src/daemon/cli.ts +127 -60
  32. package/src/input/command-registry.ts +21 -0
  33. package/src/input/commands/acp-runtime.ts +72 -0
  34. package/src/input/commands/devices-runtime.ts +109 -0
  35. package/src/input/commands/experience-runtime.ts +25 -4
  36. package/src/input/commands/git-runtime.ts +28 -4
  37. package/src/input/commands/graph-runtime.ts +45 -0
  38. package/src/input/commands/health-runtime.ts +15 -1
  39. package/src/input/commands/operator-rpc.ts +32 -11
  40. package/src/input/commands/power-runtime.ts +56 -0
  41. package/src/input/commands/qrcode-runtime.ts +14 -19
  42. package/src/input/commands/queue-runtime.ts +70 -0
  43. package/src/input/commands/workstream-attempts.ts +6 -1
  44. package/src/input/commands/workstream-runtime.ts +44 -25
  45. package/src/input/commands/worktree-runtime.ts +35 -8
  46. package/src/input/commands.ts +10 -0
  47. package/src/input/config-modal-types.ts +11 -0
  48. package/src/input/config-modal.ts +65 -2
  49. package/src/input/handler-shortcuts.ts +23 -0
  50. package/src/input/keybindings.ts +19 -1
  51. package/src/input/settings-modal-data.ts +31 -37
  52. package/src/input/settings-modal-types.ts +5 -2
  53. package/src/input/tts-settings-actions.ts +27 -8
  54. package/src/input/voice-local-settings.ts +52 -0
  55. package/src/main.ts +42 -42
  56. package/src/panels/builtin/operations.ts +54 -1
  57. package/src/panels/builtin/shared.ts +12 -0
  58. package/src/panels/builtin-modals.ts +49 -32
  59. package/src/panels/diff-panel.ts +34 -1
  60. package/src/panels/fleet-acts.ts +446 -0
  61. package/src/panels/fleet-gateway.ts +117 -0
  62. package/src/panels/fleet-observed-render.ts +128 -0
  63. package/src/panels/fleet-panel-format.ts +120 -4
  64. package/src/panels/fleet-panel-worktree-detail.ts +14 -0
  65. package/src/panels/fleet-panel.ts +60 -44
  66. package/src/panels/fleet-read-model.ts +34 -3
  67. package/src/panels/fleet-spawn.ts +266 -0
  68. package/src/panels/fleet-stop.ts +38 -2
  69. package/src/panels/fleet-tabs.ts +2 -2
  70. package/src/panels/memory-consolidation-gateway.ts +94 -0
  71. package/src/panels/modals/devices-modal.ts +161 -0
  72. package/src/panels/modals/memory-modal.ts +149 -5
  73. package/src/panels/modals/pairing-modal.ts +198 -68
  74. package/src/panels/modals/security-modal.ts +6 -0
  75. package/src/panels/workstream-graph-render.ts +123 -0
  76. package/src/renderer/composer-fragments.ts +69 -0
  77. package/src/renderer/settings-modal-helpers.ts +9 -0
  78. package/src/renderer/settings-modal.ts +4 -2
  79. package/src/renderer/shell-surface.ts +3 -0
  80. package/src/renderer/tool-call.ts +12 -6
  81. package/src/renderer/ui-factory.ts +32 -0
  82. package/src/runtime/bootstrap-command-context.ts +3 -1
  83. package/src/runtime/bootstrap-command-parts.ts +3 -1
  84. package/src/runtime/bootstrap-core.ts +6 -6
  85. package/src/runtime/bootstrap-shell.ts +7 -0
  86. package/src/runtime/code-index-services.ts +15 -1
  87. package/src/runtime/durability-services.ts +36 -1
  88. package/src/runtime/fleet-services.ts +41 -0
  89. package/src/runtime/idle-power-services.ts +85 -0
  90. package/src/runtime/index.ts +2 -0
  91. package/src/runtime/interaction-seams.ts +109 -0
  92. package/src/runtime/knowledge-services.ts +94 -0
  93. package/src/runtime/legacy-daemon-migration.ts +38 -6
  94. package/src/runtime/legacy-daemon-reconcile.ts +439 -0
  95. package/src/runtime/memory-governance-services.ts +79 -0
  96. package/src/runtime/notification-dispatch.ts +28 -0
  97. package/src/runtime/power-keepawake-remote.ts +75 -0
  98. package/src/runtime/process-lifecycle.ts +3 -1
  99. package/src/runtime/services.ts +105 -107
  100. package/src/runtime/ui-services.ts +3 -0
  101. package/src/runtime/voice-setup-services.ts +104 -0
  102. package/src/shell/blocking-input.ts +21 -141
  103. package/src/shell/recovery-input-helpers.ts +53 -166
  104. package/src/version.ts +11 -2
package/CHANGELOG.md CHANGED
@@ -4,6 +4,214 @@ All notable changes to GoodVibes TUI.
4
4
 
5
5
  ---
6
6
 
7
+ ## [1.19.0] — 2026-07-16
8
+
9
+ ### Changes
10
+ - 654eae83 deps: adopt published SDK 1.10.0 and regenerate operator contract artifact
11
+ - a7055269 docs: regenerate command reference + foundation artifacts for the new surfaces
12
+ - 17bcce8a voice setup: live per-component install progress
13
+ - cd1d1889 extract knowledge + voice-setup construction to hold services.ts under the 800-line cap
14
+ - 6eabbe16 compose the memory governor + managed voice provisioning in the daemon
15
+ - 4ea80514 voice status: render the real STT enums honestly
16
+ - c7c99a05 memory: doctor/status surface + pressure notice over ops.memory.get
17
+ - 49b5ac83 voice settings: size-labeled local-engine setup offer beside ElevenLabs
18
+ - f2bf0bb6 voice: /voice setup + /voice status one-act over the managed local-voice verbs
19
+ - f7bb30f6 changelog: macOS in-app fleet coverage, regeneration backups, provenance-gated replacement, kept promises, honest not-probed
20
+ - c26ad724 cli: not-probed is a tri-state on control-plane status and listener test — never a definite reachable:false
21
+ - 50e10f36 installer: the macOS in-app fleet is reachable — both LaunchAgent identities, structural plist provenance, zero silence on pinned plists
22
+ - ac27ebdd installer: replace-broken gate at every call site, backups before fingerprint regeneration, promises fulfilled on transfer refusal
23
+ - 576b3665 changelog: modern-systemd vocabulary, fielded pinned-unit repair, never-touch hand-written units, honest bind displays
24
+ - e63581be cli: every display surface routes endpoint bindings through one formatter seam
25
+ - 4c3c471e installer: hand-written units survive the corpse state untouched; launchd cannot-ask is never free-to-kill
26
+ - 1d3b42d8 installer: re-derive fielded pinned-endpoint units on upgrade (systemd + launchd, transfer + plain paths)
27
+ - 49fa896e tri-state honesty for modern systemd and flapping probes: rc-4 'no such unit' is ABSENT, a failed MainPID query is UNKNOWN
28
+ - 0019f2bf runtime: split the startup reconcile into legacy-daemon-reconcile.ts
29
+ - 3986860e changelog: config-derived units, fail-safe installer, serving-proof reconcile
30
+ - 9433bb11 installer: fail-safe on unknown service state, config-derived unit, endpoint-aware retirement, launchd run-state parity
31
+ - 5b66a3a1 daemon: endpoint-serving proof + never-stop-a-running-daemon on the reconcile; config-derived unit content; display parity flags
32
+ - eba26f90 changelog: describe the hardened migration, reconcile guards, and bind-honest banner
33
+ - b7e7a36e daemon: serving-proof + self-kill guards on the reconcile, timeout-bounded systemctl, bind-honest banner
34
+ - b10000df installer: supervised transfer for the legacy-active upgrade state, exit-status-checked retirement, quoting, launchd analog
35
+ - e55eb1e7 changelog: installer unit unification, honest daemon startup, legacy-unit reconcile
36
+ - 366560a0 daemon: honest startup identity and unattended legacy-unit reconcile
37
+ - 615d60aa installer: unify the daemon service on the canonical goodvibes.service unit
38
+
39
+ ## [Unreleased]
40
+
41
+ ### Fixed
42
+ - Installer now creates one daemon service unit that matches the app. The curl
43
+ installer used to write a `goodvibes-daemon.service` unit with a bare launch
44
+ command (no arguments), while the in-app service setup manages a
45
+ `goodvibes.service` unit launched with `--daemon-home`/`--hostname`/`--port`.
46
+ On upgrade a host could end up running both, and the extra bare unit booted a
47
+ second daemon that fought the real one for the same port. The installer now
48
+ writes only `goodvibes.service` with the same launch arguments the app uses,
49
+ and its create, restart, and uninstall paths all target that one name.
50
+ - Installer upgrade path migrates the old unit safely. When the daemon is
51
+ actively running under a leftover installer-created `goodvibes-daemon.service`
52
+ (the common upgrade state), the installer now performs a supervised transfer:
53
+ it writes the canonical unit, stops the old one, starts the new one, verifies
54
+ it is actually active, and only then disables and removes the old unit. If
55
+ the new unit fails to come up, everything rolls back and the old unit keeps
56
+ running. Every stop/disable checks its exit status — a failed disable (for
57
+ example, no user service bus) leaves the unit file in place and says so,
58
+ instead of removing it behind a false "disabled + removed" message. A
59
+ hand-written unit of that name (no installer marker) is never removed, an
60
+ unreadable one is reported as unreadable, and `GOODVIBES_RESTART_DAEMON=0`
61
+ now also keeps the migration from stopping a running unit. The installer's
62
+ process-restart fallback no longer kills a systemd-supervised daemon, and
63
+ paths with spaces are quoted in the generated unit. macOS gets the same
64
+ upgrade: an installer-managed LaunchAgent with the old bare launch command is
65
+ regenerated to the argument-driven form.
66
+ - Daemon startup prints an honest one-line identity. Launching the daemon binary
67
+ now prints its real version plus the home directory, host, and port it will
68
+ actually bind — the host/port come from the same resolution the bind path
69
+ uses (including the `hostMode` setting and port fallbacks), so the banner can
70
+ no longer claim a loopback bind while listening on every interface, or print
71
+ `port=0`. It points at the `install-service` command, replacing a startup
72
+ banner that could show a wrong `0.0.0` version. Version resolution is
73
+ hardened so a compiled binary can never pick up an unrelated `package.json`'s
74
+ placeholder version.
75
+ - Daemon self-heals the two-unit state at startup, carefully. If the daemon
76
+ finds a redundant installer-created `goodvibes-daemon.service` still enabled
77
+ beside its own unit, it disables and removes it and records what it did — but
78
+ only after verifying the canonical unit is genuinely serving (active with a
79
+ live main process), never from inside the old unit itself (it will not
80
+ disable the unit supervising its own process), never while the old unit has
81
+ a running daemon of its own (a running second daemon might be the one your
82
+ clients reach — retiring it needs the deliberate `migrate-service` command),
83
+ and only once the endpoint clients resolve from settings is confirmed to be
84
+ answering. The unit file is removed only after the disable actually
85
+ succeeded; a disable that times out is re-inspected and reported as exactly
86
+ what was confirmed, never a blanket claim. Refusals are logged with a reason,
87
+ the configured service name and the login home directory are used (custom
88
+ setups reconcile too), and every check runs with a per-call timeout plus one
89
+ overall time budget so even a slow service manager can never stall daemon
90
+ startup. A hand-written unit is only reported, never touched.
91
+ - Service units no longer pin the network endpoint. Both the installer and the
92
+ in-app service setup now write a unit that launches the daemon with only its
93
+ home directory; the daemon reads the configured interface mode, host, and
94
+ port from settings at startup. A host configured for network access or a
95
+ non-default port keeps that endpoint across upgrades — previously an upgrade
96
+ could silently pin the daemon back to loopback and the default port while
97
+ reporting success.
98
+ - Installer understands modern systemd's answers. Current systemd (verified on
99
+ systemd 260) reports "no such unit" with a distinct exit code that older
100
+ releases did not use; the installer now reads that as the affirmative "this
101
+ unit does not exist" — which permits writing the unit and migrating — instead
102
+ of refusing the whole upgrade with a false "service manager unreachable"
103
+ message. Transitional unit states (starting, stopping) are read as the unit
104
+ existing, and the same discipline applies to the daemon's startup check: a
105
+ service query that fails or times out is treated as unanswered, never as
106
+ "the old service is stopped".
107
+ - Existing installs with a pinned network endpoint get fixed on upgrade. Units
108
+ written by earlier releases baked the interface and port into the launch
109
+ command, silently overriding later settings changes on every boot. The
110
+ installer now regenerates recognizably product-managed units (and the macOS
111
+ LaunchAgent) to the settings-driven launch during upgrade; hand-written units
112
+ are never rewritten — they get a clear notice instead, and the migration
113
+ refuses to move a running daemon onto a hand-written unit with pinned flags.
114
+ - Hand-written service units are never modified, even broken ones. A
115
+ hand-written unit whose launch binary no longer exists is left exactly as it
116
+ is (no disable, no rename, no replacement unit written over it) with an
117
+ honest note about how to fix it.
118
+ - macOS installs made by the app itself now get every upgrade repair. The
119
+ in-app service setup registers the daemon under its own LaunchAgent name and
120
+ file, which the installer previously never looked at: pinned endpoints there
121
+ survived every upgrade silently, and the upgrade's restart path could kill
122
+ and orphan a daemon supervised under that name. The installer now handles
123
+ both LaunchAgent identities, restarts either in place, recognizes
124
+ product-installed launch files by their launch command when no marker is
125
+ present, and never stays silent about a launch file that pins the endpoint —
126
+ it is either regenerated (with a timestamped backup and a receipt) or called
127
+ out with instructions.
128
+ - Regenerating a recognized service unit always keeps a backup. A unit
129
+ identified as product-written by its description line may still carry user
130
+ customizations (proxy environment lines, a different binary path); the prior
131
+ file is saved as a timestamped backup next to the original, named in the
132
+ output, before any rewrite.
133
+ - No service unit is replaced unless it is provably platform-managed. The
134
+ broken-unit replacement path (for units whose launch binary vanished) now
135
+ checks provenance at every entry point — a hand-written daemon or agent unit
136
+ is never disabled, renamed, or replaced, even when broken; the installer
137
+ never writes agent units, so it never replaces one.
138
+ - The upgrade promise is always kept. When the installer defers a daemon
139
+ restart to the migration step and the migration then declines (for example, a
140
+ hand-written unit with pinned endpoint flags is in the way), the old unit is
141
+ restarted in place so the freshly installed binary actually starts serving,
142
+ with the reason explained.
143
+ - "Not probed" is reported as exactly that. Control-plane status and the
144
+ listener test no longer show "reachable: no" (or machine-readable false) for
145
+ an endpoint they deliberately did not probe; the output says it was not
146
+ probed and why.
147
+ - Status displays never invent a bind address. Every command that shows an
148
+ endpoint (status, doctor, control-plane status, web, listener test, service
149
+ posture, surfaces) now goes through one shared formatter: an unrecognized
150
+ interface mode is reported as exactly that — with a doctor finding naming the
151
+ fix — instead of being displayed as a definite loopback bind, and such
152
+ endpoints are never port-probed.
153
+ - Installer treats "cannot ask the service manager" as a hard stop. When
154
+ systemd cannot be reached (for example, a session without a user bus), the
155
+ installer no longer guesses: nothing is stopped, killed, or removed, and it
156
+ prints what to run once a normal session is available. The process-restart
157
+ fallback now checks per-process supervision by asking systemd which unit owns
158
+ the process — any unit name counts, and an unanswerable check counts as
159
+ supervised. macOS gets the same discipline: a loaded LaunchAgent is restarted
160
+ in place through launchd, an agent the user deliberately stopped is never
161
+ started by an upgrade, and rollbacks restore the exact pre-upgrade enablement
162
+ state.
163
+
164
+ ---
165
+
166
+ ## [1.18.0] — 2026-07-14
167
+
168
+ ### Changes
169
+ - 04356a3b adopt published SDK 1.9.0 and opt real runtimes into the host power seam
170
+ - 1551e7f2 memory: consolidation proposals surface in the TUI, and a modal clipping bug fix
171
+ - 6d65128a gates: reviewer fixtures carry the acceptance checklist; command reference regenerated
172
+ - a975efdd keep-awake is daemon-held and the chip syncs across surfaces
173
+ - 101d00de surface honesty: resolved provenance summaries, in-panel review checklist and task-graph posture
174
+ - 97ddf140 dev-link: re-link to sdk fd0e6b29 (review wire seam on the fleet node; observed-agent composition subpath bundle entry)
175
+ - 28d48db4 recovery honesty: session-scoped delete, silent auto-restore, no more .preserved dance
176
+ - ed61ab6b one-act lifecycle verbs: approve launches, discard really discards
177
+ - 3ec4f97b surface honesty: two gate tests write fleet.maxSize, not the dead orchestration.maxActiveAgents key
178
+ - ad8eb489 observed rows get a real drill-in steer path
179
+ - 70e55cf9 fork parity: run the startup retention sweep (full roots) and live config-file watch on TUI-composed runtimes
180
+ - 86a3e24c fleet composition: extract createFleetServices helper so the observed wiring fits under the file-size cap
181
+ - 6e50397b daemon composes observed foreign agents: wire observeExternalAgents through the fork so real users see observed rows
182
+ - 4f92cb10 dev-link: re-link to sdk d0a1b96c (observed-agent source exposed on a daemon-composition subpath, unblocks the daemon composing observed rows)
183
+ - 8f84a539 identifier rule: ban worded plan-item labels (mirror the SDK scanner extension)
184
+ - cedeb53e dev-link: re-link to sdk e0a5595d (cert-minting removed, consolidation.receipts verb, recovery/ registered)
185
+ - 62dd21e2 gates: adopt the SDK's fleet.maxSize rename and fix-phase rework; surface new keys; refresh goldens
186
+ - d0d5d9d0 dev-link: re-link to sdk 89690d07 (memory-provenance rides TURN_COMPLETED.metadata.memory.recordIds)
187
+ - d4ad82ce observed foreign agents render in the fleet pane; keep every touched file under the 800-line cap
188
+ - fb721780 consolidation receipts: an idle memory-consolidation run surfaces as a one-line attach notice
189
+ - d2402ea4 memory provenance chip: read the SDK metadata.memory.recordIds convention
190
+ - ebd7f06b task graph renders: a workstream's nodes, edges, states, and pool posture, legible
191
+ - 124332e6 voice settings: local engines surface, the local provider joins the picker, cost stays honest
192
+ - 7a5c5fa9 memory provenance chip: an opt-in "used N memories" turn indicator with a drill-in
193
+ - 93fed956 power surfaces: the "sleep disabled" chip, held-because reasons, the honest lid-split, a one-key toggle
194
+ - 04273e8b queued mid-turn messages: an editable list, edit/delete until delivery
195
+ - 50093a07 dev-link: re-link to sdk a03bf218; adopt per-session recovery + power/consolidation/live-turn services
196
+ - 547fbc36 per-tool cancel: a key stops the running tool call, cancelled result renders structurally
197
+ - 78dc782b /git diff: route the full structural diff into the diff panel, delete the 4,000-char slice
198
+ - 59d0d1b2 dev-link: re-link to sdk a5c63e3b (per-tool cancel, queued-message verbs, power, task graph)
199
+ - c48997e7 fleet: host third-party ACP agents as fleet rows, from the panel and a command
200
+ - 2de952b9 pairing: LAN posture rendered honestly from the SDK, tailscale serve as one action
201
+ - e0d548f9 dev-link: re-link to sdk 64c67eaf (LAN http posture, acp hosting)
202
+ - ee4c8f51 test: drop the forbidden any cast in the conflict-files detail fixture
203
+ - 1573e2d0 operator-rpc: resolve shell paths lazily, after the static refusals
204
+ - 60c9d177 fleet: the pick, conflict, and discard rows act from the panel selection
205
+ - c58becd0 fleet gateway: the pick/conflict/discard verbs over the shared operator invoke path
206
+ - cb150d8e fleet: waiting-on-human inherits the pick and conflict reasons everywhere
207
+ - 5d4d40d4 dev-link: re-link to sdk d07b49e8 (fleet waiting-on-human: picks, conflicts, worktree discard)
208
+ - fd3c1ad8 dev-link housekeeping: move the tarball pins off tmpfs to the durable job dir
209
+ - 08066730 gates: relocate shared pairing modules to core, hold the 800-line cap
210
+ - a8fe4ec7 blocked-too-long settings + honest turn-budget outcomes
211
+ - 47b568c1 pairing bundle UX + a device manager in the security domain
212
+ - 3735b46e pairing: the QR is the deep link, on a name that survives a lease change
213
+ - 1a48f148 dev-link: adopt the SDK pairing hand-off + per-device token surface
214
+
7
215
  ## [1.17.0] — 2026-07-13
8
216
 
9
217
  ### 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.17.0-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
5
+ [![Version](https://img.shields.io/badge/version-1.19.0-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