const EIconV4 = window.PrototypeIcon;

const employeeSystemProfilesV4 = {
  lead: {
    employeeNo: "AI-0017",
    owner: "AI 工作平台团队",
    onboardedAt: "2026-05-18",
    workStyles: ["证据优先", "克制表达", "主动升级风险"],
    persona: "你是项目研究员。先澄清工作项目标、数据范围和验收标准，再在单一 ActorRun 中完成研究、证据核验与报告撰写。遇到范围、预算或权限风险时暂停并请求负责人决策。",
    boundaries: "不得虚构来源；不得绕过审批发送外部内容；证据不足时必须明确假设和不确定性。",
    knowledge: [
      { id: "k1", name: "市场与客户知识库", detail: "飞书 Wiki · 326 篇", meta: "同步 6 分钟前 · v14", enabled: true },
      { id: "k2", name: "客户交付模板", detail: "飞书文档目录 · 18 个模板", meta: "只读 · v8", enabled: true },
      { id: "k3", name: "历史项目调研复盘", detail: "飞书 Wiki · 41 篇", meta: "字段脱敏 · v5", enabled: true }
    ],
    skills: [
      { id: "g1", name: "项目规划", detail: "将业务目标拆为可验收的执行计划", meta: "近 30 天调用 42 次", enabled: true },
      { id: "g2", name: "证据整合", detail: "在单一 ActorRun 中处理来源冲突并形成结论", meta: "好评率 94%", enabled: true },
      { id: "g3", name: "风险判断", detail: "识别外部动作、预算与权限风险", meta: "策略命中 11 次", enabled: true }
    ],
    sops: [
      { id: "s1", name: "项目调研与报告 SOP", detail: "目标澄清 → 证据收集 → 分析核验 → 文档交付", meta: "v4 · 已发布", enabled: true },
      { id: "s2", name: "客户简报交付 SOP", detail: "草稿 → 评审 → 权限冻结 → 发送审批", meta: "v3 · 已发布", enabled: true },
      { id: "s3", name: "验收退回处理 SOP", detail: "从检查点携带意见续做，生成新的不可变版本", meta: "v2 · 灰度", enabled: false }
    ],
    tools: [
      { id: "t1", name: "Meegle", detail: "读取工作项；回写评论、进度和状态", meta: "组织应用身份", enabled: true },
      { id: "t2", name: "飞书文档", detail: "创建、评论和发布受控文档", meta: "沿用操作者权限", enabled: true },
      { id: "t3", name: "飞书消息", detail: "发送交互卡片与审批通知", meta: "禁止自由群发", enabled: true }
    ],
    model: { primary: "GPT-5.2", fallback: "GPT-5.2-mini", temperature: "0.2", context: "256K", runtime: "研究沙箱 v8" },
    memories: [
      { id: "m1", kind: "已批准事实", title: "正式报告必须附证据索引", source: "Story 24233867 · 验收标准", time: "今天 15:41", detail: "结论需要逐项关联飞书文档或公开来源，无法核验的内容必须明确标注为假设。", status: "approved" },
      { id: "m2", kind: "工作偏好", title: "负责人偏好先看结论与建议", source: "3 次已验收工作", time: "昨天 17:20", detail: "正式报告先给结论、风险和建议，再展开研究过程与证据。", status: "approved" },
      { id: "m3", kind: "待确认候选", title: "内部调研默认只使用已授权资料", source: "RUN-2026-0242", time: "8 分钟前", detail: "本次 Run 明确限制为工作项附件与指定 Wiki，但尚不应自动推广到所有项目。", status: "candidate" },
      { id: "m4", kind: "关系上下文", title: "当前工作项负责人负责最终验收", source: "Meegle 负责人映射", time: "2026-08-13", detail: "仅用于选择上下文请求和验收提醒对象，不扩大数据访问权限。", status: "approved" }
    ],
    duties: [
      { id: "d1", title: "每周市场动态简报", schedule: "每周一 09:00", next: "8 月 17 日 09:00", last: "8 月 10 日 · 成功", enabled: true },
      { id: "d2", title: "客户项目风险巡检", schedule: "工作日 17:30", next: "今天 17:30", last: "昨天 · 发现 1 项风险", enabled: true },
      { id: "d3", title: "月度能力回归评估", schedule: "每月 1 日 10:00", next: "9 月 1 日 10:00", last: "8 月 1 日 · 通过", enabled: false }
    ],
    work: [
      { id: "RUN-2026-0242", title: "AI 员工工作平台产品定义调研", workItem: "Story 24233867", result: "执行中", time: "今天 15:36", quality: "证据覆盖 100%", tone: "blue" },
      { id: "RUN-2026-0239", title: "知识工作交付流程复盘", workItem: "Story 24233791", result: "已验收", time: "昨天 16:12", quality: "4.8 / 5", tone: "success" },
      { id: "RUN-2026-0228", title: "第三方客户端能力边界调研", workItem: "Story 24233684", result: "已验收", time: "8 月 8 日", quality: "4.6 / 5", tone: "success" },
      { id: "RUN-2026-0214", title: "Meegle 回写接口验证", workItem: "Story 24233551", result: "人工接管", time: "8 月 5 日", quality: "接口待验证", tone: "warning" }
    ],
    channels: [
      { id: "ch1", kind: "lark", name: "飞书私聊服务", address: "HyperWork AI / 项目研究员", scope: "发起确认、异常通知、交付验收", enabled: true },
      { id: "ch2", kind: "lark", name: "项目协作群", address: "AI 员工平台联调群", scope: "仅被 @ 时响应；不读取无关历史", enabled: true },
      { id: "ch3", kind: "meegle", name: "Meegle 工作项引用", address: "AI 员工工作平台空间", scope: "通过 @应用、工作项链接或飞书卡片进入", enabled: true }
    ],
    versions: [
      { version: "v5", status: "待评审", date: "今天 16:11", author: "系统建议", change: "增加本地语言免责声明检查；验收退回时限定重跑范围" },
      { version: "v4", status: "当前版本", date: "2026-07-28", author: "袁野", change: "增加证据门禁、冻结审批范围与恢复检查点" },
      { version: "v3", status: "已归档", date: "2026-06-19", author: "袁野", change: "补充调研、证据核验与报告交付职责" }
    ]
  }
};

const employeeTabsV4 = [
  { id: "overview", label: "概览", icon: "home" },
  { id: "persona", label: "档案与人设", icon: "employee" },
  { id: "capabilities", label: "能力", icon: "spark" },
  { id: "memory", label: "记忆", icon: "database" },
  { id: "duties", label: "定时职责", icon: "clock" },
  { id: "work", label: "工作记录", icon: "audit" },
  { id: "growth", label: "反馈与成长", icon: "spark" },
  { id: "channels", label: "服务渠道", icon: "connection" },
  { id: "versions", label: "版本", icon: "copy" }
];

function employeeSystemProfileV4(employee) {
  const lead = employeeSystemProfilesV4.lead;
  if (employee?.id === "lead") return lead;
  const specializedSop = employee?.id === "research" ? "公开来源研究与核验 SOP" : employee?.id === "data" ? "情景测算与模型复核 SOP" : employee?.id === "writer" ? "客户简报编排与发布 SOP" : "合规声明与敏感信息检查 SOP";
  return {
    ...lead,
    employeeNo: `AI-${String(20 + Math.max(0, ["research", "data", "writer", "legal"].indexOf(employee?.id))).padStart(4, "0")}`,
    owner: employee?.id === "legal" ? "法务与合规部" : "增长与市场部",
    onboardedAt: employee?.id === "writer" ? "2026-06-02" : "2026-05-21",
    workStyles: employee?.skills || lead.workStyles,
    persona: `你是${employee?.name || "新员工"}，岗位类型为 ${employee?.role || "Specialist"}。${employee?.description || "在已授权范围内完成专业工作。"} 输出必须给出证据、假设与可复查过程；超出职责时暂停并交回人类负责人。`,
    boundaries: "不能绕过验收宣布工作完成；不能扩大审批、预算和凭据范围；不能将任务继续委派给未知 Agent。",
    knowledge: lead.knowledge.slice(0, 2).map((item, index) => ({ ...item, id: `${employee?.id}-k${index}`, name: index ? "专业交付模板" : `${employee?.name || "员工"}知识库` })),
    skills: (employee?.skills || []).map((name, index) => ({ id: `${employee?.id}-g${index}`, name, detail: `用于${employee?.description?.slice(0, 28) || "专业任务执行"}`, meta: `近 30 天调用 ${18 - index * 3} 次`, enabled: true })),
    sops: [{ id: `${employee?.id}-s1`, name: specializedSop, detail: "输入校验 → 执行 → 证据检查 → 提交验收", meta: "v3 · 已发布", enabled: true }],
    tools: (employee?.tools || []).map((name, index) => ({ id: `${employee?.id}-t${index}`, name, detail: "仅在 ActorRun 授权范围内调用", meta: index ? "员工级授权" : "组织连接", enabled: true })),
    model: { ...lead.model, primary: employee?.model || lead.model.primary },
    memories: lead.memories.slice(0, 3).map((item, index) => ({ ...item, id: `${employee?.id}-m${index}`, source: index === 0 ? `${employee?.name || "员工"}最近工作` : item.source })),
    duties: lead.duties.slice(0, 2).map((item, index) => ({ ...item, id: `${employee?.id}-d${index}`, title: index ? `${employee?.name || "员工"}能力回归评估` : `${employee?.name || "员工"}例行工作检查` })),
    work: lead.work.slice(0, 3).map((item, index) => ({ ...item, id: `${item.id}-${employee?.id}`, title: index === 0 ? `${employee?.name || "员工"}参与：${item.title}` : item.title })),
    channels: lead.channels.slice(0, 2).map((item, index) => ({ ...item, id: `${employee?.id}-ch${index}`, address: index ? `${employee?.name || "员工"}服务群` : `AI 工作平台 / ${employee?.name || "员工"}` })),
    versions: lead.versions.map((item, index) => ({ ...item, version: index === 0 ? "v4" : index === 1 ? "v3" : "v2", status: index === 0 ? "待评审" : index === 1 ? "当前版本" : "已归档" }))
  };
}

function EmployeesAdminV4({ employees, selected, onSelect, onNew, onToggle, onNotify, onOpenRuns, onGoMeegle, onGoLark }) {
  const [tab, setTab] = React.useState("overview");
  const [query, setQuery] = React.useState("");
  const [personaEditing, setPersonaEditing] = React.useState(false);
  const [personaOverrides, setPersonaOverrides] = React.useState({});
  const [personaDraft, setPersonaDraft] = React.useState({ persona: "", boundaries: "" });
  const [capabilityTab, setCapabilityTab] = React.useState("knowledge");
  const [capabilityState, setCapabilityState] = React.useState({});
  const [memoryRows, setMemoryRows] = React.useState([]);
  const [memoryFilter, setMemoryFilter] = React.useState("全部");
  const [memoryQuery, setMemoryQuery] = React.useState("");
  const [selectedMemory, setSelectedMemory] = React.useState(null);
  const [duties, setDuties] = React.useState([]);
  const [dutyComposer, setDutyComposer] = React.useState(false);
  const [dutyDraft, setDutyDraft] = React.useState({ title: "", schedule: "每周一 09:00" });
  const [workFilter, setWorkFilter] = React.useState("全部");
  const [channelState, setChannelState] = React.useState({});
  const [proposalReviewed, setProposalReviewed] = React.useState(false);
  const [versionPublished, setVersionPublished] = React.useState(false);
  const [selectedVersion, setSelectedVersion] = React.useState("v5");
  const profile = employeeSystemProfileV4(selected);
  const persona = personaOverrides[selected?.id] || { persona: profile.persona, boundaries: profile.boundaries };

  React.useEffect(() => {
    const nextProfile = employeeSystemProfileV4(selected);
    setPersonaEditing(false);
    setPersonaDraft({ persona: nextProfile.persona, boundaries: nextProfile.boundaries });
    setCapabilityState({});
    setMemoryRows(nextProfile.memories.map(item => ({ ...item })));
    setSelectedMemory(nextProfile.memories[0]?.id || null);
    setDuties(nextProfile.duties.map(item => ({ ...item })));
    setChannelState(Object.fromEntries(nextProfile.channels.map(item => [item.id, item.enabled])));
    setProposalReviewed(false);
    setVersionPublished(false);
    setSelectedVersion(nextProfile.versions[0]?.version || "v1");
  }, [selected?.id]);

  const visibleEmployees = employees.filter(employee => `${employee.name}${employee.role}${employee.skills.join(" ")}`.toLowerCase().includes(query.trim().toLowerCase()));
  const activeMemories = memoryRows.filter(item => (memoryFilter === "全部" || item.kind === memoryFilter) && `${item.title}${item.detail}${item.source}`.includes(memoryQuery.trim()));
  const memory = memoryRows.find(item => item.id === selectedMemory) || activeMemories[0];
  const showTab = nextTab => { setTab(nextTab); };
  const toggleCapability = item => {
    const current = capabilityState[item.id] ?? item.enabled;
    setCapabilityState(state => ({ ...state, [item.id]: !current }));
    onNotify(!current ? "能力已启用" : "能力已暂停", `${item.name} 的变更将作为员工配置草稿保存。`);
  };
  const savePersona = () => {
    setPersonaOverrides(current => ({ ...current, [selected.id]: { ...personaDraft } }));
    setPersonaEditing(false);
    onNotify("岗位人设草稿已保存", "发布新版本后才会影响未来创建的 Run。", "success");
  };
  const approveMemory = id => {
    setMemoryRows(rows => rows.map(item => item.id === id ? { ...item, kind: "已批准事实", status: "approved" } : item));
    onNotify("候选记忆已批准", "该事实将进入未来 Run 的受控上下文。", "success");
  };
  const forgetMemory = id => {
    setMemoryRows(rows => rows.filter(item => item.id !== id));
    setSelectedMemory(null);
    onNotify("记忆已移除", "删除动作已记录，其他员工和用户的记忆不受影响。", "info");
  };
  const toggleDuty = id => setDuties(rows => rows.map(item => item.id === id ? { ...item, enabled: !item.enabled } : item));
  const runDuty = id => {
    setDuties(rows => rows.map(item => item.id === id ? { ...item, last: "刚刚 · 已启动独立 Run" } : item));
    onNotify("定时职责已手动启动", "系统已创建独立 Run，可在工作记录中跟踪。", "success");
  };
  const addDuty = () => {
    if (!dutyDraft.title.trim()) { onNotify("还缺少职责名称", "请说明 AI 员工需要定期完成什么。", "danger"); return; }
    setDuties(rows => [{ id: `d-${Date.now()}`, title: dutyDraft.title.trim(), schedule: dutyDraft.schedule, next: "等待计算", last: "尚未执行", enabled: true }, ...rows]);
    setDutyDraft({ title: "", schedule: "每周一 09:00" });
    setDutyComposer(false);
    onNotify("定时职责已创建", "首次执行将使用发布时的员工版本和权限策略。", "success");
  };

  return <div className="admin-page employee-system-page" data-screen-label="AI 员工工作台">
    <SectionTitle eyebrow="Persistent AI Workforce" title="AI 员工系统" detail="员工是长期存在的岗位主体：身份、能力、记忆、职责、服务记录和成长都归属于员工；一次执行仍然是独立 Run。" action={<PrototypeButton tone="primary" icon="plus" onClick={onNew}>新建 AI 员工</PrototypeButton>}></SectionTitle>
    <div className="employee-system-shell">
      <aside className="employee-roster-v4">
        <header><div><strong>员工名册</strong><small>{employees.filter(item => item.status === "启用").length} 名在岗</small></div><IconButton label="筛选" icon="filter" onClick={() => onNotify("员工筛选", "可按部门、岗位、服务渠道和能力状态筛选。")}></IconButton></header>
        <label className="employee-roster-search"><EIconV4 name="search" size={14}></EIconV4><input value={query} placeholder="搜索员工、岗位、技能" onChange={event => setQuery(event.target.value)}></input></label>
        <div className="employee-roster-list">{visibleEmployees.map(employee => <button key={employee.id} className={selected?.id === employee.id ? "active" : ""} onClick={() => onSelect(employee.id)}><Avatar initials={employee.initials} tone={employee.tone} size="sm"></Avatar><span><strong>{employee.name}</strong><small>{employee.role} · {employee.skills[0]}</small></span><i className={employee.status === "启用" ? "online" : ""}></i></button>)}</div>
        <footer><EIconV4 name="info" size={14}></EIconV4><p>切换员工后，右侧所有内容都进入该员工的独立作用域。</p></footer>
      </aside>

      <section className="employee-workspace-v4">
        <header className="employee-hero-v4">
          <div className="employee-identity-v4"><Avatar initials={selected.initials} tone={selected.tone}></Avatar><div><span>{profile.employeeNo} · {selected.role}</span><div><h2>{selected.name}</h2><StatusPill tone={selected.status === "启用" ? "success" : "neutral"}>{selected.status === "启用" ? "在岗服务" : "已下线"}</StatusPill></div><p>{selected.description}</p></div></div>
          <div className="employee-hero-facts"><div><span>所属团队</span><strong>{profile.owner}</strong></div><div><span>当前版本</span><button onClick={() => showTab("versions")}>{versionPublished ? profile.versions[0]?.version : profile.versions.find(item => item.status === "当前版本")?.version || "v1"} <EIconV4 name="chevron" size={11}></EIconV4></button></div><div><span>默认模型</span><strong>{profile.model.primary}</strong></div></div>
          <div className="employee-hero-actions"><button className={`switch ${selected.status === "启用" ? "on" : ""}`} aria-label="切换员工在岗状态" onClick={() => onToggle(selected.id)}><span></span></button><PrototypeButton icon="message" onClick={onGoLark}>去飞书对话</PrototypeButton><PrototypeButton tone="primary" icon="edit" onClick={() => { setTab("persona"); setPersonaDraft(persona); setPersonaEditing(true); }}>编辑员工</PrototypeButton></div>
        </header>

        <nav className="employee-domain-tabs">{employeeTabsV4.map(item => <button key={item.id} className={tab === item.id ? "active" : ""} onClick={() => showTab(item.id)}><EIconV4 name={item.icon} size={14}></EIconV4><span>{item.label}</span>{item.id === "memory" && memoryRows.some(row => row.status === "candidate") ? <i>1</i> : null}</button>)}</nav>

        <div className="employee-tab-content-v4">
          {tab === "overview" ? <EmployeeOverviewV4 selected={selected} profile={profile} memoryCount={memoryRows.length} candidateMemoryCount={memoryRows.filter(item => item.status === "candidate").length} duties={duties} onTab={showTab} onOpenRuns={onOpenRuns}></EmployeeOverviewV4> : null}
          {tab === "persona" ? <EmployeePersonaV4 selected={selected} profile={profile} persona={persona} editing={personaEditing} draft={personaDraft} onDraft={setPersonaDraft} onEdit={() => { setPersonaDraft(persona); setPersonaEditing(true); }} onCancel={() => setPersonaEditing(false)} onSave={savePersona}></EmployeePersonaV4> : null}
          {tab === "capabilities" ? <EmployeeCapabilitiesV4 profile={profile} activeTab={capabilityTab} onTab={setCapabilityTab} state={capabilityState} onToggle={toggleCapability} onNotify={onNotify}></EmployeeCapabilitiesV4> : null}
          {tab === "memory" ? <EmployeeMemoryV4 rows={activeMemories} selected={memory} filter={memoryFilter} query={memoryQuery} onFilter={setMemoryFilter} onQuery={setMemoryQuery} onSelect={setSelectedMemory} onApprove={approveMemory} onForget={forgetMemory} onAdd={() => { const id = `m-${Date.now()}`; const next = { id, kind: "待确认候选", title: "客户希望结论页保留关键假设", source: "管理员手动添加", time: "刚刚", detail: "需要在首次使用前由员工负责人复核适用范围。", status: "candidate" }; setMemoryRows(rows => [next, ...rows]); setSelectedMemory(id); }}></EmployeeMemoryV4> : null}
          {tab === "duties" ? <EmployeeDutiesV4 duties={duties} composer={dutyComposer} draft={dutyDraft} onDraft={setDutyDraft} onComposer={setDutyComposer} onAdd={addDuty} onToggle={toggleDuty} onRun={runDuty} onNotify={onNotify}></EmployeeDutiesV4> : null}
          {tab === "work" ? <EmployeeWorkV4 rows={profile.work} filter={workFilter} onFilter={setWorkFilter} onOpenRuns={onOpenRuns} onGoMeegle={onGoMeegle}></EmployeeWorkV4> : null}
          {tab === "growth" ? <EmployeeGrowthV4 selected={selected} reviewed={proposalReviewed} onReview={() => { setProposalReviewed(true); onNotify("改进提案已进入发布前评审", "权限、预算和历史质量基线将执行回归验证。", "success"); }} onVersions={() => setTab("versions")}></EmployeeGrowthV4> : null}
          {tab === "channels" ? <EmployeeChannelsV4 channels={profile.channels} state={channelState} onToggle={id => setChannelState(current => ({ ...current, [id]: !current[id] }))} onOpen={kind => kind === "meegle" ? onGoMeegle() : onGoLark()} onNotify={onNotify}></EmployeeChannelsV4> : null}
          {tab === "versions" ? <EmployeeVersionsV4 versions={profile.versions} selected={selectedVersion} onSelect={setSelectedVersion} reviewed={proposalReviewed} published={versionPublished} onPublish={() => { setVersionPublished(true); onNotify(`${selected.name} 新版本已发布`, "只影响之后创建的 Run；运行中的 ActorRun 继续使用原版本。", "success"); }}></EmployeeVersionsV4> : null}
        </div>
      </section>
    </div>
  </div>;
}

function EmployeeOverviewV4({ selected, profile, memoryCount, candidateMemoryCount, duties, onTab, onOpenRuns }) {
  const metrics = [
    { label: "近 30 天工作", value: "20", detail: "18 次已验收", icon: "audit", tab: "work" },
    { label: "能力资产", value: String(profile.knowledge.length + profile.skills.length + profile.sops.length + profile.tools.length), detail: "知识 / 技能 / SOP / 工具", icon: "spark", tab: "capabilities" },
    { label: "长期记忆", value: String(memoryCount), detail: candidateMemoryCount ? `${candidateMemoryCount} 条等待确认` : "全部已确认", icon: "database", tab: "memory" },
    { label: "定时职责", value: String(duties.filter(item => item.enabled).length), detail: "下次今天 17:30", icon: "clock", tab: "duties" }
  ];
  return <div className="employee-overview-v4">
    <div className="employee-metric-grid-v4">{metrics.map(item => <button key={item.label} onClick={() => onTab(item.tab)}><span><EIconV4 name={item.icon} size={17}></EIconV4></span><div><strong>{item.value}</strong><em>{item.label}</em><small>{item.detail}</small></div><EIconV4 name="chevron" size={13}></EIconV4></button>)}</div>
    <div className="employee-overview-grid-v4">
      <section className="employee-focus-card-v4"><header><div><span>当前工作</span><h3>Story 24233867 · 内部调研报告</h3></div><StatusPill tone="blue">执行中 · 63%</StatusPill></header><p>{selected.name} 正通过一个 ActorRun 与一个持久 PairSession 完成研究、证据核验和报告撰写。</p><div className="employee-focus-progress"><ProgressBar value={63}></ProgressBar><div><span>RUN-TEST-0813-007</span><span>Story 24233867</span><span>预算 ¥138 / ¥220</span></div></div><div className="employee-focus-actors"><span><Avatar initials="研" tone="violet" size="xs"></Avatar>ActorRun <b>执行中</b></span><span><Avatar initials="P" tone="blue" size="xs"></Avatar>PairSession <b>持久</b></span><span><Avatar initials="C" tone="green" size="xs"></Avatar>Attempt #1 <b>可替换</b></span></div><footer><PrototypeButton tone="primary" size="sm" icon="eye" onClick={onOpenRuns}>查看完整 Run</PrototypeButton><small>组织可以有多名员工，但 V1 每个 Run 只绑定一名员工。</small></footer></section>
      <section className="employee-activity-card-v4"><header><div><strong>员工动态</strong><span>工作与成长记录</span></div><button onClick={() => onTab("work")}>全部记录 <EIconV4 name="chevron" size={11}></EIconV4></button></header><div className="employee-timeline-v4"><article><i className="blue"></i><div><strong>从检查点 CP-014 恢复证据核验</strong><p>复用已核验输入，没有扩大权限范围</p><small>8 分钟前 · RUN-2026-0242</small></div></article><article><i className="green"></i><div><strong>知识工作交付流程复盘已验收</strong><p>业务评分 4.8 / 5，证据覆盖率 100%</p><small>昨天 16:12 · Story 24233791</small></div></article><article><i className="violet"></i><div><strong>项目调研与报告 SOP 发布 v4</strong><p>新增审批范围冻结和来源冲突处理</p><small>7 月 28 日 · 袁野</small></div></article></div></section>
    </div>
    <section className="employee-capability-strip-v4"><header><div><strong>岗位能力地图</strong><span>当前发布版本中生效的员工资产</span></div><button onClick={() => onTab("capabilities")}>管理能力 <EIconV4 name="chevron" size={11}></EIconV4></button></header><div><button onClick={() => onTab("capabilities")}><span className="knowledge"><EIconV4 name="database"></EIconV4></span><strong>{profile.knowledge.length}</strong><em>知识源</em></button><button onClick={() => onTab("capabilities")}><span className="skill"><EIconV4 name="spark"></EIconV4></span><strong>{profile.skills.length}</strong><em>Skills</em></button><button onClick={() => onTab("capabilities")}><span className="sop"><EIconV4 name="audit"></EIconV4></span><strong>{profile.sops.length}</strong><em>SOP</em></button><button onClick={() => onTab("capabilities")}><span className="tool"><EIconV4 name="code"></EIconV4></span><strong>{profile.tools.length}</strong><em>工具</em></button><button onClick={() => onTab("capabilities")}><span className="model"><EIconV4 name="spark"></EIconV4></span><strong>1</strong><em>模型策略</em></button></div></section>
  </div>;
}

function EmployeePersonaV4({ selected, profile, persona, editing, draft, onDraft, onEdit, onCancel, onSave }) {
  return <div className="employee-persona-layout-v4">
    <section className="employee-persona-card-v4"><header><div><span>长期身份</span><h3>员工档案</h3></div>{!editing ? <PrototypeButton size="sm" icon="edit" onClick={onEdit}>编辑档案</PrototypeButton> : null}</header><div className="persona-profile-row"><Avatar initials={selected.initials} tone={selected.tone}></Avatar><div><strong>{selected.name}</strong><span>{profile.employeeNo} · {selected.role}</span><div>{profile.workStyles.map(item => <em key={item}>{item}</em>)}</div></div></div><dl><div><dt>所属团队</dt><dd>{profile.owner}</dd></div><div><dt>入职时间</dt><dd>{profile.onboardedAt}</dd></div><div><dt>员工负责人</dt><dd>袁野</dd></div><div><dt>服务状态</dt><dd><StatusPill tone="success">在岗</StatusPill></dd></div></dl><div className="identity-principle-v4"><EIconV4 name="info"></EIconV4><p><strong>身份跨 Run 持续存在</strong><span>每次执行会引用已发布的员工版本，但拥有独立计划、工作区、预算和检查点。</span></p></div></section>
    <section className="employee-persona-editor-v4"><header><div><span>Position & Persona</span><h3>岗位人设与职责边界</h3></div>{editing ? <StatusPill tone="warning">草稿未发布</StatusPill> : <StatusPill tone="success">当前版本生效</StatusPill>}</header>{editing ? <div className="persona-edit-fields-v4"><label><span>岗位 Prompt</span><textarea rows="9" value={draft.persona} onChange={event => onDraft({ ...draft, persona: event.target.value })}></textarea></label><label><span>明确边界</span><textarea rows="4" value={draft.boundaries} onChange={event => onDraft({ ...draft, boundaries: event.target.value })}></textarea></label><footer><PrototypeButton onClick={onCancel}>取消</PrototypeButton><PrototypeButton tone="primary" icon="check" disabled={!draft.persona.trim() || !draft.boundaries.trim()} onClick={onSave}>保存为版本草稿</PrototypeButton></footer></div> : <div className="persona-read-v4"><span>岗位 Prompt</span><p>{persona.persona}</p><span>明确边界</span><p>{persona.boundaries}</p><div className="persona-policy-v4"><EIconV4 name="shield"></EIconV4><div><strong>Prompt 不能授予权限</strong><p>工具、知识、凭据和外部动作仍由独立策略引擎判定。</p></div></div></div>}</section>
  </div>;
}

function EmployeeCapabilitiesV4({ profile, activeTab, onTab, state, onToggle, onNotify }) {
  const sections = [
    { id: "knowledge", label: "知识", count: profile.knowledge.length, data: profile.knowledge },
    { id: "skills", label: "Skills", count: profile.skills.length, data: profile.skills },
    { id: "sops", label: "SOP", count: profile.sops.length, data: profile.sops },
    { id: "tools", label: "工具", count: profile.tools.length, data: profile.tools },
    { id: "model", label: "模型与运行时", count: 1, data: [] }
  ];
  const current = sections.find(item => item.id === activeTab) || sections[0];
  return <div className="employee-capabilities-v4"><aside><header><strong>能力配置</strong><small>员工级绑定</small></header>{sections.map(item => <button key={item.id} className={activeTab === item.id ? "active" : ""} onClick={() => onTab(item.id)}><span>{item.label}</span><em>{item.count}</em><EIconV4 name="chevron" size={12}></EIconV4></button>)}<div className="capability-version-note-v4"><EIconV4 name="copy"></EIconV4><p><strong>变更不会静默生效</strong><span>保存为草稿，回归通过后发布新版本。</span></p></div></aside><section><header><div><span>Employee Capability</span><h3>{current.label}</h3><p>{activeTab === "knowledge" ? "限定员工可以检索的飞书知识来源，读取时继续执行原始权限。" : activeTab === "sops" ? "SOP 是可版本化的执行方法，不等同于模型自由发挥。" : activeTab === "model" ? "模型、回退模型和运行环境共同组成员工的默认执行策略。" : `管理该员工可使用的${current.label}及其生效状态。`}</p></div><PrototypeButton size="sm" tone="primary" icon="plus" onClick={() => onNotify(`绑定${current.label}`, "原型已打开员工级资源选择器；发布后才会生效。")}>绑定{current.label}</PrototypeButton></header>{activeTab === "model" ? <div className="model-binding-v4"><div className="model-primary-v4"><span><EIconV4 name="spark"></EIconV4></span><div><small>主模型</small><strong>{profile.model.primary}</strong><p>长上下文推理 · 复杂规划与整合</p></div><StatusPill tone="success">默认</StatusPill></div><div className="model-fields-v4"><label><span>回退模型</span><select defaultValue={profile.model.fallback}><option>GPT-5.2-mini</option><option>GPT-5.2</option></select></label><label><span>温度</span><input defaultValue={profile.model.temperature}></input></label><label><span>上下文</span><input defaultValue={profile.model.context}></input></label><label><span>运行环境</span><select defaultValue={profile.model.runtime}><option>研究沙箱 v8</option><option>数据分析沙箱 v6</option></select></label></div><div className="model-route-v4"><span>降级顺序</span><div><strong>{profile.model.primary}</strong><EIconV4 name="arrow"></EIconV4><strong>{profile.model.fallback}</strong><EIconV4 name="arrow"></EIconV4><strong>暂停并通知负责人</strong></div></div><PrototypeButton tone="primary" icon="check" onClick={() => onNotify("模型策略草稿已保存", "回归测试完成后可以发布为新员工版本。", "success")}>保存模型策略</PrototypeButton></div> : <div className="capability-table-v4"><header><span>名称与用途</span><span>版本 / 使用情况</span><span>状态</span><span>操作</span></header>{current.data.map(item => { const enabled = state[item.id] ?? item.enabled; return <article key={item.id}><span className={`capability-glyph-v4 ${activeTab}`}><EIconV4 name={activeTab === "knowledge" ? "database" : activeTab === "sops" ? "audit" : activeTab === "tools" ? "code" : "spark"}></EIconV4></span><div><strong>{item.name}</strong><p>{item.detail}</p></div><small>{item.meta}</small><StatusPill tone={enabled ? "success" : "neutral"}>{enabled ? "生效" : "暂停"}</StatusPill><button className={`switch ${enabled ? "on" : ""}`} aria-label={`切换${item.name}`} onClick={() => onToggle(item)}><span></span></button></article>})}</div>}</section></div>;
}

function EmployeeMemoryV4({ rows, selected, filter, query, onFilter, onQuery, onSelect, onApprove, onForget, onAdd }) {
  const filters = ["全部", "已批准事实", "工作偏好", "关系上下文", "待确认候选"];
  return <div className="employee-memory-v4"><section><header><div><span>Long-term Memory</span><h3>长期记忆</h3><p>记忆按员工和用户隔离；只有批准后的事实才能进入未来 Run。</p></div><PrototypeButton tone="primary" size="sm" icon="plus" onClick={onAdd}>添加候选记忆</PrototypeButton></header><div className="memory-toolbar-v4"><label><EIconV4 name="search" size={14}></EIconV4><input value={query} placeholder="搜索事实、来源或适用范围" onChange={event => onQuery(event.target.value)}></input></label><div>{filters.map(item => <button key={item} className={filter === item ? "active" : ""} onClick={() => onFilter(item)}>{item}</button>)}</div></div><div className="memory-list-v4">{rows.length ? rows.map(item => <button key={item.id} className={selected?.id === item.id ? "active" : ""} onClick={() => onSelect(item.id)}><span className={`memory-kind-v4 ${item.status}`}><EIconV4 name={item.status === "candidate" ? "warning" : "database"} size={15}></EIconV4></span><div><strong>{item.title}</strong><p>{item.source}</p><small>{item.time}</small></div><StatusPill tone={item.status === "candidate" ? "warning" : "success"}>{item.kind}</StatusPill><EIconV4 name="chevron" size={12}></EIconV4></button>) : <div className="employee-empty-v4"><EIconV4 name="search" size={22}></EIconV4><strong>没有匹配的记忆</strong><p>调整搜索词或记忆类型。</p></div>}</div></section><aside>{selected ? <><header><div><span>Memory Detail</span><h3>{selected.title}</h3></div><StatusPill tone={selected.status === "candidate" ? "warning" : "success"}>{selected.kind}</StatusPill></header><dl><div><dt>来源</dt><dd>{selected.source}</dd></div><div><dt>沉淀时间</dt><dd>{selected.time}</dd></div><div><dt>作用域</dt><dd>当前员工 · 当前组织</dd></div></dl><div className="memory-content-v4"><span>记忆内容</span><p>{selected.detail}</p></div><div className="memory-safety-v4"><EIconV4 name="shield"></EIconV4><p><strong>不会覆盖业务事实来源</strong><span>记忆只用于补充上下文，关键结论仍必须引用飞书文档或公开证据。</span></p></div><footer>{selected.status === "candidate" ? <PrototypeButton tone="primary" icon="check" onClick={() => onApprove(selected.id)}>批准并限定范围</PrototypeButton> : null}<PrototypeButton tone="danger" icon="x" onClick={() => onForget(selected.id)}>忘记此条</PrototypeButton></footer></> : <div className="employee-empty-v4"><EIconV4 name="database" size={24}></EIconV4><strong>选择一条记忆</strong><p>查看来源、适用范围和审批状态。</p></div>}</aside></div>;
}

function EmployeeDutiesV4({ duties, composer, draft, onDraft, onComposer, onAdd, onToggle, onRun, onNotify }) {
  return <div className="employee-duties-v4"><header><div><span>Scheduled Responsibilities</span><h3>定时职责</h3><p>定时职责会按计划创建独立 Run，继承发布时的员工版本、预算与审批策略。</p></div><PrototypeButton tone="primary" size="sm" icon="plus" onClick={() => onComposer(true)}>新建定时职责</PrototypeButton></header>{composer ? <div className="duty-composer-v4"><label><span>职责名称</span><input autoFocus value={draft.title} placeholder="例如：每周客户风险摘要" onChange={event => onDraft({ ...draft, title: event.target.value })}></input></label><label><span>执行计划</span><select value={draft.schedule} onChange={event => onDraft({ ...draft, schedule: event.target.value })}><option>每周一 09:00</option><option>工作日 17:30</option><option>每月 1 日 10:00</option></select></label><div><PrototypeButton onClick={() => onComposer(false)}>取消</PrototypeButton><PrototypeButton tone="primary" icon="check" onClick={onAdd}>保存职责</PrototypeButton></div></div> : null}<div className="duty-summary-v4"><div><strong>{duties.filter(item => item.enabled).length}</strong><span>已启用</span></div><div><strong>{duties.filter(item => !item.enabled).length}</strong><span>已暂停</span></div><div><strong>100%</strong><span>近 30 天准时启动</span></div><div><strong>2</strong><span>需要人工验收</span></div></div><div className="duty-table-v4"><header><span>职责</span><span>执行计划</span><span>下次运行</span><span>最近结果</span><span>状态与操作</span></header>{duties.map(item => <article key={item.id}><div><span><EIconV4 name="clock"></EIconV4></span><strong>{item.title}</strong></div><p>{item.schedule}</p><p>{item.next}</p><p>{item.last}</p><div><button className={`switch ${item.enabled ? "on" : ""}`} aria-label={`切换${item.title}`} onClick={() => onToggle(item.id)}><span></span></button><PrototypeButton size="sm" icon="play" onClick={() => onRun(item.id)}>立即运行</PrototypeButton><IconButton label="查看历史" icon="more" onClick={() => onNotify("定时职责运行历史", "可查看每次计划触发的 Run、结果和未执行原因。")}></IconButton></div></article>)}</div></div>;
}

function EmployeeWorkV4({ rows, filter, onFilter, onOpenRuns, onGoMeegle }) {
  const filters = ["全部", "执行中", "已验收", "人工接管"];
  const visible = rows.filter(item => filter === "全部" || item.result === filter);
  return <div className="employee-work-v4"><header><div><span>Work Record</span><h3>工作记录</h3><p>这是员工跨时间的工作履历；点击一条记录后进入对应 Run 查看计划、证据和恢复过程。</p></div><div>{filters.map(item => <button key={item} className={filter === item ? "active" : ""} onClick={() => onFilter(item)}>{item}</button>)}</div></header><div className="work-record-metrics-v4"><div><strong>20</strong><span>近 30 天工作</span></div><div><strong>18</strong><span>业务已验收</span></div><div><strong>4.6</strong><span>平均评分</span></div><div><strong>96%</strong><span>证据覆盖率</span></div><div><strong>1</strong><span>人工接管</span></div></div><div className="work-record-table-v4"><header><span>工作与 Run</span><span>Meegle 工作项</span><span>时间</span><span>结果</span><span>质量信号</span><span></span></header>{visible.map(item => <article key={item.id} onClick={onOpenRuns}><div><span className={`run-status-icon ${item.result === "已验收" ? "done" : item.result === "人工接管" ? "failed" : ""}`}><EIconV4 name={item.result === "已验收" ? "check" : item.result === "人工接管" ? "hand" : "run"}></EIconV4></span><p><strong>{item.title}</strong><small>{item.id}</small></p></div><button onClick={event => { event.stopPropagation(); onGoMeegle(); }}>{item.workItem}<EIconV4 name="chevron" size={11}></EIconV4></button><span>{item.time}</span><StatusPill tone={item.tone}>{item.result}</StatusPill><strong>{item.quality}</strong><EIconV4 name="chevron" size={13}></EIconV4></article>)}</div></div>;
}

function EmployeeGrowthV4({ selected, reviewed, onReview, onVersions }) {
  return <div className="employee-growth-v4"><div className="growth-score-v4"><header><div><span>Employee Evaluation</span><h3>反馈与成长</h3></div><StatusPill tone="success">质量稳定</StatusPill></header><div className="growth-score-main-v4"><strong>4.6</strong><span>/ 5</span><p>近 30 天业务评分</p></div><div className="growth-bar-v4"><span><i style={{ width: "92%" }}></i></span><div><em>结果准确 95%</em><em>证据充分 96%</em><em>格式可用 88%</em></div></div><div className="growth-feedback-list-v4"><article><Avatar initials="林" tone="blue" size="xs"></Avatar><div><strong>“结论清楚，证据索引可以直接复核。”</strong><small>林霏 · Story 24233791 · 4.8 分</small></div></article><article><Avatar initials="周" tone="green" size="xs"></Avatar><div><strong>“退回后需要更清楚地保留修改依据。”</strong><small>周睿 · Story 24233867 · 改进信号</small></div></article></div></div><section className={`growth-proposal-v4 ${reviewed ? "reviewed" : ""}`}><header><span><EIconV4 name={reviewed ? "check" : "spark"}></EIconV4></span><div><small>员工改进提案</small><h3>{selected.name} v5</h3></div><StatusPill tone={reviewed ? "success" : "warning"}>{reviewed ? "回归评审中" : "待评审"}</StatusPill></header><p>增加“验收意见逐项回应”检查；退回时从同一 PairSession 的对应检查点续做，并生成新的不可变交付版本。</p><dl><div><dt>触发信号</dt><dd>2 条业务反馈 + 自动评估</dd></div><div><dt>建议置信度</dt><dd>87%</dd></div><div><dt>权限变化</dt><dd>无</dd></div><div><dt>影响范围</dt><dd>仅未来 Run</dd></div></dl><div className="growth-diff-v4"><span>v4</span><EIconV4 name="arrow"></EIconV4><span>v5</span><p>{reviewed ? "正在执行 4 项发布前回归" : "配置差异已生成，可审查和回滚"}</p></div><footer><PrototypeButton tone={reviewed ? "success" : "primary"} icon={reviewed ? "check" : "eye"} onClick={onReview}>{reviewed ? "已进入评审" : "评审改进提案"}</PrototypeButton><PrototypeButton icon="copy" onClick={onVersions}>查看版本历史</PrototypeButton></footer></section><section className="growth-timeline-v4"><header><strong>成长记录</strong><span>能力变化与质量信号</span></header><div><article><time>今天</time><i className="amber"></i><p><strong>生成 v5 改进提案</strong><span>来自业务反馈与自动评估</span></p></article><article><time>7 月 28 日</time><i className="violet"></i><p><strong>发布项目调研 SOP v4</strong><span>新增证据门禁与恢复策略</span></p></article><article><time>6 月 19 日</time><i className="blue"></i><p><strong>加入风险判断 Skill</strong><span>高风险外部动作识别率提升至 100%</span></p></article><article><time>5 月 18 日</time><i className="green"></i><p><strong>AI 员工正式入职</strong><span>初始版本 v1</span></p></article></div></section></div>;
}

function EmployeeChannelsV4({ channels, state, onToggle, onOpen, onNotify }) {
  return <div className="employee-channels-v4"><header><div><span>Service Channels</span><h3>服务渠道</h3><p>渠道决定用户在哪里找到这名员工；业务数据仍留在飞书和 Meegle，平台只保存必要绑定与服务记录。</p></div><PrototypeButton tone="primary" size="sm" icon="plus" onClick={() => onNotify("添加服务渠道", "选择飞书私聊、飞书群聊或 Meegle 工作项引用，并设置最小权限范围。")}>挂载渠道</PrototypeButton></header><div className="channel-grid-v4">{channels.map(item => { const enabled = state[item.id]; return <article key={item.id}><header><span className={item.kind}><EIconV4 name={item.kind === "meegle" ? "meegle" : "lark"}></EIconV4></span><StatusPill tone={enabled ? "success" : "neutral"}>{enabled ? "服务中" : "已暂停"}</StatusPill></header><h3>{item.name}</h3><p>{item.address}</p><dl><div><dt>响应范围</dt><dd>{item.scope}</dd></div><div><dt>身份合并</dt><dd>按飞书用户 ID</dd></div><div><dt>最近服务</dt><dd>{enabled ? "8 分钟前" : "—"}</dd></div></dl><footer><button className={`switch ${enabled ? "on" : ""}`} aria-label={`切换${item.name}`} onClick={() => onToggle(item.id)}><span></span></button><PrototypeButton size="sm" icon="eye" onClick={() => onOpen(item.kind)}>打开第三方客户端</PrototypeButton></footer></article>})}</div><div className="channel-boundary-v4"><EIconV4 name="shield"></EIconV4><div><strong>服务渠道不等于数据授权</strong><p>加入飞书群聊不会让 AI 员工自动读取全部历史消息；引用 Meegle 工作项也只绑定发起人明确选择的工作项。</p></div></div></div>;
}

function EmployeeVersionsV4({ versions, selected, onSelect, reviewed, published, onPublish }) {
  const version = versions.find(item => item.version === selected) || versions[0];
  const displayStatus = item => published && item === versions[0] ? "当前版本" : published && item.status === "当前版本" ? "已归档" : item.status;
  const currentStatus = displayStatus(version);
  return <div className="employee-versions-v4">
    <section><header><div><span>Immutable Configuration</span><h3>员工版本</h3><p>每个 Run 冻结员工版本；发布新版本不会改写正在执行或已经完成的工作。</p></div><PrototypeButton tone="primary" size="sm" icon="plus">创建版本草稿</PrototypeButton></header>
      <div className="version-list-v4">{versions.map(item => <button key={item.version} className={selected === item.version ? "active" : ""} onClick={() => onSelect(item.version)}><span><strong>{item.version}</strong><StatusPill tone={displayStatus(item) === "当前版本" ? "success" : displayStatus(item) === "待评审" ? "warning" : "neutral"}>{displayStatus(item)}</StatusPill></span><p>{item.change}</p><small>{item.date} · {item.author}</small><EIconV4 name="chevron" size={13}></EIconV4></button>)}</div>
    </section>
    <aside><header><div><span>Version Detail</span><h3>{version.version}</h3></div><StatusPill tone={currentStatus === "当前版本" ? "success" : currentStatus === "待评审" ? "warning" : "neutral"}>{currentStatus}</StatusPill></header><p>{version.change}</p><dl><div><dt>创建时间</dt><dd>{version.date}</dd></div><div><dt>创建者</dt><dd>{version.author}</dd></div><div><dt>影响范围</dt><dd>仅未来 Run</dd></div><div><dt>可回滚</dt><dd>是</dd></div></dl>
      {version.status === "待评审" && !published ? <><div className="version-checks-v4"><span>发布前验证</span><div><EIconV4 name="check"></EIconV4><strong>历史质量基线</strong><StatusPill dot={false} tone="success">通过</StatusPill></div><div><EIconV4 name="check"></EIconV4><strong>权限范围未扩大</strong><StatusPill dot={false} tone="success">通过</StatusPill></div><div><EIconV4 name={reviewed ? "check" : "clock"}></EIconV4><strong>20 个回归任务</strong><StatusPill dot={false} tone={reviewed ? "success" : "warning"}>{reviewed ? "通过" : "待运行"}</StatusPill></div></div><PrototypeButton tone="primary" icon="check" disabled={!reviewed} onClick={onPublish}>{reviewed ? "发布为当前版本" : "先完成回归评审"}</PrototypeButton></> : <div className="version-frozen-note-v4"><EIconV4 name="lock"></EIconV4><p><strong>配置快照不可修改</strong><span>如需调整，请从该版本创建新草稿。</span></p></div>}
    </aside>
  </div>;
}

Object.assign(window, { EmployeesAdminV4 });
