feat(graph): get_source + refresh 端點 + keyword 收斂 (T3.6-3.7)
對應 issue #1 T3 C 段(圖工具 HTTP API 備好,MCP 註冊薄殼待 arcrun)。 - get_source (3.7): graph-source.ts + GET /graph/source/:name — 回節點的 active triplet 來源指標(uri/anchor/block_id/content_hash),去重。 連帶加 source_anchor slot,ingest 從 source.anchor 帶入 - refresh (3.6/3.6b): graph-refresh.ts + POST /graph/refresh — 純被動代轉 ingest(KBDB_INGEST_URL),只人發起、無排程/webhook(fan-out 紅線)。 未設 URL → 誠實 forwarded:false,不假綠 - 3.6d: POST /search 移除公開 keyword 模式(重複 KBDB MCP),收斂 suggest-only; keywordSearch helper 留作 suggest 內部建構塊 - 3 新測試(get_source uri+anchor / active-only / refresh 未就緒誠實回報) gates: vitest 19 passed / zero SQL / 無新綁定 / dry-run bundle 乾淨 待接:MCP 註冊薄殼併 arcrun u6u-mcp-server;refresh 端到端待 ingest(T4) 部署 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+9
-16
@@ -1,43 +1,36 @@
|
||||
// 搜尋路由入口 — 僅驗證參數,呼叫 actions
|
||||
//
|
||||
// 插件層只做基本盤 keyword 搜尋(D1 LIKE,走 GET /entries/search)。
|
||||
// T3.6d:移除 graph 的 keyword 搜尋【公開端點】——純關鍵字搜尋重複於 KBDB MCP 的 kbdb_search,
|
||||
// 歸 KBDB MCP,不由 graph 代理。graph 只保留圖專屬的 `suggest`(跨知識建議)。
|
||||
// 注意:keywordSearch helper 仍保留,作為 suggest 的內部建構塊(非對外端點)。
|
||||
// 語意搜尋 / embedding 屬基本盤 optional embed 模組,不在插件 → 已移除 /search/embed。
|
||||
|
||||
import { Hono } from 'hono';
|
||||
import { z } from 'zod';
|
||||
import type { Bindings, Variables } from '../types';
|
||||
import { keywordSearch } from '../actions/search-query';
|
||||
import { suggestKnowledge } from '../actions/search-suggest';
|
||||
import { makeKbdbClient } from '../lib/kbdb-client';
|
||||
|
||||
const searchRoutes = new Hono<{ Bindings: Bindings; Variables: Variables }>();
|
||||
|
||||
const UnifiedSearchSchema = z.object({
|
||||
const SuggestSchema = z.object({
|
||||
query: z.string().min(1),
|
||||
type: z.enum(['keyword', 'suggest']).optional().default('keyword'),
|
||||
topK: z.number().min(1).max(20).optional(),
|
||||
owner_id: z.string().optional(),
|
||||
});
|
||||
|
||||
// 統一搜尋入口:POST /search
|
||||
// 統一搜尋入口:POST /search — 僅 suggest(keyword 歸 KBDB MCP,T3.6d)
|
||||
searchRoutes.post('/', async (c) => {
|
||||
const parsed = UnifiedSearchSchema.safeParse(await c.req.json());
|
||||
const parsed = SuggestSchema.safeParse(await c.req.json());
|
||||
if (!parsed.success) return c.json({ error: parsed.error.flatten() }, 400);
|
||||
const { query, type, topK, owner_id } = parsed.data;
|
||||
const { query, topK, owner_id } = parsed.data;
|
||||
|
||||
// Namespace 讀取過濾:partner token 只能搜到自己 namespace 的資料
|
||||
const namespace = c.get('namespace');
|
||||
const effectiveOwner = namespace ?? owner_id;
|
||||
|
||||
const client = makeKbdbClient(c.env);
|
||||
|
||||
if (type === 'suggest') {
|
||||
const result = await suggestKnowledge(client, query, topK, effectiveOwner);
|
||||
return c.json(result);
|
||||
}
|
||||
|
||||
const matches = await keywordSearch(client, query, { limit: topK, owner_id: effectiveOwner });
|
||||
return c.json({ matches, count: matches.length, mode: 'keyword' });
|
||||
const result = await suggestKnowledge(makeKbdbClient(c.env), query, topK, effectiveOwner);
|
||||
return c.json(result);
|
||||
});
|
||||
|
||||
export { searchRoutes };
|
||||
|
||||
Reference in New Issue
Block a user