-
M09-M15: Continuation repair passes (pi-missions branch). Six repair passes closing all spec compliance gaps from the fourth-set missions:
- Repair pass 1: M09 settings controls (show Pi/NALA buttons, permission profile, A2A mode, button order, per-provider diagnostics, launch direct/Pi, repair integration). M10/M11 CAPABILITY_REGISTRY.md, expanded PROTOCOL.md, RPC performance targets, capability version/schema fields. M13 install flags (--version, --channel, --quiet, --repair, --uninstall), nala doctor --install. M14 real /read-aloud with spokenSummary flag, /read-aloud on/off/status, full /play-back forms, /playback alias, persistent audio library, voice settings. 222 tests pass.
- Repair pass 2: M09 settings migration infrastructure (versioning, backup, restore), 10 dogfood scenario test stubs (27 tests). M10/M11 nala_environment_get MCP tool, A2A message envelope (16 types), transport selection settings (8 settings), nala tool call CLI command. M13 deb/rpm manifest entries, TTS runtime version, workspace resolver with git-root detection, settings schema versioning. M14 spoken summary capability registration, audio library TUI overlay, /clips alias. 263 tests pass.
- Repair pass 3: M15 privacy/security audit tests (110 tests: secret redaction, prompt injection, path traversal, envelope security, capability security, settings migration security). Performance benchmark tests (20 tests across 6 categories). Retention audit tests (28 tests: retention, quota, atomicity, crash recovery). Release certification document (23 sections). Documentation/UX consistency audit. Clean-machine test matrix. Dogfood scenario documentation. 290 tests pass.
- Repair pass 4: /settings slash command (list/get/set/reset + /set alias), clip pinning (pin/unpin/isPinned/pinnedClipIds), TTS daemon interface stub, workspace resolver edge case tests (UNC/junction/long paths/Unicode), install lifecycle audit tests (update/repair/rollback/uninstall), final gate certification (31 gates). 192 tests pass.
- Repair pass 5: M09 Phase 7 routing/fallback tests (33 tests), Phase 8 context menu + double-click dedup (31 tests), Phase 9 lifecycle state machine (46 tests), Phase 10 automated tests (33 tests), Phase 11 final evidence report. M12 continuation audit report (22 sections, 22 gates). M10/M11 capability parity matrix + provider transport matrix. Code quality audit (14 files). 143 tests pass.
- Repair pass 6 (code quality fixes): HIGH — RPC spec drift fixed (14 missing method descriptors added, 123→137 methods). MEDIUM — 7 swallowed catches in mcp/index.ts made explicit, /fork stub marked deprecated, runtime-manifest version made dynamic. LOW — temp file permissions set to 0o600. 201 tests pass.
- Repair pass 7: M10 MCP tool coverage (13 missing tools added, 31/31 registered, 32 coverage tests). M12 gate 7 daemon tool handlers (registerToolRpc.ts, 6 handlers, 23 CLI tests). M12 gate 3 RPC spec expansion (73 new methods, 137→210 total). M13 workspace launch integration tests (37 tests). M09 accessibility tests (42 tests). 165 tests pass.
- Repair pass 8: M11 §19 documentation (10 files: ARCHITECTURE, PROTOCOL, TRANSPORT_MATRIX, PROVIDER_CERTIFICATION, SECURITY, PERFORMANCE, FAILURE_RECOVERY, PACKAGING, OPERATOR_RUNBOOK, USER_GUIDE). M11/M10 final evidence reports. M14 TTS daemon interface expansion (9 methods, protocol v2), device selection module, spoken summary storage module. M09 Phase 11 audit tests (35 tests). M10 Phase 12 conformance matrix (64 tests). 171 tests pass.
- Repair pass 9: M10 Phase 10 failure/recovery tests (72 tests, 27 scenarios + degraded states). M10 Phase 11 settings tests (70 tests). M10 Phase 8 permission/security tests (124 tests, 13 scopes + defenses). M14 slash command edge cases (39 tests). M13 packaged build verification (32 tests). 336 tests pass.
- Repair pass 10: M09 Phase 9 process lifecycle and recovery tests (54 tests covering process startup, command rejection, executable missing, provider self-update, auth flow, quota exhaustion, daemon restart, renderer reload, desktop restart, orphan cleanup, Ctrl+C/terminal close, app shutdown, crash restore, multi-workspace, multi-instance, process-tree cleanup). M10 Phase 9 observability and self-awareness tests (35 tests: fleet view, canonical event stream, trace causality, A2A envelope observability, lifecycle observability, route observability). M14 TTS synthesis pipeline tests (35 tests: synthesis request validation, result structure, playback queue, device selection, service status, end-to-end pipeline, protocol version). M13 install script verification tests (34 tests: install.sh flags/HTTPS/SHA-256/CLI shim/PATH, install.ps1 flags/TLS/Get-FileHash/Squirrel, cross-platform consistency, runtime manifest integration). Final certification documents created (FINAL_RELEASE_CERTIFICATION.md, updated CONTINUATION_AUDIT.md, m15-final-gate-certification.md, FINAL_SUMMARY.md). 158 tests pass.
- Repair pass 11: Fast-follow tasks closing 8 previously documented limitations. Dedicated
nala rollback command (M15 gate 29 → READY, 17 tests with --yes/--dry-run/--version flags). UNC path handling in workspace resolver (M15 gate 8 enhanced, 10 Windows-guarded tests covering \\server\share\project, .git walk-up, trailing backslash, forward slash, long UNC paths). Spoken summary → persistent library pipeline (spoken-summary-pipeline.ts, 11 tests). Audio device selection completion (tts-audio-output.ts AudioOutputManager, 14 tests). RPC spec expansion 210→341 methods covering all 331 daemon-registered methods (M12 gate 3 → READY). Spec validation against live registrations (rpc-spec-validation.test.ts, 13 tests). Capability key system reconciliation (capability-reconciliation.test.ts, 21 tests). Verified all 54 m09-process-lifecycle tests pass (previously 2 failing). 86 tests pass. Total project: 3,335 tests pass across 134 test files, 0 failing.
- Repair pass 12: Dedicated
nala update command (M15 gate 27 enhanced, 21 tests with --check/--dry-run/--yes/--channel flags). Chaos testing infrastructure (chaos-test-harness.ts with 4-phase execution, 12 harness tests + 12 scenario tests covering daemon crash, provider crash, socket break, disk full, network partition, concurrent modification, memory pressure, slow provider). M12/M13/M14 final evidence reports (22 + 14 + 15 sections per spec). Certification updates across 5 files: M12 gate 3 → READY (341 methods), M15 gate 29 → READY (rollback command), M15 gate 8 enhanced (UNC tests). Combined gate totals: 42 READY, 7 READY_WITH_LIMITATIONS, 3 PENDING, 0 BLOCKED. 62 tests pass.
- Repair pass 13: TTS daemon service implementation (
tts-daemon-service.ts with createTtsDaemonService factory, 9 methods, FIFO queue with concurrency cap and timeout, AudioOutputManager integration, 30 tests). TTS daemon extraction design document (TTS_DAEMON_EXTRACTION_DESIGN.md, 13 sections covering current/target architecture, 4-phase migration path, protocol design, security, performance, backward compatibility). Auto-updater E2E simulation (31 tests covering update detection, installation, rollback after failed update, version compatibility, channel management, update lifecycle with graceful failure, checksum verification, download retry). Dogfood scenario automation (24 tests covering 5 E2E scenarios: fresh install, update existing install, multi-workspace session, read-aloud workflow, provider crash and recovery). Cross-mission conformance report (CROSS_MISSION_CONFORMANCE_REPORT.md, 486 lines covering M09–M15 conformance, mission-by-mission analysis, cross-mission dependencies, test coverage matrix, documentation coverage, gate status summary, remaining gaps). Fixed 2 flaky performance benchmark tests in m15-performance-benchmarks.test.ts by separating library construction from the measured operation, making the 1000-clip add/delete benchmarks deterministic. 85 new tests pass across 3 test files, no regressions. Total project: 3,436 tests pass across 138 test files, 0 failing.
- Repair pass 14: M15 final evidence report (19 sections per spec, 31-gate table). Release readiness checklist (8 sections: pre-release, release process, post-release, rollback, emergency, sign-off). Operator runbook updated with 5 new sections (§9 nala update, §10 nala rollback, §11 channel management, §12 TTS daemon, §13 chaos testing). Test coverage report (151 test files, 3,418 test cases, 60.4% file-level coverage, source-to-test mapping, untested files, recommendations). Fixed 2 flaky performance benchmark tests. Certification updates across 5 files.
- Repair pass 15: Closed test coverage gaps. 8 high-priority untested source files now have dedicated tests (cli-performance-targets 38, profile-types 44, provider-registry 25, provider-certification 31, provider-manifests 97, llm-attribution 33, ids 26, errors 33 = 327 tests). M12-prefixed tests created (m12-benchmark-gate 28, m12-release-gate 15 = 43 tests). A2A E2E delivery latency simulation (23 tests covering envelope creation/validation/enqueue/delivery/e2e/priority/idempotency/rate-limiting/size). 5 type-definition module tests (delegation-types 22, settings-types 18, trace-types 37, artifact-types 27, message-types 27 = 131 tests). 5 smallest test files expanded (chaos-scenarios 4→22, task-types 5→40, turn-ownership 8→20, secretRedaction 8→40, dev-prod-isolation 9→29 = +77 tests). 675 new/expanded tests pass across 21 files. M12 gate 11 (A2A_PERFORMANCE_READY) upgraded to READY. Total project: 4,069 tests across 154 test files, 0 failing. File-level coverage improved from 60.4% to 73.3% (74 of 101 source files with tests).
-
NALA CLI/TUI Agent — Second Set Missions M01-M04 (pi-missions branch). Complete implementation of the NALA CLI/TUI as a first-class client of the shared NALA daemon, covering protocol, TUI, agent OS intelligence, and distribution.
- M01: Shared daemon CLI runtime and command surface — Client protocol, daemon discovery, multi-client sessions, event streaming, command registry, public commands. 35+ source modules in
src/cli/ with barrel exports via src/shared/nala/index.ts. Path traversal protection in resolveWorkspaceConfigPath(). All tests pass.
- M02: Flagship TUI, NALA agent, and provider runtime — Agent identity and profiles, TUI architecture and terminal capabilities, interactive user flows, slash command system, provider-native backend integration, single-engine invariant (model-call firewall), NALA tools injection, skills/extensions/MCP UX, tasks/artifacts/A2A/delegation in TUI, context/memory/diff UX, voice and notifications, settings/onboarding parity, edge-case validation. 1146 tests across 46 files.
- M03: Agent OS intelligence, A2A, observability, and security — Workspace intelligence service, context broker, typed scoped reversible memory, durable A2A + task pipeline, one-writer worktree ownership, canonical local observability ledger, security hardening program, provider privacy/conformance lab, eval-gated quality + self-improvement, 2030-ready extension seams, chaos/adversarial/scale testing, desktop/TUI UX integration. 790 tests.
- M04: Distribution, installers, updates, release, and ecosystem — Product identity + executable strategy, one-line installers (Windows/macOS/Linux/offline enterprise), PATH + shell behavior + completions (14 shells), version/protocol compatibility, trustworthy atomic update system with journaling/rollback, packaging (Pi/skills/extensions/MCP/adapters), provider prerequisites + first-run experience, entitlements/accounts/local-first, documentation generation, release engineering with SBOM/SLSA, clean-machine cert matrix, performance budgets, failure and recovery UX, future ecosystem seams. 533 tests across 27 files.
- M05a-d: Continuation audits — Validated M01-M04 with fixes: barrel exports, path traversal protection, import path fixes, Zod
.strict() consistency (13 schemas fixed). All audit reports in docs/nala-cli/audits/.
- M05 Final: Production gate — Resolved pre-existing TTS merge conflicts (4 files:
audioPlayback.ts, useReadAloud.ts, ReadAloudInput.tsx, audioPlayback.test.ts), restoring pre-buffering, flushPending(), and doReplay refactor. Full test suite: 13049 tests pass (0 failures). Comprehensive architecture, security, and quality audit completed.
-
M01-M03: Single-engine Pi-wrapped provider runtime, product integration, and certification. Three final-integration missions implementing the complete provider-wrapping architecture:
- M01: Execution taxonomy + launch grants + recovery state machine — New typed schemas in
src/shared/nala/: execution-taxonomy.ts (ReasoningOwner, Mission01ExecutionMode, CredentialOwner, BillingClass, AuthRoute, ToolLoopOwner), launch-grant.ts (WrappedLaunchGrant with HMAC signing, LaunchGrantStore with single-use redemption), provider-launch-intent.ts (ProviderLaunchPreference, ProviderLaunchIntent), recovery-states.ts (19-state RecoveryStateMachine with transition enforcement), llm-attribution.ts (LlmAttribution with verified/estimated/unavailable confidence, 30+ extended event types). Single-engine invariant test with throwing model factory.
- M02: Session header + launch intent dialog + event renderer — New renderer components:
SessionHeaderStrip.tsx (compact accessible header with callsign, provider, execution mode, auth/billing, health), SessionInspector.tsx (expandable details drawer), ProviderLaunchIntentDialog.tsx (mode/profile/worktree/permission selection), NormalizedEventRenderer.tsx (renders prompts, responses, tool calls, approvals, diffs, A2A messages, errors).
- M03: Provider certification + conformance harness + fake ACP fixtures —
provider-certification.ts (ProviderCertificationSchema with 16 fields, CertificationStatusSchema), ProviderCertificationStore.ts (CRUD with atomic writes, expiry, revocation), ConformanceHarness.ts (15 standard tests: installation, auth, read-only prompt, controlled edit, MCP, A2A, artifact, permissions, cancellation, restart, quota, cleanup, fallback, single-engine, redaction), FakeAcpFixtures.ts (15+ fixture scenarios: normal, malformed, oversized, crash, canary, forged identity).
- S01: SessionBindingStore tests — 65 tests covering stampIdentity, get by runId/piSessionId/agentId, status updates, rebind, write outcome tracking, branch ancestry, atomic write/corruption recovery, workspace listing.
- S04: DiagnosticsService scaffold —
DiagnosticsService.ts with configurable provider registry, content-hash caching, test impact suggestions, bounded results, graceful degradation. 21 tests. 6 new RPC methods.
- S08: License inventory script —
scripts/generateLicenseInventory.mjs reading package-lock.json, extracting license/homepage/author for all deps. 9 tests.
-
S06: Skills manager + extension system scaffold. Two new daemon services with full CRUD, file-backed persistence, and RPC wiring: (1) SkillsManagerService (src/daemon/nala/skills/SkillsManagerService.ts) — durable CRUD for named, versioned agent skills (built-in + custom); 5 built-in skills seeded (code-review, test-runner, doc-generator, bug-triage, refactor); built-in re-merge preserves user enable/disable toggles across reopens; custom skill id collision with built-in ids rejected; 23 tests. (2) ExtensionSystem (src/daemon/nala/extensions/ExtensionSystem.ts) — isolated lifecycle management (install → enable → disable → uninstall); activation errors recorded as status='error' without crashing sibling extensions; manifest validation via Zod; upgrade-in-place preserves installedAt; 20 tests. Shared types: skill-types.ts (SkillDefinition, SkillCreateInput, SkillUpdateInput, SkillQuery) and extension-types.ts (ExtensionManifest, ExtensionRecord, ExtensionInstallInput). 13 new RPC methods (nala.skills.*, nala.extensions.*) registered via registerSkillsExtensionsRpc.ts, wired into NalaOrchestrationService, capabilities, and METHOD_CAPABILITY map. Bug fix: deriveId now uses hyphens (not dots) to match the ExtensionRecordSchema id regex; mutate() now persists draft on throw so error states are durable.
-
S07: Fake provider suite for CI + conformance tests. 5 new conformance modules in src/daemon/nala/conformance/: (1) FakeProviderSuite — deterministic fake provider adapters for CI (no real provider processes); 117 tests covering all fake provider behaviors. (2) CertificationRunner — runs certification suites against providers; 8 tests. (3) ChaosSuite — chaos engineering probes for failure injection; 9 tests. (4) PrivacyProbe — privacy compliance verification probes; 13 tests. (5) RoutePolicyService — route policy enforcement and validation; 15 tests. Total: 162 conformance tests, all passing.
-
S03: A2A end-to-end pipeline tests + worktree lease orchestrator. (1) a2aPipeline.e2e.test.ts — 11 end-to-end tests exercising the full NALA orchestration pipeline: task creation → agent assignment → A2A message exchange → delegation with cycle detection → task failure → worktree lease expiry → subtree cancellation → DAG building. Uses real JsonOrchestrationStore and NalaOrchestrationService with FakeNalaAdapter. (2) WorktreeLeaseOrchestrator (src/daemon/nala/worktrees/WorktreeLeaseOrchestrator.ts) — coordinates worktree lease lifecycle with task state; 9 tests. (3) WorktreeLeaseService + WorktreePrepService tests — 19 tests covering lease acquisition, renewal, expiry, and worktree preparation. Total: 48 worktree/orchestration tests, all passing.
-
S08: SBOM generation tests. 7 tests for scripts/generateSbom.mjs covering SPDX 2.3 document validity, app package version correctness, document namespace, relationships array, packages array, empty dependencies handling, and undefined field cleanup. All passing.
-
S02: EcosystemPanel — package catalog, review, quarantine, and safe mode UI. New renderer component (src/renderer/nala/components/EcosystemPanel.tsx) with 4 tabs: (1) Catalog — all packages (built-in + user-installed) with status badges, enable/disable/remove actions, and capability tags; (2) Review — pending intake reports for reviewer approval; (3) Quarantine — quarantined packages with release action; (4) Safe Mode — safe mode toggle with enter/exit and active status display. 8 tests covering tab rendering, RPC loading, empty states, close behavior, and tab switching. i18n keys added to en.ts and ko.ts.
-
Authenticode verification in install.ps1. Windows installer now verifies Authenticode signatures on downloaded binaries before installation. Verification activates automatically once signing certificates are available; gracefully skips (with warning) for unsigned dev builds.
-
NALA static terminal wordmark and launch banner (Mission 07). First-party checked-in banner assets (src/cli/brand/) with 4 variants (wide, standard, compact, plain) for responsive terminal widths. banner.ts module provides deterministic variant selection by terminal width, ANSI color support with NO_COLOR respect, and renderStartupBanner() composition with workspace/provider/runtime/A2A status lines. 18 tests. Phase 1 audit confirmed no superseded mascot/art code to remove.
-
Scrollback restore Fix B — cap-aware reconcile with promoteSession. Suspended sessions that were cap-skipped during recovery (MAX_RECOVER_SESSIONS=40) can now be promoted on demand when the renderer reconcile encounters their ptyId. New daemon.promoteSession RPC (idempotent on active, not-found for missing, resource-exhausted at MAX_SESSIONS=200) reuses the extracted promoteOneSession helper. daemon.listSessions extended with { includeSuspended?: boolean } param to merge disk-only suspended sessions into the response. AppLayout reconcile routes suspended ptyIds through promote → reconnect instead of fallback-create. 20 new tests across daemon + renderer.
-
Pane split max depth guard. splitPane now enforces a MAX_SPLIT_DEPTH=6 limit in addition to the existing 20-pane count cap, preventing infinitely nested splits. Depth-blocked splits set a blockedAtDepth flag and show a warning toast. 3 new tests.
-
TTS corrupt model recovery. On Protobuf parsing failed / corrupt Kokoro ONNX cache load, the TTS worker clears transformers.js model caches and retries once; if q4 still fails, falls back to q8. User-facing errors are marked recoverable (retry / change quality) instead of a fatal crash.
-
nala:rpc cold-start daemon wait. Internal nala:rpc no longer immediately throws DAEMON_DISCONNECTED before first daemon ping — waits up to ~18s with backoff for cold start. Mid-session disconnects after a successful connect still fail immediately.
-
STT push-to-talk default + mic sensitivity. Default PTT hotkey is Control+Shift+Space (avoids bare Space false starts). Settings → Dictation adds a mic sensitivity slider (0–100) that maps to the VAD energy floor in audioCapture (replacing the hard-coded 0.008 threshold). Preference persists in session data.
-
Agent idle detection + tab fig-8 freeze. Claude Code end-of-turn verbs (Cogitated for 28s, Cooked for …, etc.) now map to waiting; esc to interrupt remains non-waiting (in-flight). When ActivityMonitor goes quiet on a known agent, PTYBridge keeps waiting + agentName instead of clearing to idle. Renderer isSubstantivePtyOutput ignores pure ANSI/TUI chrome so the tab figure-8 stops spinning after a turn ends.
-
Workspace auto-trust for A2A / plugin-exec. User-opened and session-restored workspaces call workspaceTrust.setTrust; a one-shot ensureWorkspacesTrustedOnce on AppLayout mount also trusts the slice-init first workspace so boot agents are not stuck behind an untrusted gate (does not re-run, so a later user untrust is not clobbered).
-
Single-pane active border toned down. Solo leaves no longer draw a bright active accent border (shouldShowActivePaneAccent); multi-pane focus border still uses a dimmed cursor accent.
-
Toast duplicate suppression (stale-daemon spam guard). pushToast now suppresses exact message+level duplicates while an identical toast is still in the list, returning the existing toast's id. Prevents stale-daemon error spam from stacking to the MAX_TOASTS=10 cap when multiple components poll the same dead RPC method. Different message or level still admits; re-admits after auto-dismiss. 4 new tests.
-
Git-oracle test flakiness hardened. The g() helper in diff.handler.test.ts and all git calls in diffParse.test.ts now use retry (2x) with 100ms backoff and 15s per-call timeout, matching the applyPatchInRepo pattern. Eliminates bare execFileSync flakiness under heavy parallel I/O.
-
Mission 05 production hardening gaps closed. Three missing Mission 05 deliverables implemented: (1) ReconciliationService (src/daemon/nala/orchestration/ReconciliationService.ts) — detects ambiguous write outcomes (timeout, crash, partial response) by checking actual file/git state against expected hashes; returns APPLIED/NOT_APPLIED/AMBIGUOUS/CONFLICT verdict; bounded retry with reconciliation never auto-retries AMBIGUOUS or CONFLICT; 22 tests. (2) RemotePolicyService (src/daemon/nala/policy/RemotePolicyService.ts) — fetches signed policy manifests from NALA_POLICY_URL, verifies SHA-256 hash pin, caches with TTL (default 24h), falls back to BUNDLED_SAFE_POLICY on any failure; applies remote kill-switches to local route policy; 12 tests. (3) ProviderDriftDetector (src/daemon/nala/policy/ProviderDriftDetector.ts) — compares installed provider versions against compatibility matrix, returns drift severity (none/warning/critical), batch detection for all providers; 9 tests. (4) UninstallCleanupService (src/daemon/nala/maintenance/UninstallCleanupService.ts) — removes Pi runtime artifacts and NALA session state with dryRun default true, bounded by orchestration root and Pi home, never touches user data; 15 tests. (5) NALA model provider manifest — added nala provider to provider-manifests.ts as a first-party orchestration decision provider (not code-writing), internal transport, local_runtime auth, enabled by default false. 8 new RPC methods registered (nala.reconciliation.check/retry, nala.policy.remote.fetch/status, nala.policy.drift.detect/report, nala.maintenance.cleanup.preview/execute). 2 new capability keys (nala.policy, nala.maintenance). API reference regenerated.
-
i18n for NALA renderer components. All 20 new NALA renderer components (SettingsPanel, OperationsDashboard, LaunchCard, UnifiedApprovalDialog, FirstRunWizard, RepositoryMapPanel, SymbolExplorerPanel, MemoryManagerPanel, ContextPreviewPanel, OrchestrationSettingsPanel, ContextMemorySettingsPanel, ObservabilitySettingsPanel, ProfileEditor, ProfileCompareView, RoleCard, WorkflowCard, AlertList, FleetPanel, SpanTreeViewer, NalaPanelsHost) now use the useT() hook and t() translator instead of hardcoded English strings. 60+ new translation keys added to src/renderer/i18n/locales/en.ts under the nala.* namespace. Other locales fall back to English automatically for missing keys (by design).
-
NALA panel wiring and renderer component tests. All 12 top-level NALA panels (Settings, FirstRunWizard, OperationsDashboard, LaunchCard, UnifiedApprovalDialog, OrchestrationSettings, ContextMemory, Observability, RepositoryMap, SymbolExplorer, MemoryManager, ContextPreview) are now mounted in the app shell and reachable from three entry points: (1) Command palette — 12 new Ctrl+Shift+P entries including a launchCard sub-mode that lists each provider; (2) NalaOrchestrationBar "NALA" dropdown — 10 drawer panels; (3) Settings → NALA tab "NALA Panels" section — buttons opening all 10 drawers. Central open/close state lives in uiSlice (NalaPanelId union + openNalaPanel/closeNalaPanel actions, plus nalaLaunchCardProvider and nalaApprovalRequest slots for the modal/dialog). NalaPanelsHost is mounted in AppLayout and renders every panel conditionally. FirstRunWizard auto-opens once per profile via a localStorage marker (nala.firstRunCompleted). Added 7 new renderer test files (148 tests, all passing): SettingsPanel, OperationsDashboard, LaunchCard, UnifiedApprovalDialog, FirstRunWizard, RepositoryMapPanel, MemoryManagerPanel — covering tab rendering, RPC flows, CRUD operations, error states, and closed-state behavior using the established window.electronAPI.nala.rpc mock bridge pattern. Regenerated docs/api/reference.md to include the new Pi bridge alias RPC methods.
-
Workspace intelligence UI (S04 WS9). 4 new renderer components + 1 shared helper: (1) RepositoryMapPanel — file inventory viewer with per-file identity (path, language, size, classification, sensitivity), summary stats, ignore-policy block, indexing controls (scan/pause/resume), and filters by path/language/classification/sensitivity; (2) SymbolExplorerPanel — two-column symbol viewer with searchable list, kind-colored badges, detail pane (signature/docs/source/confidence), and outgoing/incoming dependency edges; (3) MemoryManagerPanel — full CRUD memory manager with scope/category/state filters, inline editor, retention policy editor, and admit/reject/pin/expire actions; (4) ContextPreviewPanel — context assembly viewer with strategy selector, token budget bar, per-item cards with "why this context" selection reasons, and compact action; (5) s04Rpc.ts — shared RPC helper + useActiveWorkspaceId hook.
-
Pi bridge tools — task, worktree, terminal, search, trace (13 new tools). The Pi bridge extension (integrations/pi/package/src/tools/) now exposes 13 new tools beyond the existing A2A and artifact tools: (1) Task tools — nala_task_get, nala_task_update, nala_task_complete, nala_task_list; (2) Worktree tools — nala_worktree_request, nala_write_lease_status, nala_worktree_release; (3) Terminal tools — nala_terminal_list, nala_terminal_send (returns descriptive error — PTY lifecycle is owned by main process); (4) Search tools — nala_workspace_search, nala_symbol_search; (5) Trace tools — nala_trace_note, nala_progress_update. All tools use env-var identity (not model-supplied IDs), Zod input validation, and graceful error handling. 10 new daemon RPC alias handlers in registerPiBridgeAliasRpc.ts bridge tool method names to existing services.
-
Operations dashboard (S05 WS6). 4 new renderer components for NALA observability: (1) OperationsDashboard — 4-tab drawer (Fleet/Timeline/Alerts/Diagnostics) with live fleet view, per-run timeline with span tree, alert management with ack/resolve, and diagnostics with provider status, resource usage, and support bundle export; (2) SpanTreeViewer — expandable/collapsible span tree with color-coded status dots and detail expansion; (3) AlertList — alert list with severity badges, filters by severity/state/source, and acknowledge/resolve actions; (4) FleetPanel — agent grid with status indicators, callsign, provider, model, route, task, worktree, pending questions, and cancel/steer/open actions, auto-refreshing every 10s.
-
Launch card, unified approval UX, and settings panels (S06 WS4/WS6/WS7). 5 new renderer components: (1) LaunchCard — detailed provider launch card with route selector, profile summary, capability badges, billing class indicator, expandable details, compact/full modes, and changed-state indicator; (2) UnifiedApprovalDialog — comprehensive approval dialog for 9 permission types (filesystem, shell, network, git, browser, MCP, spawn, secret, external path) with risk-level color coding, 5 decision choices (deny once, allow once, allow for run, allow for workspace, allow for profile), and capability summaries; (3) OrchestrationSettingsPanel — orchestration mode, delegation limits, default roles, review rounds, supervisor questions, notification preferences; (4) ContextMemorySettingsPanel — context strategy, indexing controls, memory categories with per-category retention, secret scanning toggle, memory search interface; (5) ObservabilitySettingsPanel — trace content mode, retention by event class, exporter consent toggles, support bundle export, "what is stored" inspector.
-
S06 renderer UI — settings, profiles, roles, workflows, first-run wizard. 6 new renderer components in src/renderer/nala/components/: (1) SettingsPanel — tabbed drawer (Settings/Profiles/Roles/Workflows) with scope selector, effective settings list with inline edit and reset, export, migration list; profile CRUD with clone/compare/export/health; role and workflow card grids. (2) ProfileEditor — modal for creating/editing provider profiles with write-policy checkboxes. (3) ProfileCompareView — side-by-side diff modal showing field-level differences. (4) RoleCard — role display with capabilities, boundary policy, delegation rights, and signing status. (5) WorkflowCard — workflow display with ordered stages, role assignments, and parallel fan-out. (6) FirstRunWizard — 5-step wizard (welcome → provider → profile → review → done) that creates a profile and writes initial settings. All components use the established window.electronAPI.nala.rpc bridge and Tailwind CSS variable theming.
-
MCP pinned terminal route invalidation when workspace dies (P2). When an external MCP caller claimed a dedicated workspace and the user manually closed that workspace mid-session, the process-lifetime pin in paneResolver kept pointing at the dead PTY, causing the caller's terminal tool to permanently fail until MCP restart. invalidateWorkspaceId() (the stale-identity self-heal path in src/mcp/index.ts) only cleared the workspaceResolved verified-cache flag, not the pin. Added clearPin() export to paneResolver.ts and wired it into invalidateWorkspaceId() so both call sites in callRpc (success-path and error-path stale-result checks) now clear the pin alongside the verified cache, enabling self-healing re-claim on the next call. 4 new tests added.
-
Terminal DSR-CPR response leak after channel mention paste (P2). When a channel mention was pasted into a pane, the cursor position response (ESC[<row>;<col>R, e.g. ESC[40;3R) was not consumed by the TUI during rapid paste/repaint transitions and instead leaked back through the PTY output stream as literal text (e.g. ;3R40 appearing in bulk in the scrollback). This is the same class of bug as the 2026-07-04 CPR feedback storm (replay-time, fixed by replayQuerySanitizer.ts), but on LIVE output. Added a stateful CprResponseFilter (src/renderer/terminal/cprResponseFilter.ts) that strips CPR response sequences from PTY output before they reach xterm.js. The filter is per-terminal (instantiated in useTerminal's main effect) and handles chunk-boundary splits by buffering incomplete CSI prefixes. DSR queries (ESC[6n) are preserved — xterm must see those to generate the responses the TUI expects. CPR responses are terminal reports, never display content, so stripping is lossless for the user. 19 unit tests added.
-
METHOD_CAPABILITY map completed for all 273 nala. RPC methods.* The daemon registers 273 nala.* RPC methods via .onRpc(), but METHOD_CAPABILITY in src/main/mcp/methodCapabilityMap.ts only knew about 72 of them — leaving 201 methods ungated and absent from the RpcMethod union type and ALL_RPC_METHODS array in src/shared/rpc.ts. This caused tsc errors (Record incompleteness), 2 test failures in methodCapabilityMap.test.ts (totality + capability validity), and API reference drift. Added all 201 missing methods to rpc.ts, methodCapabilityMap.ts (all using wmux.internal capability, matching the existing substrate-internal pattern), and regenerated docs/api/reference.md. Root cause: DaemonPipeServer.onRpc() accepts an untyped string, so methods could be registered without being added to the type system.
-
Provider conformance, privacy, chaos, and certification lab (Mission S07). NALA now has a provider conformance lab for certifying that each provider route meets the universal agent contract before being advertised. (1) CertificationRunner (src/daemon/nala/conformance/CertificationRunner.ts) — runs 13 standard scenarios (read-only, plan, write, tool, approval, A2A, cancel, resume, model switch, error, quota, offline, cleanup) against a UniversalAgentAdapter, produces a tamper-evident CertificationReport with SHA-256 resultsHash and per-scenario pass/fail observations. Error and quota categories expect graceful failures. (2) RoutePolicyService (src/daemon/nala/conformance/RoutePolicyService.ts) — bounded JSON persistence (max 512 policies) for per-provider, per-route metadata with 5 statuses (certified, experimental, personal_only, blocked, unknown), kill-switch (disableRoute), re-certification requirement (enableRoute), version-window checking (isRouteSupported), and 30-day offline cache (cacheForOffline). (3) ChaosSuite (src/daemon/nala/conformance/ChaosSuite.ts) — 11 standard chaos scenarios (process crash, network partition, disk full, OOM, slow response, corrupted state, permission revoked, token expiry, concurrent writes, dirty git, missing files) with filesystem reconciliation that never auto-retries ambiguous writes. (4) PrivacyProbe (src/daemon/nala/conformance/PrivacyProbe.ts) — creates a synthetic repo with allowed/ignored/excluded files, nested .git, symlinks, and canary secrets in .env/secrets/node_modules/dist/nested-repo; verdict fails on canary exposure, excluded/ignored file access, or blocked network calls. (5) Shared schemas (src/shared/nala/conformance-types.ts) — Zod schemas for certification scenarios/results/reports, route policy metadata, chaos scenarios/results, and privacy probe results. (6) RPC (registerS07Rpc.ts) — 14 endpoints for scenario listing/validation, route policy CRUD, chaos scenario listing/validation, and privacy probe helpers. (7) Tests — 79 new tests (17 schema, 8 certification, 15 route policy, 9 chaos, 13 privacy, plus existing conformance kit).
-
Settings, profiles, and roles/workflows system (Mission S06). NALA now has a layered settings resolver, provider profile system, and signed roles/workflows for governing agent behavior across workspaces. (1) SettingsService (src/daemon/nala/settings/SettingsService.ts) — effective-settings resolver with 4-scope precedence (defaults → user → workspace → session), setting definitions with securitySensitive flag, CRUD, import preview (quarantines unknown keys), migrations with version stamps, health test, and export (never includes secrets, only secretRefs). Corruption recovery via atomic read with fallback. (2) ProfileService (src/daemon/nala/profiles/ProfileService.ts) — provider profile CRUD, clone, compare (diff of providerId, authRef, billingClass, model, mode, permissions), import preview (detects missing providers, unknown capabilities, executable resources), import (forces autoActivate: false), export (strips secrets), health test. 3 built-in profiles (full-access, supervised, read-only). Bounded to 1,000 profiles. (3) RoleService (src/daemon/nala/roles/RoleService.ts) — 7 signed built-in roles (scout, researcher, planner, implementer, reviewer, verifier, oracle) with capability sets and boundary policies; 7 built-in workflows (research-then-implement, plan-review-implement, parallel-scouts, sequential-review, verify-after-implement, oracle-consult, full-cycle); custom role/workflow creation with signing. (4) Shared schemas (src/shared/nala/settings-types.ts, src/shared/nala/profile-types.ts) — Zod schemas for settings, profiles, import previews, comparisons, migrations, and resets. (5) RPC (registerS06Rpc.ts) — 20+ endpoints for settings (resolve, update, reset, export, importPreview, importSnapshot, definitions, migrations), profiles (upsert, get, list, delete, clone, compare, importPreview, importProfile, export, healthTest), and roles/workflows (list, get, create custom). (6) Tests — 47 new tests (16 settings, 18 profiles, 13 roles).
-
Trace bridge wiring (Mission S05 fix). JsonOrchestrationStore now forwards every appendActivity call to TraceIngestionService via setActivityListener(). Added 30+ dotted-form event kind mappings (task.created → task_created, etc.) to TraceIngestionService. Added eventsByTrace index to TraceLedgerService for efficient trace-level queries. Relaxed AlertService and ExporterService to accept partial upserts with schema-parsed defaults.
-
Production packaging, updates, and release certification documentation (Mission S08). 11 new operational documentation files: (1) pi-release-dependency-graph.md — frozen dependency graph with SBOM, provenance, hashes, licenses, and scans; (2) pi-reproducible-build.md — reproducible build for all components with integrity verification; (3) pi-installer-platform-matrix.md — Windows/macOS/Linux installer integration matrix; (4) pi-data-migration-rollback.md — transactional migrations, backup, compatibility windows, rollback; (5) pi-secure-updates-remote-policy.md — TUF-inspired update metadata, channels, rollout, remote policy; (6) pi-saas-entitlements-usage.md — feature classification, entitlements, usage metering, account lifecycle; (7) pi-clean-machine-upgrade-certification.md — clean VM test matrices for all platforms; (8) pi-security-resilience-certification.md — security/chaos/soak suites with 24-hour soak plan; (9) pi-support-playbooks.md — 10 support playbooks (auth, provider drift, quarantine, etc.); (10) pi-final-release-gate-rollout.md — final gate evaluation with gradual rollout; (11) RELEASE_CERTIFICATION_REPORT.md — final certification report with S01-S08 gate verdicts (46/52 PASS, 6 EXTERNAL).
-
Continuation audit report (Mission S09). docs/desktop-saas/MISSION-S09/CONTINUATION_AUDIT_REPORT.md — full audit of S06-S08 with 10 findings, 5 fixes applied, gate verdicts, and final release gate verdict of READY_WITH_EXPLICIT_LIMITATIONS. All 1,014 NALA tests pass across 71 test files with 0 TypeScript errors.
-
Production hardening (Mission 05). NALA's orchestration layer is now hardened for production with 8 batches of security, governance, and reliability improvements. (1) Electron/IPC/process hardening (B1) — CSP now enforced in development mode with Vite HMR allowances; frame-ancestors 'none' and base-uri 'self' added to prevent clickjacking and base tag injection; shared Zod schemas (src/main/ipc/schemas.ts) for high-risk IPC handlers (pty.create, pty.resize, pty.dispose, shell.openExternal, shell.openPath, clipboard.write, diff.request, fanout.request, worktask.ref, tts.speak) with size limits, format validation, and enum constraints; pty.create handlers validate payload shape before process-spawning code runs. (2) Resource governance and emergency stop (B2) — centralized ResourceLimitsSchema with safe defaults for task runtime, idle timeout, artifact size, storage quota, tool result size, delegation depth, concurrency, message size, provider health-check interval, process count, and retry limits; all limits configurable via NALA_* environment variables; global emergency stop via NALA_EMERGENCY_STOP=1 disables all non-core features in the capability manifest; validation helpers for artifact/tool result/message/delegation depth/runtime; exponential backoff calculator. (3) Provider compatibility matrix and policy manifest (B3) — signed ProviderPolicyManifestSchema with per-provider, per-transport route status (approved, experimental, personal-only, blocked); BUNDLED_SAFE_POLICY as last-known-good fallback; ProviderCompatibilityMatrixSchema with version ranges, known limitations, fallback transports, and per-architecture certification; validateProviderVersion() returns warnings for version drift; policy evaluation helpers (isProviderBlocked, isWrappedSessionDisabled, meetsMinimumVersion). (4) Fake provider conformance kit (B4) — cross-platform fake CLI scripts simulating ACP, Codex, Claude SDK, JSONL, and hostile protocols; 9 predefined conformance scenarios (normal, malformed, oversized, protocol pollution, unauthenticated, slow response); writeConformanceKit() generates all scenario scripts for CI testing without consuming plans or secrets. (5) Diagnostics bundle and privacy controls (B5) — exportable redacted DiagnosticsBundleSchema with versions, providers, launch profiles, compatibility status, recent events, sessions, resource limits, and optional logs; secret scanner detects OpenAI/Anthropic keys, Bearer tokens, passwords, private keys; export refuses if secrets are found; PrivacySettingsSchema with telemetry disabled by default; 7 minimized telemetry event types (no prompt content, code, or terminal output). (6) Versioned state migrations (B6) — MigrationRegistry with idempotent, resumable, transactional migrations; automatic backup before destructive migrations; 3 NALA state migrations (initialize profiles, add schemaVersion, add resource governance defaults). (7) Future NALA provider seam (B7) — NALA_MANIFEST reserves the 'nala' provider ID through the normal manifest system; FakeNalaAdapter proves the seam works without UI special-casing; 'nala' added to BUILTIN_PROVIDER_IDS; nala-default environment policy added. (8) Documentation (B8) — architecture, threat model (8 threats with mitigations), runbooks (6 procedures), and release checklist. 169 new tests across 7 test files.
-
Unified Pi-wrapped launch UX and provider routing (Mission 04). NALA now has a versioned launch-profile and route service that governs how each provider button behaves when clicked. (1) LaunchProfileService — a daemon-side service (src/daemon/nala/providers/LaunchProfileService.ts) with profile CRUD, default route assignment, capability validation, and route resolution with fallback options. Each provider has an AgentLaunchProfile with a route (direct, pi-wrapped, ask-each-time), wrapped execution style, auth/model/mode/permission/cwd/resume policies. Default routes: Pi button → pi-wrapped, all others → direct (no silent migration). (2) Route-aware launcher — the useLaunchRoute hook resolves the route via nala.launch.resolve RPC, then dispatches to direct or pi-wrapped launch. Falls back to direct if the daemon doesn't support the route RPC. (3) LaunchRoutePicker — modal dropdown for ask-each-time route selection. (4) ProviderButtonContextMenu — right-click menu on provider buttons for quick route switching with health badges. (5) SessionRouteBadge — π badge for pi-wrapped sessions in tab titles and Fleet cards. (6) CapabilitiesDrawer — slide-out panel showing session identity, provider health, 15 capability flags, available models, and notices. (7) PiWrappedOnboarding — first-run dialog explaining NALA tools, A2A messaging, permission bridge, and session resume. (8) ProviderDoctorPanel — diagnostic panel integrating the Provider Doctor with per-provider policy status, installation, auth, transport, and model discovery. (9) SessionResumePanel — recovery panel for pi-wrapped sessions with Resume through Pi / Resume directly / Start fresh options. (10) LaunchProfileSettings — settings section in the NALA tab with per-provider route selector, profile list, and Provider Doctor inline view. (11) Feature flag — nala.launchProfiles capability with NALA_DISABLE_LAUNCH_PROFILES=1 emergency kill switch. (12) Pi-wrapped resume — ResumeBinding extended with launchRoute field; piWrappedResumeEnvPatch() re-injects NALA bridge env vars on resume. 6 new RPC methods, 31 new tests.
-
Universal provider adapter contracts (Mission 02). NALA now has a versioned, schema-validated contract system for universal provider adapters. (1) universal-provider-types.ts — defines ProviderManifest, UniversalAgentAdapter interface, NalaAgentEvent normalized event envelope, AuthMode (7 modes: official_cli_subscription, official_cli_api, pi_oauth, direct_api, coding_plan_key, local_runtime, unavailable), ProviderTransport (8 transports), ProviderCapabilityDeclaration (26 granular capabilities), and all associated Zod schemas with validation helpers. (2) provider-manifests.ts — manifests for all 10 supported providers: Codex, Claude, Grok, Cursor, Devin, Z.AI, OpenAI, Anthropic, Ollama, LM Studio. Each manifest declares transports, auth modes, capabilities, documentation URLs, terms URLs, minimum versions, and policy revisions. Z.AI is not enabled by default and does not claim to be keyless. (3) ProviderRegistry.ts — central registry with per-provider environment policies that prevent silent billing-mode switches. Claude subscription mode removes ANTHROPIC_API_KEY; Grok subscription removes XAI_API_KEY; Devin stored-login removes WINDSURF_API_KEY; Codex ChatGPT-plan removes OPENAI_API_KEY. The buildChildEnvironment method constructs sanitized child environments without deleting user environment variables globally. (4) SecureCredentialService.ts — stores provider API keys using Electron safeStorage (Windows DPAPI). Secrets are never returned to the renderer; only redacted metadata (last 4 characters) is exposed. Decrypted values exist only in the trusted main process for minimum time. (5) AcpAgentAdapter.ts — hardened ACP (Agent Client Protocol) client adapter with JSON-RPC 2.0 over stdio, protocol version negotiation, session management, streamed events, permission handling, cancellation, bounded line/message sizes, stderr separation, request timeouts, and process-tree cleanup. (6) StructuredCliAdapter.ts — fallback adapter for providers that don't support ACP or a dedicated SDK transport. Runs the provider CLI in one-shot or streaming-JSON mode with shell:false, prompts via stdin, bounded output, and separate stdout/stderr. (7) ProviderAdapterFactory.ts — factory that creates the appropriate adapter for each provider based on the preferred transport and fallback chain. Codex uses codex-app-server → structured-cli; Claude uses claude-agent-sdk → structured-cli; Grok/Cursor/Devin use acp-stdio → structured-cli; Z.AI uses anthropic-compatible/openai-compatible; local runtimes use local-runtime. (8) ProviderDoctor.ts — diagnostic service that reports on all providers' installation, auth, capabilities, policy status, and billing-mode conflicts. Includes Z.AI plan eligibility caution, Claude policy date notice, and Grok/Cursor collision detection. (9) Fake ACP agent test harness — a minimal ACP-compatible agent (fake-acp-agent.mjs) for contract testing with modes for normal, slow, malformed, crash, permission, and stderr-noise scenarios. 19 new tests (9 ACP contract + 10 ProviderDoctor) validate all paths. 285 total tests pass.
-
Pi project trust bridge (Mission 01 audit). A new PiProjectTrustBridge (src/main/pi/PiProjectTrustBridge.ts) maps NALA workspace trust to Pi project trust with explicit user approval. Unknown workspaces default to untrusted (fail-closed). Trust decisions are persisted to trust/trust-decisions.json with approver, timestamp, and workspace identity hash. Identity changes (path modification) trigger re-approval. IPC handlers pi:trust:get, pi:trust:approve, pi:trust:revoke expose trust management to the renderer. The diagnostic report now includes trust decisions.
-
Pi bridge /nala-doctor command and structured handshake (Mission 01 audit). The @nala/pi-bridge extension now provides a /nala-doctor slash command with full diagnostic output (protocol version, runtime version, handshake status, capabilities, PI_CODING_AGENT_DIR). The handshake protocol is now structured as a versioned NalaPiHello JSON message emitted to stderr, with protocol version negotiation and rejection of unsupported versions. The handshake includes workspace ID, agent ID, task ID, session ID, launch nonce, and capability list.
-
Pi agent harness integration (Mission 01). NALA now bundles and manages a Pi runtime as a sixth built-in provider. Pi (v0.80.7, MIT) is a universal agent harness that runs as an app-managed subprocess in a NALA terminal pane. (1) PiAdapter — a new BaseAdapter subclass (src/daemon/nala/providers/PiAdapter.ts) that resolves the app-managed Pi runtime (never searches PATH for a global pi), builds launch specs with node <cli.js> args, and scopes Pi's config directory to NALA's app-data via PI_CODING_AGENT_DIR. (2) PiRuntimeManager — a main-process singleton (src/main/pi/PiRuntimeManager.ts) that resolves, verifies, and manages the bundled Pi runtime. It checks required files (cli.js, rpc-entry.js, package.json), probes pi --version, and injects NALA_PI_RUNTIME_PATH and NALA_PI_HOME env vars into the daemon spawn. (3) Quick-launch button — a Pi button with a π logo appears in the NALA Orchestration Bar alongside Claude, Codex, Devin, Cursor, and Grok. Clicking it launches Pi in a terminal pane with NALA identity env vars. (4) @nala/pi-bridge extension — a first-party Pi extension (integrations/pi/package/) that injects NALA workspace context, emits lifecycle events, and provides /nala-status and /nala-workspace slash commands. (5) Integrations structure — integrations/pi/ contains the pinned provenance lock (pi-runtime.lock.json), zero-patch ledger, fetch/build/verify scripts, and the vendored runtime. (6) IPC diagnostics — pi:health, pi:diagnostics, and pi:set-dev-override IPC handlers expose runtime health to the renderer for Settings display. (7) Baseline documentation — docs/pi-integration/01-baseline.md documents the full agent launch path, Pi architecture, and ADR-001 (subprocess decision).
-
PiAdapter and PiRuntimeManager fail-closed security hardening (Mission 01 audit). The PiAdapter previously had dev-mode fallbacks that searched process.cwd() and __dirname for the Pi runtime, violating the fail-closed invariant (Mission 01 §2.5, §6.1). A malicious cli.js placed in the current directory could have been executed. The adapter now uses ONLY the NALA_PI_RUNTIME_PATH env var injected by PiRuntimeManager. The PiRuntimeManager's dev-mode fallback is now gated on NALA_DEV=1 so production builds never resolve a runtime from the cwd. A regression test verifies that a fake cli.js in the cwd is NOT found. The PiHome fallback was also changed from ~/.nala/pi to os.tmpdir()/nala-pi-fallback to avoid touching the user's global Pi config.
-
Multi-tier agent executable resolution with cross-platform support. NALA's agent launcher now uses a 4-tier fallback chain to find agent CLIs on any platform: (1) Custom path — user-specified path; bare names like claude are treated as callsigns (shell resolves via PATH), absolute paths use the full path. Stale custom paths fall through to lower tiers instead of failing. (2) PATH search — preferred tier; produces a portable callsign (devin ... instead of & 'C:\...\devin.exe' ...). (3) Platform known paths — all 5 built-in adapters (Claude, Codex, Devin, Cursor, Grok) now return per-platform install locations for Windows (AppData), macOS (homebrew, ~/.claude/bin, ~/.local/bin), and Linux (~/.local/bin, /usr/local/bin). Previously only Windows AppData paths were hardcoded — macOS/Linux only worked via PATH search. (4) Package manager dirs — checks npm global, homebrew, cargo, pipx, and volta directories as a last resort. (5) Cross-platform PATH refresh — refreshSystemPath() now spawns a login shell on macOS/Linux (/bin/zsh -l -c "echo $PATH" or $SHELL -l -c "echo $PATH") to catch agents installed via brew install, pipx install, etc. after the app launched. Windows PATH refresh (registry merge) is unchanged. (6) Generalized disambiguation — rejectPathPatterns on BaseAdapter replaces the Cursor-specific resolveExecutable override. Cursor rejects paths containing grok directories; Grok rejects paths containing cursor-agent directories. Rejected candidates are skipped and resolution continues to the next tier. (7) Version validation — each adapter declares an expectedVersionPattern regex; probe() emits a VERSION_MISMATCH notice when the binary's --version output doesn't match, catching shell aliases or wrong tools shadowing the callsign. (8) Probe result enrichment — ProviderProbeResult now includes matchedVia (which PATH entry, known path, or package-manager dir matched) for diagnostics. resolvedVia expanded from ['path','known','custom'] to include 'pkg-manager', 'bundled', 'not-found'. The nala.provider.detectAgents RPC exposes matchedVia. (9) Custom provider platform paths — CustomProviderDefinitionSchema gains optional knownPathsByPlatform ({ win32?, darwin?, linux?, other? }) for platform-specific install locations. The flat knownPaths array remains as a cross-platform fallback. 48 new tests in resolutionTiers.test.ts cover all tiers, platform paths, callsign inference, disambiguation, version patterns, and probe enrichment.
-
Voice dictation master toggle + configurable PTT hotkey. Users can now fully enable/disable voice dictation and customize the push-to-talk activation key from Settings → Dictation. (1) Master dictation toggle — a new "Voice dictation" on/off switch at the top of the Dictation settings tab controls all voice features. When off, the Dictate button is hidden from the toolbar, the PTT hotkey is not intercepted, and toggleDictation() shows a "Voice dictation is disabled in Settings" warning. No microphone audio is captured. (2) Configurable PTT hotkey — the push-to-talk activation key is no longer hardcoded to Space. A new "Push-to-talk hotkey" card in settings lets the user click a capture button and press any key (optionally with Ctrl/Shift/Alt/Meta modifiers) to set the activation combination. A "Reset to Space" button restores the default. The keyboard shortcuts reference card now shows the configured hotkey (e.g., "Hold Ctrl+Space") instead of a hardcoded "Hold Space". The hotkey string format is Modifier+...+KeyCode (e.g., Control+Space, Shift+Alt+KeyV); new utility functions parseHotkey, hotkeyMatches, formatHotkey, and hotkeyLabel handle parsing, matching, and display. The SttConfig type expanded from 12 to 14 fields (dictationEnabled, pttHotkey); all settings persist across sessions via session.json and are pushed to the main process via VOICE_CONFIG_UPDATE IPC. For the default Space hotkey, the existing shouldHandleSpacePtt policy (IME guard, xterm helper check, editable target check) is preserved; for custom hotkeys, a simpler "terminal must be focused" check is used. Short-tap behavior (type a space on quick Space tap) is preserved for Space only — custom hotkeys cancel silently on short tap.
-
Gatsby theme — 1920s Art Deco easter-egg skin. A new "Gatsby" theme in Settings → Appearance transforms the app into a Jazz Age masterpiece. The palette is drawn directly from Fitzgerald's symbolism: deep bay-black night (#0A0E08), champagne-cream text (#F4E9C1), rich gold accent (#D4AF37), and the iconic green light (#7EC8A0) as the secondary/link accent — "a single green light, minute and far away, that might have been the end of a dock." Beyond the standard color tokens, the theme layers Art Deco decorative elements throughout the UI: (1) Gold gradient headings — h1/h2 titles render with a shimmering gold gradient (Art Deco background-clip: text). (2) Gold-bordered Card surfaces — settings cards get a subtle gold border with a gradient surface fill and inset gold top highlight. (3) Green light pulse — running agent status dots (.sidebar-dot-running) pulse with a soft green glow, echoing Gatsby's eternal hope at the end of Daisy's dock. (4) Gold terminal cursor — the xterm cursor is gold (#D4AF37) via the dedicated gatsby xterm palette, with a subtle gold border framing the terminal viewport. (5) Art Deco corner ornaments — modal dialogs get geometric stepped gold corner brackets (Chrysler Building motif) via ::before/::after pseudo-elements. (6) Sunburst status bar — the status bar gets a subtle radiating-line conic gradient background (the most iconic Art Deco motif). (7) Chevron zigzag dividers — <hr> elements render as repeating zigzag patterns in dim gold. (8) Gold-on-black scrollbars — scrollbars get a gold gradient thumb on a black track. (9) Art Deco input fields — text inputs (text, number, search, password, email, textarea, select) get a gold-underlined style with a gold glow on focus. (10) Green-light toggle glow — active toggle switches emit a soft green glow. (11) Gold focus rings — all :focus-visible outlines use gold. (12) Green-light text selection — text selection uses a translucent green-light background. (13) Gold-accented active tabs — the active settings tab gets a gold left border with an inset glow. (14) Gold range sliders — slider inputs use gold accent color. (15) Subtle gold button hover glow — buttons emit a faint gold halo on hover. All animations respect prefers-reduced-motion. The theme also includes a dedicated xterm terminal palette (gatsby) with matching gold cursor, green-light ANSI greens, and champagne foreground. The theme appears as the 11th option in the theme grid — a fun easter egg for users to discover.
-
STT settings overhaul — microphone selection, audio processing, transcript formatting, and live audio level. The Dictation settings tab now has detailed controls organized into sections: (1) Microphone device picker — enumerate available mics via enumerateDevices, select a preferred device, or use auto-selection (best laptop mic scoring). A Refresh button re-enumerates devices after plugging in a USB mic. (2) Audio processing toggles — independently enable/disable noise suppression, echo cancellation, and auto gain control (all default on). These are passed as getUserMedia constraints so the browser's DSP handles them before audio reaches whisper. (3) Transcript formatting — capitalize first letter (default on), auto-add trailing punctuation if the transcript lacks terminal punctuation (default on), and trailing space for multi-phrase dictation flow (default on). These are pure post-processing on the transcript text before injection. (4) Live audio level indicator — the VoiceStatusChip now shows a real-time mic level bar during recording, driven by an AnalyserNode on the mic stream (RMS level at ~60fps, respects prefers-reduced-motion). (5) Keyboard shortcuts reference card — shows "Hold Space = PTT", "Click Dictate = Toggle", "Esc = Cancel" directly in settings. All new settings persist across sessions and are pushed to the main process for diagnostics via VOICE_CONFIG_UPDATE IPC. The SttConfig type expanded from 5 to 12 fields; WhisperService.reconfigure() and getConfig() handle all new fields.
-
Robust agent callsign resolution (PATH-first with live refresh). NALA now reliably launches agents using their bare callsign (e.g., devin --permission-mode dangerous) instead of fragile full paths (e.g., & 'C:\Users\...\devin.exe' --permission-mode dangerous). Key improvements: (1) Live PATH refresh — before each agent launch, the daemon re-reads the system PATH from the Windows registry (HKCU + HKLM), so agents installed after the app launched are detected immediately without restarting. (2) Callsign disambiguation — Cursor and Grok previously both claimed agent as a PATH callsign, causing ambiguity; Cursor now only uses cursor-agent (its dedicated callsign), while Grok uses grok. (3) Detection scan RPC — a new nala.provider.detectAgents RPC returns a summary of which agents are installed, how they were found (PATH callsign vs known path vs not found), and their version. (4) resolvedVia + callsign fields in ProviderProbeResult — the UI can now show whether each agent was found on PATH (portable callsign) or via a known install location (full path fallback). The callsign-first approach makes launches portable across machines, survives binary updates/moves, and produces readable one-liners in the terminal.
-
TTS pause elimination (gap trim + pre-buffer). Read Aloud no longer has mid-sentence pauses. Two new settings (Settings → Read Aloud) fix the root cause: (1) Gap trim (0–200ms, default 40ms) removes the natural silence Kokoro inserts at the start/end of each sentence chunk, tightening the gap between consecutive chunks. (2) Pre-buffer (0–500ms, default 150ms) delays the first sound slightly to build a head-start buffer, so when a long sentence takes more time to synthesize than the previous sentence took to play, there's buffered audio to fill the gap — no silence. Both settings are adjustable via sliders and persist across sessions.
-
STT push-to-talk toggle + smoother state. The spacebar push-to-talk can now be toggled on/off in Settings → Dictation (default: on). When off, only the Dictate button works — the spacebar is never intercepted. The hold threshold slider now ranges from 15–150ms with 5ms steps for finer control. The default hold time is reduced from 45ms to 30ms (33% shorter) so a brief press is enough to trigger dictation. The voice status chip and toolbar button no longer flash "Dictate" before "Listening…" — both show "Listening…" instantly when you hold the spacebar, with no visible state transition (entrance animation and CSS transitions removed for instant feedback).
-
nala update CLI command — always run the latest stable. A new nala update (also wmux update) CLI command checks GitHub Releases for a newer stable version, downloads the installer, SHA-256-verifies it, and launches it — all without needing the app or daemon to be running. On Windows, the Squirrel Setup.exe handles kill-install-restart automatically. On Linux AppImage, the downloaded AppImage replaces the running one and relaunches; deb/rpm are opened with the system package manager. Use --check to only report availability without installing, and --json for machine-readable output. This means every time you run nala update, you end up on the latest stable build.
-
Launch-time update check (no more 30-minute polling). The in-app auto-updater previously checked for updates 15 seconds after launch and then every 30 minutes. The periodic 30-minute check has been removed — now the app checks once on fresh launch and auto-downloads the installer if a newer stable version exists. The user gets a "Restart to update" prompt when the download is verified. This aligns with the "always latest stable on launch" goal without being disruptive mid-session.
-
Dictation settings tab (Settings → Dictation). STT/voice dictation can now be configured from the UI instead of environment variables only. The new Settings → Dictation tab includes: whisper model selection (tiny.en / base.en / tiny / base / small, with size and speed notes), language selection (24 common languages + auto-detect), push-to-talk hold threshold slider (30–150ms), auto-preload toggle, a live engine status indicator (idle / loading / ready / error with model name), and reset-to-defaults. Model changes restart the whisper worker automatically; language changes take effect on the next dictation (no restart needed). Settings persist across sessions via session.json.
-
Instant push-to-talk (speculative capture). The mic now starts the instant you press Space — not after a hold timer. Previously, holding Space to dictate waited 100ms before even starting the microphone, then another 50-200ms for getUserMedia(), so the total press-to-dictate latency was 150-300ms. Now the mic starts on keydown, and the 60ms hold threshold only decides tap-vs-hold (if you tap, the speculative audio is discarded and a normal space is typed). A warm mic stream is also kept open between dictations to eliminate getUserMedia() latency on subsequent presses. Net effect: dictation starts capturing audio in ~0ms on warm presses (vs 150-300ms before).
-
Agent callsign launching (PATH-first). When you click a provider button (Claude, Codex, Devin, Cursor, Grok), NALA now launches the agent using its bare callsign (e.g., devin --permission-mode dangerous) instead of the full file path (& 'C:\Users\...\devin.exe' --permission-mode dangerous). This works because most agent CLIs install themselves on PATH. If the callsign isn't on PATH, NALA falls back to the known install location. The callsign approach is more portable (survives binary updates/moves), more readable in the terminal, and matches how users naturally launch agents. Custom providers also get callsign support via their executableNames field.
-
Dark window frame with white title bar symbols. The main window now uses titleBarOverlay with a dark background (#050C0E) and white min/max/close symbols, so the window frame matches the app theme instead of using the Windows system accent color (which could be orange, blue, or any color).
-
Release notes in Settings → About. The update widget in the About tab now shows a collapsible "Release notes" panel with the CHANGELOG excerpt for the available version, so users can read what changed before clicking "Update & Restart".
-
Full i18n coverage for update UI. All 23 locales now have translations for the StatusBar update keys (checkForUpdates, checking, settings, about, restartToUpdate, updateReady, upToDate) — no more English fallback for any locale.
-
Topbar "Restart to update" button. When an update is downloaded and SHA-256 verified, a pulsing green "↻ Restart to update" button appears in the status bar next to the settings gear — one click installs and restarts. No need to navigate to Settings.
-
Settings dropdown with "Check for updates". The settings gear (⚙) in the topbar now opens a dropdown menu with "Check for updates", "Settings", and "About" — so manual update checks are one click away if auto-detect fails on startup.
-
Agentic tools settings + MCP tools. Agents can now call 6 new MCP tools, each gated by a Settings → Tools toggle. Safe tools (on by default): agent_list_workspace (see agents in workspace), agent_prompt (send a prompt to another agent). Dangerous tools (off by default): agent_spin_up (spin up a new agent in a terminal), agent_open_window (open a new workspace window), agent_open_terminal (open a new terminal), agent_spawn_subagent (spawn a subagent for delegated work). When a tool is disabled, agents get a clear "enable in Settings → Tools" message. Settings persist across sessions with fail-closed guards on dangerous tools.
-
Quiet toasts by default. Most toast notifications are now suppressed — the UI already surfaces those signals inline (badges, panels, status), so the pop-ups were just noise. Only actionable error-level toasts appear by default; routine info/warn toasts ("copied!", "workspace created", "long paste truncated") are dropped at the store boundary. Settings → Notifications adds a "Toast minimum level" selector (Error / Warning / All) to dial verbosity back up, and the existing toast on/off toggle now fully silences them. The setting persists across sessions.
-
Read Aloud: paste text to hear it spoken. A new card at the bottom of the workspace turns a clipboard paste into spoken audio using Kokoro-82M, a fully local, open-source TTS model — no cloud calls, no Python, no GPU required. Click the card, paste (Ctrl+V or any native paste gesture), and the text is read aloud sentence-by-sentence via Web Audio, starting in well under a second on subsequent uses (streaming synthesis — the first sentence plays while later ones are still being generated). The pasted text is never rendered or stored in DOM state. A new Settings → Read Aloud tab offers voice selection (15 curated English voices across US/UK accents, grouped by accent and gender with quality grades and trait descriptions), a voice preview button to audition any voice without pasting, speed (0.75×–1.5×, Kokoro's duration-aware speed so it stays natural, with quick-select preset buttons), a fast/higher-quality toggle, volume, auto-play-on-paste, interrupt-vs-finish policy for pasting while already speaking, and a reset-to-defaults button. First use requires an internet connection to download the ~90 MB voice model; after that, it works fully offline. The model runs in a Node.js worker_thread inside the Electron main process so synthesis never stalls the UI. Pasted text is normalized (markdown fencing, headings, links, bold/italic, list markers, emoji, and smart quotes are stripped) so docs and chat read naturally. The worker auto-terminates after 5 minutes of idle to free memory. When auto-play is off, pasting "primes" the card (green indicator) and a click starts speaking. A retry button appears on error. Download progress is shown as a percentage and inline progress bar during first-run model fetch.
-
Agent callsigns — same-provider instances get distinct names. Launching three Devin panes used to show "Devin CLI" on every tab, sidebar row, and Fleet card with no way to tell them apart. Each agent launch now auto-assigns a short, futuristic callsign (Vega, Cipher, Onyx, …) from a ~50-entry pool, scoped per-workspace so the same name never recurs twice in one workspace at the same time. The callsign seeds Surface.title at launch, so tabs, sidebar, Fleet cards, and nala_agent_list all show it automatically. a2a_discover returns it as agentName (callsign-first) alongside a separate agentType (the detected CLI flavor), so an orchestrating agent can address "Agent Vega" by matching the callsign instead of guessing which "Devin CLI" to send to. FleetCard's display-name priority was reordered to paneLabel || title || agentName so an explicit callsign wins over the generic detected type. Manual rename (double-click a tab) still works and is never overwritten — callsigns only seed new launches. Right-click a tab for a "Reroll callsign" action that picks a fresh random name from the pool (excluding other tabs' current names). The a2a_discover and nala_agent_list MCP tool descriptions now explicitly mention the callsign field so orchestrating agents know to match it when a user says "tell Vega to…".
-
Agent detection for Devin CLI, Cursor CLI, and Grok Build. The agent detector now recognizes three additional CLI tools — Devin CLI (Cognition), Cursor CLI (cursor-agent), and Grok Build (xAI) — so their panes get the correct agent slug, status tracking (waiting-at-prompt detection), and signal routing. The AgentSlug union was extended in all three sync locations (AgentDetector, shared/events, integrations/shared/signal-types) per the existing contract.
-
Create a workspace from a folder. wmux new-workspace --cwd <dir> (also --dir/--path, or a bare directory path) opens a workspace whose terminals start in that folder and is named after the folder by default. In the UI: sidebar + → Open folder…, or the command palette Open Folder as Workspace.
-
Workspace isolation for agent-to-agent messaging. Agents launched inside a workspace can now only discover, message, and broadcast to agents in that same workspace — run separate multi-agent fleets on multiple projects with no bleed-through. Sibling agents stay fully addressable (discover lists every agent pane in your workspace; broadcast pings each sibling pane), replies to human-bridged cross-workspace tasks still work, and your own tools (UI, CLI) keep full cross-workspace reach.
-
Fan-out sub-tasks know their slice. Each spawned agent's prompt now opens with its task name, position ("sub-task 2 of 4"), the sibling task list, an only-your-slice scope rule, and a pointer to the mission channel — instead of N agents all receiving the identical prompt and colliding on the same work.
-
True YOLO. With YOLO on, NALA never interrupts you — agent-to-agent execute requests and spawn proposals approve automatically, even in Connect/Orchestrate modes. The only "agent needs you" moment left is an agent's own CLI asking a question in its terminal, which shows as that tab's figure-8 freezing. Settings → NALA now explains YOLO and each A2A mode in plain language.
-
Per-provider status-bar visibility. Settings → NALA → Providers has show/hide checkboxes for each quick-launch button (all shown by default); the row re-spaces itself automatically. Buttons are now square, logo-only marks — no more Cl/Cx/Dv/Cu/Gk letters.
-
Smart provider launch. Clicking a provider button with an empty, untouched terminal focused opens the agent right there — seamlessly, in the same tab position, no flash — instead of adding a new tab; any activity keeps the new-tab behavior, and clicking several provider buttons in a row spawns one terminal each.
-
Tab figure-8 is the agent status light. A tab hosting an agent always shows the mini figure-8: moving while the agent works, frozen and dimmed when it's idle, finished, or waiting on your input. The bell icon is gone. The motion tracks real activity — an agent parked at its prompt (or a trust dialog) freezes within ~3 seconds even if its coarse status still says running.
-
Close every terminal. Closing the last terminal no longer auto-respawns one — the pane shows a calm empty state (still figure-8, "All quiet here", a New Terminal button) until you start something. Restarts still boot with a fresh terminal.
-
Dictate into any text box. Hold Space in any input, textarea, or editable field — modals, popovers, Idea Capture, Rich Input — and speech streams in at the caret as you talk, same near-live cadence as terminal dictation. A short Space press still types a space. The target is pinned when you start talking, so slow transcription can't land in the wrong place.
-
Bottom-toolbar tools always work. Attach, Snippets, Rich Input, and Dictate are never greyed out by focus quirks — each resolves its terminal via a fallback chain (focused → active pane → any), and creates one if the workspace has none.
-
No console window in the taskbar. Launch via scripts/NALA.vbs (point the desktop shortcut there) — the launcher console runs hidden; output stays in logs/launch.log. The daemon was already windowless.
-
Tasks & Artifacts and Plan are now in the sidebar. The two actions that lived in a dedicated strip under the status bar moved into the sidebar (both the expanded list and the collapsed icon rail), so they're always reachable regardless of sidebar position. The panel and sheet themselves are unchanged.