@tenphi/akno-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +83 -0
- package/README.md +26 -0
- package/config/default.jsonc +548 -0
- package/dist/bench/answer-corpus.d.ts +48 -0
- package/dist/bench/answer-corpus.d.ts.map +1 -0
- package/dist/bench/answer-corpus.js +491 -0
- package/dist/bench/answer-corpus.js.map +1 -0
- package/dist/bench/answer.d.ts +156 -0
- package/dist/bench/answer.d.ts.map +1 -0
- package/dist/bench/answer.js +608 -0
- package/dist/bench/answer.js.map +1 -0
- package/dist/bench/auto-recall-answer-corpus.d.ts +21 -0
- package/dist/bench/auto-recall-answer-corpus.d.ts.map +1 -0
- package/dist/bench/auto-recall-answer-corpus.js +245 -0
- package/dist/bench/auto-recall-answer-corpus.js.map +1 -0
- package/dist/bench/auto-recall-answer.d.ts +198 -0
- package/dist/bench/auto-recall-answer.d.ts.map +1 -0
- package/dist/bench/auto-recall-answer.js +720 -0
- package/dist/bench/auto-recall-answer.js.map +1 -0
- package/dist/bench/auto-recall-corpus.d.ts +45 -0
- package/dist/bench/auto-recall-corpus.d.ts.map +1 -0
- package/dist/bench/auto-recall-corpus.js +221 -0
- package/dist/bench/auto-recall-corpus.js.map +1 -0
- package/dist/bench/auto-recall.d.ts +171 -0
- package/dist/bench/auto-recall.d.ts.map +1 -0
- package/dist/bench/auto-recall.js +651 -0
- package/dist/bench/auto-recall.js.map +1 -0
- package/dist/bench/entity-resolution.d.ts +37 -0
- package/dist/bench/entity-resolution.d.ts.map +1 -0
- package/dist/bench/entity-resolution.js +121 -0
- package/dist/bench/entity-resolution.js.map +1 -0
- package/dist/bench/graph.d.ts +57 -0
- package/dist/bench/graph.d.ts.map +1 -0
- package/dist/bench/graph.js +573 -0
- package/dist/bench/graph.js.map +1 -0
- package/dist/bench/llm-ranking-probe.d.ts +27 -0
- package/dist/bench/llm-ranking-probe.d.ts.map +1 -0
- package/dist/bench/llm-ranking-probe.js +105 -0
- package/dist/bench/llm-ranking-probe.js.map +1 -0
- package/dist/bench/merge-discovery-corpus.d.ts +26 -0
- package/dist/bench/merge-discovery-corpus.d.ts.map +1 -0
- package/dist/bench/merge-discovery-corpus.js +114 -0
- package/dist/bench/merge-discovery-corpus.js.map +1 -0
- package/dist/bench/merge-discovery-review.d.ts +81 -0
- package/dist/bench/merge-discovery-review.d.ts.map +1 -0
- package/dist/bench/merge-discovery-review.js +149 -0
- package/dist/bench/merge-discovery-review.js.map +1 -0
- package/dist/bench/merge-discovery.d.ts +122 -0
- package/dist/bench/merge-discovery.d.ts.map +1 -0
- package/dist/bench/merge-discovery.js +390 -0
- package/dist/bench/merge-discovery.js.map +1 -0
- package/dist/bench/mixed-retrieval.d.ts +35 -0
- package/dist/bench/mixed-retrieval.d.ts.map +1 -0
- package/dist/bench/mixed-retrieval.js +355 -0
- package/dist/bench/mixed-retrieval.js.map +1 -0
- package/dist/bench/ranking-corpus.d.ts +29 -0
- package/dist/bench/ranking-corpus.d.ts.map +1 -0
- package/dist/bench/ranking-corpus.js +514 -0
- package/dist/bench/ranking-corpus.js.map +1 -0
- package/dist/bench/ranking-end-to-end.d.ts +112 -0
- package/dist/bench/ranking-end-to-end.d.ts.map +1 -0
- package/dist/bench/ranking-end-to-end.js +479 -0
- package/dist/bench/ranking-end-to-end.js.map +1 -0
- package/dist/bench/ranking-latency.d.ts +71 -0
- package/dist/bench/ranking-latency.d.ts.map +1 -0
- package/dist/bench/ranking-latency.js +130 -0
- package/dist/bench/ranking-latency.js.map +1 -0
- package/dist/bench/ranking-matrix.d.ts +141 -0
- package/dist/bench/ranking-matrix.d.ts.map +1 -0
- package/dist/bench/ranking-matrix.js +526 -0
- package/dist/bench/ranking-matrix.js.map +1 -0
- package/dist/bench/ranking-review.d.ts +93 -0
- package/dist/bench/ranking-review.d.ts.map +1 -0
- package/dist/bench/ranking-review.js +249 -0
- package/dist/bench/ranking-review.js.map +1 -0
- package/dist/bench/ranking.d.ts +122 -0
- package/dist/bench/ranking.d.ts.map +1 -0
- package/dist/bench/ranking.js +547 -0
- package/dist/bench/ranking.js.map +1 -0
- package/dist/bench.d.ts +60 -0
- package/dist/bench.d.ts.map +1 -0
- package/dist/bench.js +167 -0
- package/dist/bench.js.map +1 -0
- package/dist/config/jsonc.d.ts +8 -0
- package/dist/config/jsonc.d.ts.map +1 -0
- package/dist/config/jsonc.js +85 -0
- package/dist/config/jsonc.js.map +1 -0
- package/dist/config/load.d.ts +43 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +608 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/paths.d.ts +10 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +38 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +698 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +394 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/write-rules.d.ts +41 -0
- package/dist/config/write-rules.d.ts.map +1 -0
- package/dist/config/write-rules.js +225 -0
- package/dist/config/write-rules.js.map +1 -0
- package/dist/config/write-setup.d.ts +42 -0
- package/dist/config/write-setup.d.ts.map +1 -0
- package/dist/config/write-setup.js +358 -0
- package/dist/config/write-setup.js.map +1 -0
- package/dist/context.d.ts +64 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +14 -0
- package/dist/context.js.map +1 -0
- package/dist/doctor.d.ts +115 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +388 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index/chunk.d.ts +62 -0
- package/dist/index/chunk.d.ts.map +1 -0
- package/dist/index/chunk.js +307 -0
- package/dist/index/chunk.js.map +1 -0
- package/dist/index/defer.d.ts +32 -0
- package/dist/index/defer.d.ts.map +1 -0
- package/dist/index/defer.js +66 -0
- package/dist/index/defer.js.map +1 -0
- package/dist/index/derive.d.ts +99 -0
- package/dist/index/derive.d.ts.map +1 -0
- package/dist/index/derive.js +378 -0
- package/dist/index/derive.js.map +1 -0
- package/dist/index/entity-resolution.d.ts +68 -0
- package/dist/index/entity-resolution.d.ts.map +1 -0
- package/dist/index/entity-resolution.js +305 -0
- package/dist/index/entity-resolution.js.map +1 -0
- package/dist/index/graph.d.ts +46 -0
- package/dist/index/graph.d.ts.map +1 -0
- package/dist/index/graph.js +618 -0
- package/dist/index/graph.js.map +1 -0
- package/dist/index/indexer.d.ts +301 -0
- package/dist/index/indexer.d.ts.map +1 -0
- package/dist/index/indexer.js +1398 -0
- package/dist/index/indexer.js.map +1 -0
- package/dist/index/revision-barrier.d.ts +30 -0
- package/dist/index/revision-barrier.d.ts.map +1 -0
- package/dist/index/revision-barrier.js +140 -0
- package/dist/index/revision-barrier.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/adoption-eligibility.d.ts +4 -0
- package/dist/ingest/adoption-eligibility.d.ts.map +1 -0
- package/dist/ingest/adoption-eligibility.js +18 -0
- package/dist/ingest/adoption-eligibility.js.map +1 -0
- package/dist/ingest/availability.d.ts +15 -0
- package/dist/ingest/availability.d.ts.map +1 -0
- package/dist/ingest/availability.js +37 -0
- package/dist/ingest/availability.js.map +1 -0
- package/dist/ingest/extract.d.ts +58 -0
- package/dist/ingest/extract.d.ts.map +1 -0
- package/dist/ingest/extract.js +255 -0
- package/dist/ingest/extract.js.map +1 -0
- package/dist/ingest/fetch.d.ts +35 -0
- package/dist/ingest/fetch.d.ts.map +1 -0
- package/dist/ingest/fetch.js +142 -0
- package/dist/ingest/fetch.js.map +1 -0
- package/dist/ingest/inbox.d.ts +53 -0
- package/dist/ingest/inbox.d.ts.map +1 -0
- package/dist/ingest/inbox.js +110 -0
- package/dist/ingest/inbox.js.map +1 -0
- package/dist/ingest/name.d.ts +72 -0
- package/dist/ingest/name.d.ts.map +1 -0
- package/dist/ingest/name.js +208 -0
- package/dist/ingest/name.js.map +1 -0
- package/dist/ingest/parts.d.ts +78 -0
- package/dist/ingest/parts.d.ts.map +1 -0
- package/dist/ingest/parts.js +52 -0
- package/dist/ingest/parts.js.map +1 -0
- package/dist/ingest/rendition.d.ts +75 -0
- package/dist/ingest/rendition.d.ts.map +1 -0
- package/dist/ingest/rendition.js +92 -0
- package/dist/ingest/rendition.js.map +1 -0
- package/dist/ingest/store.d.ts +66 -0
- package/dist/ingest/store.d.ts.map +1 -0
- package/dist/ingest/store.js +92 -0
- package/dist/ingest/store.js.map +1 -0
- package/dist/kb/folders.d.ts +37 -0
- package/dist/kb/folders.d.ts.map +1 -0
- package/dist/kb/folders.js +133 -0
- package/dist/kb/folders.js.map +1 -0
- package/dist/kb/frontmatter.d.ts +91 -0
- package/dist/kb/frontmatter.d.ts.map +1 -0
- package/dist/kb/frontmatter.js +274 -0
- package/dist/kb/frontmatter.js.map +1 -0
- package/dist/kb/line-facts.d.ts +29 -0
- package/dist/kb/line-facts.d.ts.map +1 -0
- package/dist/kb/line-facts.js +23 -0
- package/dist/kb/line-facts.js.map +1 -0
- package/dist/kb/page.d.ts +92 -0
- package/dist/kb/page.d.ts.map +1 -0
- package/dist/kb/page.js +243 -0
- package/dist/kb/page.js.map +1 -0
- package/dist/kb/scan.d.ts +38 -0
- package/dist/kb/scan.d.ts.map +1 -0
- package/dist/kb/scan.js +109 -0
- package/dist/kb/scan.js.map +1 -0
- package/dist/kb/words.d.ts +30 -0
- package/dist/kb/words.d.ts.map +1 -0
- package/dist/kb/words.js +107 -0
- package/dist/kb/words.js.map +1 -0
- package/dist/maintenance/adopt.d.ts +65 -0
- package/dist/maintenance/adopt.d.ts.map +1 -0
- package/dist/maintenance/adopt.js +238 -0
- package/dist/maintenance/adopt.js.map +1 -0
- package/dist/maintenance/budget.d.ts +55 -0
- package/dist/maintenance/budget.d.ts.map +1 -0
- package/dist/maintenance/budget.js +61 -0
- package/dist/maintenance/budget.js.map +1 -0
- package/dist/maintenance/conflicts.d.ts +105 -0
- package/dist/maintenance/conflicts.d.ts.map +1 -0
- package/dist/maintenance/conflicts.js +368 -0
- package/dist/maintenance/conflicts.js.map +1 -0
- package/dist/maintenance/contradictions.d.ts +34 -0
- package/dist/maintenance/contradictions.d.ts.map +1 -0
- package/dist/maintenance/contradictions.js +199 -0
- package/dist/maintenance/contradictions.js.map +1 -0
- package/dist/maintenance/curate.d.ts +156 -0
- package/dist/maintenance/curate.d.ts.map +1 -0
- package/dist/maintenance/curate.js +2070 -0
- package/dist/maintenance/curate.js.map +1 -0
- package/dist/maintenance/dream.d.ts +139 -0
- package/dist/maintenance/dream.d.ts.map +1 -0
- package/dist/maintenance/dream.js +1632 -0
- package/dist/maintenance/dream.js.map +1 -0
- package/dist/maintenance/graph-candidates.d.ts +19 -0
- package/dist/maintenance/graph-candidates.d.ts.map +1 -0
- package/dist/maintenance/graph-candidates.js +120 -0
- package/dist/maintenance/graph-candidates.js.map +1 -0
- package/dist/maintenance/housekeeping.d.ts +81 -0
- package/dist/maintenance/housekeeping.d.ts.map +1 -0
- package/dist/maintenance/housekeeping.js +281 -0
- package/dist/maintenance/housekeeping.js.map +1 -0
- package/dist/maintenance/link-repairs.d.ts +58 -0
- package/dist/maintenance/link-repairs.d.ts.map +1 -0
- package/dist/maintenance/link-repairs.js +281 -0
- package/dist/maintenance/link-repairs.js.map +1 -0
- package/dist/maintenance/log.d.ts +41 -0
- package/dist/maintenance/log.d.ts.map +1 -0
- package/dist/maintenance/log.js +72 -0
- package/dist/maintenance/log.js.map +1 -0
- package/dist/maintenance/managed-item-routing.d.ts +48 -0
- package/dist/maintenance/managed-item-routing.d.ts.map +1 -0
- package/dist/maintenance/managed-item-routing.js +281 -0
- package/dist/maintenance/managed-item-routing.js.map +1 -0
- package/dist/maintenance/managed-item-sources.d.ts +38 -0
- package/dist/maintenance/managed-item-sources.d.ts.map +1 -0
- package/dist/maintenance/managed-item-sources.js +324 -0
- package/dist/maintenance/managed-item-sources.js.map +1 -0
- package/dist/maintenance/managed-items.d.ts +162 -0
- package/dist/maintenance/managed-items.d.ts.map +1 -0
- package/dist/maintenance/managed-items.js +1329 -0
- package/dist/maintenance/managed-items.js.map +1 -0
- package/dist/maintenance/merge-classifier.d.ts +19 -0
- package/dist/maintenance/merge-classifier.d.ts.map +1 -0
- package/dist/maintenance/merge-classifier.js +49 -0
- package/dist/maintenance/merge-classifier.js.map +1 -0
- package/dist/maintenance/model-telemetry.d.ts +45 -0
- package/dist/maintenance/model-telemetry.d.ts.map +1 -0
- package/dist/maintenance/model-telemetry.js +107 -0
- package/dist/maintenance/model-telemetry.js.map +1 -0
- package/dist/maintenance/observe.d.ts +72 -0
- package/dist/maintenance/observe.d.ts.map +1 -0
- package/dist/maintenance/observe.js +265 -0
- package/dist/maintenance/observe.js.map +1 -0
- package/dist/maintenance/path-policy.d.ts +83 -0
- package/dist/maintenance/path-policy.d.ts.map +1 -0
- package/dist/maintenance/path-policy.js +360 -0
- package/dist/maintenance/path-policy.js.map +1 -0
- package/dist/maintenance/plans.d.ts +366 -0
- package/dist/maintenance/plans.d.ts.map +1 -0
- package/dist/maintenance/plans.js +4060 -0
- package/dist/maintenance/plans.js.map +1 -0
- package/dist/maintenance/profile.d.ts +33 -0
- package/dist/maintenance/profile.d.ts.map +1 -0
- package/dist/maintenance/profile.js +99 -0
- package/dist/maintenance/profile.js.map +1 -0
- package/dist/maintenance/recovery.d.ts +38 -0
- package/dist/maintenance/recovery.d.ts.map +1 -0
- package/dist/maintenance/recovery.js +217 -0
- package/dist/maintenance/recovery.js.map +1 -0
- package/dist/maintenance/repair.d.ts +37 -0
- package/dist/maintenance/repair.d.ts.map +1 -0
- package/dist/maintenance/repair.js +183 -0
- package/dist/maintenance/repair.js.map +1 -0
- package/dist/maintenance/rule-drift.d.ts +104 -0
- package/dist/maintenance/rule-drift.d.ts.map +1 -0
- package/dist/maintenance/rule-drift.js +507 -0
- package/dist/maintenance/rule-drift.js.map +1 -0
- package/dist/maintenance/run-verification.d.ts +44 -0
- package/dist/maintenance/run-verification.d.ts.map +1 -0
- package/dist/maintenance/run-verification.js +253 -0
- package/dist/maintenance/run-verification.js.map +1 -0
- package/dist/maintenance/runs.d.ts +142 -0
- package/dist/maintenance/runs.d.ts.map +1 -0
- package/dist/maintenance/runs.js +439 -0
- package/dist/maintenance/runs.js.map +1 -0
- package/dist/maintenance/semantic-merge-discovery.d.ts +54 -0
- package/dist/maintenance/semantic-merge-discovery.d.ts.map +1 -0
- package/dist/maintenance/semantic-merge-discovery.js +308 -0
- package/dist/maintenance/semantic-merge-discovery.js.map +1 -0
- package/dist/maintenance/temporal.d.ts +44 -0
- package/dist/maintenance/temporal.d.ts.map +1 -0
- package/dist/maintenance/temporal.js +295 -0
- package/dist/maintenance/temporal.js.map +1 -0
- package/dist/models/client.d.ts +214 -0
- package/dist/models/client.d.ts.map +1 -0
- package/dist/models/client.js +904 -0
- package/dist/models/client.js.map +1 -0
- package/dist/models/provider-api.d.ts +28 -0
- package/dist/models/provider-api.d.ts.map +1 -0
- package/dist/models/provider-api.js +320 -0
- package/dist/models/provider-api.js.map +1 -0
- package/dist/open.d.ts +163 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +382 -0
- package/dist/open.js.map +1 -0
- package/dist/ops/adopt.d.ts +12 -0
- package/dist/ops/adopt.d.ts.map +1 -0
- package/dist/ops/adopt.js +138 -0
- package/dist/ops/adopt.js.map +1 -0
- package/dist/ops/answer.d.ts +29 -0
- package/dist/ops/answer.d.ts.map +1 -0
- package/dist/ops/answer.js +557 -0
- package/dist/ops/answer.js.map +1 -0
- package/dist/ops/context.d.ts +18 -0
- package/dist/ops/context.d.ts.map +1 -0
- package/dist/ops/context.js +713 -0
- package/dist/ops/context.js.map +1 -0
- package/dist/ops/folder.d.ts +23 -0
- package/dist/ops/folder.d.ts.map +1 -0
- package/dist/ops/folder.js +130 -0
- package/dist/ops/folder.js.map +1 -0
- package/dist/ops/forget.d.ts +14 -0
- package/dist/ops/forget.d.ts.map +1 -0
- package/dist/ops/forget.js +212 -0
- package/dist/ops/forget.js.map +1 -0
- package/dist/ops/graph.d.ts +10 -0
- package/dist/ops/graph.d.ts.map +1 -0
- package/dist/ops/graph.js +480 -0
- package/dist/ops/graph.js.map +1 -0
- package/dist/ops/ingest.d.ts +40 -0
- package/dist/ops/ingest.d.ts.map +1 -0
- package/dist/ops/ingest.js +434 -0
- package/dist/ops/ingest.js.map +1 -0
- package/dist/ops/list.d.ts +9 -0
- package/dist/ops/list.d.ts.map +1 -0
- package/dist/ops/list.js +217 -0
- package/dist/ops/list.js.map +1 -0
- package/dist/ops/move.d.ts +20 -0
- package/dist/ops/move.d.ts.map +1 -0
- package/dist/ops/move.js +173 -0
- package/dist/ops/move.js.map +1 -0
- package/dist/ops/read.d.ts +9 -0
- package/dist/ops/read.d.ts.map +1 -0
- package/dist/ops/read.js +271 -0
- package/dist/ops/read.js.map +1 -0
- package/dist/ops/recall.d.ts +13 -0
- package/dist/ops/recall.d.ts.map +1 -0
- package/dist/ops/recall.js +297 -0
- package/dist/ops/recall.js.map +1 -0
- package/dist/ops/remember.d.ts +34 -0
- package/dist/ops/remember.d.ts.map +1 -0
- package/dist/ops/remember.js +660 -0
- package/dist/ops/remember.js.map +1 -0
- package/dist/ops/timeline.d.ts +11 -0
- package/dist/ops/timeline.d.ts.map +1 -0
- package/dist/ops/timeline.js +111 -0
- package/dist/ops/timeline.js.map +1 -0
- package/dist/ops/undo.d.ts +9 -0
- package/dist/ops/undo.d.ts.map +1 -0
- package/dist/ops/undo.js +38 -0
- package/dist/ops/undo.js.map +1 -0
- package/dist/ops/write.d.ts +55 -0
- package/dist/ops/write.d.ts.map +1 -0
- package/dist/ops/write.js +463 -0
- package/dist/ops/write.js.map +1 -0
- package/dist/recall/assemble.d.ts +81 -0
- package/dist/recall/assemble.d.ts.map +1 -0
- package/dist/recall/assemble.js +603 -0
- package/dist/recall/assemble.js.map +1 -0
- package/dist/recall/expand.d.ts +55 -0
- package/dist/recall/expand.d.ts.map +1 -0
- package/dist/recall/expand.js +282 -0
- package/dist/recall/expand.js.map +1 -0
- package/dist/recall/graph-arm.d.ts +17 -0
- package/dist/recall/graph-arm.d.ts.map +1 -0
- package/dist/recall/graph-arm.js +227 -0
- package/dist/recall/graph-arm.js.map +1 -0
- package/dist/recall/llm-rerank.d.ts +55 -0
- package/dist/recall/llm-rerank.d.ts.map +1 -0
- package/dist/recall/llm-rerank.js +213 -0
- package/dist/recall/llm-rerank.js.map +1 -0
- package/dist/recall/reranker-calibration.d.ts +23 -0
- package/dist/recall/reranker-calibration.d.ts.map +1 -0
- package/dist/recall/reranker-calibration.js +161 -0
- package/dist/recall/reranker-calibration.js.map +1 -0
- package/dist/recall/search.d.ts +107 -0
- package/dist/recall/search.d.ts.map +1 -0
- package/dist/recall/search.js +530 -0
- package/dist/recall/search.js.map +1 -0
- package/dist/reserved.d.ts +39 -0
- package/dist/reserved.d.ts.map +1 -0
- package/dist/reserved.js +63 -0
- package/dist/reserved.js.map +1 -0
- package/dist/rules/compile.d.ts +27 -0
- package/dist/rules/compile.d.ts.map +1 -0
- package/dist/rules/compile.js +105 -0
- package/dist/rules/compile.js.map +1 -0
- package/dist/setup/model-free.d.ts +15 -0
- package/dist/setup/model-free.d.ts.map +1 -0
- package/dist/setup/model-free.js +26 -0
- package/dist/setup/model-free.js.map +1 -0
- package/dist/setup/openai.d.ts +46 -0
- package/dist/setup/openai.d.ts.map +1 -0
- package/dist/setup/openai.js +165 -0
- package/dist/setup/openai.js.map +1 -0
- package/dist/store/db.d.ts +61 -0
- package/dist/store/db.d.ts.map +1 -0
- package/dist/store/db.js +265 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/ids.d.ts +29 -0
- package/dist/store/ids.d.ts.map +1 -0
- package/dist/store/ids.js +0 -0
- package/dist/store/ids.js.map +1 -0
- package/dist/store/migrations.d.ts +54 -0
- package/dist/store/migrations.d.ts.map +1 -0
- package/dist/store/migrations.js +923 -0
- package/dist/store/migrations.js.map +1 -0
- package/dist/store/vectors.d.ts +34 -0
- package/dist/store/vectors.d.ts.map +1 -0
- package/dist/store/vectors.js +158 -0
- package/dist/store/vectors.js.map +1 -0
- package/dist/timeline/documents.d.ts +23 -0
- package/dist/timeline/documents.d.ts.map +1 -0
- package/dist/timeline/documents.js +262 -0
- package/dist/timeline/documents.js.map +1 -0
- package/dist/watch/watcher.d.ts +43 -0
- package/dist/watch/watcher.d.ts.map +1 -0
- package/dist/watch/watcher.js +143 -0
- package/dist/watch/watcher.js.map +1 -0
- package/dist/write/atomic.d.ts +34 -0
- package/dist/write/atomic.d.ts.map +1 -0
- package/dist/write/atomic.js +58 -0
- package/dist/write/atomic.js.map +1 -0
- package/dist/write/conflict.d.ts +43 -0
- package/dist/write/conflict.d.ts.map +1 -0
- package/dist/write/conflict.js +149 -0
- package/dist/write/conflict.js.map +1 -0
- package/dist/write/edit.d.ts +59 -0
- package/dist/write/edit.d.ts.map +1 -0
- package/dist/write/edit.js +231 -0
- package/dist/write/edit.js.map +1 -0
- package/dist/write/gate.d.ts +59 -0
- package/dist/write/gate.d.ts.map +1 -0
- package/dist/write/gate.js +99 -0
- package/dist/write/gate.js.map +1 -0
- package/dist/write/journal.d.ts +90 -0
- package/dist/write/journal.d.ts.map +1 -0
- package/dist/write/journal.js +187 -0
- package/dist/write/journal.js.map +1 -0
- package/dist/write/ledger.d.ts +28 -0
- package/dist/write/ledger.d.ts.map +1 -0
- package/dist/write/ledger.js +141 -0
- package/dist/write/ledger.js.map +1 -0
- package/dist/write/placement.d.ts +29 -0
- package/dist/write/placement.d.ts.map +1 -0
- package/dist/write/placement.js +140 -0
- package/dist/write/placement.js.map +1 -0
- package/dist/write/remember-fallback.d.ts +18 -0
- package/dist/write/remember-fallback.d.ts.map +1 -0
- package/dist/write/remember-fallback.js +48 -0
- package/dist/write/remember-fallback.js.map +1 -0
- package/dist/write/retain.d.ts +61 -0
- package/dist/write/retain.d.ts.map +1 -0
- package/dist/write/retain.js +272 -0
- package/dist/write/retain.js.map +1 -0
- package/package.json +50 -0
- package/swift/extract.swift +232 -0
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
import { allocateLlmRerankIds, rerankWithLlm } from "./llm-rerank.js";
|
|
2
|
+
import { nativeRerankerCalibration } from "./reranker-calibration.js";
|
|
3
|
+
/**
|
|
4
|
+
* Pipeline: query expansion → vector + FTS5 hybrid → rerank → group hits by
|
|
5
|
+
* page → build cards → fill budget. This module is the middle: two arms, fused.
|
|
6
|
+
*
|
|
7
|
+
* FTS5 does not care about size — it is sub-millisecond at 2,000 chunks and at
|
|
8
|
+
* 100,000. The vector arm is brute force by decision, which is exact and
|
|
9
|
+
* fast enough an order of magnitude past the knowledge base this is built for.
|
|
10
|
+
*/
|
|
11
|
+
export async function hybridSearch(store, embedding, options) {
|
|
12
|
+
const degraded = [];
|
|
13
|
+
const notes = [];
|
|
14
|
+
const lexical = lexicalSearch(store, options.queries, options.candidatesPerArm, options.chunkIds);
|
|
15
|
+
let vector = [];
|
|
16
|
+
if (embedding.available) {
|
|
17
|
+
const embedded = await embedding.embed(options.vectorTexts);
|
|
18
|
+
if (embedded.ok && embedded.value) {
|
|
19
|
+
// Candidate pre-filtering. Scoring only the lexical candidate
|
|
20
|
+
// set instead of every vector raises the ceiling several-fold for free —
|
|
21
|
+
// but it cannot help a purely semantic query with no lexical overlap, so it
|
|
22
|
+
// is a fallback for a knowledge base past the brute-force threshold, not
|
|
23
|
+
// the default. Below the threshold, an exact scan of everything is both
|
|
24
|
+
// faster than it needs to be and strictly more accurate.
|
|
25
|
+
const lexicalPrefilter = options.prefilterAbove !== undefined && store.vectors.count() > options.prefilterAbove
|
|
26
|
+
? new Set(lexical.map((hit) => hit.chunkId))
|
|
27
|
+
: undefined;
|
|
28
|
+
const prefilter = intersect(options.chunkIds, lexicalPrefilter);
|
|
29
|
+
if (lexicalPrefilter)
|
|
30
|
+
notes.push(`vector scan pre-filtered to ${prefilter?.size ?? 0} lexical candidates`);
|
|
31
|
+
vector = vectorSearch(store, embedded.value, options.candidatesPerArm, prefilter);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
degraded.push(embedding.degradedReason(embedded));
|
|
35
|
+
if (embedded.error)
|
|
36
|
+
notes.push(embedded.error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
degraded.push(embedding.degradedReason({}));
|
|
41
|
+
if (embedding.unavailableReason)
|
|
42
|
+
notes.push(embedding.unavailableReason);
|
|
43
|
+
}
|
|
44
|
+
const arms = [lexical, vector];
|
|
45
|
+
return { hits: fuseHits(arms), arms, degraded, notes };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* FTS5 with bm25 ranking. Every query in the expansion runs separately and the
|
|
49
|
+
* results fuse, rather than being OR-ed into one giant MATCH — a single query
|
|
50
|
+
* with eight alternatives ranks a chunk matching one weak term above a chunk
|
|
51
|
+
* matching the original phrase.
|
|
52
|
+
*/
|
|
53
|
+
function lexicalSearch(store, queries, limit, chunkIds) {
|
|
54
|
+
const perQuery = [];
|
|
55
|
+
for (const query of queries) {
|
|
56
|
+
const match = toMatchExpression(query);
|
|
57
|
+
if (!match)
|
|
58
|
+
continue;
|
|
59
|
+
try {
|
|
60
|
+
const rows = store.db
|
|
61
|
+
.prepare(`SELECT c.id AS chunk_id, c.page_id, c.document_id,
|
|
62
|
+
bm25(chunks_fts, 1.0, 2.0) AS rank
|
|
63
|
+
FROM chunks_fts
|
|
64
|
+
JOIN chunks c ON c.id = chunks_fts.rowid
|
|
65
|
+
WHERE chunks_fts MATCH ?
|
|
66
|
+
${chunkIds ? 'AND c.id IN (SELECT value FROM json_each(?))' : ''}
|
|
67
|
+
ORDER BY rank
|
|
68
|
+
LIMIT ?`)
|
|
69
|
+
.all(match, ...(chunkIds ? [JSON.stringify([...chunkIds])] : []), limit);
|
|
70
|
+
perQuery.push(rows
|
|
71
|
+
// bm25 returns negative numbers, more negative being better.
|
|
72
|
+
.map((row) => ({
|
|
73
|
+
chunkId: row.chunk_id,
|
|
74
|
+
pageId: row.page_id,
|
|
75
|
+
documentId: row.document_id,
|
|
76
|
+
score: -row.rank,
|
|
77
|
+
from: ['lexical'],
|
|
78
|
+
})));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// A MATCH expression FTS5 rejects is a bad query, not a broken index.
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return fuseHits(perQuery);
|
|
86
|
+
}
|
|
87
|
+
function vectorSearch(store, vectors, limit, prefilter) {
|
|
88
|
+
const perVector = [];
|
|
89
|
+
const identityOf = store.db.prepare('SELECT page_id, document_id FROM chunks WHERE id = ?');
|
|
90
|
+
for (const vector of vectors) {
|
|
91
|
+
if (vector.length !== store.vectors.dimensions)
|
|
92
|
+
continue;
|
|
93
|
+
const hits = store.vectors.search(vector, limit, prefilter);
|
|
94
|
+
const mapped = [];
|
|
95
|
+
for (const hit of hits) {
|
|
96
|
+
const row = identityOf.get(hit.chunkId);
|
|
97
|
+
if (!row)
|
|
98
|
+
continue;
|
|
99
|
+
mapped.push({
|
|
100
|
+
chunkId: hit.chunkId,
|
|
101
|
+
pageId: row.page_id,
|
|
102
|
+
documentId: row.document_id,
|
|
103
|
+
score: hit.score,
|
|
104
|
+
from: ['vector'],
|
|
105
|
+
// Cosine is already an absolute similarity, so it survives fusion as the
|
|
106
|
+
// answer to "is this actually a good match?" — which the fused rank is not.
|
|
107
|
+
relevance: Math.max(0, Math.min(1, hit.score)),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
perVector.push(mapped);
|
|
111
|
+
}
|
|
112
|
+
return fuseHits(perVector);
|
|
113
|
+
}
|
|
114
|
+
/** Undefined means unrestricted; when both restrictions exist, both must hold. */
|
|
115
|
+
function intersect(left, right) {
|
|
116
|
+
if (!left)
|
|
117
|
+
return right;
|
|
118
|
+
if (!right)
|
|
119
|
+
return left;
|
|
120
|
+
const out = new Set();
|
|
121
|
+
for (const value of left)
|
|
122
|
+
if (right.has(value))
|
|
123
|
+
out.add(value);
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Reciprocal rank fusion. Chosen over score normalization because bm25 and
|
|
128
|
+
* cosine are not on comparable scales and never will be — RRF only needs the
|
|
129
|
+
* ordering within each arm, which is the one thing both arms are reliable about.
|
|
130
|
+
*/
|
|
131
|
+
const RRF_K = 60;
|
|
132
|
+
/**
|
|
133
|
+
* The LLM still judges exactly `topK` candidates. One boundary slot is selected by vector rank from a
|
|
134
|
+
* bounded 2× fusion pool, which lets a strong paraphrase just outside the fused window compete without
|
|
135
|
+
* increasing model tokens or comparing cosine with reciprocal-rank scores.
|
|
136
|
+
*/
|
|
137
|
+
export const RERANK_CANDIDATE_SELECTION_VERSION = 'fusion-semantic-tail-v1';
|
|
138
|
+
export const RERANK_CANDIDATE_POOL_MULTIPLIER = 2;
|
|
139
|
+
export function selectRerankCandidates(hits, topK) {
|
|
140
|
+
if (topK <= 0 || hits.length === 0)
|
|
141
|
+
return [];
|
|
142
|
+
if (hits.length <= topK || topK < 2)
|
|
143
|
+
return hits.slice(0, topK);
|
|
144
|
+
const fixed = hits.slice(0, topK - 1);
|
|
145
|
+
const boundary = hits.slice(topK - 1, topK * RERANK_CANDIDATE_POOL_MULTIPLIER);
|
|
146
|
+
let selected = boundary[0];
|
|
147
|
+
for (const candidate of boundary.slice(1)) {
|
|
148
|
+
if (candidate.relevance !== undefined && candidate.relevance > (selected.relevance ?? -Infinity)) {
|
|
149
|
+
selected = candidate;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return [...fixed, selected];
|
|
153
|
+
}
|
|
154
|
+
export function fuseHits(lists) {
|
|
155
|
+
const populated = lists.filter((list) => list.length > 0);
|
|
156
|
+
// One list needs no fusion, and passing it through keeps its own scores rather
|
|
157
|
+
// than flattening them all onto the reciprocal-rank scale.
|
|
158
|
+
if (populated.length <= 1)
|
|
159
|
+
return populated[0] ?? [];
|
|
160
|
+
const merged = new Map();
|
|
161
|
+
for (const list of populated) {
|
|
162
|
+
const sorted = [...list].sort((a, b) => b.score - a.score);
|
|
163
|
+
for (let rank = 0; rank < sorted.length; rank++) {
|
|
164
|
+
const hit = sorted[rank];
|
|
165
|
+
const contribution = 1 / (RRF_K + rank + 1);
|
|
166
|
+
const existing = merged.get(hit.chunkId);
|
|
167
|
+
if (existing) {
|
|
168
|
+
existing.score += contribution;
|
|
169
|
+
for (const arm of hit.from)
|
|
170
|
+
if (!existing.from.includes(arm))
|
|
171
|
+
existing.from.push(arm);
|
|
172
|
+
existing.graphPaths = mergeGraphPaths(existing.graphPaths, hit.graphPaths);
|
|
173
|
+
if (hit.relevance !== undefined) {
|
|
174
|
+
existing.relevance = Math.max(existing.relevance ?? 0, hit.relevance);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
merged.set(hit.chunkId, { ...hit, score: contribution, from: [...hit.from] });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return [...merged.values()].sort((a, b) => b.score - a.score);
|
|
183
|
+
}
|
|
184
|
+
function mergeGraphPaths(left, right) {
|
|
185
|
+
if (!left?.length)
|
|
186
|
+
return right?.length ? [...right] : undefined;
|
|
187
|
+
if (!right?.length)
|
|
188
|
+
return left;
|
|
189
|
+
const merged = new Map(left.map((path) => [graphPathKey(path), path]));
|
|
190
|
+
for (const path of right)
|
|
191
|
+
merged.set(graphPathKey(path), path);
|
|
192
|
+
return [...merged.values()].slice(0, 3);
|
|
193
|
+
}
|
|
194
|
+
function graphPathKey(path) {
|
|
195
|
+
return `${path.nodes.map((node) => node.id).join('\0')}\0${path.relations.join('\0')}\0${path.evidence
|
|
196
|
+
.map((locator) => [
|
|
197
|
+
locator.kind,
|
|
198
|
+
locator.slug,
|
|
199
|
+
locator.document,
|
|
200
|
+
locator.event,
|
|
201
|
+
locator.fact,
|
|
202
|
+
locator.line_start,
|
|
203
|
+
locator.line_end,
|
|
204
|
+
locator.field,
|
|
205
|
+
].join('\0'))
|
|
206
|
+
.join('\0')}`;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* FTS5's MATCH syntax will happily reject a natural-language query — a bare `?`,
|
|
210
|
+
* an unbalanced quote, a stray `NEAR`. Quoting every token and OR-ing them makes
|
|
211
|
+
* any user input a legal expression, which matters because a thrown syntax error
|
|
212
|
+
* here would read to the caller as "nothing matched".
|
|
213
|
+
*/
|
|
214
|
+
export function toMatchExpression(query) {
|
|
215
|
+
const tokens = query
|
|
216
|
+
.toLowerCase()
|
|
217
|
+
.replace(/[^\p{L}\p{N}\s'-]/gu, ' ')
|
|
218
|
+
.split(/\s+/)
|
|
219
|
+
.map((token) => token.replace(/^[-']+|[-']+$/g, ''))
|
|
220
|
+
.filter((token) => token.length > 1);
|
|
221
|
+
if (tokens.length === 0)
|
|
222
|
+
return null;
|
|
223
|
+
// A quoted phrase for the whole query, plus each token, so an exact phrase
|
|
224
|
+
// outranks a bag of words without excluding partial matches.
|
|
225
|
+
const quoted = tokens.map((token) => `"${token.replace(/"/g, '')}"`);
|
|
226
|
+
const phrase = tokens.length > 1 ? `"${tokens.join(' ')}" OR ` : '';
|
|
227
|
+
return `${phrase}${quoted.join(' OR ')}`;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Without a reranker, hybrid score ordering stands. With one, the top
|
|
231
|
+
* candidates are re-scored against the original query. A native cross-encoder
|
|
232
|
+
* sees each query/passage pair; LLM mode applies one guarded listwise prompt.
|
|
233
|
+
*
|
|
234
|
+
* Two measured facts about cost, since they are counter-intuitive: the reranker is
|
|
235
|
+
* by far the most expensive stage in the pipeline (≈1s against ≈33ms for embedding
|
|
236
|
+
* and ≈4ms for the lexical arm on a local bge-reranker-v2-m3), and its cost is per
|
|
237
|
+
* *candidate*, not per character. So `topK` is the only real latency dial, and
|
|
238
|
+
* turning it down trades away which pages come back — see `config/default.jsonc`.
|
|
239
|
+
*
|
|
240
|
+
* The output is on **one scale with the un-reranked tail**, which is not a detail.
|
|
241
|
+
* A cross-encoder emits logits (bge-reranker spans roughly -12 to +8) while fusion
|
|
242
|
+
* emits reciprocal ranks around 0.01-0.2. Returning both in one array means any
|
|
243
|
+
* later `Math.max` over a page's chunks prefers a mediocre fused hit to a
|
|
244
|
+
* confidently-judged one, and the reranker silently stops mattering.
|
|
245
|
+
*/
|
|
246
|
+
export async function rerankHits(store, reranker, query, hits, topK, maxChars = 800,
|
|
247
|
+
/**
|
|
248
|
+
* Where this model puts the relevant/irrelevant boundary on its own logit scale. Subtracted
|
|
249
|
+
* before the sigmoid so that boundary lands on 0.5, which is what every threshold downstream
|
|
250
|
+
* already assumes. 0 leaves a model already centred there untouched.
|
|
251
|
+
*/
|
|
252
|
+
scoreOffset = 0, excludeIrrelevant = false) {
|
|
253
|
+
if (!reranker.available || hits.length === 0) {
|
|
254
|
+
return reranker.available
|
|
255
|
+
? { hits, degraded: null, note: null, qualification: null }
|
|
256
|
+
: {
|
|
257
|
+
hits,
|
|
258
|
+
degraded: reranker.degradedReason({}),
|
|
259
|
+
note: reranker.unavailableReason,
|
|
260
|
+
qualification: null,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const candidates = reranker.rerankerMode === 'llm' ? selectRerankCandidates(hits, topK) : hits.slice(0, topK);
|
|
264
|
+
// One prepared statement for the whole batch rather than one per candidate.
|
|
265
|
+
const select = store.db.prepare('SELECT heading_path, text FROM chunks WHERE id = ?');
|
|
266
|
+
const graphEvidence = graphEvidenceReader(store);
|
|
267
|
+
const texts = candidates.map((hit) => {
|
|
268
|
+
const row = select.get(hit.chunkId);
|
|
269
|
+
if (!row)
|
|
270
|
+
return '';
|
|
271
|
+
const full = row.heading_path ? `${row.heading_path}\n${row.text}` : row.text;
|
|
272
|
+
const graphContext = renderGraphRerankContext(hit.graphPaths, graphEvidence);
|
|
273
|
+
const graphBudget = graphContext ? Math.floor(maxChars / 2) : 0;
|
|
274
|
+
const boundedGraph = graphContext.slice(0, graphBudget);
|
|
275
|
+
const boundedContent = full.slice(0, maxChars - boundedGraph.length);
|
|
276
|
+
const candidateText = boundedGraph
|
|
277
|
+
? `[Graph path and its cited evidence]\n${boundedGraph}\n[Candidate]\n${boundedContent}`
|
|
278
|
+
: boundedContent;
|
|
279
|
+
// Bounds the request payload. Measured as *free* rather than fast: truncating
|
|
280
|
+
// from the 4,000-char chunk cap to 800 changed neither latency (1036 → 1028 ms)
|
|
281
|
+
// nor a single result across 8 queries, because this reranker's cost is per
|
|
282
|
+
// candidate, not per character. `topK` is the latency dial, and lowering that
|
|
283
|
+
// does change which pages come back. Kept anyway — a cross-encoder's relevance
|
|
284
|
+
// signal is front-loaded, and an unbounded payload is worth not having.
|
|
285
|
+
return candidateText.slice(0, maxChars);
|
|
286
|
+
});
|
|
287
|
+
if (reranker.rerankerMode === 'llm') {
|
|
288
|
+
const ids = allocateLlmRerankIds(query, candidates.map((hit) => `${hit.pageId ?? 'document'}:${hit.chunkId}`));
|
|
289
|
+
const llmCandidates = candidates.map((hit, index) => {
|
|
290
|
+
return {
|
|
291
|
+
id: ids[index],
|
|
292
|
+
text: texts[index] ?? '',
|
|
293
|
+
sourceKind: hit.pageId ? 'page' : 'document',
|
|
294
|
+
matchedBy: hit.from,
|
|
295
|
+
};
|
|
296
|
+
});
|
|
297
|
+
const result = await rerankWithLlm(reranker, query, llmCandidates);
|
|
298
|
+
if (!result.ok || !result.value) {
|
|
299
|
+
return {
|
|
300
|
+
hits,
|
|
301
|
+
degraded: reranker.degradedReason(result),
|
|
302
|
+
note: result.error ?? null,
|
|
303
|
+
qualification: null,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
// The listwise model supplies the order. Scores encode only that order; the separately
|
|
307
|
+
// returned relevance label is the absolute signal consumers may threshold.
|
|
308
|
+
const rejected = result.value.filter((entry) => excludeIrrelevant && entry.relevance === 0).length;
|
|
309
|
+
const reordered = result.value
|
|
310
|
+
.map((entry, rank) => ({ entry, rank }))
|
|
311
|
+
.filter(({ entry }) => !excludeIrrelevant || entry.relevance > 0)
|
|
312
|
+
.map(({ entry, rank }) => {
|
|
313
|
+
const hit = candidates[entry.index];
|
|
314
|
+
return {
|
|
315
|
+
...hit,
|
|
316
|
+
score: (candidates.length - rank) / candidates.length,
|
|
317
|
+
relevance: entry.relevance / 3,
|
|
318
|
+
};
|
|
319
|
+
});
|
|
320
|
+
return finishRerank(hits, candidates, reordered, {
|
|
321
|
+
model: 'llm',
|
|
322
|
+
model_id: reranker.modelId ?? undefined,
|
|
323
|
+
latency_ms: result.latencyMs,
|
|
324
|
+
input_tokens: result.usage?.inputTokens ?? null,
|
|
325
|
+
output_tokens: result.usage?.outputTokens ?? null,
|
|
326
|
+
total_tokens: result.usage?.totalTokens ?? null,
|
|
327
|
+
applied: excludeIrrelevant,
|
|
328
|
+
judged: candidates.length,
|
|
329
|
+
rejected,
|
|
330
|
+
unjudged: hits.length - candidates.length,
|
|
331
|
+
basis: excludeIrrelevant ? 'llm_grade' : 'disabled',
|
|
332
|
+
threshold: null,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
const result = await reranker.rerank(query, texts, candidates.length);
|
|
336
|
+
if (!result.ok || !result.value) {
|
|
337
|
+
return {
|
|
338
|
+
hits,
|
|
339
|
+
degraded: reranker.degradedReason(result),
|
|
340
|
+
note: result.error ?? null,
|
|
341
|
+
qualification: null,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
const entries = completeNativeRerank(result.value, candidates.length);
|
|
345
|
+
if (!entries) {
|
|
346
|
+
return {
|
|
347
|
+
hits,
|
|
348
|
+
degraded: 'rerank_failed',
|
|
349
|
+
note: 'rerank returned an incomplete or invalid candidate permutation',
|
|
350
|
+
qualification: null,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
let resolvedOffset;
|
|
354
|
+
let calibration;
|
|
355
|
+
if (scoreOffset === 'auto') {
|
|
356
|
+
const outcome = await nativeRerankerCalibration(store, reranker);
|
|
357
|
+
if (!outcome.ok || !outcome.value) {
|
|
358
|
+
// Ordering remains useful, but without a trustworthy boundary these are relative ranks and
|
|
359
|
+
// qualification must stay off. Guessing here is how an unfamiliar model erases good recall.
|
|
360
|
+
const reordered = entries
|
|
361
|
+
.sort((a, b) => b.score - a.score)
|
|
362
|
+
.map((entry, rank) => ({
|
|
363
|
+
...candidates[entry.index],
|
|
364
|
+
score: (candidates.length - rank) / candidates.length,
|
|
365
|
+
}));
|
|
366
|
+
return finishRerank(hits, candidates, reordered, {
|
|
367
|
+
model: 'native',
|
|
368
|
+
model_id: reranker.modelId ?? undefined,
|
|
369
|
+
latency_ms: result.latencyMs,
|
|
370
|
+
applied: false,
|
|
371
|
+
judged: candidates.length,
|
|
372
|
+
rejected: 0,
|
|
373
|
+
unjudged: hits.length - candidates.length,
|
|
374
|
+
basis: 'calibration_failed',
|
|
375
|
+
threshold: null,
|
|
376
|
+
}, outcome.error ?? 'native reranker auto-calibration failed; qualification was not applied');
|
|
377
|
+
}
|
|
378
|
+
resolvedOffset = outcome.value.scoreOffset;
|
|
379
|
+
calibration = 'native_auto';
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
resolvedOffset = scoreOffset;
|
|
383
|
+
calibration = 'native_manual';
|
|
384
|
+
}
|
|
385
|
+
const judged = [];
|
|
386
|
+
for (const entry of entries) {
|
|
387
|
+
const hit = candidates[entry.index];
|
|
388
|
+
// A logit through a sigmoid is a relevance in (0, 1) — comparable across
|
|
389
|
+
// queries, and readable as a score rather than as a model internal.
|
|
390
|
+
// The cross-encoder saw the query and the passage together, so its judgement
|
|
391
|
+
// replaces cosine as the absolute signal rather than merging with it.
|
|
392
|
+
//
|
|
393
|
+
// `scoreOffset` is what makes "comparable" true across *models* as well as queries. Two
|
|
394
|
+
// cross-encoders that rank a set identically can sit on entirely different scales: measured
|
|
395
|
+
// here, an irrelevant pair scores ~−11 on bge-reranker-v2-m3 and ~−0.3 on
|
|
396
|
+
// gte-reranker-modernbert-base, so the same 0.5 cutoff admits 0.8% of irrelevant pairs on
|
|
397
|
+
// one and 42.5% on the other. Recentring here keeps every threshold downstream honest.
|
|
398
|
+
const relevance = sigmoid(entry.score - resolvedOffset);
|
|
399
|
+
if (hit)
|
|
400
|
+
judged.push({ ...hit, score: relevance, relevance });
|
|
401
|
+
}
|
|
402
|
+
judged.sort((a, b) => b.score - a.score);
|
|
403
|
+
const reordered = excludeIrrelevant ? judged.filter((hit) => (hit.relevance ?? 0) >= 0.5) : judged;
|
|
404
|
+
return finishRerank(hits, candidates, reordered, {
|
|
405
|
+
model: 'native',
|
|
406
|
+
model_id: reranker.modelId ?? undefined,
|
|
407
|
+
latency_ms: result.latencyMs,
|
|
408
|
+
applied: excludeIrrelevant,
|
|
409
|
+
judged: candidates.length,
|
|
410
|
+
rejected: excludeIrrelevant ? judged.length - reordered.length : 0,
|
|
411
|
+
unjudged: hits.length - candidates.length,
|
|
412
|
+
basis: excludeIrrelevant ? calibration : 'disabled',
|
|
413
|
+
threshold: resolvedOffset,
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
function graphEvidenceReader(store) {
|
|
417
|
+
let page;
|
|
418
|
+
let document;
|
|
419
|
+
try {
|
|
420
|
+
page = store.db.prepare(`SELECT c.text
|
|
421
|
+
FROM chunks c
|
|
422
|
+
JOIN pages p ON p.id = c.page_id
|
|
423
|
+
WHERE p.slug = ? AND c.document_id IS NULL
|
|
424
|
+
ORDER BY CASE WHEN ? BETWEEN c.line_start AND c.line_end THEN 0 ELSE 1 END, c.ord
|
|
425
|
+
LIMIT 1`);
|
|
426
|
+
document = store.db.prepare(`SELECT text
|
|
427
|
+
FROM chunks
|
|
428
|
+
WHERE document_id = ?
|
|
429
|
+
ORDER BY ord
|
|
430
|
+
LIMIT 1`);
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
// Small embedders may supply only the chunk table. Path identities still help their reranker even when
|
|
434
|
+
// this optional supporting excerpt cannot be loaded from the handle.
|
|
435
|
+
return () => '';
|
|
436
|
+
}
|
|
437
|
+
const cache = new Map();
|
|
438
|
+
return (locator) => {
|
|
439
|
+
const key = `${locator.kind}\0${locator.slug ?? ''}\0${locator.document ?? ''}\0${locator.line_start ?? ''}`;
|
|
440
|
+
const cached = cache.get(key);
|
|
441
|
+
if (cached !== undefined)
|
|
442
|
+
return cached;
|
|
443
|
+
const row = locator.slug
|
|
444
|
+
? page.get(locator.slug, locator.line_start ?? -1)
|
|
445
|
+
: locator.document
|
|
446
|
+
? document.get(locator.document)
|
|
447
|
+
: undefined;
|
|
448
|
+
const text = row?.text.replace(/\s+/g, ' ').trim().slice(0, 180) ?? '';
|
|
449
|
+
cache.set(key, text);
|
|
450
|
+
return text;
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
function renderGraphRerankContext(paths, evidenceText) {
|
|
454
|
+
if (!paths?.length)
|
|
455
|
+
return '';
|
|
456
|
+
return paths
|
|
457
|
+
.slice(0, 2)
|
|
458
|
+
.map((path) => {
|
|
459
|
+
const route = [];
|
|
460
|
+
for (let index = 0; index < path.nodes.length; index++) {
|
|
461
|
+
const node = path.nodes[index];
|
|
462
|
+
route.push(node.slug ?? node.document ?? node.label ?? node.id);
|
|
463
|
+
const relation = path.relations[index];
|
|
464
|
+
if (relation)
|
|
465
|
+
route.push(`-${relation}->`);
|
|
466
|
+
}
|
|
467
|
+
const evidence = path.evidence
|
|
468
|
+
.map(evidenceText)
|
|
469
|
+
.filter(Boolean)
|
|
470
|
+
.map((text) => `Evidence: ${text}`);
|
|
471
|
+
return [`Path: ${route.join(' ')}`, ...evidence].join('\n');
|
|
472
|
+
})
|
|
473
|
+
.join('\n');
|
|
474
|
+
}
|
|
475
|
+
function finishRerank(hits, judged, reordered, qualification, note = null) {
|
|
476
|
+
// Qualification is a claim about what may be shown. Candidates outside the bounded window
|
|
477
|
+
// were not judged, so filling empty slots from that tail would silently undo the filter.
|
|
478
|
+
if (qualification.applied)
|
|
479
|
+
return { hits: reordered, degraded: null, note, qualification };
|
|
480
|
+
const seen = new Set(reordered.map((hit) => hit.chunkId));
|
|
481
|
+
const judgedIds = new Set(judged.map((hit) => hit.chunkId));
|
|
482
|
+
const tail = hits.filter((hit) => !seen.has(hit.chunkId) && !judgedIds.has(hit.chunkId));
|
|
483
|
+
// The reranker judged the bounded selection; the tail was never looked at, so it cannot
|
|
484
|
+
// outrank a judged hit. Compress it into the band below the weakest judged one,
|
|
485
|
+
// preserving its fused order.
|
|
486
|
+
const floor = reordered.at(-1)?.score ?? 0;
|
|
487
|
+
const rescaledTail = tail.map((hit, index) => ({
|
|
488
|
+
...hit,
|
|
489
|
+
score: (floor * (tail.length - index)) / (tail.length + 1),
|
|
490
|
+
}));
|
|
491
|
+
return { hits: [...reordered, ...rescaledTail], degraded: null, note, qualification };
|
|
492
|
+
}
|
|
493
|
+
function completeNativeRerank(entries, count) {
|
|
494
|
+
if (entries.length !== count)
|
|
495
|
+
return null;
|
|
496
|
+
const seen = new Set();
|
|
497
|
+
for (const entry of entries) {
|
|
498
|
+
if (!Number.isInteger(entry.index) ||
|
|
499
|
+
entry.index < 0 ||
|
|
500
|
+
entry.index >= count ||
|
|
501
|
+
!Number.isFinite(entry.score) ||
|
|
502
|
+
seen.has(entry.index)) {
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
seen.add(entry.index);
|
|
506
|
+
}
|
|
507
|
+
return entries;
|
|
508
|
+
}
|
|
509
|
+
function sigmoid(logit) {
|
|
510
|
+
return 1 / (1 + Math.exp(-logit));
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Puts fused scores on a readable 0..1 scale when no reranker ran. Reciprocal
|
|
514
|
+
* rank fusion produces values around 0.016 whose absolute magnitude means
|
|
515
|
+
* nothing, and a card reporting `score: 0.016` reads as "barely a match" when it
|
|
516
|
+
* is in fact the best hit in the knowledge base.
|
|
517
|
+
*
|
|
518
|
+
* The result is **relative within one result set** — it says how this hit compares
|
|
519
|
+
* to the best hit here, not how relevant it is in the abstract. That is the only
|
|
520
|
+
* honest reading of a fused rank, and it is what the field is documented as.
|
|
521
|
+
*/
|
|
522
|
+
export function normalizeScores(hits) {
|
|
523
|
+
if (hits.length === 0)
|
|
524
|
+
return hits;
|
|
525
|
+
const best = Math.max(...hits.map((hit) => hit.score));
|
|
526
|
+
if (!Number.isFinite(best) || best <= 0)
|
|
527
|
+
return hits;
|
|
528
|
+
return hits.map((hit) => ({ ...hit, score: hit.score / best }));
|
|
529
|
+
}
|
|
530
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/recall/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { AknoConfig } from './config/schema.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Reserved paths. Almost everything in a knowledge base is the user's; this
|
|
4
|
+
* is the whole list of what is not, and the rule that governs all of it is the
|
|
5
|
+
* same: **if a reserved path already exists and isn't what Akno expects, leave
|
|
6
|
+
* it completely alone.**
|
|
7
|
+
*
|
|
8
|
+
* Both `open()` (which refuses to start rather than adopt one) and `doctor`
|
|
9
|
+
* (which reports it) need the same predicate, and two copies that could disagree
|
|
10
|
+
* about whether a file is a ledger is exactly the bug worth not having.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* The ledger's slug — `timeline.md` becomes `timeline`.
|
|
14
|
+
*
|
|
15
|
+
* One derivation, three callers. It used to be written out separately in the write path and
|
|
16
|
+
* in the indexer, which is two chances to disagree about which page is the ledger, and
|
|
17
|
+
* whichever one was wrong would be wrong silently.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ledgerSlug(config: AknoConfig): string;
|
|
20
|
+
/**
|
|
21
|
+
* **Every slug prefix a caller must not aim a page write at.**
|
|
22
|
+
*
|
|
23
|
+
* These are Akno's own structures, not the user's notes: the ledger is maintained by
|
|
24
|
+
* `insertEvent` and nothing else, the inbox is a queue that empties itself, observations are
|
|
25
|
+
* written by the cycle with their own evidence, and the journal is a record of what happened.
|
|
26
|
+
* A claim landing on any of them is a claim in a file whose shape means something specific —
|
|
27
|
+
* and on the ledger, where prose is invisible to the event parser, it is a claim in a file
|
|
28
|
+
* that will never be read back.
|
|
29
|
+
*/
|
|
30
|
+
export declare function reservedSlugs(config: AknoConfig): string[];
|
|
31
|
+
/** True when `slug` is a reserved path or lives underneath one. */
|
|
32
|
+
export declare function isReserved(slug: string, config: AknoConfig): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* An event ledger has event lines in it. A project plan someone happens to have
|
|
35
|
+
* called `timeline.md` does not, and appending `- **2026-08-06** | …` into the
|
|
36
|
+
* middle of their document is not a recoverable mistake.
|
|
37
|
+
*/
|
|
38
|
+
export declare function looksLikeLedger(absPath: string): boolean;
|
|
39
|
+
//# sourceMappingURL=reserved.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reserved.d.ts","sourceRoot":"","sources":["../src/reserved.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAErD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAO1D;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAEpE;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CASxD"}
|