feat: unify installation model catalog
This commit is contained in:
@@ -130,10 +130,6 @@ function workspaceId(value: unknown): string | undefined {
|
||||
return typeof value === "string" && /^[a-z][a-z0-9-]{2,62}$/.test(value) ? value : undefined;
|
||||
}
|
||||
|
||||
function modelReference(value: unknown): `${string}/${string}` | undefined {
|
||||
return typeof value === "string" && /^[^/\s]+\/[^/\s]+$/.test(value) ? value as `${string}/${string}` : undefined;
|
||||
}
|
||||
|
||||
function positiveInteger(value: unknown, max = Number.MAX_SAFE_INTEGER): number | undefined {
|
||||
return typeof value === "number" && Number.isSafeInteger(value) && value > 0 && value <= max ? value : undefined;
|
||||
}
|
||||
@@ -348,17 +344,6 @@ function uniqueChoices<T extends string>(value: unknown, choices: readonly T[]):
|
||||
return result;
|
||||
}
|
||||
|
||||
function uniqueModels(value: unknown): `${string}/${string}`[] | undefined {
|
||||
if (!Array.isArray(value) || value.length === 0) return undefined;
|
||||
const result: `${string}/${string}`[] = [];
|
||||
for (const item of value) {
|
||||
const model = modelReference(item);
|
||||
if (!model || result.includes(model)) return undefined;
|
||||
result.push(model);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function originRelativePath(value: unknown): string | undefined {
|
||||
return typeof value === "string" && /^\/(?!\/)[^\\\u0000-\u001F\u007F?#]*$/.test(value) && !/%5c/i.test(value)
|
||||
? value
|
||||
@@ -391,17 +376,11 @@ function copyDiagnostics(value: unknown): CanonicalDiagnostics | undefined {
|
||||
|
||||
/** Drops unknown fields before a server response can become a browser draft or conflict view. */
|
||||
export function sanitizeCanonicalWorkspace(value: unknown): CanonicalWorkspace | undefined {
|
||||
const source = exactRecord(value, [
|
||||
"workspace", "dwh", "semantic_index", "llm_policy", "diagnostics", "evidence",
|
||||
]);
|
||||
const source = exactRecord(value, ["workspace", "dwh", "diagnostics", "evidence"]);
|
||||
const metadata = exactRecord(source?.workspace, ["schema_version", "id", "name", "description", "language"]);
|
||||
const dwh = exactRecord(source?.dwh, ["engine", "database", "schema", "port", "timeout_ms", "supported_transports"]);
|
||||
const semanticIndex = exactRecord(source?.semantic_index, ["vector_store", "embedding"]);
|
||||
const vectorStore = exactRecord(semanticIndex?.vector_store, ["engine", "collection", "dimensions", "distance"]);
|
||||
const embedding = exactRecord(semanticIndex?.embedding, ["provider", "model", "dimensions"]);
|
||||
const policy = exactRecord(source?.llm_policy, ["default", "allowed"]);
|
||||
const diagnostics = source?.diagnostics === undefined ? undefined : copyDiagnostics(source.diagnostics);
|
||||
if (!metadata || !dwh || !semanticIndex || !vectorStore || !embedding || !policy) return undefined;
|
||||
if (!metadata || !dwh) return undefined;
|
||||
const id = workspaceId(metadata.id);
|
||||
const evidence = id && source?.evidence !== undefined ? copyEvidence(source.evidence, id) : undefined;
|
||||
const name = text(metadata.name);
|
||||
@@ -412,29 +391,16 @@ export function sanitizeCanonicalWorkspace(value: unknown): CanonicalWorkspace |
|
||||
const dwhPort = dwh.port === undefined ? undefined : positiveInteger(dwh.port, 65_535);
|
||||
const dwhTimeout = dwh.timeout_ms === undefined ? undefined : positiveInteger(dwh.timeout_ms);
|
||||
const dwhTransports = uniqueChoices(dwh.supported_transports, ["postgres_direct", "rest_api", "ssh_tunnel"] as const);
|
||||
const collection = workspaceId(vectorStore.collection);
|
||||
const vectorDimensions = positiveInteger(vectorStore.dimensions, 32_768);
|
||||
const distance = oneOf(vectorStore.distance, ["cosine"] as const);
|
||||
const embeddingProvider = oneOf(embedding.provider, ["ollama_internal"] as const);
|
||||
const embeddingModel = text(embedding.model);
|
||||
const embeddingDimensions = positiveInteger(embedding.dimensions, 32_768);
|
||||
const allowedModels = uniqueModels(policy.allowed);
|
||||
const defaultModel = policy.default === undefined ? undefined : modelReference(policy.default);
|
||||
if (
|
||||
metadata.schema_version !== 3 || !id || !name || !language || (metadata.description !== undefined && !description)
|
||||
metadata.schema_version !== 4 || !id || !name || !language || (metadata.description !== undefined && !description)
|
||||
|| dwh.engine !== "postgres" || !database || !schema || (dwh.port !== undefined && !dwhPort) || (dwh.timeout_ms !== undefined && !dwhTimeout) || !dwhTransports
|
||||
|| vectorStore.engine !== "qdrant" || !collection || !vectorDimensions || !distance
|
||||
|| !embeddingProvider || !embeddingModel || !embeddingDimensions || !allowedModels
|
||||
|| (defaultModel !== undefined && !allowedModels.includes(defaultModel)) || vectorDimensions !== embeddingDimensions
|
||||
|| vectorDimensions !== 1024 || embeddingDimensions !== 1024
|
||||
|| embeddingModel !== "qwen3-embedding:0.6b"
|
||||
) return undefined;
|
||||
if (source?.diagnostics !== undefined && !diagnostics) return undefined;
|
||||
if (source?.evidence !== undefined && !evidence) return undefined;
|
||||
if (diagnostics?.dwh_rest && !dwhTransports.includes("rest_api")) return undefined;
|
||||
return {
|
||||
workspace: {
|
||||
schema_version: 3,
|
||||
schema_version: 4,
|
||||
id,
|
||||
name,
|
||||
...(description ? { description } : {}),
|
||||
@@ -446,17 +412,6 @@ export function sanitizeCanonicalWorkspace(value: unknown): CanonicalWorkspace |
|
||||
...(dwhTimeout ? { timeout_ms: dwhTimeout } : {}),
|
||||
supported_transports: dwhTransports,
|
||||
},
|
||||
semantic_index: {
|
||||
vector_store: {
|
||||
engine: "qdrant", collection, dimensions: 1024, distance: "cosine",
|
||||
},
|
||||
embedding: {
|
||||
provider: "ollama_internal", model: "qwen3-embedding:0.6b", dimensions: 1024,
|
||||
},
|
||||
},
|
||||
llm_policy: {
|
||||
...(defaultModel ? { default: defaultModel } : {}), allowed: allowedModels,
|
||||
},
|
||||
...(diagnostics ? { diagnostics } : {}),
|
||||
...(evidence ? { evidence } : {}),
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user