M3a:息壤三级记忆域——归真触发提取管线/白名单明忆/重忆确认/正影版本链/删除墓碑/双通道召回注入,退役旧记忆-抽取-反思-大周天-演化管线(迁移 004,验收 7 用例)

This commit is contained in:
chenxin committed 2026-08-27 09:16:32 +08:00
1 parent 2a640a901b
commit 9c98c2f85e
69 files changed
+1193 -6033

No files matched your search

-166
View File
@@ -1,166 +0,0 @@
import { EvolutionList } from "@/components/evolution/EvolutionList";
import { PageContainer } from "@/components/layout/PageContainer";
import { ErrorState } from "@/components/shared/StateViews";
import { serverApi } from "@/lib/api/server-client";
import { describeError } from "@/lib/utils/error";
import type { Character, EvolutionCandidate, Paginated } from "@/types/api";
export const dynamic = "force-dynamic";
/**
* 演化候选页 · 大周天自我评估生成的演化增量在此审核。
* 设计稿 evolution-preview.html — 周天四镜 + 候选层积 + 朱砂待裁 + 应用沉积。
* L4 核心变更(人格 / 使命 / 安全边界)需人工通过才写入;低风险类生成时已自动应用。
*/
export default async function EvolutionPage() {
let characterId: string | null = null;
let characterName = "";
let initial: EvolutionCandidate[] = [];
let counts = { pending: 0, applied: 0, rejected: 0 };
let error: string | null = null;
try {
const active = await serverApi.get<Character>("/characters/active");
characterId = active.id;
characterName = active.display_name || active.name;
const [pending, applied, rejected] = await Promise.all([
serverApi.get<Paginated<EvolutionCandidate>>(
`/characters/${active.id}/evolution-candidates`,
{ status: "pending", page_size: 50 },
),
serverApi.get<Paginated<EvolutionCandidate>>(
`/characters/${active.id}/evolution-candidates`,
{ status: "applied", page_size: 1 },
),
serverApi.get<Paginated<EvolutionCandidate>>(
`/characters/${active.id}/evolution-candidates`,
{ status: "rejected", page_size: 1 },
),
]);
initial = pending.items;
counts = {
pending: pending.total,
applied: applied.total,
rejected: rejected.total,
};
} catch (e) {
error = describeError(e);
}
return (
<PageContainer
title="演化"
description="大周天 · 演化候选"
meta={
<>
{characterName && (
<span className="char-pill">
<span className="avatar-mini">{characterName.charAt(0)}</span>
{characterName}
</span>
)}
<span className="page-meta">
待裁 <b>{counts.pending}</b> · 半自动{" "}
<b style={{ color: "var(--patina)" }}>{counts.applied}</b> · 已应用{" "}
<b>{counts.applied}</b>
</span>
</>
}
maxWidth="max-w-5xl"
>
{error ? (
<ErrorState message={error} />
) : characterId ? (
<div className="space-y-5">
{/* 周天四镜(签名) */}
<div className="cycle-card">
<div className="cycle-head">
<span className="cycle-title">大周天 · 候选阶段</span>
<span className="cycle-id">
cycle_01JZK7Q3B…4F · 触发自会话结束
</span>
<span className="cycle-state">候选生成中</span>
</div>
<div className="mirror-chain">
<div className="mc-step done">
<div className="mc-mirror">
<div className="disc">评</div>
</div>
<span className="mc-name">评估</span>
<span className="mc-sub">evaluation</span>
<span className="mc-yield">态势 ✓</span>
</div>
<span className="mc-link done"></span>
<div className="mc-step done">
<div className="mc-mirror">
<div className="disc">演</div>
</div>
<span className="mc-name">演化</span>
<span className="mc-sub">evolution</span>
<span className="mc-yield">策略 ✓</span>
</div>
<span className="mc-link done"></span>
<div className="mc-step active">
<div className="mc-mirror">
<div className="disc">候</div>
</div>
<span className="mc-name">候选</span>
<span className="mc-sub">candidate · 当阶</span>
<span className="mc-yield">{counts.pending} 条草拟</span>
</div>
<span className="mc-link"></span>
<div className="mc-step">
<div className="mc-mirror">
<div className="disc">藏</div>
</div>
<span className="mc-name">入藏</span>
<span className="mc-sub">memory · 未达</span>
<span className="mc-yield">-</span>
</div>
</div>
<div className="snapshot-row">
<div className="snap-mini">
<div className="k">最近记忆</div>
<div className="v">
12<small>条入参</small>
</div>
</div>
<div className="snap-mini">
<div className="k">人格版本</div>
<div className="v">
v7<small>当前</small>
</div>
</div>
<div className="snap-mini">
<div className="k">世界实体</div>
<div className="v">
—<small>个</small>
</div>
</div>
<div className="snap-mini">
<div className="k">内驱力</div>
<div className="v">
{counts.pending}
<small>条好奇</small>
</div>
</div>
<div className="snap-verdict">
<b>评估结论:</b>近 12
条记忆呈「回应偏长」信号,可收敛风格字段;身份画稳定,无核心变更必要。建议生成
1 条风格类半自动候选,其余维持现状。
</div>
</div>
</div>
<EvolutionList
characterId={characterId}
initial={initial}
counts={counts}
/>
</div>
) : null}
</PageContainer>
);
}
-41
View File
@@ -1,41 +0,0 @@
import { PageContainer } from "@/components/layout/PageContainer";
import { ErrorState } from "@/components/shared/StateViews";
import { MemoryList } from "@/components/memory/MemoryList";
import { serverApi } from "@/lib/api/server-client";
import { describeError } from "@/lib/utils/error";
import type { Character, Memory, Paginated } from "@/types/api";
export const dynamic = "force-dynamic";
export default async function MemoryPage() {
let memories: Memory[] = [];
let characterId: string | undefined;
let error: string | null = null;
try {
const active = await serverApi
.get<Character>("/characters/active")
.catch(() => null);
characterId = active?.id;
const data = await serverApi.get<Paginated<Memory>>("/memory", {
page_size: 100,
});
memories = data.items;
} catch (e) {
error = describeError(e);
}
return (
<PageContainer
title="记忆"
description="当前人物的长期记忆,支持手动新增、编辑与删除。"
>
{error ? (
<ErrorState message={error} />
) : (
<MemoryList initialMemories={memories} characterId={characterId} />
)}
</PageContainer>
);
}
-48
View File
@@ -1,48 +0,0 @@
import { PageContainer } from "@/components/layout/PageContainer";
import { ErrorState, EmptyState } from "@/components/shared/StateViews";
import { MemoryAdminList } from "@/components/admin/MemoryAdminList";
import { serverApi } from "@/lib/api/server-client";
import { describeError } from "@/lib/utils/error";
import type { Memory, Paginated } from "@/types/api";
export const dynamic = "force-dynamic";
/**
* 息壤枢 · 长期记忆。
*
* 取所有记忆列表,经 MemoryAdminList 组件做删除/详情查看。
* 数据来自 GET /memory(API §8)。
*/
export default async function AdminMemoryPage() {
let memories: Memory[] = [];
let error: string | null = null;
try {
const data = await serverApi.get<Paginated<Memory>>("/memory", {
page_size: 100,
});
memories = data.items;
} catch (e) {
error = describeError(e);
}
return (
<PageContainer
title="息壤枢"
description="长期记忆 · 自生不息"
maxWidth="max-w-3xl"
>
{error ? (
<ErrorState message={error} />
) : memories.length === 0 ? (
<EmptyState
title="暂无记忆"
description="当前人物还没有沉淀任何长期记忆。"
/>
) : (
<MemoryAdminList initial={memories} />
)}
</PageContainer>
);
}
@@ -6,7 +6,6 @@ import { VermilionAction } from "@/components/admin/VermilionAction";
import { PolicyMatrix } from "@/components/admin/PolicyMatrix";
import { AuditConsole } from "@/components/admin/AuditConsole";
import { ToolRegistry } from "@/components/admin/ToolRegistry";
import { MemoryAdminList } from "@/components/admin/MemoryAdminList";
import { PersonalityEditor } from "@/components/admin/PersonalityEditor";
import { GoalTree } from "@/components/admin/GoalTree";
import { PerceptionConsentMatrix } from "@/components/admin/PerceptionConsentMatrix";
@@ -46,7 +45,6 @@ const VALID_PIVOTS: Pivot[] = [
"perception",
"world_model",
"planner",
"memory",
"tool_runtime",
"agent_society",
];
@@ -74,20 +72,6 @@ export default async function PivotDetailPage({
return <ToolRuntimeDetail />;
case "personality_core":
return <PersonalityCoreDetail />;
case "memory":
return <MemorySystemDetail />;
case "goal_orchestrator":
return <GoalOrchestratorDetail />;
case "perception":
return <PerceptionDetail />;
case "world_model":
return <WorldModelDetail />;
case "planner":
return <PlannerDetail />;
case "agent_society":
return <AgentSocietyDetail />;
default:
notFound();
}
}
@@ -285,39 +269,6 @@ async function PersonalityCoreDetail() {
);
}
/** 息壤枢:长期记忆列表(自生不息) */
async function MemorySystemDetail() {
let memories: Memory[] = [];
let error: string | null = null;
try {
const data = await serverApi.get<Paginated<Memory>>("/memory", {
page_size: 100,
});
memories = data.items;
} catch (e) {
error = describeError(e);
}
return (
<PageContainer
title="息壤枢"
description="长期记忆 · 自生不息"
maxWidth="max-w-3xl"
>
{error ? (
<ErrorState message={error} />
) : memories.length === 0 ? (
<EmptyState
title="暂无记忆"
description="当前人物还没有沉淀任何长期记忆。"
/>
) : (
<MemoryAdminList initial={memories} />
)}
</PageContainer>
);
}
/** 太一枢:目标层级树(最高目标 → 任务,可编辑标题/优先级/状态) */
async function GoalOrchestratorDetail() {
let goals: GoalNode[] = [];