Files
Jarvis/App/MCP/AppDelegateContextBuilderAdapter.swift
james.maes dfc237db0c feat(07-06): installMemory + installVision + TS bus protocol 2.1.0 (Task 1)
- AppDelegate gains installMemory() and installVision() mirroring installVoice's
  six-step pattern. Memory installs BEFORE voice (memory ready before first
  turn); vision AFTER voice (camera lifecycle independent).
- MemoryStore + MemoryExtractionOrchestrator + MemoryExtractionCoordinator
  constructed; AppDelegateMemoryReplaySink bridges Memory.MemoryReplaySink ->
  Replay.ReplayLog.record(_:for:). Coordinator wiring deferred until
  AgentOrchestrator lands in AppDelegate (documented in SUMMARY).
- CameraCapture + PresenceMonitor instantiated; the SINGLE PresenceSignalBus
  reference (owned by PresenceMonitor) flows via AppDelegateContextBuilderAdapter
  to ContextBuilder.installPresence and via hudStateCoordinator?.attachPresence
  to the HUD coordinator. VISION-03 boundary preserved.
- VisionRouter constructed with T1=Ollama, T2=Ollama (sidecar deferred), T3=
  Anthropic (key from Keychain); the runTurn dispatcher branch is deferred
  until AgentOrchestrator wires up.
- DisablePresence menu-bar toggle wired alongside MuteWakeWord.
- BannerContent.cameraDenied + cameraRevoked presets; cameraDegradationTask
  watches CameraCapture.degradationStream and enqueues banners.
- HudStateCoordinator.attachPresence is a generic AsyncSequence subscriber
  preserving HUD-08 single-writer invariant (presence is record-only).
- ContextBuilder.installPresence(_:) is a static no-op drain (deferred wiring
  for the future per-turn system-prompt enricher).
- TS BUS_PROTOCOL_VERSION 2.0.0 -> 2.1.0; sessionHistory + TurnRow added to
  the BusOutbound discriminator union with full decode arm. Round-trip test
  bumped accordingly. scripts/check-bus-protocol-version.sh now passes.
2026-04-29 18:40:47 -05:00

23 lines
1001 B
Swift

import Foundation
import JarvisVision
/// Static facade for routing `PresenceSignalBus.stream` into the
/// `ContextBuilder` surface owned by Plan 07-05.
///
/// 07-06 calls `AppDelegateContextBuilderAdapter.attachPresence(bus.stream)`
/// from `installVision()`; the adapter forwards into
/// `ContextBuilder.installPresence(_:)` which currently drains the stream
/// as a deferred-wiring no-op (per the 07-06 SUMMARY's "Deferred wiring"
/// section). The actual per-turn system-prompt enrichment lands in a
/// follow-on plan.
///
/// VISION-03 preserved: the adapter is the ONLY caller into ContextBuilder
/// from the App target; the call passes the AsyncStream by reference. The
/// adapter has no reference to TTSEngine or AgentOrchestrator submit paths.
/// `scripts/check-presence-vision-isolation.sh` confirms.
public enum AppDelegateContextBuilderAdapter {
public static func attachPresence(_ stream: AsyncStream<PresenceEvent>) {
ContextBuilder.installPresence(stream)
}
}