feat: KBDB-graph 插件獨立 — 全面改寫成走基本盤 API(API-as-Wall)
按 leo 鐵律(2026-06-14)把插件從「直接 SQL 操作基本盤表」改寫成 「只透過基本盤 arcrun/kbdb HTTP API 讀寫」。零建表、零 migration、零 SQL。 - 新增 src/lib/kbdb-client.ts:唯一對外通道,封裝 entries/templates/records API - 新增 src/lib/templates.ts:triplet/entity template 定義(替代建表) - 改寫 21 個違規 action(triplet/graph/entity/search)→ 走 client,圖在插件層記憶體組裝 - 移除所有 migrations、D1/Vectorize/AI 綁定;embedding/語意搜尋歸基本盤 optional 模組 - index.ts 只掛 triplets/graph/entities/search 路由;基本盤路由歸 arcrun/kbdb - 測試改走 mock client(純 node);裁剪 CLAUDE.md 只留 graph 插件 + 鐵律 - 修正 SDD design.md「讀現狀推翻鐵律」的錯誤判斷(共用 D1 → API-as-Wall) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
import { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';
|
||||
import type { Bindings } from '../types';
|
||||
import {
|
||||
getPendingAliases,
|
||||
confirmPendingAlias,
|
||||
rejectPendingAlias,
|
||||
} from '../actions/entity-pending';
|
||||
import { listTripletEntities } from '../actions/triplet-entities';
|
||||
import { makeKbdbClient } from '../lib/kbdb-client';
|
||||
|
||||
const entityRoutes = new OpenAPIHono<{ Bindings: Bindings }>();
|
||||
|
||||
// GET / (列出 entities)
|
||||
const listEntitiesRoute = createRoute({
|
||||
method: 'get',
|
||||
path: '/',
|
||||
request: {
|
||||
query: z.object({
|
||||
limit: z.string().optional(),
|
||||
offset: z.string().optional(),
|
||||
q: z.string().optional(),
|
||||
}),
|
||||
},
|
||||
responses: {
|
||||
200: { description: 'List of entities' },
|
||||
},
|
||||
tags: ['Entities'],
|
||||
});
|
||||
|
||||
entityRoutes.openapi(listEntitiesRoute, async (c) => {
|
||||
const limit = parseInt(c.req.query('limit') || '100');
|
||||
const offset = parseInt(c.req.query('offset') || '0');
|
||||
const q = c.req.query('q') || '';
|
||||
|
||||
const result = await listTripletEntities(makeKbdbClient(c.env), { limit, offset, q: q || undefined });
|
||||
return c.json(result);
|
||||
});
|
||||
|
||||
// GET /pending (列出待確認)
|
||||
const listPendingRoute = createRoute({
|
||||
method: 'get',
|
||||
path: '/pending',
|
||||
responses: {
|
||||
200: { description: 'List of pending aliases' },
|
||||
},
|
||||
tags: ['Entities'],
|
||||
});
|
||||
|
||||
entityRoutes.openapi(listPendingRoute, async (c) => {
|
||||
const limit = parseInt(c.req.query('limit') || '100');
|
||||
const pending = await getPendingAliases(makeKbdbClient(c.env), limit);
|
||||
return c.json(pending);
|
||||
});
|
||||
|
||||
entityRoutes.post('/pending/:id/confirm', async (c) => {
|
||||
const id = c.req.param('id');
|
||||
await confirmPendingAlias(makeKbdbClient(c.env), id);
|
||||
return c.json({ success: true, action: 'confirmed', id });
|
||||
});
|
||||
|
||||
entityRoutes.post('/pending/:id/reject', async (c) => {
|
||||
const id = c.req.param('id');
|
||||
const newEntity = await rejectPendingAlias(makeKbdbClient(c.env), id);
|
||||
return c.json({ success: true, action: 'rejected', newEntity });
|
||||
});
|
||||
|
||||
export { entityRoutes };
|
||||
Reference in New Issue
Block a user