diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 30f65cd56..c6ee0cece 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,7 +48,10 @@ jobs: # The real build is exercised in the spa-build job below. - name: Run tests - run: pytest tests/ -v --tb=short --ignore=tests/e2e + # Run across all runner cores. The serial suite (4845 tests) took + # ~22 min; -n auto cuts it to a few minutes so "merge on green" is + # practical. Dropped -v so xdist worker output stays readable. + run: pytest tests/ --tb=short --ignore=tests/e2e -n auto - name: Verify app starts run: python -c "from tinyagentos.app import create_app; print('OK')" diff --git a/.gitignore b/.gitignore index f2cfcbedf..918432eb4 100644 --- a/.gitignore +++ b/.gitignore @@ -97,3 +97,4 @@ desktop/tsconfig.tsbuildinfo docs/AGENT_HANDOFF.md docs/audit/ .understand-anything/ +docs/agent-jobs/ diff --git a/desktop/src/apps/ActivityApp.tsx b/desktop/src/apps/ActivityApp.tsx index 980b7efde..bfdc4b85a 100644 --- a/desktop/src/apps/ActivityApp.tsx +++ b/desktop/src/apps/ActivityApp.tsx @@ -824,6 +824,20 @@ export function ActivityApp({ windowId: _windowId }: { windowId: string }) { const cpuLabel = hardwareLabel("cpu", hw); if (cpuLabel) cards.push({ kind: "cpu", label: cpuLabel, tierIdx: 2 }); + // The controller self-registers as a worker named "local" + // (loopback url). Its NPU/CPU are already shown above as the + // controller's own scheduler resources, so for the local node + // only surface devices the controller does not already list + // (e.g. an integrated GPU it does not schedule on). This + // avoids the same physical hardware appearing twice. + const isSelf = + w.name === "local" || + /\/\/(127\.0\.0\.1|localhost|\[::1\])(:|\/|$)/.test(w.url || ""); + const controllerTiers = new Set(schedulerStats.resources.map((res) => res.tier)); + const visibleCards = isSelf + ? cards.filter((c) => !controllerTiers.has(c.tierIdx)) + : cards; + const tierLabels = ["GPU", "NPU", "CPU"]; const tierColors = [ "text-emerald-400 bg-emerald-500/10", @@ -831,7 +845,7 @@ export function ActivityApp({ windowId: _windowId }: { windowId: string }) { "text-sky-400 bg-sky-500/10", ]; - return cards.map((card) => ( + return visibleCards.map((card) => (
last) parts.push(text.slice(last, match.index)); - if (match[2]) parts.push({match[2]}); - else if (match[3]) parts.push({match[3]}); - else if (match[4]) parts.push({match[4]}); - last = match.index + match[0].length; - } - if (last < text.length) parts.push(text.slice(last)); - return parts; +export function renderInline(text: string, keyPrefix: string) { + return [ +
+

, + a: ({ node, ...props }) => ( + + ), + code: ({ node, className, children, ...props }) => { + const isBlock = typeof className === "string" && /language-/.test(className); + if (isBlock) { + return {children}; + } + return ( + + {children} + + ); + }, + ul: ({ node, ...props }) =>