Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ MemoryCore/scripts/tests/
docs/knowledge/self-implement-wiki/_e2e-output/

# Development databases and runtime data (never commit)
data/
data/skills.db
data/tdai-memory.db
**/data/vectors.db
Expand All @@ -126,6 +127,10 @@ data/tdai-memory.db
**/data/_wiki_engines/
**/data/mem-*/

# MemoryPanel local config (contains real user keys, never commit)
MemoryPanel/config/metadata-instances.json
MemoryPanel/.env

# Test coverage output
coverage/
**/coverage/
Expand Down
31 changes: 30 additions & 1 deletion MemoryCore/src/gateway/generated/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*/

import * as z from "zod";
import type { ActorRef, ApiResponseEnvelope, IdFields, ConversationRole, Pagination, AssetType, AssetMutateData, AssetSearchRequest, AssetSearchHit, AssetSearchData, ConversationItem, ConversationAddRequest, ConversationAddData, ConversationQueryRequest, ConversationQueryData, ConversationSearchRequest, ConversationSearchHit, ConversationSearchData, ConversationDeleteRequest, ConversationDeleteData, AtomicDetail, AtomicUpdateRequest, AtomicUpdateData, AtomicQueryRequest, AtomicQueryData, AtomicSearchRequest, AtomicSearchHit, AtomicSearchData, AtomicDeleteRequest, AtomicDeleteData, ScenarioEntry, ScenarioFile, ScenarioListRequest, ScenarioListData, ScenarioReadRequest, ScenarioWriteRequest, ScenarioWriteData, ScenarioRmRequest, CoreFile, CoreReadRequest, CoreWriteRequest, CoreWriteData, SkillSummary, SkillDetail, SkillListRequest, SkillListData, SkillGetRequest, SkillFile, SkillCreateRequest, SkillUpdateRequest, SkillMutateData, SkillDeleteRequest, SkillSearchRequest, SkillSearchHit, SkillSearchData, SkillImportRole, SkillImportMessage, SkillImportRequest, SkillImportDiagnostic, SkillImportData, TeamStatus, UserStatus, AgentStatus, TaskSourceType, AgentVisibility, BatchDeleteResult, TeamBatchDeleteRequest, UserBatchDeleteRequest, AgentBatchDeleteRequest, TaskBatchDeleteRequest, TeamData, TeamCreateRequest, TeamGetRequest, TeamUpdateRequest, UserData, UserCreateRequest, UserUpdateRequest, UserGetRequest, AgentData, AgentCreateRequest, AgentGetRequest, AgentUpdateRequest, TaskData, TaskCreateRequest, TaskGetRequest, TaskUpdateRequest, AddConversation200, AddConversationError, AddConversationMutationRequest, AddConversationMutationResponse, QueryConversation200, QueryConversationError, QueryConversationMutationRequest, QueryConversationMutationResponse, SearchConversation200, SearchConversationError, SearchConversationMutationRequest, SearchConversationMutationResponse, DeleteConversation200, DeleteConversationError, DeleteConversationMutationRequest, DeleteConversationMutationResponse, UpdateAtomic200, UpdateAtomicError, UpdateAtomicMutationRequest, UpdateAtomicMutationResponse, QueryAtomic200, QueryAtomicError, QueryAtomicMutationRequest, QueryAtomicMutationResponse, SearchAtomic200, SearchAtomicError, SearchAtomicMutationRequest, SearchAtomicMutationResponse, DeleteAtomic200, DeleteAtomicError, DeleteAtomicMutationRequest, DeleteAtomicMutationResponse, LsScenario200, LsScenarioError, LsScenarioMutationRequest, LsScenarioMutationResponse, ReadScenario200, ReadScenarioError, ReadScenarioMutationRequest, ReadScenarioMutationResponse, WriteScenario200, WriteScenarioError, WriteScenarioMutationRequest, WriteScenarioMutationResponse, RmScenario200, RmScenarioError, RmScenarioMutationRequest, RmScenarioMutationResponse, ReadCore200, ReadCoreError, ReadCoreMutationRequest, ReadCoreMutationResponse, WriteCore200, WriteCoreError, WriteCoreMutationRequest, WriteCoreMutationResponse, ListSkill200, ListSkillError, ListSkillMutationRequest, ListSkillMutationResponse, GetSkill200, GetSkillError, GetSkillMutationRequest, GetSkillMutationResponse, CreateSkill200, CreateSkillError, CreateSkillMutationRequest, CreateSkillMutationResponse, UpdateSkill200, UpdateSkillError, UpdateSkillMutationRequest, UpdateSkillMutationResponse, DeleteSkill200, DeleteSkillError, DeleteSkillMutationRequest, DeleteSkillMutationResponse, SearchSkill200, SearchSkillError, SearchSkillMutationRequest, SearchSkillMutationResponse, ImportSkill200, ImportSkillError, ImportSkillMutationRequest, ImportSkillMutationResponse, CreateTeam200, CreateTeamError, CreateTeamMutationRequest, CreateTeamMutationResponse, GetTeam200, GetTeamError, GetTeamMutationRequest, GetTeamMutationResponse, UpdateTeam200, UpdateTeamError, UpdateTeamMutationRequest, UpdateTeamMutationResponse, DeleteTeam200, DeleteTeamError, DeleteTeamMutationRequest, DeleteTeamMutationResponse, CreateUser200, CreateUserError, CreateUserMutationRequest, CreateUserMutationResponse, GetUser200, GetUserError, GetUserMutationRequest, GetUserMutationResponse, UpdateUser200, UpdateUserError, UpdateUserMutationRequest, UpdateUserMutationResponse, DeleteUser200, DeleteUserError, DeleteUserMutationRequest, DeleteUserMutationResponse, CreateAgent200, CreateAgentError, CreateAgentMutationRequest, CreateAgentMutationResponse, GetAgent200, GetAgentError, GetAgentMutationRequest, GetAgentMutationResponse, UpdateAgent200, UpdateAgentError, UpdateAgentMutationRequest, UpdateAgentMutationResponse, DeleteAgent200, DeleteAgentError, DeleteAgentMutationRequest, DeleteAgentMutationResponse, CreateTask200, CreateTaskError, CreateTaskMutationRequest, CreateTaskMutationResponse, GetTask200, GetTaskError, GetTaskMutationRequest, GetTaskMutationResponse, UpdateTask200, UpdateTaskError, UpdateTaskMutationRequest, UpdateTaskMutationResponse, DeleteTask200, DeleteTaskError, DeleteTaskMutationRequest, DeleteTaskMutationResponse } from "./types.ts";
import type { ActorRef, ApiResponseEnvelope, IdFields, ConversationRole, Pagination, AssetType, AssetMutateData, AssetSearchRequest, AssetSearchHit, AssetSearchData, ConversationItem, ConversationAddRequest, ConversationAddData, ConversationQueryRequest, ConversationQueryData, ConversationSearchRequest, ConversationSearchHit, ConversationSearchData, ConversationDeleteRequest, ConversationDeleteData, AtomicDetail, AtomicUpdateRequest, AtomicUpdateData, AtomicQueryRequest, AtomicQueryData, AtomicSearchRequest, AtomicSearchHit, AtomicSearchData, AtomicDeleteRequest, AtomicDeleteData, AtomicCreateRequest, AtomicCreateData, ScenarioEntry, ScenarioFile, ScenarioListRequest, ScenarioListData, ScenarioReadRequest, ScenarioWriteRequest, ScenarioWriteData, ScenarioRmRequest, CoreFile, CoreReadRequest, CoreWriteRequest, CoreWriteData, SkillSummary, SkillDetail, SkillListRequest, SkillListData, SkillGetRequest, SkillFile, SkillCreateRequest, SkillUpdateRequest, SkillMutateData, SkillDeleteRequest, SkillSearchRequest, SkillSearchHit, SkillSearchData, SkillImportRole, SkillImportMessage, SkillImportRequest, SkillImportDiagnostic, SkillImportData, TeamStatus, UserStatus, AgentStatus, TaskSourceType, AgentVisibility, BatchDeleteResult, TeamBatchDeleteRequest, UserBatchDeleteRequest, AgentBatchDeleteRequest, TaskBatchDeleteRequest, TeamData, TeamCreateRequest, TeamGetRequest, TeamUpdateRequest, UserData, UserCreateRequest, UserUpdateRequest, UserGetRequest, AgentData, AgentCreateRequest, AgentGetRequest, AgentUpdateRequest, TaskData, TaskCreateRequest, TaskGetRequest, TaskUpdateRequest, AddConversation200, AddConversationError, AddConversationMutationRequest, AddConversationMutationResponse, QueryConversation200, QueryConversationError, QueryConversationMutationRequest, QueryConversationMutationResponse, SearchConversation200, SearchConversationError, SearchConversationMutationRequest, SearchConversationMutationResponse, DeleteConversation200, DeleteConversationError, DeleteConversationMutationRequest, DeleteConversationMutationResponse, UpdateAtomic200, UpdateAtomicError, UpdateAtomicMutationRequest, UpdateAtomicMutationResponse, QueryAtomic200, QueryAtomicError, QueryAtomicMutationRequest, QueryAtomicMutationResponse, SearchAtomic200, SearchAtomicError, SearchAtomicMutationRequest, SearchAtomicMutationResponse, DeleteAtomic200, DeleteAtomicError, DeleteAtomicMutationRequest, DeleteAtomicMutationResponse, LsScenario200, LsScenarioError, LsScenarioMutationRequest, LsScenarioMutationResponse, ReadScenario200, ReadScenarioError, ReadScenarioMutationRequest, ReadScenarioMutationResponse, WriteScenario200, WriteScenarioError, WriteScenarioMutationRequest, WriteScenarioMutationResponse, RmScenario200, RmScenarioError, RmScenarioMutationRequest, RmScenarioMutationResponse, ReadCore200, ReadCoreError, ReadCoreMutationRequest, ReadCoreMutationResponse, WriteCore200, WriteCoreError, WriteCoreMutationRequest, WriteCoreMutationResponse, ListSkill200, ListSkillError, ListSkillMutationRequest, ListSkillMutationResponse, GetSkill200, GetSkillError, GetSkillMutationRequest, GetSkillMutationResponse, CreateSkill200, CreateSkillError, CreateSkillMutationRequest, CreateSkillMutationResponse, UpdateSkill200, UpdateSkillError, UpdateSkillMutationRequest, UpdateSkillMutationResponse, DeleteSkill200, DeleteSkillError, DeleteSkillMutationRequest, DeleteSkillMutationResponse, SearchSkill200, SearchSkillError, SearchSkillMutationRequest, SearchSkillMutationResponse, ImportSkill200, ImportSkillError, ImportSkillMutationRequest, ImportSkillMutationResponse, CreateTeam200, CreateTeamError, CreateTeamMutationRequest, CreateTeamMutationResponse, GetTeam200, GetTeamError, GetTeamMutationRequest, GetTeamMutationResponse, UpdateTeam200, UpdateTeamError, UpdateTeamMutationRequest, UpdateTeamMutationResponse, DeleteTeam200, DeleteTeamError, DeleteTeamMutationRequest, DeleteTeamMutationResponse, CreateUser200, CreateUserError, CreateUserMutationRequest, CreateUserMutationResponse, GetUser200, GetUserError, GetUserMutationRequest, GetUserMutationResponse, UpdateUser200, UpdateUserError, UpdateUserMutationRequest, UpdateUserMutationResponse, DeleteUser200, DeleteUserError, DeleteUserMutationRequest, DeleteUserMutationResponse, CreateAgent200, CreateAgentError, CreateAgentMutationRequest, CreateAgentMutationResponse, GetAgent200, GetAgentError, GetAgentMutationRequest, GetAgentMutationResponse, UpdateAgent200, UpdateAgentError, UpdateAgentMutationRequest, UpdateAgentMutationResponse, DeleteAgent200, DeleteAgentError, DeleteAgentMutationRequest, DeleteAgentMutationResponse, CreateTask200, CreateTaskError, CreateTaskMutationRequest, CreateTaskMutationResponse, GetTask200, GetTaskError, GetTaskMutationRequest, GetTaskMutationResponse, UpdateTask200, UpdateTaskError, UpdateTaskMutationRequest, UpdateTaskMutationResponse, DeleteTask200, DeleteTaskError, DeleteTaskMutationRequest, DeleteTaskMutationResponse } from "./types.ts";

/**
* @description 统一响应外壳。`code = 0` 表示成功;非 0 表示业务错误。\n常见业务错误语义:\n - `400`:参数不合法(如关键 ID 缺失、互斥字段同时出现、空入参等);\n - `401`:鉴权失败;\n - `403`:**全接口统一**——多个业务字段均可见但归属一致性校验\n 失败(如 `(team_id, agent_id)` 不构成有效 Agent 归属、\n `task_id` 不属于 `team_id`、`(task_id, agent_id) ∉\n task_agents`、`creator_user_id` 不是该 team 成员等);\n 写审计日志;\n - `404`:资源不存在或不属于当前调用上下文(记忆原子层 / 资产层 /\n 实体 CRUD 一律按 404,与 offload.yaml 同契约,不暴露存在性);\n - `409`:会话级 / 资产级并发竞争超时;\n - `422`:Schema 校验通过但业务规则不通过(如 Skill 重名 / 版本冲突);\n - `429`:频控触发;\n - `500`:内部错误,可有限重试;\n - `503-LLM_UNAVAILABLE` / `503-STORAGE_UNAVAILABLE`:依赖不可用;\n - `504`:请求超时。\n
Expand Down Expand Up @@ -175,6 +175,35 @@ export const atomicUpdateDataSchema = z.object({
"updated_at": z.iso.datetime()
}) as unknown as z.ZodType<AtomicUpdateData>

/**
* Batch create L1 atomic memories. Each record gets a server-generated
* record_id (`m_{timestamp}_{randomHex}`). Use this for user-driven memory
* imports (markdown notes, JSON arrays, file uploads) — bypassing the
* L0→L1 distillation pipeline. Isolation (team/agent/user) is enforced
* by the V3 router. No dedup; callers responsible for content hygiene.
*/
export const atomicCreateRequestSchema = z.lazy(() => idFieldsSchema).and(z.object({
"records": z.array(z.object({
"content": z.string().max(8192),
"type": z.optional(z.enum(["persona", "episodic", "instruction", "work_fact", "work_task", "work_method", "work_artifact"]).default("persona")),
"scene_name": z.optional(z.string().describe("软分类命名空间,如 preferences / events / entities。不强制,可空。")),
"priority": z.optional(z.number().min(-1).max(100).default(50)),
"metadata": z.optional(z.record(z.string(), z.unknown()))
})).min(1).max(500).describe("单次最多 500 条记忆。超过请分批调用。"),
"dedup": z.optional(z.object({
"enabled": z.boolean().default(false).describe("是否启用去重。启用后,每条记录写入前先搜索,命中则 skip/update。"),
"threshold": z.optional(z.number().min(0).max(1).default(0.85).describe("去重阈值 0-1,score 超过则视为重复。默认 0.85。")),
"mode": z.optional(z.enum(["skip", "update"]).default("skip").describe("命中重复时的行为:skip=跳过,update=覆盖更新。"))
}).default({ enabled: false }))
})) as unknown as z.ZodType<AtomicCreateRequest>

export const atomicCreateDataSchema = z.object({
"created": z.int().describe("实际写入条数(含 update)。"),
"ids": z.array(z.string()).describe("每条记忆的 record_id,顺序与请求 records 对齐。skip 的为空字符串。"),
"skipped": z.optional(z.int().describe("因重复跳过的条数。")),
"updated": z.optional(z.int().describe("因重复而更新的条数。"))
}) as unknown as z.ZodType<AtomicCreateData>

export const atomicQueryRequestSchema = z.lazy(() => paginationSchema).and(z.lazy(() => idFieldsSchema)).and(z.object({
"type": z.optional(z.string().describe("episodic` / `persona` / `instruction")),
"time_start": z.optional(z.iso.datetime()),
Expand Down
70 changes: 70 additions & 0 deletions MemoryCore/src/gateway/generated/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,76 @@ export type AtomicUpdateData = {
updated_at: string;
};

/**
* Batch create L1 atomic memories. Each record gets a server-generated
* record_id. For user-driven imports bypassing L0→L1 distillation.
*/
export type AtomicCreateRequest = (IdFields & {
/**
* @description 单次最多 500 条记忆。超过请分批调用。
*/
records: Array<{
/**
* @maxLength 8192
* @type string
*/
content: string;
/**
* @description persona / episodic / instruction / work_fact / work_task / work_method / work_artifact
*/
type?: "persona" | "episodic" | "instruction" | "work_fact" | "work_task" | "work_method" | "work_artifact";
/**
* @description 软分类命名空间,如 preferences / events / entities。不强制,可空。
* @type string | undefined
*/
scene_name?: string;
/**
* @description 优先级 -1..100,默认 50。-1 表示全局指令。
*/
priority?: number;
/**
* @description 任意结构化元数据。
*/
metadata?: Record<string, unknown>;
}>;
/**
* @description 去重配置。启用后每条记录写入前先搜索,命中则 skip/update。
*/
dedup?: {
enabled: boolean;
/**
* @description 去重阈值 0-1,score 超过则视为重复。默认 0.85。
*/
threshold?: number;
/**
* @description 命中重复时的行为:skip=跳过,update=覆盖更新。
*/
mode?: "skip" | "update";
};
});

export type AtomicCreateData = {
/**
* @description 实际写入条数(含 update)。
* @type integer
*/
created: number;
/**
* @description 每条记忆的 record_id,顺序与请求 records 对齐。skip 的为空字符串。
*/
ids: string[];
/**
* @description 因重复跳过的条数。
* @type integer | undefined
*/
skipped?: number;
/**
* @description 因重复而更新的条数。
* @type integer | undefined
*/
updated?: number;
};

export type AtomicQueryRequest = (Pagination & IdFields & {
/**
* @description `episodic` / `persona` / `instruction`
Expand Down
Loading