Files
UHD_Media_Tool/packages/mapping
rootandClaude Opus 5.5 a24bda952b feat(server): W2-B sources, identity resolution, metadata and site workbench
- Sites / accounts / feeds: registry view (/site-definitions), site CRUD with
  enable/disable (history stays queryable, marked site_disabled), accounts and
  feed URLs stored as secrets (only secret_ref / redacted urlDisplay exposed),
  feed enable/disable/reset/fetch; one shared rate limiter + adapter per site.
- Tasks: ingestFeed (FeedFetchState/FeedCursor on feed_source, observation
  feed+guid upsert with digest-change updates, source_release site+id
  aggregation across feeds, auth failure -> account invalid + decision, no
  retry, gap -> feed.gap_suspected -> budgeted backfill snapshot),
  resolveObservation (parseRelease -> local recall via title_alias pg_trgm +
  accepted identities -> TMDB -> resolveIdentity; auto binds entity /
  provisional units / identities / aliases, otherwise identity_candidate pool
  with evidence version and bounded review backoff; manual lock respected),
  refreshMetadata (metadata_field + field_override, user locks win, paths
  untouched), snapshotSite (site_snapshot coverage records).
- Events: feed.due, feed.gap_suspected, release.observed (self-consumed),
  release.resolved, decision.created/updated; scheduler in worker start().
- Identity API: entity detail with redirects, manual mapping correction with
  identity_revision, merge with identity_redirect, pool list/assign/dismiss/
  retry, content unit numbering lock, aliases, external identities.
- Decisions: list/summary (by entity and kind)/detail/resolve; identity
  options executed directly.
- Workbench: /sites/{id}/releases (snapshot first, coalesced live search with
  backoff, origin + freshness) and /sites/{id}/releases/{rid} (volatile field
  recheck times, refresh keeps data on failure).
- Capabilities: catalog.lookup, release.search, release.inspect,
  identity.resolve.
- Migrations 0018-0020: site.adapter api, source_release.resolution_locked,
  site_snapshot, identity_candidate, resolution_attempt, identity_redirect,
  metadata_field, field_override.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-27 20:12:01 +08:00
..

@umt/mapping

domain ↔ contracts 的集中映射(W1 审查 B5)。只依赖 @umt/domain 与 @umt/contracts,不依赖 db / adapters。server 各模块需要在两套取值之间转换时一律走这里,不要在模块里各写一份。

db 行(snake_case)↔ contracts(camelCase)的转换不在本包;adapters 的 SiteRelease 以结构类型 SiteReleaseLike 接入(兼容性由 apps/server/test/mapping-compat.test.ts 在类型层保证)。

文件 导出 方向
download.ts toContractDownloadState / toDomainDownloadStatus / mergeObservedDownloadState / DOMAIN_DOWNLOAD_STATUSES domain paused_by_threshold/paused_by_user/error/missing_files ↔ contracts paused+PauseReason/failed/missing;业务叠加态(submitting/stalled/importing/imported)在合并观察时保留
evidence.ts toContractEvidenceLevel / toDomainConfidence / toDomainMediaType / toContractMediaKind / toDomainEntityType / toContractEntityType needs_confirm ↔ needs_review,manual → rule_confirmed,rejected → null;tv ↔ series/variety
identity.ts toContractResolveStatus / toReleaseResolutionStatus / rankedToIdentityCreate / localIdentityCandidate `auto/ambiguous/no_match → resolved
slot.ts toContractSlotStatus / toDomainSlotStatus / slotSpecFromRow / slotSpecToColumns / toContractSlotEvaluation Slot 状态;规则 JSON 列 ↔ SlotSpec;评估结果 → { decision, acceptable, rejected[] }
release.ts toParsedColumns / fromParsedColumns / toContractContentType / toDomainContentType / toContractSegment / toDomainSegment ParsedRelease ↔ source_release.parsed + parser_version(版本不符返回 null,重解析)
site-release.ts siteReleaseToSourceRelease / sourceReleaseToSiteRelease / SiteReleaseLike 站点资源 ↔ SourceReleaseCreate / SourceRelease;downloadUrl 不入库
path-binding.ts toDomainPathBinding / toPathBindingCreate / parseTemplateVersion entityId/scope/season/templateVersion:number/active ↔ mediaEntityId/bindingKind/seasonNumber/templateVersion:string/status
organize.ts organizePlanToRecord / organizePlanToFileResults / organizePlanToCapabilityOutput / organizationStatusFromFiles / toOrganizationAction / toOrganizeOperation / toFileRole OrganizePlan → organization_record / organization_file_result 草稿 / organize.plan 输出

规则

  • 映射表一律写成 Record<一侧的联合类型, …>:domain 增删取值时 typecheck 失败;contracts 侧在 test/enums.test.ts 按 z.enum(...).options 逐个断言,新增取值时测试失败。
  • 新增映射先写测试(往返、schema 合法)。输出给 contracts 的对象都用对应 zod schema 在测试里 safeParse 一遍。