- FeedbackFunction → IConfigRepository (feedback CRUD)
- TenantOffboardFunction → IMaintenanceRepository.DeleteAllTenantDataAsync()
Zero functions/services now create their own TableServiceClient.
All table access goes through repository interfaces.
https://claude.ai/code/session_01NHWJfPaa8TQHuPzMD7gG63
All 10 repository implementations now get their TableClient instances from
the central TableStorageService singleton instead of creating their own
TableServiceClient connections.
Before: 8 parallel TableServiceClient instances to same Storage Account
After: 1 shared TableServiceClient (+ 2 domain-specific functions)
https://claude.ai/code/session_01NHWJfPaa8TQHuPzMD7gG63
- VulnerabilityCorrelationService: TableStorageService → IVulnerabilityRepository + ISessionRepository
- IAdminRepository: Add SetTenantMemberEnabledAsync
- TableAdminRepository, TenantAdminsService: Implement enable/disable via new method
- DataAccessServiceExtensions: Add IDeviceSecurityRepository registration
All 12 bypass services now use repository interfaces. Zero services create
their own TableServiceClient. Only repository implementations + TableStorageService
+ 2 domain-specific functions (Feedback, TenantOffboard) have direct table access.
https://claude.ai/code/session_01NHWJfPaa8TQHuPzMD7gG63
Replace direct TableStorageService injection with ISessionRepository,
IMetricsRepository, and IMaintenanceRepository in 10 Function files.
Add GetSessionEventsAsync to ISessionRepository interface.
Migration in progress — more functions and services to follow.
https://claude.ai/code/session_01NHWJfPaa8TQHuPzMD7gG63
Introduces a clean abstraction layer to decouple domain services from Azure Table Storage,
enabling future migration to Cosmos DB and Event Streaming without touching business logic.
Architecture:
- 10 repository interfaces in Shared/DataAccess/ (ISessionRepository, IRuleRepository, etc.)
- IDataEventPublisher interface with NullDataEventPublisher for future event streaming
- IStorageInitializer for provider-agnostic initialization
- 5 Table Storage implementations that delegate to existing TableStorageService
- DI extension method AddTableStorageDataAccess() with AddEventStreaming<T>() hook
- Migration plan in tasks/todo.md for incremental adoption
https://claude.ai/code/session_01NHWJfPaa8TQHuPzMD7gG63
Replace the deprecated @xenova/transformers v2 with the actively maintained
@huggingface/transformers v3. Migration changes:
- Import path: @xenova/transformers → @huggingface/transformers
- Quantization: quantized: true → dtype: 'q8' (v3 API)
- Type workaround: dynamic import for pipeline() to avoid TS2590
from the more complex v3 overload signatures
Model (Xenova/all-MiniLM-L6-v2) and output format unchanged.
https://claude.ai/code/session_01TBPsvvMBue9Ft7j3CfD4S2
The License section previously stated "MIT License" which was misleading,
as the project actually uses a split model (MIT for Agent/Shared, AGPL-3.0
for server-side components). Updated to reflect the actual licensing terms.
https://claude.ai/code/session_01WPv7ceMFvhU9GStDPcryRE
- Build SummaryDialog (WPF) alongside Agent and bundle into same ZIP
- Upload AutopilotMonitor-Agent.zip + version.json to Azure Blob Storage
(matches bootstrap script download URL pattern)
- Compute Content-MD5 header for ZIP integrity validation
- New workflow input to toggle blob upload independently from release
Requires AZURE_BLOB_AGENT_SAS_TOKEN secret for blob storage access.
https://claude.ai/code/session_01QiuThUkeSEbiapFpTY9yRp
On-demand workflow (workflow_dispatch) that:
- Builds the .NET Framework 4.8 Agent on Windows runner
- Auto-increments build counter or accepts manual override
- Creates a ZIP artifact with all build outputs + version.json
- Optionally creates a GitHub Release with the artifacts
- Commits updated buildcounter.txt back to the repo
https://claude.ai/code/session_01QiuThUkeSEbiapFpTY9yRp
Introduce a pluggable search architecture with two backends:
- VectorSearchProvider: Sentence-transformer embeddings (all-MiniLM-L6-v2)
for true semantic search. Best quality, requires model download.
- FuseSearchProvider: Fuse.js fuzzy text matching. Zero model download,
instant startup, lightweight fallback.
Auto-detection: if @xenova/transformers is available, uses vector; otherwise
falls back to fuse. Override via SEARCH_BACKEND=vector|fuse env var.
Architecture:
SearchProvider (interface) ← tools.ts programs against this
├── VectorSearchProvider ← embeddings + cosine similarity
└── FuseSearchProvider ← fuse.js weighted fuzzy match
createSearchProvider() ← factory with auto-detect
Also refactored knowledge-base.ts to be provider-agnostic (just loads
documents) and removed the old monolithic vector-store.ts.
https://claude.ai/code/session_01TBPsvvMBue9Ft7j3CfD4S2
Add two new MCP tools powered by local embeddings (all-MiniLM-L6-v2 via
@xenova/transformers):
- search_knowledge: Semantic search over 103 analysis rules, gather rules,
and IME log patterns. Finds relevant rules by meaning, not exact match.
- search_events_semantic: Semantic search over enrollment event messages
within a session or across recent failed sessions. Matches symptoms by
meaning (e.g. "timeout" finds "connection timed out", "waiting exceeded").
Implementation:
- vector-store.ts: In-memory vector store with cosine similarity
- knowledge-base.ts: Loads rules from disk, computes embeddings at startup
- Embeddings computed locally — no external API key required
https://claude.ai/code/session_01TBPsvvMBue9Ft7j3CfD4S2