DeepSeek TUI has a shallow one-file-per-session JSON layout, so moving it next keeps the provider migration incremental while exercising the JSON source helper with non-JSONL extensions.
The provider preserves legacy discovery filters for latest and offline queue files, raw/full ID lookup, changed-path classification, fingerprint propagation, and parse normalization without changing runtime sync dispatch.
fix(parser): preserve deepseek tui symlink files
DeepSeek TUI legacy lookup and parsing followed direct symlinks to session JSON files, so the facade provider needs an explicit way to preserve that source shape instead of silently dropping linked archives.
The JSONL source helper keeps symlink-file following opt-in, DeepSeek TUI enables it, and the branch manifest opts the concrete provider into shadow comparison so the migration is exercised rather than additive.
Validation: go test -tags "fts5" ./internal/parser -run 'Test(DeepSeekTUIProvider|JSONLSourceSet|ProviderMigrationModes)' -count=1; go test -tags "fts5" ./internal/parser -count=1; go vet ./...; git diff --check
test(parser): skip deepseek symlink test when unsupported
Some test environments deny symlink creation even though the provider behavior is valid when links are available. The regression should skip in that environment instead of failing for host permissions.
Validation: go test -tags "fts5" ./internal/parser -run 'Test(DeepSeekTUIProvider|ProviderMigrationModes)' -count=1; go test -tags "fts5" ./internal/parser -count=1; go vet ./...; git diff --check
test(sync): compare deepseek tui shadow parity
DeepSeek TUI is shadow-compared on this branch, so add the shared source-level proof that provider observation matches the existing ParseDeepSeekTUISession output. This keeps the branch review focused on an actual migration surface rather than only provider-local parser tests.
Validation: go fmt ./...; go test -tags "fts5" ./internal/parser ./internal/sync -count=1; go vet ./...; git diff --check; ./custom-gcl run --config .golangci.nilaway.yml ./internal/parser/... ./internal/sync/...
refactor(parser): fold deepseek tui into provider
DeepSeek TUI should have one maintained parser shape on this branch. Leaving exported discover, lookup, and parse functions beside the concrete provider kept the migration additive and forced sync to preserve a second dispatch path.
Make the concrete provider authoritative, move parsing onto the provider, remove the AgentDef legacy hooks and engine dispatch, and replace shadow-baseline tests with provider API coverage plus a guard that the old symbols stay gone.
Validation: go test -tags "fts5" ./internal/parser ./internal/sync ./cmd/agentsview -count=1; go vet ./...; git diff --check
fix(parser): preserve deepseek tui file hash
DeepSeek TUI legacy sync stored the transcript content hash, but the migrated provider source set did not request hashing, so provider-authoritative Parse left Session.File.Hash empty when using the real Fingerprint path.\n\nEnable source hashing for DeepSeek TUI and make the provider parse test use Fingerprint -> Parse to assert the persisted file_hash value comes from the session JSON content.\n\nValidation: go test -tags "fts5" ./internal/parser -run TestDeepSeekTUIProvider -count=1; go test -tags "fts5" ./internal/parser -count=1; go vet ./...; git diff --check
DeepSeek TUI has a shallow one-file-per-session JSON layout, so moving it next keeps the provider migration incremental while exercising the JSON source helper with non-JSONL extensions.
The provider preserves legacy discovery filters for latest and offline queue files, raw/full ID lookup, changed-path classification, fingerprint propagation, and parse normalization without changing runtime sync dispatch.