{isInitializing ? ( -
+

Loading console state...

) : ( <> {/* Simulator Panel */} - {showSimulator && ( -
-
-

- Inbox Mail Feed Simulator -

-

- Simulate new support tickets/email threads landing in the team inbox to verify routing - behavior. -

-
- - {/* Presets */} -
-

Click a preset mail to inject:

-
- {presets.map((preset, index) => ( - - ))} -
-
- -
-

- Or create a custom email message: -

-
-
- - setSender(e.target.value)} - className="w-full p-2 bg-zinc-950 border border-zinc-850 rounded-lg text-xs text-zinc-200 focus:outline-none focus:border-zinc-700" - /> -
- -
- - setSubject(e.target.value)} - className="w-full p-2 bg-zinc-950 border border-zinc-850 rounded-lg text-xs text-zinc-200 focus:outline-none focus:border-zinc-700" - /> -
- -
- - -
- -
- - setSnippet(e.target.value)} - className="w-full p-2 bg-zinc-950 border border-zinc-850 rounded-lg text-xs text-zinc-200 focus:outline-none focus:border-zinc-700" - /> + {showSimulator && ( +
+
+

+ Inbox Mail Feed Simulator +

+

+ Simulate new support tickets/email threads landing in the team inbox to verify + routing behavior. +

-
- -
- {(["low", "medium", "high"] as const).map((p) => ( + {/* Presets */} +
+

Click a preset mail to inject:

+
+ {presets.map((preset, index) => ( ))}
-
- +
+

+ Or create a custom email message: +

+ +
+ + setSender(e.target.value)} + className="w-full p-2 bg-zinc-950 border border-zinc-850 rounded-lg text-xs text-zinc-200 focus:outline-none focus:border-zinc-700" + /> +
+ +
+ + setSubject(e.target.value)} + className="w-full p-2 bg-zinc-950 border border-zinc-850 rounded-lg text-xs text-zinc-200 focus:outline-none focus:border-zinc-700" + /> +
+ +
+ + +
+ +
+ + setSnippet(e.target.value)} + className="w-full p-2 bg-zinc-950 border border-zinc-850 rounded-lg text-xs text-zinc-200 focus:outline-none focus:border-zinc-700" + /> +
+ +
+ +
+ {(["low", "medium", "high"] as const).map((p) => ( + + ))} +
+
+ +
+ +
+
- -
-
- )} +
+ )} {/* Simulator feedback banner */}
@@ -306,154 +313,154 @@ export function AssignmentConsole() {
{/* Metrics Dashboard */} -
- {/* Metric 1 */} -
- - Unassigned Tickets - -
- 0 ? "text-amber-400" : "text-zinc-300" - }`} - > - {metrics.unassignedThreads} - - active inbox -
-
+
+ {/* Metric 1 */} +
+ + Unassigned Tickets + +
+ 0 ? "text-amber-400" : "text-zinc-300" + }`} + > + {metrics.unassignedThreads} + + active inbox +
+
- {/* Metric 2 */} -
- - Average Workload - -
- - {metrics.averageWorkload} - - threads / agent -
-
+ {/* Metric 2 */} +
+ + Average Workload + +
+ + {metrics.averageWorkload} + + threads / agent +
+
- {/* Metric 3 */} -
- - Collaborators - -
- - {metrics.activeAgents} - - / {metrics.totalAgents} online -
-
+ {/* Metric 3 */} +
+ + Collaborators + +
+ + {metrics.activeAgents} + + / {metrics.totalAgents} online +
+
- {/* Metric 4 */} -
- - Completed/Resolved - -
- - {metrics.resolvedThreads} - - threads + {/* Metric 4 */} +
+ + Completed/Resolved + +
+ + {metrics.resolvedThreads} + + threads +
+
-
-
- {/* Main workspace layout */} -
- {/* Left/Middle: Ticket Workspace */} -
-
-

- Mail Queue & Thread Streams ({threads.length}) -

-
- -
+ {/* Main workspace layout */} +
+ {/* Left/Middle: Ticket Workspace */} +
+
+

+ Mail Queue & Thread Streams ({threads.length}) +

+
+ +
- {/* Right Sidebar: Collaborators & Workload Balancing */} -
- + {/* Right Sidebar: Collaborators & Workload Balancing */} +
+ - {/* Audit Trail Logs */} -
-
-

- Assignment Activity Logs -

- Real-time audit -
+ {/* Audit Trail Logs */} +
+
+

+ Assignment Activity Logs +

+ Real-time audit +
-
- {logs.length === 0 ? ( -

- No assignment operations logged yet. -

- ) : ( - logs.map((log) => ( -
-
- {log.id} - - {new Date(log.timestamp).toLocaleTimeString([], { - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - })} - -
-
- - {log.operator === "Auto-Routing Engine" - ? "⚡ Auto-Router" - : `👤 ${log.operator}`} - - - {log.action} - - {log.agentId !== "all" && ( - <> - collaborator - {log.agentName} - - )} -
-

- Subject: {log.threadSubject} +

+ {logs.length === 0 ? ( +

+ No assignment operations logged yet.

-
- )) - )} + ) : ( + logs.map((log) => ( +
+
+ {log.id} + + {new Date(log.timestamp).toLocaleTimeString([], { + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + })} + +
+
+ + {log.operator === "Auto-Routing Engine" + ? "⚡ Auto-Router" + : `👤 ${log.operator}`} + + + {log.action} + + {log.agentId !== "all" && ( + <> + collaborator + {log.agentName} + + )} +
+

+ Subject: {log.threadSubject} +

+
+ )) + )} +
-
)}
diff --git a/tools/v2/team/multi-agent-assignment/components/ThreadList.tsx b/tools/v2/team/multi-agent-assignment/components/ThreadList.tsx index ed63fbd6..655c6ed6 100644 --- a/tools/v2/team/multi-agent-assignment/components/ThreadList.tsx +++ b/tools/v2/team/multi-agent-assignment/components/ThreadList.tsx @@ -83,7 +83,9 @@ export function ThreadList({ aria-controls="threads-panel" onClick={() => setFilter(t)} className={`px-3 py-1.5 rounded-md text-[10px] font-semibold uppercase tracking-wider transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-sky-500/50 ${ - filter === t ? "bg-zinc-800 text-sky-400 shadow-sm" : "text-zinc-400 hover:text-zinc-200" + filter === t + ? "bg-zinc-800 text-sky-400 shadow-sm" + : "text-zinc-400 hover:text-zinc-200" }`} > {t} @@ -104,7 +106,9 @@ export function ThreadList({ 📥

- {threads.length === 0 ? "No active threads in the queue." : "No matching threads found."} + {threads.length === 0 + ? "No active threads in the queue." + : "No matching threads found."}

Try modifying filters or simulating an incoming mail stream. From 0cba18632ce53f005fa29ef172c7b4d00ecf0420 Mon Sep 17 00:00:00 2001 From: binayyub4211 Date: Thu, 25 Jun 2026 09:06:28 +0100 Subject: [PATCH 5/5] fix(ts): cast ReactElement props to any to resolve TS18046 in component test tree walkers --- .../grammar-cleaner/tests/components.test.ts | 10 +++++----- .../team/collision-detection/tests/components.test.ts | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/v1/individual/grammar-cleaner/tests/components.test.ts b/tools/v1/individual/grammar-cleaner/tests/components.test.ts index c13b8556..bfa64f67 100644 --- a/tools/v1/individual/grammar-cleaner/tests/components.test.ts +++ b/tools/v1/individual/grammar-cleaner/tests/components.test.ts @@ -14,7 +14,7 @@ const sampleInput = SAMPLE_TEXTS[0].input; const onChange = () => {}; const onSubmit = () => {}; -function isElement(n: unknown): n is ReactElement { +function isElement(n: unknown): n is ReactElement { return ( typeof n === "object" && n !== null && "type" in n && "props" in (n as Record) ); @@ -22,11 +22,11 @@ function isElement(n: unknown): n is ReactElement { function findInTree( node: ReactNode, - predicate: (el: ReactElement) => boolean, -): ReactElement | null { + predicate: (el: ReactElement) => boolean, +): ReactElement | null { if (!isElement(node)) return null; if (predicate(node)) return node; - const children = node.props.children; + const children = (node.props as any).children; if (children == null) return null; const arr = Array.isArray(children) ? children : [children]; for (const child of arr) { @@ -36,7 +36,7 @@ function findInTree( return null; } -function hasElement(node: ReactNode, predicate: (el: ReactElement) => boolean): boolean { +function hasElement(node: ReactNode, predicate: (el: ReactElement) => boolean): boolean { return findInTree(node, predicate) !== null; } diff --git a/tools/v1/team/collision-detection/tests/components.test.ts b/tools/v1/team/collision-detection/tests/components.test.ts index 7ee8b48d..7a2dcb82 100644 --- a/tools/v1/team/collision-detection/tests/components.test.ts +++ b/tools/v1/team/collision-detection/tests/components.test.ts @@ -13,7 +13,7 @@ import { scanActiveReplies } from "../services/collisionDetection"; const sampleReplies = COLLISION_FIXTURES[0].replies; -function isElement(n: unknown): n is ReactElement { +function isElement(n: unknown): n is ReactElement { return ( typeof n === "object" && n !== null && "type" in n && "props" in (n as Record) ); @@ -21,11 +21,11 @@ function isElement(n: unknown): n is ReactElement { function findInTree( node: ReactNode, - predicate: (el: ReactElement) => boolean, -): ReactElement | null { + predicate: (el: ReactElement) => boolean, +): ReactElement | null { if (!isElement(node)) return null; if (predicate(node)) return node; - const children = node.props.children; + const children = (node.props as any).children; if (children == null) return null; const arr = Array.isArray(children) ? children : [children]; for (const child of arr) { @@ -35,7 +35,7 @@ function findInTree( return null; } -function hasElement(node: ReactNode, predicate: (el: ReactElement) => boolean): boolean { +function hasElement(node: ReactNode, predicate: (el: ReactElement) => boolean): boolean { return findInTree(node, predicate) !== null; }