import type { Context } from '@deepseek-ai/cordis' import type { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client' import type { ConvViewProps } from '@deepseek-ai/dsh-client-ui-conversation/client' import type { SessionPendingInteractionSnapshot } from '@deepseek-ai/dsh-client-ui-session/client' import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots' import { Button, IconCheckOutline14, IconRefreshOutline14, Pill, StateDot, } from '@deepseek-ai/dsh-client-ui-primitives' import { useEffect, useRef, useState, useSyncExternalStore } from 'react' import type { BoundedSourceRecord, CandidateRejectionReasonCode, CandidateFieldView, CandidateView, ComponentRole, MatchCandidateView, PlanningObservationView, PlanningResultView, PreflightRecordView, DiagnosticComponentInput, EpisodeRefView, ExtractionEvidenceItem, ExtractionOmissionReason, ExtractionOmissionView, ProposalOutputTokenLimitInput, RevisionProposalView, SourceRefView, UsageExecutionView, LearningCapability, LearningPredictionView, ExperienceSuggestionGroupView, SuggestionOwnerChoiceInput, } from '../types.js' import { CANDIDATE_REJECTION_REASON_CODES, LEARNING_CAPABILITIES, M2_ALLOWED_USE_MODES } from '../types.js' import { EXPERIENCE_KINDS, type ExperienceKind } from '../domain/kind.js' import { createFieldEditDraft, fieldTextDiff, fieldValuesEqual, resolveFieldEdit, type FieldEditDraft, type FieldEditIssue, } from './field-review.js' import { en, type ExperienceLocaleKey, zh } from './locales.js' import { createStore, type ExperienceStore } from './store.js' import { ExperienceShell } from './workspace-shell.js' import { currentTaskStage, DEFAULT_EXPERIENCE_MODE, fieldReviewProgress, type ExperienceMode, type FieldReviewProgress, type InspectorTab, nextUnreviewedField, TASK_STAGES, type TaskStage, taskStageReachable, taskStageState, parseLearningHistory, parseLearningRanking, type LearningHistoryView, type LearningRankingView, type LearningParticipation, type LearningTaskOutcome, type LearningRankingMode, } from './workspace-model.js' import css from './workspace.module.css' const NS = 'experience-map' /** Dedicated ranking predictor the Host binds its history-ranking wire to (CONTRACT/OPT-C). */ const LEARNING_RANKING_PREDICTOR_VERSION = 'opt-history-ranking' type ViewProps = ConvViewProps & PropsLocale type Translate = ViewProps['t'] type ManagementSection = 'recent_suggestions' | 'cross_session' | 'needs_attention' | 'candidates' type SuggestionSection = Exclude /** Editable reason suggestions; selecting one only fills the reason box, it never decides. */ const COMMON_DECISION_REASONS: readonly ExperienceLocaleKey[] = [ 'reason.quick.matchesProposal', 'reason.quick.correctedContent', 'reason.quick.sourceInsufficient', 'reason.quick.contradictsFacts', ] /** Install the M2 Experience workspace in the existing Harness Conversation tab strip. */ export function registerExperienceWorkspace(ctx: Context): void { const connection = ctx.get('connection') as ConnectionHandle const stores = new Set() ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'experience-map dictionaries') const t = ctx.locale.bind(NS) ctx.slots.inject('conversation.view', () => ctx.slots.register({ name: 'conversation.view', id: 'experience', order: 20, locale: NS, label: () => t('view.label'), }, (props: ViewProps) => )) ctx.on('connection/reset', () => { for (const store of stores) void store.reset() }) } function ExperienceWorkspaceOwner({ connection, stores, ...props }: ViewProps & { readonly connection: ConnectionHandle readonly stores: Set }) { const [store] = useState(() => createStore(connection)) useEffect(() => { stores.add(store) void store.refresh() return () => { stores.delete(store) } }, [store, stores]) return } function ExperienceWorkspace({ store, t, sessionId, useSessionPendingInteraction, }: ViewProps & { readonly store: ExperienceStore }) { const state = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot) const planReviewKey = useSessionPendingInteraction((interactions: SessionPendingInteractionSnapshot) => { const interaction = interactions.get(sessionId) return interaction?.kind === 'plan-review' ? interaction.key : undefined }) const previousPlanReviewKey = useRef(undefined) const [mode, setMode] = useState(DEFAULT_EXPERIENCE_MODE) const [managementSection, setManagementSection] = useState('recent_suggestions') const [selectedSuggestionGroupId, setSelectedSuggestionGroupId] = useState(null) const [inspectorOpen, setInspectorOpen] = useState(true) const [inspectorTab, setInspectorTab] = useState('overview') const [stage, setStage] = useState('stable_kernel') const derivedTaskStage = currentTaskStage(state) const selectedSuggestion = state.suggestions?.groups.find( group => group.suggestionGroupId === selectedSuggestionGroupId, ) const [activeTaskStage, setActiveTaskStage] = useState(derivedTaskStage) const [requestedKind, setRequestedKind] = useState('diagnostic') const [outputTokenLimitMode, setOutputTokenLimitMode] = useState('configured_default') const [customMaxTokens, setCustomMaxTokens] = useState(16_384) const outputTokenLimit = outputTokenLimitMode === 'custom' ? { mode: outputTokenLimitMode, maxTokens: customMaxTokens } as const : { mode: outputTokenLimitMode } as const const customLimitValid = outputTokenLimitMode !== 'custom' || (Number.isSafeInteger(customMaxTokens) && customMaxTokens >= 1_024 && customMaxTokens <= 32_768) const generationSelectionCurrent = state.inspection === undefined || (state.inspection.requestedKind === requestedKind && outputTokenLimitEquals(state.inspection.outputTokenLimit, outputTokenLimit)) useEffect(() => { setStage('stable_kernel') }, [state.selected?.candidateId]) useEffect(() => { setActiveTaskStage(derivedTaskStage) }, [derivedTaskStage, state.selectedPlanning?.plan.usageId]) useEffect(() => { if (selectedSuggestionGroupId !== null && selectedSuggestion === undefined) { setSelectedSuggestionGroupId(null) } }, [selectedSuggestion, selectedSuggestionGroupId]) const changeManagementSection = (section: ManagementSection): void => { setManagementSection(section) setSelectedSuggestionGroupId(null) } const inspectSuggestion = (groupId: string): void => { setSelectedSuggestionGroupId(groupId) setInspectorOpen(true) setInspectorTab('sources') } useEffect(() => { const previous = previousPlanReviewKey.current previousPlanReviewKey.current = planReviewKey // ui-session owns plan-review settlement; the Experience view only reads the resulting Host state. if (previous !== undefined && planReviewKey === undefined) void store.refresh() }, [planReviewKey, store]) const changeMode = (next: ExperienceMode): void => { setMode(next) setInspectorTab('overview') } return
candidate.state === 'proposed' || candidate.state === 'in_review').length} inspectorLabel={t('inspector.title')} inspectorOpen={inspectorOpen} onModeChange={changeMode} onInspectorOpenChange={setInspectorOpen} context={
{t('title')} {mode === 'task' ? t(`task.stage.${activeTaskStage}`) : t('management.pending')}

{mode === 'task' ? t('task.description') : t('management.description')}

} navigation={mode === 'task' ? : } workbench={mode === 'task' ? : managementSection === 'candidates' ? : } inspector={} status={} />
} function TaskNavigation({ active, current, setActive, t }: { readonly active: TaskStage readonly current: TaskStage readonly setActive: (stage: TaskStage) => void readonly t: Translate }) { return <>

{t('task.navigation')}

    {TASK_STAGES.map((item, index) => { const state = taskStageState(item, current) return
  1. })}
} function ManagementNavigation({ state, store, active, setActive, t }: { readonly state: ReturnType readonly store: ExperienceStore readonly active: ManagementSection readonly setActive: (section: ManagementSection) => void readonly t: Translate }) { const groups = state.suggestions?.groups ?? [] const sections: ReadonlyArray = [ ['recent_suggestions', groups.length], ['cross_session', groups.filter(group => group.crossSession).length], ['needs_attention', groups.filter(group => group.saveReadiness !== 'ready').length], ['candidates', state.candidates.length], ] return <>

{t('management.pending')}

    {sections.map(([section, count]) =>
  • )}
{active !== 'candidates' ? null : <>

{t('inbox.count')}: {state.candidates.length}

{state.candidates.length === 0 ?

{t('inbox.empty')}

: null}
    {state.candidates.map(candidate =>
  • )}
} } function SuggestionWorkbench({ state, store, section, selectedGroupId, selectGroup, t }: { readonly state: ReturnType readonly store: ExperienceStore readonly section: SuggestionSection readonly selectedGroupId: string | null readonly selectGroup: (groupId: string) => void readonly t: Translate }) { const projection = state.suggestions const allGroups = projection?.groups ?? [] const groups = section === 'cross_session' ? allGroups.filter(group => group.crossSession) : section === 'needs_attention' ? allGroups.filter(group => group.saveReadiness !== 'ready') : allGroups return

{t(`suggestion.section.${section}`)}

{t(`suggestion.description.${section}`)}

{groups.length}
{projection?.state !== 'degraded' ? null :

{t('suggestion.projectionDegraded')}

} {(projection?.suppressedGroupCount ?? 0) === 0 ? null :

{t('suggestion.suppressed')}: {projection!.suppressedGroupCount}

} {section !== 'recent_suggestions' || projection === undefined ? null : } {groups.length === 0 ?
{t('suggestion.empty')}
:
{groups.map(group => )}
}
} function SessionSuggestionIndex({ projection, groups, selectGroup, t }: { readonly projection: NonNullable['suggestions']> readonly groups: readonly ExperienceSuggestionGroupView[] readonly selectGroup: (groupId: string) => void readonly t: Translate }) { return

{t('suggestion.sessionIndex')}

{projection.sessions.map(session => { const sessionGroups = groups.filter(group => group.sessionIds.includes(session.sessionId)) return
{t('suggestion.session')} · {formatDateTime(session.sessionCreatedAt)} {sessionGroups.length === 0 ? t(`suggestion.sessionState.${session.state}`) : `${sessionGroups.length} ${t('suggestion.groups')}`} {sessionGroups.length === 0 ?

{t('suggestion.noSuggestion')}

:
    {sessionGroups.map(group =>
  • )}
}
})}
} function SuggestionCard({ group, selected, running, store, selectGroup, t }: { readonly group: ExperienceSuggestionGroupView readonly selected: boolean readonly running: boolean readonly store: ExperienceStore readonly selectGroup: (groupId: string) => void readonly t: Translate }) { const roles = suggestionDetailRoles(group.kind) const path = suggestionComponent(group, roles.path) const precondition = suggestionComponent(group, roles.precondition) const failure = suggestionComponent(group, roles.failure) const verifier = suggestionComponent(group, roles.verifier) const sourceCount = new Set(group.occurrences.flatMap(occurrence => occurrence.sourceRefs.map(ref => ref.sourceRefId))).size return

{group.title}

{t(`experienceKind.${group.kind}`)} · {t(`suggestion.consolidation.${group.consolidation}`)} {group.crossSession ? ` · ${t('suggestion.crossSession')}` : ''}

{t(`suggestion.readiness.${group.saveReadiness}`)}
{t('suggestion.occurrences')}: {group.occurrenceCount} {t('suggestion.sessions')}: {group.sessionIds.length} {t('suggestion.sources')}: {sourceCount}
{t('suggestion.goal')}
{group.draft.intent}
{t('suggestion.path')}
{path}
{t('suggestion.precondition')}
{precondition}
{t('suggestion.failure')}
{failure}
{t('suggestion.verifier')}
{verifier}
{t('suggestion.risk')}
{group.riskFlags.map(flag => t(suggestionRiskKey(flag))).join(';')}
{group.saveReadiness === 'ready' ?

{group.consolidation === 'semantic_duplicate' ? <>{t('suggestion.semanticDuplicateAttach')} {t('suggestion.semanticDuplicateTarget')}: {group.canonicalMatch?.title ?? t('field.empty')} : t('suggestion.saveReady')}

:

{t('suggestion.needsAttention')}: {suggestionReadinessExplanation(group, t)}

}
{group.saveReadiness !== 'ready' ? null : } {group.consolidationDetail?.allowedOwnerChoices.map(choice => )}
} function suggestionOwnerChoice( group: ExperienceSuggestionGroupView, choice: SuggestionOwnerChoiceInput['choice'], ): SuggestionOwnerChoiceInput { const detail = group.consolidationDetail if (detail?.targetExperienceVersionId === null || detail?.targetExperienceVersionId === undefined) { throw new Error('Suggestion duplicate target is unavailable') } return { choice, targetExperienceVersionId: detail.targetExperienceVersionId, materialDifferences: choice === 'keep_distinct' ? detail.materialDifferences : [], } } function suggestionComponent( group: ExperienceSuggestionGroupView, roles: readonly ComponentRole[], ): string { for (const role of roles) { const component = group.draft.components.find(item => item.role === role) if (component !== undefined) return component.content } return '—' } function suggestionDetailRoles(kind: ExperienceKind): Readonly> { switch (kind) { case 'procedure': return { path: ['step'], precondition: ['entry_condition'], failure: ['failure_branch', 'forbidden_condition'], verifier: ['verifier'], } case 'diagnostic': return { path: ['resolution_candidate', 'branch'], precondition: ['discriminator', 'environment_scope'], failure: ['falsifier', 'misleading_signal'], verifier: ['recovery_verifier'], } case 'preference_policy': return { path: ['directive', 'modality'], precondition: ['task_or_output_scope', 'subject_scope'], failure: ['override_policy', 'exception', 'no_known_exception'], verifier: ['authority_source', 'valid_from'], } case 'fact': return { path: ['object_or_value', 'predicate'], precondition: ['qualifiers', 'valid_from'], failure: ['contradiction_policy'], verifier: ['source_evidence'], } case 'strategy': return { path: ['candidate_option'], precondition: ['hard_constraint', 'decision_criterion'], failure: ['stop_exploration_rule', 'escalation_rule'], verifier: ['outcome_measure'], } case 'causal': return { path: ['cause_or_intervention', 'effect_or_metric'], precondition: ['applicability_condition', 'mechanism'], failure: ['competing_explanation', 'falsifier'], verifier: ['causal_grade', 'evidence_link'], } } } function suggestionRiskKey(flag: string): ExperienceLocaleKey { if (flag === 'current_permission_required') return 'suggestion.risk.currentPermission' if (flag === 'freshness_revalidation_required') return 'suggestion.risk.freshness' if (flag === 'human_decision_required') return 'suggestion.risk.humanDecision' if (flag === 'causal_promotion_required') return 'suggestion.risk.causalPromotion' if (flag === 'current_user_authority_required') return 'suggestion.risk.currentUserAuthority' return 'suggestion.risk.noExecutionAuthority' } function suggestionReadinessExplanation(group: ExperienceSuggestionGroupView, t: Translate): string { if (group.readinessReasons.includes('semantic_duplicate_vector_only_unverified')) { return t('suggestion.reason.semanticVectorOnly') } if (group.readinessReasons.includes('semantic_duplicate_ambiguous')) { return t('suggestion.reason.semanticAmbiguous') } if (group.readinessReasons.includes('semantic_specialization_review')) { return t('suggestion.reason.semanticSpecialization') } if (group.saveReadiness === 'needs_review') return t('suggestion.reason.needsReview') if (group.saveReadiness === 'needs_enrichment') return t('suggestion.reason.needsEnrichment') return t('suggestion.reason.blocked') } function LocalStatus({ state, t }: { readonly state: ReturnType readonly t: Translate }) { const status = state.phase === 'ready' ? 'done' : state.phase === 'loading' ? 'ongoing' : 'error' const statusText = state.phase === 'loading' ? t('state.loading') : state.phase === 'ready' ? t('state.ready') : `${t('state.error')}: ${state.error ?? ''}` return
{t('status.host')} {statusText}
{t('field.principal')} {state.status?.principalId ?? t('field.empty')}
{t('field.receipt')} {state.receipt?.receiptId ?? t('field.empty')}
{t('field.version')} {state.version?.experienceVersionId ?? t('field.empty')}
{t('status.semanticModel')} {state.retrieval === undefined ? t('field.empty') : `${t(`status.semanticModel.${state.retrieval.manifest.providerState}`)} · ${state.retrieval.manifest.documentCount}`}
} function ManagementWorkspace({ store, state, sessionId, t, stage, setStage, outputTokenLimitMode, setOutputTokenLimitMode, customMaxTokens, setCustomMaxTokens, outputTokenLimit, customLimitValid, generationSelectionCurrent, requestedKind, setRequestedKind, }: { readonly store: ExperienceStore readonly state: ReturnType readonly sessionId: string readonly t: Translate readonly stage: CandidateFieldView['stage'] readonly setStage: (stage: CandidateFieldView['stage']) => void readonly outputTokenLimitMode: ProposalOutputTokenLimitInput['mode'] readonly setOutputTokenLimitMode: (mode: ProposalOutputTokenLimitInput['mode']) => void readonly customMaxTokens: number readonly setCustomMaxTokens: (value: number) => void readonly outputTokenLimit: ProposalOutputTokenLimitInput readonly customLimitValid: boolean readonly generationSelectionCurrent: boolean readonly requestedKind: ExperienceKind readonly setRequestedKind: (kind: ExperienceKind) => void }) { const disclosure = state.inspection?.disclosure const disclosedItems = state.inspection?.evidencePacket.items ?? [] const disclosureComplete = disclosure !== undefined && disclosure.evidenceItemCount === disclosedItems.length const confirmed = disclosure !== undefined && state.confirmedDisclosureDigest === disclosure.disclosureDigest && outputTokenLimitEquals(state.inspection?.outputTokenLimit, outputTokenLimit) return

{state.selected?.title ?? t('management.pending')}

{state.selected === undefined ? t('management.selectCandidate') : t('management.reviewDescription')}

{state.selected === undefined ? null : {t(`candidate.state.${state.selected.state}`)}}

{t('episode.title')}

{t('episode.description')}

{t('disclosure.outputTokenSetting')} {outputTokenLimitMode !== 'custom' ? null : ( setCustomMaxTokens(event.currentTarget.valueAsNumber)} /> )}
{!generationSelectionCurrent ?

{t('disclosure.reinspectRequired')}

: null}
{disclosure === undefined ? null : (
{t('disclosure.route')} {disclosure.provider} / {disclosure.model}
{t('disclosure.sourceRecords')} {disclosure.sourceRecordCount} · {t('disclosure.items')} {disclosure.evidenceItemCount}
{t('disclosure.reasoning')} {disclosure.reasoningEffort} · {t(`disclosure.outputTokenMode.${disclosure.outputTokenLimitMode}`)} · {displayTokenLimit(disclosure.maxOutputTokens, t)}
{t('disclosure.estimatedTokens')} {disclosure.estimatedInputTokens}
{!disclosureComplete ?

{t('disclosure.incomplete')}

: null}
{t('disclosure.preview')}: {disclosure.evidenceItemCount}
{t('disclosure.technicalDetails')}

{disclosure.promptVersion} · {disclosure.schemaVersion} · {disclosure.policyVersion}

{t('disclosure.resultTool')}: {disclosure.resultToolName}

{t('disclosure.resultSchemaDigest')}: {disclosure.resultSchemaDigest}

{t('disclosure.digest')}: {disclosure.sourceInputDigest}

{t('disclosure.settingsRevision')}: {disclosure.settingsRevision ?? '—'}

{t('disclosure.settingsDigest')}: {disclosure.settingsDigest}

{t('disclosure.confirmationDigest')}: {disclosure.disclosureDigest}

)}
{state.selected === undefined ?
{t('candidate.noneSelected')}
: (
)} {state.version === undefined ? null : } {state.version === undefined ? null : }
} function MarkdownPanel({ state, store, t }: { readonly state: ReturnType readonly store: ExperienceStore readonly t: Translate }) { const [edited, setEdited] = useState('') const [reason, setReason] = useState('Reviewed the structured Markdown diff') useEffect(() => setEdited(state.markdownProjection?.markdown ?? ''), [state.markdownProjection?.receipt.projectionDigest]) const proposal = state.markdownRevision return

{t('markdown.title')}

{t('markdown.description')}

{state.markdownProjection === undefined ? null : <>

{t('markdown.receipt')}: {state.markdownProjection.receipt.markdownProjectionReceiptId}