mirror of
https://github.com/BradGroux/veritas-kanban.git
synced 2026-10-08 12:47:51 +00:00
fix(types): replace as-any casts with proper type narrowing
This commit is contained in:
parent
ec5cc7a0e2
commit
4b4b1197ee
4 changed files with 111 additions and 12 deletions
|
|
@ -3913,3 +3913,67 @@
|
|||
{"type":"task.created","taskId":"task_20260128_PNHngW","status":"todo","id":"evt_bpE9jp_MFCZ8","timestamp":"2026-01-28T23:18:51.954Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260128_KXgXs-","project":"veritas-kanban","status":"done","previousStatus":"in-progress","id":"evt_i7ObLcav49RK","timestamp":"2026-01-28T23:19:15.060Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260128_fTudfN","project":"veritas-kanban","status":"in-progress","previousStatus":"todo","id":"evt_KlHOdVR_-UaW","timestamp":"2026-01-28T23:19:41.071Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260128_iFNFgD","project":"veritas-kanban","status":"done","previousStatus":"in-progress","id":"evt_X1C7orlxRQFY","timestamp":"2026-01-28T23:26:39.708Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260128_LTxaqy","project":"veritas-kanban","status":"in-progress","previousStatus":"todo","id":"evt_yTxRPnoZCryp","timestamp":"2026-01-28T23:27:17.549Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260126_legacy1","status":"blocked","previousStatus":"review","id":"evt_VMmyWf9VwZWJ","timestamp":"2026-01-28T23:27:27.839Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_lj4Z99","status":"todo","id":"evt_8FTG7WXaHgz-","timestamp":"2026-01-28T23:27:27.849Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_sBF9Nv","status":"todo","id":"evt_psmbhNov4Z3R","timestamp":"2026-01-28T23:27:27.855Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260128_sBF9Nv","status":"in-progress","previousStatus":"todo","id":"evt_kUekHpbkWHGb","timestamp":"2026-01-28T23:27:27.857Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_SYLpR_","status":"todo","id":"evt_rReB8JRWaG4u","timestamp":"2026-01-28T23:27:27.858Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260128_SYLpR_","status":"blocked","previousStatus":"todo","id":"evt_Y4rBSSjj9Hzo","timestamp":"2026-01-28T23:27:27.859Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_43vnTM","status":"todo","id":"evt_vzAzLJLruX6_","timestamp":"2026-01-28T23:27:27.860Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260128_43vnTM","status":"done","previousStatus":"todo","id":"evt_K5t87ZXDtUV4","timestamp":"2026-01-28T23:27:27.860Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_p1PLRl","project":"my-project","status":"todo","id":"evt_5ahbJVZwBUlf","timestamp":"2026-01-28T23:27:27.864Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260126_idem1","status":"blocked","previousStatus":"review","id":"evt_w-UnHxp5CtVj","timestamp":"2026-01-28T23:27:27.866Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_BQ3-gL","status":"todo","id":"evt_7pro9QOmHrO6","timestamp":"2026-01-28T23:27:27.868Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_QkCHxG","status":"todo","id":"evt_eV7jh9FyC_8t","timestamp":"2026-01-28T23:27:27.873Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260126_multi2","status":"blocked","previousStatus":"review","id":"evt_mgK-mP4QJPqz","timestamp":"2026-01-28T23:27:27.876Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260126_multi1","status":"blocked","previousStatus":"review","id":"evt_J2puAECXTaZk","timestamp":"2026-01-28T23:27:27.876Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_MmcFgY","status":"todo","id":"evt_PnxqHkye-g2g","timestamp":"2026-01-28T23:27:27.876Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_hT819y","status":"todo","id":"evt_EeX4hqyr1UqT","timestamp":"2026-01-28T23:27:27.889Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260128_MmcFgY","status":"in-progress","previousStatus":"todo","id":"evt_ffL8-vv2NeQA","timestamp":"2026-01-28T23:27:27.890Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_7fgNop","status":"todo","id":"evt_bIyUvz9NeRPL","timestamp":"2026-01-28T23:27:27.895Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_1B5w5Q","status":"todo","id":"evt_6TMhdPb7sWeY","timestamp":"2026-01-28T23:27:27.898Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_IYgvXl","status":"todo","id":"evt_sbRP7kB7XO49","timestamp":"2026-01-28T23:27:27.912Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_5xHrOL","status":"todo","id":"evt_jT5Uw8_mvNsR","timestamp":"2026-01-28T23:27:27.932Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_ZYZWzi","status":"todo","id":"evt_b7xFKC3Vi24S","timestamp":"2026-01-28T23:27:27.935Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_aOoNnj","status":"todo","id":"evt_UCyxa6b1hdvo","timestamp":"2026-01-28T23:27:27.938Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_QmqnPn","status":"todo","id":"evt_GcEQSPE0Lsa_","timestamp":"2026-01-28T23:27:27.943Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_V68maD","status":"todo","id":"evt_b0kpvnwOejnU","timestamp":"2026-01-28T23:27:27.952Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_7qD-UI","status":"todo","id":"evt_hoRGbBuazqbJ","timestamp":"2026-01-28T23:27:27.969Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_QI6jIO","status":"todo","id":"evt_QA5cXJlxsjNQ","timestamp":"2026-01-28T23:27:27.974Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_BT3M14","status":"todo","id":"evt_kINtIAZlazKX","timestamp":"2026-01-28T23:27:27.979Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_CkCfO_","status":"todo","id":"evt_Xwvg2Aua7BGw","timestamp":"2026-01-28T23:27:27.981Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_QKDumH","project":"test-project","status":"todo","id":"evt_7RbOiyIaJ0UI","timestamp":"2026-01-28T23:27:27.981Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_p-6qI6","status":"todo","id":"evt_urI8YxvCXGch","timestamp":"2026-01-28T23:27:27.987Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_Rzpwgn","status":"todo","id":"evt_ZaIyhKoW1o9h","timestamp":"2026-01-28T23:27:27.988Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_jqse3Q","status":"todo","id":"evt_RB5e5Z6bNvIb","timestamp":"2026-01-28T23:27:27.989Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_haeVOH","status":"todo","id":"evt_2pYQjXXWAVSP","timestamp":"2026-01-28T23:27:27.996Z"}
|
||||
{"type":"task.restored","taskId":"task_20260126_arch1","status":"done","id":"evt_Pa0qC9CJdKMG","timestamp":"2026-01-28T23:27:27.998Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260126_arch1","status":"blocked","previousStatus":"done","id":"evt_JiMmO53cXCHJ","timestamp":"2026-01-28T23:27:27.999Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_czW7n3","status":"todo","id":"evt_46j7Bf4iE0aO","timestamp":"2026-01-28T23:27:27.999Z"}
|
||||
{"type":"task.archived","taskId":"task_20260126_arch1","status":"blocked","id":"evt_MlGWo9pnFH-z","timestamp":"2026-01-28T23:27:28.000Z"}
|
||||
{"type":"task.archived","taskId":"task_20260128_czW7n3","status":"todo","id":"evt_djComEhLRvgk","timestamp":"2026-01-28T23:27:28.001Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_-uhv7U","status":"todo","id":"evt_5AN6TJvorSKF","timestamp":"2026-01-28T23:27:28.004Z"}
|
||||
{"type":"task.status_changed","taskId":"task_20260128_-uhv7U","status":"in-progress","previousStatus":"todo","id":"evt_-Wk7-9J36ZgZ","timestamp":"2026-01-28T23:27:28.009Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_dXHAIj","status":"todo","id":"evt_NGKNGQMc2CqP","timestamp":"2026-01-28T23:27:28.013Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_sUEmpo","status":"todo","id":"evt_B-mZSF4GBdxd","timestamp":"2026-01-28T23:27:28.018Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_n5aO8k","status":"todo","id":"evt_Z1PmMp2u-Ra9","timestamp":"2026-01-28T23:27:28.022Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_8cHMuK","status":"todo","id":"evt_mSQj8c3rdvvS","timestamp":"2026-01-28T23:27:28.026Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_jwxuzA","status":"todo","id":"evt_OUceL334UP69","timestamp":"2026-01-28T23:27:28.027Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_HtzXYk","status":"todo","id":"evt_YxwdchAAEvnZ","timestamp":"2026-01-28T23:27:28.033Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_sOYg1P","status":"todo","id":"evt__DpsvkFuEiAj","timestamp":"2026-01-28T23:27:28.035Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_zaUHfj","status":"todo","id":"evt_CkdOdJrXE6VE","timestamp":"2026-01-28T23:27:28.039Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_6VFrU8","status":"todo","id":"evt_lYPzqEziVTLs","timestamp":"2026-01-28T23:27:28.042Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_Glgvaf","status":"todo","id":"evt__TBFocfkJOpn","timestamp":"2026-01-28T23:27:28.043Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_JvmuVL","status":"todo","id":"evt_FwLG9vQIPZyg","timestamp":"2026-01-28T23:27:28.049Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_GAGA6m","status":"todo","id":"evt_UjxLEK6-s1YE","timestamp":"2026-01-28T23:27:28.057Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_U_4372","status":"todo","id":"evt_av3ebPB-ncTr","timestamp":"2026-01-28T23:27:28.063Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_UvcmNW","status":"todo","id":"evt_gUz2BpieniHE","timestamp":"2026-01-28T23:27:28.068Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_Y-3iHI","project":"project-a","status":"todo","id":"evt_U8R_y4wYTe3x","timestamp":"2026-01-28T23:27:28.083Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_ukkEcs","project":"project-a","status":"todo","id":"evt_3dDxNWLtB5Dd","timestamp":"2026-01-28T23:27:28.084Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_jj1qjE","project":"project-b","status":"todo","id":"evt_4pgFqXEVC1af","timestamp":"2026-01-28T23:27:28.085Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_MhTVqi","status":"todo","id":"evt_FWu4L4Fnl3aI","timestamp":"2026-01-28T23:27:28.110Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_hAmiS8","status":"todo","id":"evt_xyDVtMkhHNpf","timestamp":"2026-01-28T23:27:28.123Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_iuB0lF","status":"todo","id":"evt_MkA_8ItHmobO","timestamp":"2026-01-28T23:27:28.127Z"}
|
||||
{"type":"task.created","taskId":"task_20260128_oiEekN","status":"todo","id":"evt_YRPGA9mojxOK","timestamp":"2026-01-28T23:27:28.128Z"}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,37 @@
|
|||
[
|
||||
{
|
||||
"id": "activity_1769642837550_cmukzh57h",
|
||||
"type": "status_changed",
|
||||
"taskId": "task_20260128_LTxaqy",
|
||||
"taskTitle": "PERF: Optimize telemetry storage growth and query performance",
|
||||
"details": {
|
||||
"from": "todo",
|
||||
"status": "in-progress"
|
||||
},
|
||||
"timestamp": "2026-01-28T23:27:17.550Z"
|
||||
},
|
||||
{
|
||||
"id": "activity_1769642805992_n500diz9w",
|
||||
"type": "comment_added",
|
||||
"taskId": "task_20260128_iFNFgD",
|
||||
"taskTitle": "QUALITY: Audit and fix 39 silent catch blocks",
|
||||
"details": {
|
||||
"author": "Veritas",
|
||||
"preview": "Audited all catch blocks across server/src and web..."
|
||||
},
|
||||
"timestamp": "2026-01-28T23:26:45.992Z"
|
||||
},
|
||||
{
|
||||
"id": "activity_1769642799708_eggjdun33",
|
||||
"type": "status_changed",
|
||||
"taskId": "task_20260128_iFNFgD",
|
||||
"taskTitle": "QUALITY: Audit and fix 39 silent catch blocks",
|
||||
"details": {
|
||||
"from": "in-progress",
|
||||
"status": "done"
|
||||
},
|
||||
"timestamp": "2026-01-28T23:26:39.708Z"
|
||||
},
|
||||
{
|
||||
"id": "activity_1769642381071_3yttsvfj6",
|
||||
"type": "status_changed",
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
import fs from 'fs/promises';
|
||||
import { createReadStream, createWriteStream } from 'fs';
|
||||
import path from 'path';
|
||||
import { createGzip, gunzipSync } from 'zlib';
|
||||
import { pipeline } from 'stream/promises';
|
||||
import { nanoid } from 'nanoid';
|
||||
import type {
|
||||
TelemetryEvent,
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ export function useUpdateFeatureSettings() {
|
|||
const queryClient = useQueryClient();
|
||||
|
||||
return useMutation({
|
||||
mutationFn: (patch: Partial<FeatureSettings>) => api.settings.updateFeatures(patch),
|
||||
mutationFn: (patch: Record<string, any>) => api.settings.updateFeatures(patch),
|
||||
onMutate: async (patch) => {
|
||||
// Cancel in-flight fetches
|
||||
await queryClient.cancelQueries({ queryKey: QUERY_KEY });
|
||||
|
|
@ -61,13 +61,13 @@ export function useUpdateFeatureSettings() {
|
|||
|
||||
// Optimistically update
|
||||
if (previous) {
|
||||
const optimistic: Record<string, Record<string, unknown>> = { ...previous };
|
||||
const patchRecord = patch as Record<string, Record<string, unknown>>;
|
||||
for (const section of Object.keys(patchRecord)) {
|
||||
if (section in optimistic && typeof patchRecord[section] === 'object') {
|
||||
// SAFETY: FeatureSettings sections are all objects — use Record view for dynamic key access
|
||||
const optimistic = { ...previous } as unknown as Record<string, Record<string, unknown>>;
|
||||
for (const section of Object.keys(patch) as Array<keyof FeatureSettings>) {
|
||||
if (section in optimistic && typeof patch[section] === 'object') {
|
||||
optimistic[section] = {
|
||||
...optimistic[section],
|
||||
...patchRecord[section],
|
||||
...patch[section],
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -96,23 +96,22 @@ export function useUpdateFeatureSettings() {
|
|||
export function useDebouncedFeatureUpdate(delayMs = 500) {
|
||||
const update = useUpdateFeatureSettings();
|
||||
const timeoutRef = { current: null as ReturnType<typeof setTimeout> | null };
|
||||
const pendingRef = { current: {} as Record<string, Record<string, unknown>> };
|
||||
const pendingRef = { current: {} as Record<string, any> };
|
||||
|
||||
const flush = useCallback(() => {
|
||||
if (Object.keys(pendingRef.current).length > 0) {
|
||||
update.mutate({ ...pendingRef.current } as Partial<FeatureSettings>);
|
||||
update.mutate({ ...pendingRef.current });
|
||||
pendingRef.current = {};
|
||||
}
|
||||
}, [update]);
|
||||
|
||||
const debouncedUpdate = useCallback(
|
||||
(patch: Partial<FeatureSettings>) => {
|
||||
(patch: Record<string, any>) => {
|
||||
// Merge into pending batch
|
||||
const patchRecord = patch as Record<string, Record<string, unknown>>;
|
||||
for (const section of Object.keys(patchRecord)) {
|
||||
for (const section of Object.keys(patch)) {
|
||||
pendingRef.current[section] = {
|
||||
...(pendingRef.current[section] || {}),
|
||||
...patchRecord[section],
|
||||
...patch[section],
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue