@burdenoff/microfe-atheletebridge 2026.1024.1 → 2026.1031.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/atheletebridge/components/ai/DecisionCard.d.ts.map +1 -1
  2. package/dist/atheletebridge/components/ai/DecisionCard.js +217 -122
  3. package/dist/atheletebridge/components/ai/DecisionCard.js.map +1 -1
  4. package/dist/atheletebridge/components/ai/SubjectDecisions.d.ts +29 -0
  5. package/dist/atheletebridge/components/ai/SubjectDecisions.d.ts.map +1 -0
  6. package/dist/atheletebridge/components/ai/SubjectDecisions.js +69 -0
  7. package/dist/atheletebridge/components/ai/SubjectDecisions.js.map +1 -0
  8. package/dist/atheletebridge/components/ai/index.d.ts +2 -0
  9. package/dist/atheletebridge/components/ai/index.d.ts.map +1 -1
  10. package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts +10 -1
  11. package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts.map +1 -1
  12. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +24 -15
  13. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
  14. package/dist/atheletebridge/pages/athletes/AthleteProfilePage.d.ts.map +1 -1
  15. package/dist/atheletebridge/pages/athletes/AthleteProfilePage.js +135 -118
  16. package/dist/atheletebridge/pages/athletes/AthleteProfilePage.js.map +1 -1
  17. package/dist/atheletebridge/pages/programs/ProgramDetailPage.d.ts.map +1 -1
  18. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +42 -34
  19. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
  20. package/dist/atheletebridge/pages/teams/TeamDetailPage.d.ts.map +1 -1
  21. package/dist/atheletebridge/pages/teams/TeamDetailPage.js +65 -57
  22. package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
  23. package/dist/atheletebridge/utils/aiDecision.d.ts +12 -0
  24. package/dist/atheletebridge/utils/aiDecision.d.ts.map +1 -1
  25. package/dist/atheletebridge/utils/aiDecision.js +11 -1
  26. package/dist/atheletebridge/utils/aiDecision.js.map +1 -1
  27. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"DecisionCard.js","names":[],"sources":["../../../../src/atheletebridge/components/ai/DecisionCard.tsx"],"sourcesContent":["/**\n * Decision card\n * @module atheletebridge/components/ai\n *\n * One AI decision, rendered from the ledger row it was written to: the\n * `decision` payload, the `inputRefs` provenance (the ids and aggregate stats\n * the model actually considered), and the coach's review action\n * (`athOverrideAgentRun`).\n *\n * Three rules:\n * - A run whose decision carries `parseError` renders as a FAILED decision.\n * The provider answered, the answer was unusable, and the card says so —\n * an empty card would read as a silent success.\n * - A FAILED run shows the recorded upstream error, not a blank space.\n * - Nothing in the payload is hidden: keys this build does not recognise are\n * still listed (see `utils/aiDecision`).\n */\n\nimport { useState } from 'react';\nimport { AlertTriangle, Check, FileSearch, Gavel, Loader2 } from 'lucide-react';\nimport { Badge, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { FormField, fieldInputClass } from '../form';\nimport { StatusBadge } from '../StatusBadge';\nimport {\n usePrograms,\n useProgramAiState,\n useOverrideAgentRun,\n} from '../../hooks/useAthleteBridgeApi';\nimport type { AthAgentRun, AthAiAssessment } from '../../types';\nimport { cn } from '../../utils/cn';\nimport { formatDate } from '../../utils/formatters';\nimport { timeAgo } from '../../utils/timeAgo';\nimport {\n formatConfidence,\n formatLoadChange,\n isRecord,\n programIdFromInputRefs,\n summarizeDecision,\n toProvenanceEntries,\n} from '../../utils/aiDecision';\nimport {\n ADJUSTMENT_STATUS_LABELS,\n ASSESSMENT_DESCRIPTIONS,\n ASSESSMENT_LABELS,\n ASSESSMENT_OPTIONS,\n ASSESSMENT_VARIANT,\n} from './assessment';\nimport { AiErrorNotice } from './AiErrorNotice';\n\ninterface DecisionCardProps {\n run: AthAgentRun;\n /** Highlighted because it is the run selected in the activity feed. */\n isFocused?: boolean;\n className?: string;\n}\n\n/** The program's CURRENT AI state, so the card shows where the proposal landed. */\nfunction ProgramAiState({ programId }: { programId: string }) {\n const program = useProgramAiState(programId);\n\n if (program.isLoading) {\n return (\n <p className=\"inline-flex items-center gap-1.5 text-xs text-text-muted\">\n <Loader2 className=\"h-3 w-3 animate-spin\" /> Loading program state…\n </p>\n );\n }\n if (program.isError || !program.data) {\n // NOT_FOUND here is legitimate — the program may have been archived since.\n return <p className=\"text-xs text-text-muted\">Program {programId} is no longer readable.</p>;\n }\n\n const context = program.data.context;\n const adjustment = isRecord(context) ? context.lastAiAdjustment : null;\n const status =\n isRecord(adjustment) && typeof adjustment.status === 'string' ? adjustment.status : null;\n const agentRunId =\n isRecord(adjustment) && typeof adjustment.agentRunId === 'string'\n ? adjustment.agentRunId\n : null;\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-text-secondary\">\n <span className=\"font-medium text-text-primary\">{program.data.name}</span>\n <StatusBadge status={program.data.status} />\n {status ? (\n <>\n <span>·</span>\n <span>{ADJUSTMENT_STATUS_LABELS[status] ?? status}</span>\n {agentRunId && <span className=\"font-mono text-text-muted\">{agentRunId}</span>}\n </>\n ) : (\n <span className=\"text-text-muted\">· no AI adjustment recorded on this program</span>\n )}\n </div>\n );\n}\n\n/** Coach review — appended as a NEW ledger row, never an edit of the original. */\nfunction OverrideForm({\n run,\n knownProgramId,\n onCancel,\n onSuccess,\n}: {\n run: AthAgentRun;\n knownProgramId: string | null;\n onCancel: () => void;\n onSuccess: () => void;\n}) {\n const override = useOverrideAgentRun();\n // Only needed when the run itself does not name a program: `athGenerateProgram`\n // runs before its program exists, so the link is written the other way round\n // (onto the program's `context.agentRunId`) and the coach has to say which.\n const programs = usePrograms({ pagination: { limit: 100 } });\n\n const [programId, setProgramId] = useState(knownProgramId ?? '');\n const [assessment, setAssessment] = useState<AthAiAssessment>('MAINTAIN');\n const [note, setNote] = useState('');\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n setValidationError(null);\n if (!programId) {\n setValidationError('Choose the program this decision concerns.');\n return;\n }\n if (!note.trim()) {\n setValidationError('A note is required — it is the record of why you decided this.');\n return;\n }\n override.mutate(\n { runId: run.id, programId, assessment, note: note.trim() },\n {\n onSuccess: () => {\n setNote('');\n onSuccess();\n },\n }\n );\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"mt-4 space-y-4 border-t border-border-seam pt-4\">\n <p className=\"text-xs text-text-secondary\">\n Your decision is appended to the ledger as a new run that supersedes this one — the original\n is never edited. Filing the same call the AI made records it as accepted; a different one\n records it as overridden.\n </p>\n\n {knownProgramId ? (\n <FormField label=\"Program\" hint=\"Taken from this run's provenance.\">\n <input\n className={fieldInputClass}\n value={knownProgramId}\n readOnly\n aria-label=\"Program this decision concerns\"\n />\n </FormField>\n ) : (\n <FormField\n label=\"Program\"\n htmlFor={`override-program-${run.id}`}\n required\n hint=\"This run predates its program, so pick the one it produced. A program the run never touched is rejected.\"\n >\n <select\n id={`override-program-${run.id}`}\n className={fieldInputClass}\n value={programId}\n onChange={(event) => setProgramId(event.target.value)}\n >\n <option value=\"\">Select a program…</option>\n {(programs.data?.items ?? []).map((program) => (\n <option key={program.id} value={program.id}>\n {program.name}\n </option>\n ))}\n </select>\n </FormField>\n )}\n\n <FormField\n label=\"Your assessment\"\n htmlFor={`override-assessment-${run.id}`}\n required\n hint={ASSESSMENT_DESCRIPTIONS[assessment]}\n >\n <select\n id={`override-assessment-${run.id}`}\n className={fieldInputClass}\n value={assessment}\n onChange={(event) => setAssessment(event.target.value as AthAiAssessment)}\n >\n {ASSESSMENT_OPTIONS.map((option) => (\n <option key={option} value={option}>\n {ASSESSMENT_LABELS[option]}\n </option>\n ))}\n </select>\n </FormField>\n\n <FormField label=\"Note\" htmlFor={`override-note-${run.id}`} required>\n <textarea\n id={`override-note-${run.id}`}\n className={fieldInputClass}\n rows={3}\n value={note}\n maxLength={1000}\n onChange={(event) => setNote(event.target.value)}\n placeholder=\"Why this call — what you saw that the model did not.\"\n />\n </FormField>\n\n {validationError && <p className=\"text-sm text-status-error-text\">{validationError}</p>}\n {override.isError && <AiErrorNotice error={override.error} />}\n\n <div className=\"flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={override.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-60\"\n >\n {override.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Gavel className=\"h-4 w-4\" />\n )}\n File decision\n </button>\n </div>\n </form>\n );\n}\n\nexport function DecisionCard({ run, isFocused = false, className }: DecisionCardProps) {\n const [overrideOpen, setOverrideOpen] = useState(false);\n const [overrideDone, setOverrideDone] = useState(false);\n\n const summary = summarizeDecision(run.decision);\n const provenance = toProvenanceEntries(run.inputRefs);\n const programId = programIdFromInputRefs(run.inputRefs);\n const confidence = formatConfidence(summary.confidence);\n const loadChange = formatLoadChange(summary.recommendedWeeklyLoadChangePct);\n const runFailed = run.status === 'FAILED';\n const readsAsFailure = runFailed || summary.isFailure;\n\n return (\n <GlassCard\n treatment=\"insight\"\n className={cn('p-5', isFocused && 'ring-2 ring-[var(--color-focus-ring)]', className)}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3\n className={cn(\n 'flex items-center gap-2 text-base font-semibold',\n readsAsFailure ? 'text-status-error-text' : 'text-text-primary'\n )}\n >\n {readsAsFailure && <AlertTriangle className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />}\n {runFailed ? 'Decision not reached' : summary.title}\n </h3>\n <p className=\"mt-1 text-sm text-text-secondary\">{run.promptSummary}</p>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {summary.assessment && (\n <StatusBadge\n status={ASSESSMENT_LABELS[summary.assessment]}\n variant={ASSESSMENT_VARIANT[summary.assessment]}\n />\n )}\n {summary.status && (\n <Badge variant=\"outline\">\n {ADJUSTMENT_STATUS_LABELS[summary.status] ?? summary.status}\n </Badge>\n )}\n </div>\n </div>\n\n <p className=\"mt-2 text-xs text-text-muted\" title={formatDate(run.createdAt)}>\n {run.provider}/{run.model} · {timeAgo(run.createdAt)} · run{' '}\n <code className=\"font-mono\">{run.id}</code>\n </p>\n\n {/* The decision itself */}\n <div className=\"mt-4\">\n {runFailed ? (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3\">\n <p className=\"text-sm font-medium text-status-error-text\">\n The provider chain could not answer, so no decision was produced.\n </p>\n {run.error && (\n <p className=\"mt-1.5 whitespace-pre-wrap break-words font-mono text-xs leading-relaxed text-status-error-text\">\n {run.error}\n </p>\n )}\n </div>\n ) : summary.kind === 'parse-failure' ? (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3\">\n <p className=\"text-sm font-medium text-status-error-text\">\n The model replied, but the reply could not be used.\n </p>\n <p className=\"mt-1.5 whitespace-pre-wrap break-words font-mono text-xs leading-relaxed text-status-error-text\">\n {summary.parseError}\n </p>\n <p className=\"mt-1.5 text-xs text-text-secondary\">\n Nothing was applied to any program. The row is kept so the failure is auditable.\n </p>\n </div>\n ) : summary.kind === 'none' ? (\n <p className=\"text-sm text-text-muted\">This run recorded no decision payload.</p>\n ) : (\n <div className=\"space-y-3\">\n {summary.rationale && (\n <p className=\"text-sm text-text-secondary\">{summary.rationale}</p>\n )}\n {summary.note && (\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-secondary\">\n <span className=\"font-medium text-text-primary\">Coach note: </span>\n {summary.note}\n </p>\n )}\n {(confidence || loadChange) && (\n <div className=\"flex flex-wrap gap-1.5\">\n {confidence && (\n <span className=\"inline-flex items-center rounded-md border border-border-seam bg-bg-sunken px-2 py-0.5 text-xs font-medium tabular-nums text-text-secondary\">\n Confidence {confidence}\n </span>\n )}\n {loadChange && (\n <span className=\"inline-flex items-center rounded-md border border-border-seam bg-bg-sunken px-2 py-0.5 text-xs font-medium tabular-nums text-text-secondary\">\n Weekly load {loadChange}\n </span>\n )}\n </div>\n )}\n {summary.flags.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {summary.flags.map((flag) => (\n <span\n key={flag}\n className=\"inline-flex items-center rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-xs font-medium text-status-warning-text\"\n >\n {flag}\n </span>\n ))}\n </div>\n )}\n {summary.extra.length > 0 && (\n <dl className=\"grid grid-cols-1 gap-x-6 gap-y-1 text-xs sm:grid-cols-2\">\n {summary.extra.map((entry) => (\n <div key={entry.key} className=\"flex gap-1.5\">\n <dt className=\"shrink-0 font-medium text-text-primary\">{entry.label}:</dt>\n <dd className=\"min-w-0 break-words text-text-secondary\">{entry.value}</dd>\n </div>\n ))}\n </dl>\n )}\n </div>\n )}\n </div>\n\n {/* Provenance — what the model was actually given */}\n <div className=\"mt-4 border-t border-border-seam pt-3\">\n <h4 className=\"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wide text-text-muted\">\n <FileSearch className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n Considered\n </h4>\n {provenance.length === 0 ? (\n <p className=\"mt-1.5 text-xs text-text-muted\">This run recorded no input references.</p>\n ) : (\n <dl className=\"mt-1.5 grid grid-cols-1 gap-x-6 gap-y-1 text-xs sm:grid-cols-2\">\n {provenance.map((entry) => (\n <div key={entry.key} className=\"flex gap-1.5\">\n <dt className=\"shrink-0 font-medium text-text-primary\">{entry.label}:</dt>\n <dd className=\"min-w-0 break-words text-text-secondary\">{entry.value}</dd>\n </div>\n ))}\n </dl>\n )}\n {programId && (\n <div className=\"mt-2\">\n <ProgramAiState programId={programId} />\n </div>\n )}\n </div>\n\n {/* Coach review */}\n <div className=\"mt-4\">\n {overrideDone && !overrideOpen ? (\n <p className=\"inline-flex items-center gap-1.5 text-sm text-status-success-text\">\n <Check className=\"h-4 w-4\" /> Your decision was recorded as a new ledger row.\n </p>\n ) : !overrideOpen ? (\n <button\n type=\"button\"\n onClick={() => {\n setOverrideDone(false);\n setOverrideOpen(true);\n }}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <Gavel className=\"h-4 w-4\" /> File a coach decision\n </button>\n ) : (\n <OverrideForm\n run={run}\n knownProgramId={programId}\n onCancel={() => setOverrideOpen(false)}\n onSuccess={() => {\n setOverrideOpen(false);\n setOverrideDone(true);\n }}\n />\n )}\n </div>\n </GlassCard>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DecisionCard.js","names":[],"sources":["../../../../src/atheletebridge/components/ai/DecisionCard.tsx"],"sourcesContent":["/**\n * Decision card\n * @module atheletebridge/components/ai\n *\n * One AI decision, rendered from the ledger row it was written to: the\n * `decision` payload, the `inputRefs` provenance (the ids and aggregate stats\n * the model actually considered), and the coach's review action\n * (`athOverrideAgentRun`).\n *\n * Three rules:\n * - A run whose decision carries `parseError` renders as a FAILED decision.\n * The provider answered, the answer was unusable, and the card says so —\n * an empty card would read as a silent success.\n * - A FAILED run shows the recorded upstream error, not a blank space.\n * - Nothing in the payload is hidden: keys this build does not recognise are\n * still listed (see `utils/aiDecision`).\n */\n\nimport { useState } from 'react';\nimport { AlertTriangle, Check, FileSearch, Gavel, Loader2, Sparkles, X } from 'lucide-react';\nimport { Badge, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { FormField, fieldInputClass } from '../form';\nimport { StatusBadge } from '../StatusBadge';\nimport {\n usePrograms,\n useProgramAiState,\n useOverrideAgentRun,\n} from '../../hooks/useAthleteBridgeApi';\nimport type { AthAgentRun, AthAiAssessment } from '../../types';\nimport type { ProposalState } from '../../utils/aiDecision';\nimport { cn } from '../../utils/cn';\nimport { formatDate } from '../../utils/formatters';\nimport { timeAgo } from '../../utils/timeAgo';\nimport {\n formatConfidence,\n formatLoadChange,\n isRecord,\n programIdFromInputRefs,\n proposalStateFor,\n summarizeDecision,\n toProvenanceEntries,\n} from '../../utils/aiDecision';\nimport {\n ADJUSTMENT_STATUS_LABELS,\n ASSESSMENT_DESCRIPTIONS,\n ASSESSMENT_LABELS,\n ASSESSMENT_OPTIONS,\n ASSESSMENT_VARIANT,\n} from './assessment';\nimport { AiErrorNotice } from './AiErrorNotice';\n\ninterface DecisionCardProps {\n run: AthAgentRun;\n /** Highlighted because it is the run selected in the activity feed. */\n isFocused?: boolean;\n className?: string;\n}\n\n/** The program's CURRENT AI state, so the card shows where the proposal landed. */\nfunction ProgramAiState({ programId }: { programId: string }) {\n const program = useProgramAiState(programId);\n\n if (program.isLoading) {\n return (\n <p className=\"inline-flex items-center gap-1.5 text-xs text-text-muted\">\n <Loader2 className=\"h-3 w-3 animate-spin\" /> Loading program state…\n </p>\n );\n }\n if (program.isError || !program.data) {\n // NOT_FOUND here is legitimate — the program may have been archived since.\n return <p className=\"text-xs text-text-muted\">Program {programId} is no longer readable.</p>;\n }\n\n const context = program.data.context;\n const adjustment = isRecord(context) ? context.lastAiAdjustment : null;\n const status =\n isRecord(adjustment) && typeof adjustment.status === 'string' ? adjustment.status : null;\n const agentRunId =\n isRecord(adjustment) && typeof adjustment.agentRunId === 'string'\n ? adjustment.agentRunId\n : null;\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-text-secondary\">\n <span className=\"font-medium text-text-primary\">{program.data.name}</span>\n <StatusBadge status={program.data.status} />\n {status ? (\n <>\n <span>·</span>\n <span>{ADJUSTMENT_STATUS_LABELS[status] ?? status}</span>\n {agentRunId && <span className=\"font-mono text-text-muted\">{agentRunId}</span>}\n </>\n ) : (\n <span className=\"text-text-muted\">· no AI adjustment recorded on this program</span>\n )}\n </div>\n );\n}\n\n/** Coach review — appended as a NEW ledger row, never an edit of the original. */\nfunction OverrideForm({\n run,\n knownProgramId,\n initialAssessment = 'MAINTAIN',\n onCancel,\n onSuccess,\n}: {\n run: AthAgentRun;\n knownProgramId: string | null;\n /** Pre-selected call — the first alternative to the AI's when overriding. */\n initialAssessment?: AthAiAssessment;\n onCancel: () => void;\n onSuccess: () => void;\n}) {\n const override = useOverrideAgentRun();\n // Only needed when the run itself does not name a program: `athGenerateProgram`\n // runs before its program exists, so the link is written the other way round\n // (onto the program's `context.agentRunId`) and the coach has to say which.\n const programs = usePrograms({ pagination: { limit: 100 } });\n\n const [programId, setProgramId] = useState(knownProgramId ?? '');\n const [assessment, setAssessment] = useState<AthAiAssessment>(initialAssessment);\n const [note, setNote] = useState('');\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n setValidationError(null);\n if (!programId) {\n setValidationError('Choose the program this decision concerns.');\n return;\n }\n if (!note.trim()) {\n setValidationError('A note is required — it is the record of why you decided this.');\n return;\n }\n override.mutate(\n { runId: run.id, programId, assessment, note: note.trim() },\n {\n onSuccess: () => {\n setNote('');\n onSuccess();\n },\n }\n );\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"mt-4 space-y-4 border-t border-border-seam pt-4\">\n <p className=\"text-xs text-text-secondary\">\n Your decision is appended to the ledger as a new run that supersedes this one — the original\n is never edited. Filing the same call the AI made records it as accepted; a different one\n records it as overridden.\n </p>\n\n {knownProgramId ? (\n <FormField label=\"Program\" hint=\"Taken from this run's provenance.\">\n <input\n className={fieldInputClass}\n value={knownProgramId}\n readOnly\n aria-label=\"Program this decision concerns\"\n />\n </FormField>\n ) : (\n <FormField\n label=\"Program\"\n htmlFor={`override-program-${run.id}`}\n required\n hint=\"This run predates its program, so pick the one it produced. A program the run never touched is rejected.\"\n >\n <select\n id={`override-program-${run.id}`}\n className={fieldInputClass}\n value={programId}\n onChange={(event) => setProgramId(event.target.value)}\n >\n <option value=\"\">Select a program…</option>\n {(programs.data?.items ?? []).map((program) => (\n <option key={program.id} value={program.id}>\n {program.name}\n </option>\n ))}\n </select>\n </FormField>\n )}\n\n <FormField\n label=\"Your assessment\"\n htmlFor={`override-assessment-${run.id}`}\n required\n hint={ASSESSMENT_DESCRIPTIONS[assessment]}\n >\n <select\n id={`override-assessment-${run.id}`}\n className={fieldInputClass}\n value={assessment}\n onChange={(event) => setAssessment(event.target.value as AthAiAssessment)}\n >\n {ASSESSMENT_OPTIONS.map((option) => (\n <option key={option} value={option}>\n {ASSESSMENT_LABELS[option]}\n </option>\n ))}\n </select>\n </FormField>\n\n <FormField label=\"Note\" htmlFor={`override-note-${run.id}`} required>\n <textarea\n id={`override-note-${run.id}`}\n className={fieldInputClass}\n rows={3}\n value={note}\n maxLength={1000}\n onChange={(event) => setNote(event.target.value)}\n placeholder=\"Why this call — what you saw that the model did not.\"\n />\n </FormField>\n\n {validationError && <p className=\"text-sm text-status-error-text\">{validationError}</p>}\n {override.isError && <AiErrorNotice error={override.error} />}\n\n <div className=\"flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={override.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-60\"\n >\n {override.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Gavel className=\"h-4 w-4\" />\n )}\n File decision\n </button>\n </div>\n </form>\n );\n}\n\nconst PROPOSAL_RESOLVED_COPY: Record<Exclude<ProposalState, 'pending'>, string | null> = {\n accepted: 'A coach accepted this proposal.',\n overridden: 'A coach overrode this proposal.',\n superseded: 'A later decision has replaced this one on the program.',\n unknown: null,\n};\n\n/**\n * \"AI proposes … [Accept] [Override]\" for an assessment that is still awaiting\n * a coach. Accepting files a coach review with the AI's own call (recorded as\n * ACCEPTED); overriding opens the review form pre-set to a different call.\n * Both append a new ledger row — the proposal itself is never edited.\n */\nfunction ProposalReview({\n run,\n programId,\n proposed,\n onOverride,\n onDone,\n}: {\n run: AthAgentRun;\n programId: string;\n proposed: AthAiAssessment;\n onOverride: () => void;\n onDone: () => void;\n}) {\n const program = useProgramAiState(programId);\n const accept = useOverrideAgentRun();\n\n if (program.isLoading) {\n return (\n <p className=\"inline-flex items-center gap-1.5 text-xs text-text-muted\">\n <Loader2 className=\"h-3 w-3 animate-spin\" /> Checking whether this proposal is still open…\n </p>\n );\n }\n\n const state = proposalStateFor(run.id, program.data?.context);\n if (state !== 'pending') {\n const copy = PROPOSAL_RESOLVED_COPY[state];\n return copy ? (\n <p\n className=\"inline-flex items-center gap-1.5 text-sm text-text-secondary\"\n data-testid=\"ai-proposal-resolved\"\n >\n <Check className=\"h-4 w-4 text-status-success-text\" aria-hidden=\"true\" /> {copy}\n </p>\n ) : null;\n }\n\n return (\n <div\n className=\"rounded-lg border border-border-seam bg-bg-sunken p-3\"\n data-testid=\"ai-proposal-review\"\n >\n <p className=\"flex flex-wrap items-center gap-2 text-sm text-text-primary\">\n <Sparkles className=\"h-4 w-4 text-text-secondary\" aria-hidden=\"true\" />\n <span>\n AI proposes <span className=\"font-semibold\">{ASSESSMENT_LABELS[proposed]}</span>\n </span>\n <span className=\"text-xs text-text-muted\">\n by {run.provider}/{run.model}\n </span>\n </p>\n <p className=\"mt-1 text-xs text-text-secondary\">{ASSESSMENT_DESCRIPTIONS[proposed]}</p>\n {accept.isError && <AiErrorNotice error={accept.error} className=\"mt-2\" />}\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n disabled={accept.isPending}\n onClick={() =>\n accept.mutate(\n {\n runId: run.id,\n programId,\n assessment: proposed,\n note: `Accepted the AI proposal (${ASSESSMENT_LABELS[proposed]}) from ${run.provider}/${run.model}.`,\n },\n { onSuccess: onDone }\n )\n }\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-3 py-1.5 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-60\"\n >\n {accept.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"h-4 w-4\" />\n )}\n Accept\n </button>\n <button\n type=\"button\"\n disabled={accept.isPending}\n onClick={onOverride}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-elevated disabled:opacity-60\"\n >\n <X className=\"h-4 w-4\" /> Override\n </button>\n </div>\n </div>\n );\n}\n\nexport function DecisionCard({ run, isFocused = false, className }: DecisionCardProps) {\n const [overrideOpen, setOverrideOpen] = useState(false);\n const [overrideDone, setOverrideDone] = useState(false);\n\n const summary = summarizeDecision(run.decision);\n const provenance = toProvenanceEntries(run.inputRefs);\n const programId = programIdFromInputRefs(run.inputRefs);\n const confidence = formatConfidence(summary.confidence);\n const loadChange = formatLoadChange(summary.recommendedWeeklyLoadChangePct);\n const runFailed = run.status === 'FAILED';\n const readsAsFailure = runFailed || summary.isFailure;\n // Only a successful AI assessment tied to a program can be accepted as-is.\n const reviewable = !runFailed && summary.kind === 'assessment';\n const overrideDefault: AthAiAssessment =\n ASSESSMENT_OPTIONS.find((option) => option !== summary.assessment) ?? 'MAINTAIN';\n\n return (\n <GlassCard\n treatment=\"insight\"\n className={cn('p-5', isFocused && 'ring-2 ring-[var(--color-focus-ring)]', className)}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3\n className={cn(\n 'flex items-center gap-2 text-base font-semibold',\n readsAsFailure ? 'text-status-error-text' : 'text-text-primary'\n )}\n >\n {readsAsFailure && <AlertTriangle className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />}\n {runFailed ? 'Decision not reached' : summary.title}\n </h3>\n <p className=\"mt-1 text-sm text-text-secondary\">{run.promptSummary}</p>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {summary.assessment && (\n <StatusBadge\n status={ASSESSMENT_LABELS[summary.assessment]}\n variant={ASSESSMENT_VARIANT[summary.assessment]}\n />\n )}\n {summary.status && (\n <Badge variant=\"outline\">\n {ADJUSTMENT_STATUS_LABELS[summary.status] ?? summary.status}\n </Badge>\n )}\n </div>\n </div>\n\n <p className=\"mt-2 text-xs text-text-muted\" title={formatDate(run.createdAt)}>\n {run.provider}/{run.model} · {timeAgo(run.createdAt)} · run{' '}\n <code className=\"font-mono\">{run.id}</code>\n </p>\n\n {/* The decision itself */}\n <div className=\"mt-4\">\n {runFailed ? (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3\">\n <p className=\"text-sm font-medium text-status-error-text\">\n The provider chain could not answer, so no decision was produced.\n </p>\n {run.error && (\n <p className=\"mt-1.5 whitespace-pre-wrap break-words font-mono text-xs leading-relaxed text-status-error-text\">\n {run.error}\n </p>\n )}\n </div>\n ) : summary.kind === 'parse-failure' ? (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3\">\n <p className=\"text-sm font-medium text-status-error-text\">\n The model replied, but the reply could not be used.\n </p>\n <p className=\"mt-1.5 whitespace-pre-wrap break-words font-mono text-xs leading-relaxed text-status-error-text\">\n {summary.parseError}\n </p>\n <p className=\"mt-1.5 text-xs text-text-secondary\">\n Nothing was applied to any program. The row is kept so the failure is auditable.\n </p>\n </div>\n ) : summary.kind === 'none' ? (\n <p className=\"text-sm text-text-muted\">This run recorded no decision payload.</p>\n ) : (\n <div className=\"space-y-3\">\n {summary.rationale && (\n <p className=\"text-sm text-text-secondary\">{summary.rationale}</p>\n )}\n {summary.note && (\n <p className=\"rounded-lg bg-bg-sunken p-3 text-sm text-text-secondary\">\n <span className=\"font-medium text-text-primary\">Coach note: </span>\n {summary.note}\n </p>\n )}\n {(confidence || loadChange) && (\n <div className=\"flex flex-wrap gap-1.5\">\n {confidence && (\n <span className=\"inline-flex items-center rounded-md border border-border-seam bg-bg-sunken px-2 py-0.5 text-xs font-medium tabular-nums text-text-secondary\">\n Confidence {confidence}\n </span>\n )}\n {loadChange && (\n <span className=\"inline-flex items-center rounded-md border border-border-seam bg-bg-sunken px-2 py-0.5 text-xs font-medium tabular-nums text-text-secondary\">\n Weekly load {loadChange}\n </span>\n )}\n </div>\n )}\n {summary.flags.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {summary.flags.map((flag) => (\n <span\n key={flag}\n className=\"inline-flex items-center rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-xs font-medium text-status-warning-text\"\n >\n {flag}\n </span>\n ))}\n </div>\n )}\n {summary.extra.length > 0 && (\n <dl className=\"grid grid-cols-1 gap-x-6 gap-y-1 text-xs sm:grid-cols-2\">\n {summary.extra.map((entry) => (\n <div key={entry.key} className=\"flex gap-1.5\">\n <dt className=\"shrink-0 font-medium text-text-primary\">{entry.label}:</dt>\n <dd className=\"min-w-0 break-words text-text-secondary\">{entry.value}</dd>\n </div>\n ))}\n </dl>\n )}\n </div>\n )}\n </div>\n\n {/* Provenance — what the model was actually given */}\n <div className=\"mt-4 border-t border-border-seam pt-3\">\n <h4 className=\"flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wide text-text-muted\">\n <FileSearch className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n Considered\n </h4>\n {provenance.length === 0 ? (\n <p className=\"mt-1.5 text-xs text-text-muted\">This run recorded no input references.</p>\n ) : (\n <dl className=\"mt-1.5 grid grid-cols-1 gap-x-6 gap-y-1 text-xs sm:grid-cols-2\">\n {provenance.map((entry) => (\n <div key={entry.key} className=\"flex gap-1.5\">\n <dt className=\"shrink-0 font-medium text-text-primary\">{entry.label}:</dt>\n <dd className=\"min-w-0 break-words text-text-secondary\">{entry.value}</dd>\n </div>\n ))}\n </dl>\n )}\n {programId && (\n <div className=\"mt-2\">\n <ProgramAiState programId={programId} />\n </div>\n )}\n </div>\n\n {/* Coach review */}\n <div className=\"mt-4\">\n {overrideDone && !overrideOpen ? (\n <p className=\"inline-flex items-center gap-1.5 text-sm text-status-success-text\">\n <Check className=\"h-4 w-4\" /> Your decision was recorded as a new ledger row.\n </p>\n ) : overrideOpen ? (\n <OverrideForm\n run={run}\n knownProgramId={programId}\n initialAssessment={overrideDefault}\n onCancel={() => setOverrideOpen(false)}\n onSuccess={() => {\n setOverrideOpen(false);\n setOverrideDone(true);\n }}\n />\n ) : reviewable && programId && summary.assessment ? (\n <ProposalReview\n run={run}\n programId={programId}\n proposed={summary.assessment}\n onOverride={() => {\n setOverrideDone(false);\n setOverrideOpen(true);\n }}\n onDone={() => setOverrideDone(true)}\n />\n ) : (\n <button\n type=\"button\"\n onClick={() => {\n setOverrideDone(false);\n setOverrideOpen(true);\n }}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <Gavel className=\"h-4 w-4\" /> File a coach decision\n </button>\n )}\n </div>\n </GlassCard>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * AI decisions for one subject
3
+ * @module atheletebridge/components/ai
4
+ *
5
+ * The decision cards a coach sees in context (BOFF-3574): on an athlete's
6
+ * profile, a team, or a program, the ledger rows (`athAgentRuns` narrowed by
7
+ * `AthAgentRunFilter`) that concern exactly that subject, newest first, each
8
+ * with its model, inputs, decision and the accept/override review.
9
+ *
10
+ * The full workspace ledger, the model picker and "run a decision" stay on the
11
+ * AI Operations page; this section links there rather than duplicating them.
12
+ */
13
+ export type DecisionSubject = {
14
+ kind: 'athlete';
15
+ athleteId: string;
16
+ } | {
17
+ kind: 'team';
18
+ teamId: string;
19
+ } | {
20
+ kind: 'program';
21
+ programId: string;
22
+ };
23
+ interface SubjectDecisionsProps {
24
+ subject: DecisionSubject;
25
+ className?: string;
26
+ }
27
+ export declare function SubjectDecisions({ subject, className }: SubjectDecisionsProps): import("react").JSX.Element;
28
+ export {};
29
+ //# sourceMappingURL=SubjectDecisions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubjectDecisions.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/components/ai/SubjectDecisions.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAU3C,UAAU,qBAAqB;IAC7B,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,qBAAqB,+BAkE7E"}
@@ -0,0 +1,69 @@
1
+ import { useAthleteBridge as e } from "../../context/AthleteBridgeContext.js";
2
+ import { EmptyState as t } from "../EmptyState.js";
3
+ import { ErrorState as n, LoadingState as r } from "../LoadingState.js";
4
+ import { useAgentRuns as i } from "../../hooks/useAthleteBridgeApi.js";
5
+ import { CursorPager as a } from "../CursorPager.js";
6
+ import { DecisionCard as o } from "./DecisionCard.js";
7
+ import { useState as s } from "react";
8
+ import { Sparkles as c } from "lucide-react";
9
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
10
+ //#region src/atheletebridge/components/ai/SubjectDecisions.tsx
11
+ var d = 5, f = {
12
+ athlete: "No AI decision has been made about this athlete yet. Run a performance assessment from AI Operations to get a proposal.",
13
+ team: "No AI program has been generated for this team yet. Generate one from AI Operations.",
14
+ program: "No AI decision has been recorded against this program yet. Assess an athlete on it from AI Operations."
15
+ };
16
+ function p({ subject: p, className: m }) {
17
+ let { navigateTo: h } = e(), [g, _] = s(0), v = i({
18
+ limit: d,
19
+ offset: g * d,
20
+ athleteId: p.kind === "athlete" ? p.athleteId : void 0,
21
+ teamId: p.kind === "team" ? p.teamId : void 0,
22
+ programId: p.kind === "program" ? p.programId : void 0
23
+ }), y = v.data?.items ?? [], b = v.data?.pageInfo.hasMore ?? !1;
24
+ return /* @__PURE__ */ u("section", {
25
+ className: m,
26
+ "data-testid": "ai-subject-decisions",
27
+ children: [
28
+ /* @__PURE__ */ u("div", {
29
+ className: "mb-4 flex flex-wrap items-center justify-between gap-2",
30
+ children: [/* @__PURE__ */ u("h2", {
31
+ className: "flex items-center gap-2 text-lg font-semibold text-text-primary",
32
+ children: [/* @__PURE__ */ l(c, {
33
+ className: "h-5 w-5 text-text-secondary",
34
+ "aria-hidden": "true"
35
+ }), "AI decisions"]
36
+ }), /* @__PURE__ */ l("button", {
37
+ type: "button",
38
+ onClick: () => h("/ai"),
39
+ className: "rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken",
40
+ children: "Open AI Operations"
41
+ })]
42
+ }),
43
+ v.isLoading ? /* @__PURE__ */ l(r, { label: "Loading AI decisions…" }) : v.isError ? /* @__PURE__ */ l(n, {
44
+ title: "AI decisions unavailable",
45
+ message: "We could not read the AI decision ledger for this view. Please try again.",
46
+ onRetry: () => void v.refetch()
47
+ }) : y.length === 0 ? /* @__PURE__ */ l(t, {
48
+ illustration: "empty-data",
49
+ icon: /* @__PURE__ */ l(c, { className: "h-10 w-10" }),
50
+ title: g > 0 ? "No more decisions on this page" : "No AI decisions yet",
51
+ description: g > 0 ? "Go back a page to see earlier decisions." : f[p.kind]
52
+ }) : /* @__PURE__ */ l("div", {
53
+ className: "space-y-4",
54
+ children: y.map((e) => /* @__PURE__ */ l(o, { run: e }, e.id))
55
+ }),
56
+ (g > 0 || b) && /* @__PURE__ */ l(a, {
57
+ className: "mt-4",
58
+ page: g,
59
+ hasMore: b,
60
+ onPrev: () => _((e) => Math.max(0, e - 1)),
61
+ onNext: () => _((e) => e + 1)
62
+ })
63
+ ]
64
+ });
65
+ }
66
+ //#endregion
67
+ export { p as SubjectDecisions };
68
+
69
+ //# sourceMappingURL=SubjectDecisions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubjectDecisions.js","names":[],"sources":["../../../../src/atheletebridge/components/ai/SubjectDecisions.tsx"],"sourcesContent":["/**\n * AI decisions for one subject\n * @module atheletebridge/components/ai\n *\n * The decision cards a coach sees in context (BOFF-3574): on an athlete's\n * profile, a team, or a program, the ledger rows (`athAgentRuns` narrowed by\n * `AthAgentRunFilter`) that concern exactly that subject, newest first, each\n * with its model, inputs, decision and the accept/override review.\n *\n * The full workspace ledger, the model picker and \"run a decision\" stay on the\n * AI Operations page; this section links there rather than duplicating them.\n */\n\nimport { useState } from 'react';\nimport { Sparkles } from 'lucide-react';\nimport { CursorPager } from '../CursorPager';\nimport { EmptyState } from '../EmptyState';\nimport { ErrorState, LoadingState } from '../LoadingState';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { useAgentRuns } from '../../hooks/useAthleteBridgeApi';\nimport { DecisionCard } from './DecisionCard';\n\nconst PAGE_SIZE = 5;\n\nexport type DecisionSubject =\n | { kind: 'athlete'; athleteId: string }\n | { kind: 'team'; teamId: string }\n | { kind: 'program'; programId: string };\n\nconst EMPTY_COPY: Record<DecisionSubject['kind'], string> = {\n athlete:\n 'No AI decision has been made about this athlete yet. Run a performance assessment from AI Operations to get a proposal.',\n team: 'No AI program has been generated for this team yet. Generate one from AI Operations.',\n program:\n 'No AI decision has been recorded against this program yet. Assess an athlete on it from AI Operations.',\n};\n\ninterface SubjectDecisionsProps {\n subject: DecisionSubject;\n className?: string;\n}\n\nexport function SubjectDecisions({ subject, className }: SubjectDecisionsProps) {\n const { navigateTo } = useAthleteBridge();\n const [page, setPage] = useState(0);\n\n const runs = useAgentRuns({\n limit: PAGE_SIZE,\n offset: page * PAGE_SIZE,\n athleteId: subject.kind === 'athlete' ? subject.athleteId : undefined,\n teamId: subject.kind === 'team' ? subject.teamId : undefined,\n programId: subject.kind === 'program' ? subject.programId : undefined,\n });\n const items = runs.data?.items ?? [];\n const hasMore = runs.data?.pageInfo.hasMore ?? false;\n\n return (\n <section className={className} data-testid=\"ai-subject-decisions\">\n <div className=\"mb-4 flex flex-wrap items-center justify-between gap-2\">\n <h2 className=\"flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Sparkles className=\"h-5 w-5 text-text-secondary\" aria-hidden=\"true\" />\n AI decisions\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/ai')}\n className=\"rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n Open AI Operations\n </button>\n </div>\n\n {runs.isLoading ? (\n <LoadingState label=\"Loading AI decisions…\" />\n ) : runs.isError ? (\n <ErrorState\n title=\"AI decisions unavailable\"\n message=\"We could not read the AI decision ledger for this view. Please try again.\"\n onRetry={() => void runs.refetch()}\n />\n ) : items.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Sparkles className=\"h-10 w-10\" />}\n title={page > 0 ? 'No more decisions on this page' : 'No AI decisions yet'}\n description={\n page > 0 ? 'Go back a page to see earlier decisions.' : EMPTY_COPY[subject.kind]\n }\n />\n ) : (\n <div className=\"space-y-4\">\n {items.map((run) => (\n <DecisionCard key={run.id} run={run} />\n ))}\n </div>\n )}\n\n {(page > 0 || hasMore) && (\n <CursorPager\n className=\"mt-4\"\n page={page}\n hasMore={hasMore}\n onPrev={() => setPage((p) => Math.max(0, p - 1))}\n onNext={() => setPage((p) => p + 1)}\n />\n )}\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;AAsBA,IAAM,IAAY,GAOZ,IAAsD;CAC1D,SACE;CACF,MAAM;CACN,SACE;AACJ;AAOA,SAAgB,EAAiB,EAAE,YAAS,gBAAoC;CAC9E,IAAM,EAAE,kBAAe,EAAiB,GAClC,CAAC,GAAM,KAAW,EAAS,CAAC,GAE5B,IAAO,EAAa;EACxB,OAAO;EACP,QAAQ,IAAO;EACf,WAAW,EAAQ,SAAS,YAAY,EAAQ,YAAY,KAAA;EAC5D,QAAQ,EAAQ,SAAS,SAAS,EAAQ,SAAS,KAAA;EACnD,WAAW,EAAQ,SAAS,YAAY,EAAQ,YAAY,KAAA;CAC9D,CAAC,GACK,IAAQ,EAAK,MAAM,SAAS,CAAC,GAC7B,IAAU,EAAK,MAAM,SAAS,WAAW;CAE/C,OACE,kBAAC,WAAD;EAAoB;EAAW,eAAY;YAA3C;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD;MAAU,WAAU;MAA8B,eAAY;KAAQ,CAAA,GAAC,cAErE;QACJ,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAW,KAAK;KAC/B,WAAU;eACX;IAEO,CAAA,CACL;;GAEJ,EAAK,YACJ,kBAAC,GAAD,EAAc,OAAM,wBAAyB,CAAA,IAC3C,EAAK,UACP,kBAAC,GAAD;IACE,OAAM;IACN,SAAQ;IACR,eAAe,KAAK,EAAK,QAAQ;GAClC,CAAA,IACC,EAAM,WAAW,IACnB,kBAAC,GAAD;IACE,cAAa;IACb,MAAM,kBAAC,GAAD,EAAU,WAAU,YAAa,CAAA;IACvC,OAAO,IAAO,IAAI,mCAAmC;IACrD,aACE,IAAO,IAAI,6CAA6C,EAAW,EAAQ;GAE9E,CAAA,IAED,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAM,KAAK,MACV,kBAAC,GAAD,EAAgC,OAAM,GAAnB,EAAI,EAAe,CACvC;GACE,CAAA;IAGL,IAAO,KAAK,MACZ,kBAAC,GAAD;IACE,WAAU;IACJ;IACG;IACT,cAAc,GAAS,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;IAC/C,cAAc,GAAS,MAAM,IAAI,CAAC;GACnC,CAAA;EAEI;;AAEb"}
@@ -6,6 +6,8 @@ export { AiErrorNotice } from './AiErrorNotice';
6
6
  export { AiModelPicker } from './AiModelPicker';
7
7
  export { AgentRunFeed } from './AgentRunFeed';
8
8
  export { DecisionCard } from './DecisionCard';
9
+ export { SubjectDecisions } from './SubjectDecisions';
10
+ export type { DecisionSubject } from './SubjectDecisions';
9
11
  export { RunDecisionPanel } from './RunDecisionPanel';
10
12
  export { ASSESSMENT_LABELS, ASSESSMENT_DESCRIPTIONS, ASSESSMENT_VARIANT, ASSESSMENT_OPTIONS, ADJUSTMENT_STATUS_LABELS, } from './assessment';
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/components/ai/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/components/ai/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,cAAc,CAAC"}
@@ -314,8 +314,17 @@ export interface AgentRunFilters {
314
314
  limit?: number;
315
315
  /** Rows to skip. Offset-based: the composed PaginationInput has no cursor. */
316
316
  offset?: number;
317
+ /** Only runs whose `inputRefs.athleteId` is this athlete's user id. */
318
+ athleteId?: string;
319
+ /** Only runs whose `inputRefs.teamId` is this team. */
320
+ teamId?: string;
321
+ /** Only runs whose `inputRefs.programId` is this program. */
322
+ programId?: string;
317
323
  }
318
- /** The workspace's AI decision ledger, most recent first. */
324
+ /**
325
+ * The workspace's AI decision ledger, most recent first — optionally narrowed
326
+ * to one athlete, team or program (the decision cards on those views).
327
+ */
319
328
  export declare const useAgentRuns: (filters?: AgentRunFilters) => import('@tanstack/react-query').UseQueryResult<NoInfer<AthAgentRunConnection>, Error>;
320
329
  /**
321
330
  * A single ledger row by id. Used to resolve the `extensions.agentRunId` an
@@ -1 +1 @@
1
- {"version":3,"file":"useAthleteBridgeApi.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/hooks/useAthleteBridgeApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAthleteBridgeApi.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/hooks/useAthleteBridgeApi.ts"],"names":[],"mappings":"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"}
@@ -863,26 +863,35 @@ var ge = (e = {}) => {
863
863
  t.setQueryData(["atheletebridge", "ai-config"], e);
864
864
  }
865
865
  });
866
- }, $ = (t = {}) => {
867
- let { apiGatewayUrl: n } = e(), { limit: r = 10, offset: a = 0 } = t;
866
+ };
867
+ function $(e) {
868
+ let t = {};
869
+ return e.athleteId && (t.athleteId = e.athleteId), e.teamId && (t.teamId = e.teamId), e.programId && (t.programId = e.programId), Object.keys(t).length > 0 ? t : null;
870
+ }
871
+ var xe = (t = {}) => {
872
+ let { apiGatewayUrl: n } = e(), { limit: r = 10, offset: a = 0 } = t, o = $(t);
868
873
  return i({
869
874
  queryKey: [
870
875
  "atheletebridge",
871
876
  "agent-runs",
872
877
  r,
873
- a
878
+ a,
879
+ o
874
880
  ],
875
- queryFn: async () => (await u(`query AthAgentRuns($pagination: PaginationInput) {
876
- athAgentRuns(pagination: $pagination) {
881
+ queryFn: async () => (await u(`query AthAgentRuns($pagination: PaginationInput, $filter: AthAgentRunFilter) {
882
+ athAgentRuns(pagination: $pagination, filter: $filter) {
877
883
  items { ${Z} }
878
884
  pageInfo { cursor hasMore }
879
885
  }
880
- }`, { pagination: {
881
- limit: r,
882
- offset: a
883
- } }, n)).athAgentRuns
886
+ }`, {
887
+ pagination: {
888
+ limit: r,
889
+ offset: a
890
+ },
891
+ filter: o
892
+ }, n)).athAgentRuns
884
893
  });
885
- }, xe = (t) => {
894
+ }, Se = (t) => {
886
895
  let { apiGatewayUrl: n } = e();
887
896
  return i({
888
897
  queryKey: [
@@ -896,7 +905,7 @@ var ge = (e = {}) => {
896
905
  enabled: !!t,
897
906
  retry: !1
898
907
  });
899
- }, Se = (t) => {
908
+ }, Ce = (t) => {
900
909
  let { apiGatewayUrl: n } = e();
901
910
  return i({
902
911
  queryKey: [
@@ -908,7 +917,7 @@ var ge = (e = {}) => {
908
917
  enabled: !!t,
909
918
  retry: !1
910
919
  });
911
- }, Ce = () => {
920
+ }, we = () => {
912
921
  let t = a(), { apiGatewayUrl: n } = e();
913
922
  return r({
914
923
  mutationFn: async (e) => (await u(`mutation AthGenerateProgram($input: AthGenerateProgramInput!) {
@@ -923,7 +932,7 @@ var ge = (e = {}) => {
923
932
  t.invalidateQueries({ queryKey: ["atheletebridge", "agent-runs"] }), t.invalidateQueries({ queryKey: ["atheletebridge", "programs"] }), t.invalidateQueries({ queryKey: ["atheletebridge", "sessions"] });
924
933
  }
925
934
  });
926
- }, we = () => {
935
+ }, Te = () => {
927
936
  let t = a(), { apiGatewayUrl: n } = e();
928
937
  return r({
929
938
  mutationFn: async ({ athleteId: e, programId: t, requestedProvider: r }) => (await u("mutation AthAdjustPlanFromPerformance($athleteId: ID!, $programId: ID!, $requestedProvider: String) {\n athAdjustPlanFromPerformance(athleteId: $athleteId, programId: $programId, requestedProvider: $requestedProvider) {\n agentRunId athleteId programId assessment rationale confidence\n recommendedWeeklyLoadChangePct flags appliedToProgram createdAt\n }\n }", {
@@ -939,7 +948,7 @@ var ge = (e = {}) => {
939
948
  ] });
940
949
  }
941
950
  });
942
- }, Te = () => {
951
+ }, Ee = () => {
943
952
  let t = a(), { apiGatewayUrl: n } = e();
944
953
  return r({
945
954
  mutationFn: async ({ runId: e, programId: t, assessment: r, note: i }) => (await u("mutation AthOverrideAgentRun($runId: ID!, $programId: ID!, $assessment: AthAiAssessment!, $note: String!) {\n athOverrideAgentRun(runId: $runId, programId: $programId, assessment: $assessment, note: $note) {\n id workspaceId programId supersedesRunId assessment note\n appliedToProgram createdAt\n }\n }", {
@@ -958,6 +967,6 @@ var ge = (e = {}) => {
958
967
  });
959
968
  };
960
969
  //#endregion
961
- export { c as AI_PROVIDER_UNAVAILABLE, l as AthApiError, J as directoryUserName, ae as useAddDrill, O as useAddMember, we as useAdjustPlanFromPerformance, xe as useAgentRun, $ as useAgentRuns, _e as useAiModelCatalog, ie as useArchiveProgram, D as useArchiveTeam, he as useAthleteProfile, q as useAvailability, R as useBookSession, V as useCancelSession, ge as useCoachAnalytics, B as useCompleteSession, z as useConfirmSession, te as useCreateProgram, T as useCreateTeam, de as useFile, j as useFixture, A as useFixtures, Ce as useGenerateProgram, W as useLogWorkout, Te as useOverrideAgentRun, U as usePerformanceMetrics, F as useProgram, Se as useProgramAiState, P as usePrograms, me as useRecentActivity, N as useRecordFixtureResult, G as useRecordMetric, ce as useRemindAvailability, oe as useRemoveDrill, k as useRemoveMember, ee as useScheduleFixture, L as useSession, I as useSessions, se as useSetAvailability, ye as useSetWorkspaceAiModel, be as useSetWorkspaceAutoPilot, M as useStandings, C as useTeam, w as useTeamMembers, S as useTeams, re as useTransitionProgram, ne as useUpdateProgram, E as useUpdateTeam, ue as useUploadFile, pe as useUserDirectory, fe as useUserSearch, Y as useUsersByIds, H as useWorkoutLogs, ve as useWorkspaceAiConfig };
970
+ export { c as AI_PROVIDER_UNAVAILABLE, l as AthApiError, J as directoryUserName, ae as useAddDrill, O as useAddMember, Te as useAdjustPlanFromPerformance, Se as useAgentRun, xe as useAgentRuns, _e as useAiModelCatalog, ie as useArchiveProgram, D as useArchiveTeam, he as useAthleteProfile, q as useAvailability, R as useBookSession, V as useCancelSession, ge as useCoachAnalytics, B as useCompleteSession, z as useConfirmSession, te as useCreateProgram, T as useCreateTeam, de as useFile, j as useFixture, A as useFixtures, we as useGenerateProgram, W as useLogWorkout, Ee as useOverrideAgentRun, U as usePerformanceMetrics, F as useProgram, Ce as useProgramAiState, P as usePrograms, me as useRecentActivity, N as useRecordFixtureResult, G as useRecordMetric, ce as useRemindAvailability, oe as useRemoveDrill, k as useRemoveMember, ee as useScheduleFixture, L as useSession, I as useSessions, se as useSetAvailability, ye as useSetWorkspaceAiModel, be as useSetWorkspaceAutoPilot, M as useStandings, C as useTeam, w as useTeamMembers, S as useTeams, re as useTransitionProgram, ne as useUpdateProgram, E as useUpdateTeam, ue as useUploadFile, pe as useUserDirectory, fe as useUserSearch, Y as useUsersByIds, H as useWorkoutLogs, ve as useWorkspaceAiConfig };
962
971
 
963
972
  //# sourceMappingURL=useAthleteBridgeApi.js.map