tmai 1.0.0

Tactful Multi Agent Interface - Monitor and control multiple AI coding agents
Documentation
import { useState } from "react";
import { useAgentsStore } from "../../stores/agents";
import type { ProjectGroup } from "../../types/agent";
import { AgentTreeItem } from "./AgentTreeItem";

interface ProjectItemProps {
  group: ProjectGroup;
}

export function ProjectItem({ group }: ProjectItemProps) {
  const [expanded, setExpanded] = useState(true);
  const selectedProject = useAgentsStore((s) => s.selectedProject);
  const selectProject = useAgentsStore((s) => s.selectProject);

  const isSelected = selectedProject === group.project;
  const attentionCount = group.agents.filter((a) => a.needs_attention).length;

  return (
    <div>
      <div
        className={`flex w-full items-center gap-0.5 text-sm ${
          isSelected
            ? "bg-neutral-300 text-neutral-900 dark:bg-neutral-800 dark:text-white"
            : ""
        }`}
      >
        {/* Toggle expand/collapse */}
        <button
          type="button"
          onClick={(e) => {
            e.stopPropagation();
            setExpanded(!expanded);
          }}
          className="shrink-0 px-1.5 py-1.5 text-xs text-neutral-500 hover:text-neutral-700 dark:hover:text-neutral-300"
          aria-label={`${expanded ? "Collapse" : "Expand"} ${group.displayName}`}
          aria-expanded={expanded}
        >
          {expanded ? "▼" : "▶"}
        </button>
        {/* Select project */}
        <button
          onClick={() => selectProject(group.project)}
          className="flex min-w-0 flex-1 items-center gap-1.5 py-1.5 pr-3 text-left hover:bg-neutral-200 dark:hover:bg-neutral-700"
        >
          <span className="truncate flex-1">{group.displayName}</span>
          {attentionCount > 0 && (
            <span className="rounded-full bg-yellow-600 px-1.5 text-xs font-medium text-white">
              {attentionCount}
            </span>
          )}
        </button>
      </div>
      {expanded && (
        <div className="ml-2">
          {group.agents.map((agent) => (
            <AgentTreeItem key={agent.id} agent={agent} />
          ))}
        </div>
      )}
    </div>
  );
}