@burdenoff/microfe-atheletebridge 2026.1029.1 → 2026.1031.2
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.
- package/dist/atheletebridge/components/ai/AiModelPicker.d.ts.map +1 -1
- package/dist/atheletebridge/components/ai/AiModelPicker.js +17 -3
- package/dist/atheletebridge/components/ai/AiModelPicker.js.map +1 -1
- package/dist/atheletebridge/components/ai/DecisionCard.d.ts.map +1 -1
- package/dist/atheletebridge/components/ai/DecisionCard.js +217 -122
- package/dist/atheletebridge/components/ai/DecisionCard.js.map +1 -1
- package/dist/atheletebridge/components/ai/SubjectDecisions.d.ts +29 -0
- package/dist/atheletebridge/components/ai/SubjectDecisions.d.ts.map +1 -0
- package/dist/atheletebridge/components/ai/SubjectDecisions.js +69 -0
- package/dist/atheletebridge/components/ai/SubjectDecisions.js.map +1 -0
- package/dist/atheletebridge/components/ai/index.d.ts +2 -0
- package/dist/atheletebridge/components/ai/index.d.ts.map +1 -1
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts +10 -1
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts.map +1 -1
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +25 -16
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
- package/dist/atheletebridge/pages/athletes/AthleteProfilePage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/athletes/AthleteProfilePage.js +135 -118
- package/dist/atheletebridge/pages/athletes/AthleteProfilePage.js.map +1 -1
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +42 -34
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/teams/TeamDetailPage.d.ts.map +1 -1
- package/dist/atheletebridge/pages/teams/TeamDetailPage.js +65 -57
- package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
- package/dist/atheletebridge/types/index.d.ts +6 -0
- package/dist/atheletebridge/types/index.d.ts.map +1 -1
- package/dist/atheletebridge/utils/aiDecision.d.ts +12 -0
- package/dist/atheletebridge/utils/aiDecision.d.ts.map +1 -1
- package/dist/atheletebridge/utils/aiDecision.js +11 -1
- package/dist/atheletebridge/utils/aiDecision.js.map +1 -1
- package/package.json +1 -1
|
@@ -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
|
-
/**
|
|
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":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,eAAe,EAEf,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,SAAS,EAET,eAAe,EACf,oBAAoB,EAEpB,iBAAiB,EACjB,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,QAAQ,EACR,WAAW,EAEX,OAAO,EACP,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EAChB,MAAM,UAAU,CAAC;AAMlB,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAEjE;;;;;;;;;;GAUG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQlE;AAED,+EAA+E;AAC/E,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,WACM,CAAC;AAsIzE,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,QAAQ,GAAI,UAAS,WAAgB,sFAsBjD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,GAAG,SAAS,mFAoB7C,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,SAAS,eAAe,gFAgBlF,CAAC;AAEF,eAAO,MAAM,aAAa,sGAkBzB,CAAC;AAEF,eAAO,MAAM,aAAa;QAIkB,MAAM;WAAS,kBAAkB;WAe5E,CAAC;AAEF,eAAO,MAAM,cAAc,0FAgB1B,CAAC;AAEF,eAAO,MAAM,YAAY,uGAqBxB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,uFAiB9C,CAAC;AAMF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,UAAS,cAAmB,yFAsBvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,GAAG,SAAS,sFAgBhD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,aAAa,MAAM,GAAG,SAAS,kFAgB3D,CAAC;AAEF,eAAO,MAAM,kBAAkB,4GAkB9B,CAAC;AAEF,eAAO,MAAM,sBAAsB;QAIS,MAAM;WAAS,oBAAoB;WAgB9E,CAAC;AAMF,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,UAAS,cAAmB,yFAuBvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,GAAG,SAAS,sFAmBhD,CAAC;AAEF,eAAO,MAAM,gBAAgB,4GAkB5B,CAAC;AAEF,eAAO,MAAM,gBAAgB;QAIe,MAAM;WAAS,qBAAqB;WAe/E,CAAC;AAEF,eAAO,MAAM,oBAAoB;QAIY,MAAM;YAAU,gBAAgB;WAe5E,CAAC;AAEF,eAAO,MAAM,iBAAiB,0FAgB7B,CAAC;AAEF,eAAO,MAAM,WAAW,qGAoBvB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,YAAY,MAAM,uFAgBhD,CAAC;AAMF,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,UAAS,cAAmB,yFAuBvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,GAAG,SAAS,sFAgBhD,CAAC;AAEF,eAAO,MAAM,cAAc,0GAkB1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,6FAmB7B,CAAC;AAEF,eAAO,MAAM,kBAAkB;QAIa,MAAM;YAAU,uBAAuB;WAelF,CAAC;AAEF,eAAO,MAAM,gBAAgB,6FAmB5B,CAAC;AAMF,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,GAAI,UAAS,iBAAsB,4FAsB7D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,GAAG,SAAS,EAC7B,aAAa,eAAe,2FAmB7B,CAAC;AAEF,eAAO,MAAM,aAAa,4GAkBzB,CAAC;AAEF,eAAO,MAAM,eAAe,qHAkB3B,CAAC;AAYF,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+DAA+D;AAC/D,eAAO,MAAM,eAAe,GAAI,SAAS,mBAAmB,sFAoB3D,CAAC;AAEF,eAAO,MAAM,kBAAkB,mHAoB9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;gBAGU,MAAM;gBAAc,MAAM;WAWrE,CAAC;AAYF;;;;GAIG;AACH,eAAO,MAAM,aAAa,eAGT,IAAI,KAAG,OAAO,CAAC,MAAM,CA6CrC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,GAAG,SAAS,4FAiB7C,CAAC;AAOF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,GAAI,MAAM,aAAa,KAAG,MAMvD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,oFAsB3C,CAAC;AAUF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,aAAa,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,iGAkD1E,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;IAC9D,4DAA4D;IAC5D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACvE;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,aAAa,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,KAAG,aAUhF,CAAC;AASF,MAAM,MAAM,YAAY,GACtB,cAAc,GAAG,cAAc,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAElG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,GAAI,iDAM/B,mBAAmB,KAAG,YAAY,EAyEa,CAAC;AAQnD,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,GAAG,SAAS,EAC1B,UAAU,MAAM,GAAG,SAAS,KAC3B,cA4BF,CAAC;AAOF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;IACvC,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6EAA6E;IAC7E,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACvE,kFAAkF;IAClF,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;;;;OAIG;IACH,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wEAAwE;IACxE,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,6CAA6C;IAC7C,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,uDAAuD;IACvD,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgCD,gEAAgE;AAChE,eAAO,MAAM,iBAAiB,GAAI,UAAS,qBAA0B,KAAG,cAmMvE,CAAC;AAkBF,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,wFAiB7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,mGAehC,CAAC;AAEF,eAAO,MAAM,sBAAsB;cAIqB,MAAM;WAAS,MAAM;WAc5E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,wGAkBpC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"useAthleteBridgeApi.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/hooks/useAthleteBridgeApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,eAAe,EAEf,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,SAAS,EAET,eAAe,EACf,oBAAoB,EAEpB,iBAAiB,EACjB,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,QAAQ,EACR,WAAW,EAEX,OAAO,EACP,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EAChB,MAAM,UAAU,CAAC;AAMlB,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAEjE;;;;;;;;;;GAUG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQlE;AAED,+EAA+E;AAC/E,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,WACM,CAAC;AAsIzE,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,QAAQ,GAAI,UAAS,WAAgB,sFAsBjD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,GAAG,SAAS,mFAoB7C,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,SAAS,eAAe,gFAgBlF,CAAC;AAEF,eAAO,MAAM,aAAa,sGAkBzB,CAAC;AAEF,eAAO,MAAM,aAAa;QAIkB,MAAM;WAAS,kBAAkB;WAe5E,CAAC;AAEF,eAAO,MAAM,cAAc,0FAgB1B,CAAC;AAEF,eAAO,MAAM,YAAY,uGAqBxB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,uFAiB9C,CAAC;AAMF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,UAAS,cAAmB,yFAsBvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,GAAG,SAAS,sFAgBhD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,aAAa,MAAM,GAAG,SAAS,kFAgB3D,CAAC;AAEF,eAAO,MAAM,kBAAkB,4GAkB9B,CAAC;AAEF,eAAO,MAAM,sBAAsB;QAIS,MAAM;WAAS,oBAAoB;WAgB9E,CAAC;AAMF,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,UAAS,cAAmB,yFAuBvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,GAAG,SAAS,sFAmBhD,CAAC;AAEF,eAAO,MAAM,gBAAgB,4GAkB5B,CAAC;AAEF,eAAO,MAAM,gBAAgB;QAIe,MAAM;WAAS,qBAAqB;WAe/E,CAAC;AAEF,eAAO,MAAM,oBAAoB;QAIY,MAAM;YAAU,gBAAgB;WAe5E,CAAC;AAEF,eAAO,MAAM,iBAAiB,0FAgB7B,CAAC;AAEF,eAAO,MAAM,WAAW,qGAoBvB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,YAAY,MAAM,uFAgBhD,CAAC;AAMF,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,UAAS,cAAmB,yFAuBvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,GAAG,SAAS,sFAgBhD,CAAC;AAEF,eAAO,MAAM,cAAc,0GAkB1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,6FAmB7B,CAAC;AAEF,eAAO,MAAM,kBAAkB;QAIa,MAAM;YAAU,uBAAuB;WAelF,CAAC;AAEF,eAAO,MAAM,gBAAgB,6FAmB5B,CAAC;AAMF,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,eAAO,MAAM,cAAc,GAAI,UAAS,iBAAsB,4FAsB7D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,GAAG,SAAS,EAC7B,aAAa,eAAe,2FAmB7B,CAAC;AAEF,eAAO,MAAM,aAAa,4GAkBzB,CAAC;AAEF,eAAO,MAAM,eAAe,qHAkB3B,CAAC;AAYF,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+DAA+D;AAC/D,eAAO,MAAM,eAAe,GAAI,SAAS,mBAAmB,sFAoB3D,CAAC;AAEF,eAAO,MAAM,kBAAkB,mHAoB9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;gBAGU,MAAM;gBAAc,MAAM;WAWrE,CAAC;AAYF;;;;GAIG;AACH,eAAO,MAAM,aAAa,eAGT,IAAI,KAAG,OAAO,CAAC,MAAM,CA6CrC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,GAAG,SAAS,4FAiB7C,CAAC;AAOF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,GAAI,MAAM,aAAa,KAAG,MAMvD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,oFAsB3C,CAAC;AAUF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,aAAa,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,iGAkD1E,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;IAC9D,4DAA4D;IAC5D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACvE;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,aAAa,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,KAAG,aAUhF,CAAC;AASF,MAAM,MAAM,YAAY,GACtB,cAAc,GAAG,cAAc,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAElG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,GAAI,iDAM/B,mBAAmB,KAAG,YAAY,EAyEa,CAAC;AAQnD,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,GAAG,SAAS,EAC1B,UAAU,MAAM,GAAG,SAAS,KAC3B,cA4BF,CAAC;AAOF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;IACvC,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6EAA6E;IAC7E,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACvE,kFAAkF;IAClF,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;;;;OAIG;IACH,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wEAAwE;IACxE,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,6CAA6C;IAC7C,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,uDAAuD;IACvD,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgCD,gEAAgE;AAChE,eAAO,MAAM,iBAAiB,GAAI,UAAS,qBAA0B,KAAG,cAmMvE,CAAC;AAkBF,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,wFAiB7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,mGAehC,CAAC;AAEF,eAAO,MAAM,sBAAsB;cAIqB,MAAM;WAAS,MAAM;WAc5E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,wGAkBpC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,UAAS,eAAoB,0FAoBzD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,GAAG,SAAS,uFAiBjD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,IAAI,MAAM,GAAG,SAAS;aAMqB,OAAO;kBAanF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,4HAyB9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;eASxB,MAAM;eACN,MAAM;wBACG,MAAM;WAqB/B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;WAUnB,MAAM;eACF,MAAM;gBACL,eAAe;UACrB,MAAM;WAqBjB,CAAC;AAMF,eAAO,MAAM,SAAS,qEAarB,CAAC"}
|
|
@@ -829,7 +829,7 @@ var ge = (e = {}) => {
|
|
|
829
829
|
let { apiGatewayUrl: t } = e();
|
|
830
830
|
return i({
|
|
831
831
|
queryKey: ["atheletebridge", "ai-model-catalog"],
|
|
832
|
-
queryFn: async () => (await u("query AthAiModelCatalog {\n athAiModelCatalog { provider model label isDefault capabilities }\n }", {}, t)).athAiModelCatalog,
|
|
832
|
+
queryFn: async () => (await u("query AthAiModelCatalog {\n athAiModelCatalog { provider model label isDefault capabilities configured }\n }", {}, t)).athAiModelCatalog,
|
|
833
833
|
staleTime: 30 * 6e4
|
|
834
834
|
});
|
|
835
835
|
}, ve = () => {
|
|
@@ -863,26 +863,35 @@ var ge = (e = {}) => {
|
|
|
863
863
|
t.setQueryData(["atheletebridge", "ai-config"], e);
|
|
864
864
|
}
|
|
865
865
|
});
|
|
866
|
-
}
|
|
867
|
-
|
|
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
|
-
}`, {
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
886
|
+
}`, {
|
|
887
|
+
pagination: {
|
|
888
|
+
limit: r,
|
|
889
|
+
offset: a
|
|
890
|
+
},
|
|
891
|
+
filter: o
|
|
892
|
+
}, n)).athAgentRuns
|
|
884
893
|
});
|
|
885
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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,
|
|
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
|