Files
xinmi/scripts/wiki_recovery_budget_sql.cjs
T
yawan f7fc992f57
Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
WeKnora deployment source with the reviewed wiki identity, summary and recovery fixes
2026-09-22 16:19:06 +08:00

23 lines
2.1 KiB
JavaScript

// Match repository.WikiRecoveryFingerprints: UTF-8 fields framed by an unsigned
// 64-bit big-endian byte length. Only digests leave the database.
const framed = value => `int8send(octet_length(convert_to(coalesce(${value},''),'UTF8'))::bigint)||convert_to(coalesce(${value},''),'UTF8')`
const framedArray = expression => `(SELECT string_agg(${framed('field')}, ''::bytea ORDER BY ordinal) FROM unnest(${expression}) WITH ORDINALITY AS fields(field,ordinal))`
const textArray = fields => `ARRAY[${fields.join(',')}]::text[]`
function recoveryFingerprintsSQL(source = 'd', kb = 'k', doc = 'n') {
const fields = textArray(["'wiki-recovery-source-v1'", `${source}.tenant_id::text`, `${source}.scope_id`, `${source}.related_id`, `${doc}.title`])
const chunkFields = textArray(['c.id', 'c.content', "coalesce(c.content_revision,0)::text", "coalesce(c.chunk_index,0)::text",
"coalesce(c.start_at,0)::text", "coalesce(c.end_at,0)::text", 'c.chunk_type', 'c.parent_chunk_id', 'c.image_info', "coalesce(c.is_enabled,false)::text"])
const configFields = textArray(["'wiki-recovery-model-v1'", `${kb}.wiki_config::text`, `${kb}.indexing_strategy::text`])
const modelFields = textArray(['m.id', 'm.name', 'm.type', 'm.source', 'm.status', 'm.parameters::text'])
return {
source: `encode(sha256(${framedArray(fields)} || coalesce((SELECT string_agg(${framedArray(chunkFields)}, ''::bytea ORDER BY c.id)
FROM chunks c WHERE c.tenant_id=${source}.tenant_id AND c.knowledge_base_id=${source}.scope_id AND c.knowledge_id=${source}.related_id AND c.deleted_at IS NULL),''::bytea)),'hex')`,
model: `encode(sha256(${framedArray(configFields)} || coalesce((SELECT string_agg(${framedArray(modelFields)}, ''::bytea ORDER BY wanted.ordinal)
FROM unnest(ARRAY[coalesce(nullif(${kb}.wiki_config->>'synthesis_model_id',''),${kb}.summary_model_id),${kb}.embedding_model_id]) WITH ORDINALITY wanted(id,ordinal)
JOIN models m ON m.id=wanted.id AND m.tenant_id=${source}.tenant_id AND m.deleted_at IS NULL WHERE wanted.id<>''),''::bytea)),'hex')`,
}
}
module.exports = { recoveryFingerprintsSQL }