feat: add AI knowledge analysis MVP

This commit is contained in:
2026-07-05 00:47:52 -07:00
parent 6aa72d3b43
commit e204974b57
32 changed files with 8705 additions and 4 deletions

View File

@@ -1,7 +1,7 @@
"use client";
import { FormEvent, useMemo, useState } from "react";
import { Edit3, Filter, Plus, Search, Trash2 } from "lucide-react";
import { Brain, Edit3, Filter, Plus, Search, Trash2 } from "lucide-react";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
@@ -10,6 +10,7 @@ import { Dialog } from "@/components/ui/dialog";
import { Input, Textarea } from "@/components/ui/input";
import { Select } from "@/components/ui/select";
import { Table } from "@/components/ui/table";
import { ElderAiAnalysisDialog } from "@/modules/ai/components/ElderAiAnalysisDialog";
import type { ApiResult } from "@/modules/core/server/api";
import type { Permission } from "@/modules/core/types";
import type { CareLevel, Elder, ElderInput, ElderStatus } from "@/modules/elders/types";
@@ -123,10 +124,12 @@ export function EldersClient({ elderContexts = {}, initialElders, permissions }:
const [statusFilter, setStatusFilter] = useState<ElderStatus | typeof ALL_STATUS>(ALL_STATUS);
const [careLevelFilter, setCareLevelFilter] = useState<CareLevel | typeof ALL_CARE_LEVELS>(ALL_CARE_LEVELS);
const [page, setPage] = useState(1);
const [aiTarget, setAiTarget] = useState<Elder | null>(null);
const canCreate = permissions.includes("elder:create");
const canUpdate = permissions.includes("elder:update");
const canDelete = permissions.includes("elder:delete");
const canUseAi = permissions.includes("ai:read") && permissions.includes("elder:read");
const isEditing = editingId !== null;
const canSubmit = isEditing ? canUpdate : canCreate;
@@ -401,6 +404,17 @@ export function EldersClient({ elderContexts = {}, initialElders, permissions }:
</Table.Cell>
<Table.Cell className="px-4 py-3">
<div className="flex justify-end gap-2">
{canUseAi ? (
<Button
onClick={() => setAiTarget(elder)}
size="sm"
type="button"
variant="outline"
>
<Brain className="size-4" aria-hidden="true" />
AI
</Button>
) : null}
<Button
disabled={!canUpdate}
onClick={() => beginEdit(elder)}
@@ -581,6 +595,8 @@ export function EldersClient({ elderContexts = {}, initialElders, permissions }:
</div>
</div>
</Dialog>
<ElderAiAnalysisDialog elder={aiTarget} onClose={() => setAiTarget(null)} open={aiTarget !== null} />
</div>
);
}