feat(ingest): POST /triplets/ingest 寫入端 + deprecate-then-append (T3.2-3.5)
對應 issue #1 T3 B 段。 - templates: TRIPLET_SLOTS 加 status/superseded_by/source_uri/content_hash; ENTITY_SLOTS 加 gloss;recordToTriplet 映射新欄位(缺省 status=active 相容舊資料) - kbdb-client: ensureTemplate 改 slot-diff 補丁(既有 template 走 PATCH /templates/:id 補缺 slot,取代 early-return → 免遷移腳本);新增 updateRecord(PATCH /records/:id) - triplet-ingest action(88 行純函式):Zod strict 鏡射 ingest-candidate 契約 → idempotency(uri+hash 同→no-op)→ 先 append 後 deprecate(無「全無 active」空窗) - POST /triplets/ingest route:strict 驗證失敗 → 422(禁送 graph 領域欄位) - queryTriplets 預設 active-only(traverse/search/neighbors 皆經此), includeDeprecated opt-out 供 rollback/考古 - 6 測試案全綠(vitest 16 passed);mock-client 同步 slot-diff + updateRecord gates: zero SQL / zero migration / 無 D1·Vectorize·AI 綁定 / dry-run bundle 乾淨 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -18,6 +18,8 @@ export type CreateTripletData = {
|
||||
bridge_score?: number;
|
||||
subject_entity_type?: string;
|
||||
object_entity_type?: string;
|
||||
source_uri?: string;
|
||||
content_hash?: string;
|
||||
};
|
||||
|
||||
/** 建立三元組 → POST /records(template=triplet)。 */
|
||||
@@ -37,10 +39,13 @@ export async function createTriplet(
|
||||
confidence: String(data.confidence ?? 1.0),
|
||||
clusters_json: JSON.stringify(clusters),
|
||||
bridge_score: String(bridgeScore),
|
||||
status: 'active',
|
||||
};
|
||||
if (data.source_block_id) values.source_block_id = data.source_block_id;
|
||||
if (data.subject_entity_type) values.subject_entity_type = data.subject_entity_type;
|
||||
if (data.object_entity_type) values.object_entity_type = data.object_entity_type;
|
||||
if (data.source_uri) values.source_uri = data.source_uri;
|
||||
if (data.content_hash) values.content_hash = data.content_hash;
|
||||
|
||||
const id = await client.createRecord(TPL_TRIPLET, values, data.owner_id);
|
||||
return { id, subject: data.subject, predicate: data.predicate, object: data.object };
|
||||
@@ -54,6 +59,7 @@ export type TripletFilters = {
|
||||
offset?: number;
|
||||
owner_id?: string;
|
||||
entity_type?: string;
|
||||
includeDeprecated?: boolean; // 預設只回 active;rollback/考古才開(T3.5)
|
||||
};
|
||||
|
||||
/** 查三元組 → 取 template 全部 record,插件層 filter(base 無複合 slot 查詢)。 */
|
||||
@@ -64,6 +70,9 @@ export async function queryTriplets(
|
||||
const records = await client.listRecordsByTemplate(TPL_TRIPLET, filters.owner_id);
|
||||
let triplets = records.map(recordToTriplet);
|
||||
|
||||
// active-only:deprecated 不進圖遍歷/查詢(缺省 status 視為 active,相容舊資料)。
|
||||
if (!filters.includeDeprecated) triplets = triplets.filter((t) => t.status === 'active');
|
||||
|
||||
if (filters.subject) triplets = triplets.filter((t) => t.subject === filters.subject);
|
||||
if (filters.predicate) triplets = triplets.filter((t) => t.predicate === filters.predicate);
|
||||
if (filters.object) triplets = triplets.filter((t) => t.object === filters.object);
|
||||
|
||||
Reference in New Issue
Block a user