refactor(ts-migration): Phase 11 batch 7 — the assistant's non-component modules
The eleven `.js` files under `src/components/ai-assistant/`: the blocks
format, contexts, routing, history, placement, viewport, the greeting
and prompt tables in `dynamic`, the derivations in `insights`, and
`uiEdit`, whose boundary batch 1 already typed.
79 errors, and two optional markers cleared 63 of them.
`plural(n, word, irregular)` is called with two arguments sixty times in
`dynamic.ts` and its own body reads `irregular || \`${word}s\``, so the
third parameter has always been optional in everything but the
signature. `heading(value, sub)` is the same: `sub` is spread into the
block and `undefined` is what most callers mean. Marking both optional
is a statement about the existing contract, and the markers erase — the
emitted signatures still read `plural=(n,word,irregular)` and
`heading=(value,sub)`, checked in the output rather than assumed.
Those three `heading` errors landed in `lib/skills/workforceFlow.ts`,
already migrated and untouched here. Worth noting how that works: a
function's arity only starts being enforced on its callers once the file
defining it is TypeScript. Migrating a leaf makes claims about every
file that imports it, which is why this phase moves bottom-up.
The remaining nine were two `reduce` accumulators inferring `{}`, so
`Object.values` over them produced `unknown`. Both are now stated —
`{ label, count }` for the score bands, and the five-field hire grouping
— which is more useful than `any` and exactly what the lines below them
build.
Measured against `dde4ba6`:
typecheck 6 errors, unchanged; no new error anywhere
lint exit 0, 0 errors, 289 warnings
npm test 1684/1691, the same 7 failures verbatim
build exit 0, identical bundle hash 74d17e2d…
type erasure 83/83 byte-identical across Phase 11 so far
No baseline artifact touched.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HBG1wnuRfJKCstGB8Fekr8
This commit is contained in:
@@ -20,7 +20,7 @@ export const doc = (...blocks) => ({
|
|||||||
export const text = (value) => value && { type: 'text', text: value };
|
export const text = (value) => value && { type: 'text', text: value };
|
||||||
|
|
||||||
/** A section label inside a response. */
|
/** A section label inside a response. */
|
||||||
export const heading = (value, sub) => value && { type: 'heading', text: value, sub };
|
export const heading = (value, sub?) => value && { type: 'heading', text: value, sub };
|
||||||
|
|
||||||
/** Headline figures. `items: [{ label, value, delta?, sub?, tone? }]` */
|
/** Headline figures. `items: [{ label, value, delta?, sub?, tone? }]` */
|
||||||
export const kpis = (items) => items?.length && { type: 'kpis', items };
|
export const kpis = (items) => items?.length && { type: 'kpis', items };
|
||||||
@@ -15,7 +15,7 @@ import { PRIVILEGED_EVENTS, activitySignals } from '@/lib/activitySignals';
|
|||||||
|
|
||||||
export const pct = (n, d) => (d ? Math.round((n / d) * 100) : 0);
|
export const pct = (n, d) => (d ? Math.round((n / d) * 100) : 0);
|
||||||
|
|
||||||
export const plural = (n, word, irregular) =>
|
export const plural = (n, word, irregular?) =>
|
||||||
`${n} ${n === 1 ? word : irregular || `${word}s`}`;
|
`${n} ${n === 1 ? word : irregular || `${word}s`}`;
|
||||||
|
|
||||||
export const verb = (n, singular, plural_) => (n === 1 ? singular : plural_);
|
export const verb = (n, singular, plural_) => (n === 1 ? singular : plural_);
|
||||||
@@ -215,7 +215,7 @@ export function buildFacts({
|
|||||||
),
|
),
|
||||||
experienced: profiles.filter((p) => (p.experience_years || 0) >= 3),
|
experienced: profiles.filter((p) => (p.experience_years || 0) >= 3),
|
||||||
avgScore: avg(profiles.filter((p) => p.krow_score > 0).map((p) => p.krow_score)),
|
avgScore: avg(profiles.filter((p) => p.krow_score > 0).map((p) => p.krow_score)),
|
||||||
bands: Object.values(profiles.reduce((acc, p) => {
|
bands: Object.values(profiles.reduce<Record<string, { label: string; count: number }>>((acc, p) => {
|
||||||
const { label } = getScoreBand(p.krow_score || 0);
|
const { label } = getScoreBand(p.krow_score || 0);
|
||||||
acc[label] ||= { label, count: 0 };
|
acc[label] ||= { label, count: 0 };
|
||||||
acc[label].count += 1;
|
acc[label].count += 1;
|
||||||
@@ -241,7 +241,9 @@ export function buildFacts({
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
const groupHires = (key) => Object.values(hires.reduce((acc, h) => {
|
const groupHires = (key) => Object.values(hires.reduce<Record<string, {
|
||||||
|
name: string; count: number; scores: any[]; days: any[]; ratings: any[];
|
||||||
|
}>>((acc, h) => {
|
||||||
const name = h[key] || 'Unspecified';
|
const name = h[key] || 'Unspecified';
|
||||||
acc[name] ||= { name, count: 0, scores: [], days: [], ratings: [] };
|
acc[name] ||= { name, count: 0, scores: [], days: [], ratings: [] };
|
||||||
acc[name].count += 1;
|
acc[name].count += 1;
|
||||||
Reference in New Issue
Block a user