@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
package/dist/ops/read.js
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { annotateLines, LINE_FACT_COLUMNS } from "../kb/line-facts.js";
|
|
4
|
+
import { AknoError, ReadInput } from '@tenphi/akno-protocol';
|
|
5
|
+
import { documentAvailability } from "../ingest/availability.js";
|
|
6
|
+
/**
|
|
7
|
+
* `read({slug})` returns the full body of a `source` page every time.
|
|
8
|
+
* The role governs only what recall pulls in unprompted — **this is a relevance
|
|
9
|
+
* policy, not access control.**
|
|
10
|
+
*/
|
|
11
|
+
export async function read(ctx, rawInput) {
|
|
12
|
+
const input = ReadInput.parse(rawInput);
|
|
13
|
+
if (input.document)
|
|
14
|
+
return readDocument(ctx, input.document);
|
|
15
|
+
return readPage(ctx, input);
|
|
16
|
+
}
|
|
17
|
+
function readPage(ctx, input) {
|
|
18
|
+
const row = (input.slug
|
|
19
|
+
? ctx.store.db.prepare(SELECT_PAGE + ' WHERE slug = ?').get(input.slug)
|
|
20
|
+
: ctx.store.db.prepare(SELECT_PAGE + ' WHERE id = ?').get(input.id));
|
|
21
|
+
if (!row) {
|
|
22
|
+
throw new AknoError('not_found', `no page at ${input.slug ?? input.id}`, {
|
|
23
|
+
// A near-miss list turns "not found" into something the caller can act on
|
|
24
|
+
// instead of guessing again.
|
|
25
|
+
nearest: nearestSlugs(ctx, input.slug ?? ''),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
let content;
|
|
29
|
+
try {
|
|
30
|
+
content = fs.readFileSync(path.join(ctx.config.aknoPath, row.rel_path), 'utf8');
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
// The index says it exists and the file does not. That is `unavailable`, not
|
|
34
|
+
// `not_found`: the knowledge base did record this, and the caller should say
|
|
35
|
+
// so rather than "there is nothing about that".
|
|
36
|
+
throw new AknoError('unavailable', `${row.slug} is indexed but could not be read: ${message(err)}`);
|
|
37
|
+
}
|
|
38
|
+
const allLines = content.split('\n');
|
|
39
|
+
const from = input.from_line ?? 1;
|
|
40
|
+
const to = input.to_line ?? allLines.length;
|
|
41
|
+
const lines = allLines
|
|
42
|
+
.slice(from - 1, to)
|
|
43
|
+
.map((text, index) => ({ n: from + index, text }))
|
|
44
|
+
.filter((line) => line.text.length > 0 || line.n === from);
|
|
45
|
+
const facts = ctx.store.db
|
|
46
|
+
.prepare(`SELECT ${LINE_FACT_COLUMNS} FROM facts WHERE page_id = ?
|
|
47
|
+
AND EXISTS (
|
|
48
|
+
SELECT 1 FROM pages current_page
|
|
49
|
+
WHERE current_page.id = facts.page_id
|
|
50
|
+
AND current_page.derived_hash = current_page.body_hash
|
|
51
|
+
)`)
|
|
52
|
+
.all(row.id);
|
|
53
|
+
const withConfidence = annotateLines(lines, facts);
|
|
54
|
+
const links = ctx.store.db
|
|
55
|
+
.prepare('SELECT DISTINCT to_slug, broken FROM links WHERE from_page = ?')
|
|
56
|
+
.all(row.id);
|
|
57
|
+
const backlinks = ctx.store.db
|
|
58
|
+
.prepare('SELECT DISTINCT p.slug FROM links l JOIN pages p ON p.id = l.from_page WHERE l.to_page = ?')
|
|
59
|
+
.all(row.id);
|
|
60
|
+
const documents = ctx.store.db
|
|
61
|
+
.prepare(`SELECT id, rel_path, mime, label, page_count, group_key, renders, text,
|
|
62
|
+
availability, missing_since
|
|
63
|
+
FROM documents WHERE page_id = ?`)
|
|
64
|
+
.all(row.id);
|
|
65
|
+
const superseded = facts
|
|
66
|
+
.filter((fact) => fact.valid_to !== null)
|
|
67
|
+
.map((fact) => ({ claim: fact.claim, valid_to: fact.valid_to }));
|
|
68
|
+
return {
|
|
69
|
+
status: 'ok',
|
|
70
|
+
page: {
|
|
71
|
+
id: row.id,
|
|
72
|
+
slug: row.slug,
|
|
73
|
+
title: row.title,
|
|
74
|
+
type: row.type,
|
|
75
|
+
tags: JSON.parse(row.tags),
|
|
76
|
+
role: row.role,
|
|
77
|
+
management: { remember: row.remember_management, dream: row.dream_management },
|
|
78
|
+
about: JSON.parse(row.about),
|
|
79
|
+
aliases: JSON.parse(row.aliases),
|
|
80
|
+
frontmatter: JSON.parse(row.frontmatter),
|
|
81
|
+
summary: row.summary,
|
|
82
|
+
...(row.keywords ? { keywords: JSON.parse(row.keywords) } : {}),
|
|
83
|
+
lines: withConfidence,
|
|
84
|
+
source_fence_line: row.source_fence_line,
|
|
85
|
+
links: links.filter((link) => link.broken === 0).map((link) => link.to_slug),
|
|
86
|
+
backlinks: backlinks.map((link) => link.slug),
|
|
87
|
+
...(links.some((l) => l.broken === 1)
|
|
88
|
+
? { broken_links: links.filter((l) => l.broken === 1).map((l) => l.to_slug) }
|
|
89
|
+
: {}),
|
|
90
|
+
...(superseded.length > 0 ? { superseded } : {}),
|
|
91
|
+
...(documents.length > 0
|
|
92
|
+
? {
|
|
93
|
+
documents: documents.map((doc) => ({
|
|
94
|
+
id: doc.id,
|
|
95
|
+
rel_path: doc.rel_path,
|
|
96
|
+
...(doc.mime ? { mime: doc.mime } : {}),
|
|
97
|
+
...(doc.label ? { label: doc.label } : {}),
|
|
98
|
+
...(doc.page_count !== null ? { pages: doc.page_count } : {}),
|
|
99
|
+
availability: availabilityForDocument(ctx, doc),
|
|
100
|
+
})),
|
|
101
|
+
}
|
|
102
|
+
: {}),
|
|
103
|
+
...(row.updated_at ? { updated: row.updated_at.slice(0, 10) } : {}),
|
|
104
|
+
bytes: row.bytes,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const SELECT_DOCUMENT = `SELECT d.id, d.rel_path, d.mime, d.sha256, d.label, d.text, d.page_count,
|
|
109
|
+
d.ocr, d.bytes, d.group_key, d.renders, p.slug,
|
|
110
|
+
d.availability, d.missing_since
|
|
111
|
+
FROM documents d LEFT JOIN pages p ON p.id = d.page_id`;
|
|
112
|
+
/**
|
|
113
|
+
* A document by id, by its path in the knowledge base, or by its bare filename.
|
|
114
|
+
*
|
|
115
|
+
* Someone who has just read a page is holding three handles on the same file and has no
|
|
116
|
+
* reason to prefer one: the `id` in `documents[]`, the `rel_path` beside it, and the
|
|
117
|
+
* basename inside the `![[…]]` embed in the body. The embed is the most visible of the
|
|
118
|
+
* three and used to be the only one that did not work, so the two-call route — read the
|
|
119
|
+
* page, then read its document — dead-ended on a `not_found` that said only that the id was
|
|
120
|
+
* wrong, with nothing to try next.
|
|
121
|
+
*
|
|
122
|
+
* A bare filename resolves only when exactly one file matches. Quietly picking one of two
|
|
123
|
+
* `lease.pdf`s would answer a question about one document with the text of another, which
|
|
124
|
+
* is worse than the error.
|
|
125
|
+
*/
|
|
126
|
+
function resolveDocument(ctx, handle) {
|
|
127
|
+
const exact = ctx.store.db
|
|
128
|
+
.prepare(`${SELECT_DOCUMENT} WHERE d.id = ? OR d.rel_path = ?`)
|
|
129
|
+
.get(handle, handle);
|
|
130
|
+
if (exact)
|
|
131
|
+
return exact;
|
|
132
|
+
const byName = ctx.store.db
|
|
133
|
+
.prepare(`${SELECT_DOCUMENT} WHERE d.rel_path LIKE '%/' || ? LIMIT 5`)
|
|
134
|
+
.all(handle);
|
|
135
|
+
if (byName.length === 1)
|
|
136
|
+
return byName[0];
|
|
137
|
+
if (byName.length > 1) {
|
|
138
|
+
throw new AknoError('invalid', `${byName.length} documents are called ${handle} — name the path`, {
|
|
139
|
+
matches: byName.map((row) => row.rel_path),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const leaf = handle.split('/').pop() ?? handle;
|
|
143
|
+
const nearest = ctx.store.db
|
|
144
|
+
.prepare('SELECT rel_path FROM documents WHERE rel_path LIKE ? LIMIT 5')
|
|
145
|
+
.all(`%${leaf}%`);
|
|
146
|
+
throw new AknoError('not_found', `no document at ${handle}`, {
|
|
147
|
+
...(nearest.length > 0 ? { nearest: nearest.map((row) => row.rel_path) } : {}),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
function readDocument(ctx, documentId) {
|
|
151
|
+
const found = resolveDocument(ctx, documentId);
|
|
152
|
+
// Asking for the text file beside a contract is asking for the contract. It holds a copy
|
|
153
|
+
// of the same text, and answering from the copy would make which of the two you happened
|
|
154
|
+
// to name matter.
|
|
155
|
+
const row = found.renders ? resolveDocument(ctx, found.renders) : found;
|
|
156
|
+
// A document someone's scanner cut into `passport.pdf` and `passport-2.pdf` is one
|
|
157
|
+
// document, so reading any part returns the whole of it: the text of every part in order,
|
|
158
|
+
// the total page count, and the other parts' paths. Asking for a passport and getting
|
|
159
|
+
// half of it, with nothing saying so, is the failure this avoids.
|
|
160
|
+
//
|
|
161
|
+
// Renditions are not parts. `contract.pdf.txt` carries the same text as `contract.pdf`,
|
|
162
|
+
// so joining it in would return the contract twice and count it as a part that could not
|
|
163
|
+
// be read.
|
|
164
|
+
const parts = ctx.store.db
|
|
165
|
+
.prepare(`SELECT id, rel_path, text, page_count, ocr, availability, missing_since FROM documents
|
|
166
|
+
WHERE group_key = ? AND renders IS NULL ORDER BY part`)
|
|
167
|
+
.all(row.group_key ?? row.rel_path);
|
|
168
|
+
const availability = documentAvailability(ctx.store.db, parts);
|
|
169
|
+
const readable = parts
|
|
170
|
+
.map((part) => ({ ...part, readableText: part.text ?? renditionTextFor(ctx, part.rel_path) }))
|
|
171
|
+
.filter((part) => part.readableText !== null);
|
|
172
|
+
const text = readable.length > 0 ? readable.map((part) => part.readableText).join('\n\n') : null;
|
|
173
|
+
const pageCount = parts.reduce((sum, part) => (part.page_count === null ? sum : (sum ?? 0) + part.page_count), null);
|
|
174
|
+
const notes = [];
|
|
175
|
+
if (availability.status !== 'available') {
|
|
176
|
+
notes.push(`original file${availability.missing_originals.length === 1 ? '' : 's'} missing: ` +
|
|
177
|
+
availability.missing_originals.join(', '));
|
|
178
|
+
}
|
|
179
|
+
if (text === null) {
|
|
180
|
+
notes.push('nothing could be read from this file — a photo with no text in it, or a format with no extractor');
|
|
181
|
+
}
|
|
182
|
+
else if (readable.length < parts.length) {
|
|
183
|
+
// Partial is a result, not a failure — but a caller reasoning over half a contract has
|
|
184
|
+
// to know which half it has.
|
|
185
|
+
notes.push(`${parts.length - readable.length} of ${parts.length} parts could not be read: ` +
|
|
186
|
+
parts
|
|
187
|
+
.filter((part) => part.text === null)
|
|
188
|
+
.map((part) => part.rel_path)
|
|
189
|
+
.join(', '));
|
|
190
|
+
}
|
|
191
|
+
if (parts.length > 1) {
|
|
192
|
+
notes.push(`${parts.length} files, read as one document: ${parts.map((part) => part.rel_path).join(', ')}`);
|
|
193
|
+
}
|
|
194
|
+
const status = availability.status === 'unavailable'
|
|
195
|
+
? 'unavailable'
|
|
196
|
+
: availability.status === 'degraded' || readable.length < parts.length
|
|
197
|
+
? 'degraded'
|
|
198
|
+
: 'ok';
|
|
199
|
+
const degraded = [];
|
|
200
|
+
if (availability.status === 'degraded')
|
|
201
|
+
degraded.push('document_source_missing');
|
|
202
|
+
if (text === null || readable.length < parts.length)
|
|
203
|
+
degraded.push('no_document_text');
|
|
204
|
+
return {
|
|
205
|
+
status,
|
|
206
|
+
// Extraction is a built-in reader, not a model call — so a file nothing could be read
|
|
207
|
+
// from is its own kind of degraded, and pointing at a model would send someone to
|
|
208
|
+
// configure one that would not have helped.
|
|
209
|
+
...(status === 'degraded' && degraded.length > 0 ? { degraded } : {}),
|
|
210
|
+
...(notes.length > 0 ? { note: notes.join('. ') } : {}),
|
|
211
|
+
document: {
|
|
212
|
+
id: row.id,
|
|
213
|
+
page: row.slug,
|
|
214
|
+
rel_path: row.rel_path,
|
|
215
|
+
mime: row.mime,
|
|
216
|
+
sha256: row.sha256,
|
|
217
|
+
label: row.label,
|
|
218
|
+
page_count: pageCount,
|
|
219
|
+
ocr: parts.some((part) => part.ocr === 1),
|
|
220
|
+
text,
|
|
221
|
+
bytes: row.bytes,
|
|
222
|
+
availability,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
function availabilityForDocument(ctx, row) {
|
|
227
|
+
const source = row.renders ? resolveDocument(ctx, row.renders) : row;
|
|
228
|
+
const parts = ctx.store.db
|
|
229
|
+
.prepare(`SELECT rel_path, text, availability, missing_since FROM documents
|
|
230
|
+
WHERE group_key = ? AND renders IS NULL ORDER BY part`)
|
|
231
|
+
.all(source.group_key ?? source.rel_path);
|
|
232
|
+
return documentAvailability(ctx.store.db, parts.length > 0 ? parts : [source]);
|
|
233
|
+
}
|
|
234
|
+
/** Read a surviving rendition only when the indexed extraction itself is gone. */
|
|
235
|
+
function renditionTextFor(ctx, sourcePath) {
|
|
236
|
+
const row = ctx.store.db
|
|
237
|
+
.prepare(`SELECT rel_path FROM documents
|
|
238
|
+
WHERE renders = ? AND availability = 'available'
|
|
239
|
+
ORDER BY rel_path LIMIT 1`)
|
|
240
|
+
.get(sourcePath);
|
|
241
|
+
if (!row)
|
|
242
|
+
return null;
|
|
243
|
+
try {
|
|
244
|
+
const content = fs.readFileSync(path.join(ctx.config.aknoPath, row.rel_path), 'utf8');
|
|
245
|
+
if (!content.startsWith('# Extracted text of '))
|
|
246
|
+
return content;
|
|
247
|
+
const bodyAt = content.indexOf('\n\n');
|
|
248
|
+
return bodyAt === -1 ? content : content.slice(bodyAt + 2).replace(/\n$/, '');
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const SELECT_PAGE = `SELECT id, slug, rel_path, title, type, tags, role, remember_management,
|
|
255
|
+
dream_management, about, aliases, frontmatter, summary,
|
|
256
|
+
keywords, source_fence_line, bytes, updated_at
|
|
257
|
+
FROM pages`;
|
|
258
|
+
/** Cheap prefix and substring match. Good enough to catch a typo or a wrong folder. */
|
|
259
|
+
function nearestSlugs(ctx, slug) {
|
|
260
|
+
if (slug.length === 0)
|
|
261
|
+
return [];
|
|
262
|
+
const leaf = slug.split('/').pop() ?? slug;
|
|
263
|
+
const rows = ctx.store.db
|
|
264
|
+
.prepare('SELECT slug FROM pages WHERE slug LIKE ? OR slug LIKE ? LIMIT 5')
|
|
265
|
+
.all(`%${leaf}%`, `${slug}%`);
|
|
266
|
+
return rows.map((row) => row.slug);
|
|
267
|
+
}
|
|
268
|
+
function message(err) {
|
|
269
|
+
return err instanceof Error ? err.message : String(err);
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/ops/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type RecallOutput } from '@tenphi/akno-protocol';
|
|
2
|
+
import type { AknoContext } from '../context.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The retrieval op. Expand → hybrid search → rerank → assemble → fit a
|
|
5
|
+
* budget. `mode` selects the expansion strategy and is inferred from the query
|
|
6
|
+
* by default.
|
|
7
|
+
*
|
|
8
|
+
* Four properties matter more here than ranking quality: every line carries its
|
|
9
|
+
* address, absence has a reason, superseded values come back labelled, and one
|
|
10
|
+
* budget governs the whole assembly.
|
|
11
|
+
*/
|
|
12
|
+
export declare function recall(ctx: AknoContext, rawInput: unknown): Promise<RecallOutput>;
|
|
13
|
+
//# sourceMappingURL=recall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/ops/recall.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMjD;;;;;;;;GAQG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAkOvF"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { RecallInput, } from '@tenphi/akno-protocol';
|
|
2
|
+
import { indexDegradation } from "../context.js";
|
|
3
|
+
import { expandQuery, inferMode, splitMultiPart } from "../recall/expand.js";
|
|
4
|
+
import { graphRecallCandidates } from "../recall/graph-arm.js";
|
|
5
|
+
import { fuseHits, hybridSearch, normalizeScores, rerankHits } from "../recall/search.js";
|
|
6
|
+
/**
|
|
7
|
+
* The retrieval op. Expand → hybrid search → rerank → assemble → fit a
|
|
8
|
+
* budget. `mode` selects the expansion strategy and is inferred from the query
|
|
9
|
+
* by default.
|
|
10
|
+
*
|
|
11
|
+
* Four properties matter more here than ranking quality: every line carries its
|
|
12
|
+
* address, absence has a reason, superseded values come back labelled, and one
|
|
13
|
+
* budget governs the whole assembly.
|
|
14
|
+
*/
|
|
15
|
+
export async function recall(ctx, rawInput) {
|
|
16
|
+
const input = RecallInput.parse(rawInput);
|
|
17
|
+
const mode = input.mode ?? inferMode(input.query);
|
|
18
|
+
const depth = input.depth ?? (mode === 'explore' ? 'summary' : 'lines');
|
|
19
|
+
const limit = input.limit ?? (mode === 'explore' ? ctx.config.recall.defaultLimit * 2 : ctx.config.recall.defaultLimit);
|
|
20
|
+
const budget = input.budget ?? ctx.config.recall.defaultBudget;
|
|
21
|
+
const degraded = new Set();
|
|
22
|
+
const notes = [];
|
|
23
|
+
// A knowledge base with nothing in it is `empty`, not a failure — but it must
|
|
24
|
+
// not be confused with an index that could not be read.
|
|
25
|
+
const chunkCount = ctx.store.db.prepare('SELECT count(*) AS c FROM chunks').get().c;
|
|
26
|
+
if (chunkCount === 0) {
|
|
27
|
+
return {
|
|
28
|
+
status: 'empty',
|
|
29
|
+
results: [],
|
|
30
|
+
searched: [input.query],
|
|
31
|
+
budget_used: 0,
|
|
32
|
+
mode,
|
|
33
|
+
scores: 'relative',
|
|
34
|
+
note: 'the index holds no chunks yet — run `akno index`',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// Multi-part questions are split and searched separately, then merged.
|
|
38
|
+
const parts = mode === 'question' ? splitMultiPart(input.query) : [input.query];
|
|
39
|
+
const allQueries = [];
|
|
40
|
+
const allVectorTexts = [];
|
|
41
|
+
const allConcepts = [];
|
|
42
|
+
for (const part of parts) {
|
|
43
|
+
const expansion = await expandQuery(part, mode, ctx.models.expansion, input.expand ?? ctx.config.recall.expansion, ctx.config.recall.expansionTimeoutMs);
|
|
44
|
+
allQueries.push(...expansion.queries);
|
|
45
|
+
allVectorTexts.push(...expansion.vectorTexts);
|
|
46
|
+
allConcepts.push(...expansion.concepts);
|
|
47
|
+
if (expansion.degraded)
|
|
48
|
+
degraded.add(expansion.degraded);
|
|
49
|
+
if (expansion.note)
|
|
50
|
+
notes.push(expansion.note);
|
|
51
|
+
}
|
|
52
|
+
const chunkIds = resolveFilter(ctx, input);
|
|
53
|
+
if (chunkIds !== null && chunkIds.size === 0) {
|
|
54
|
+
return {
|
|
55
|
+
status: 'empty',
|
|
56
|
+
results: [],
|
|
57
|
+
searched: dedupe(allQueries),
|
|
58
|
+
budget_used: 0,
|
|
59
|
+
mode,
|
|
60
|
+
scores: 'relative',
|
|
61
|
+
note: 'the filter matched no indexed evidence',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
let search;
|
|
65
|
+
try {
|
|
66
|
+
search = await hybridSearch(ctx.store, ctx.models.embedding, {
|
|
67
|
+
queries: dedupe(allQueries),
|
|
68
|
+
vectorTexts: dedupe(allVectorTexts),
|
|
69
|
+
candidatesPerArm: ctx.config.recall.candidatesPerArm,
|
|
70
|
+
prefilterAbove: ctx.config.index.annThresholdChunks,
|
|
71
|
+
...(chunkIds ? { chunkIds } : {}),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
// The index could not be read. Say so — an agent can honestly offer to check
|
|
76
|
+
// again, which it cannot do if this returns as "nothing recorded".
|
|
77
|
+
return {
|
|
78
|
+
status: 'unavailable',
|
|
79
|
+
results: [],
|
|
80
|
+
searched: dedupe(allQueries),
|
|
81
|
+
budget_used: 0,
|
|
82
|
+
mode,
|
|
83
|
+
scores: 'relative',
|
|
84
|
+
note: err instanceof Error ? err.message : String(err),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
for (const reason of search.degraded)
|
|
88
|
+
degraded.add(reason);
|
|
89
|
+
notes.push(...search.notes);
|
|
90
|
+
let hits = search.hits;
|
|
91
|
+
if (input.graph ?? ctx.config.recall.graph) {
|
|
92
|
+
try {
|
|
93
|
+
const graphResult = await graphRecallCandidates(ctx, input.query, search.hits, chunkIds ?? undefined);
|
|
94
|
+
for (const reason of graphResult.degraded)
|
|
95
|
+
degraded.add(reason);
|
|
96
|
+
notes.push(...graphResult.notes);
|
|
97
|
+
if (graphResult.hits.length > 0)
|
|
98
|
+
hits = fuseHits([...search.arms, graphResult.hits]);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Graph retrieval is an optional candidate arm. Its failure weakens recall, but must not erase the
|
|
102
|
+
// lexical and vector evidence that is still readable or pretend their result proves absence.
|
|
103
|
+
degraded.add('no_graph_index');
|
|
104
|
+
notes.push('the structural graph candidate arm was unavailable');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
let reranked = false;
|
|
108
|
+
let qualification = null;
|
|
109
|
+
const shouldRerank = input.rerank ?? true;
|
|
110
|
+
if (shouldRerank && hits.length > 0 && ctx.models.reranker.available) {
|
|
111
|
+
const result = await rerankHits(ctx.store, ctx.models.reranker, input.query, hits, ctx.config.models.reranker.topK ?? 40, ctx.config.models.reranker.maxChars ?? 800, ctx.config.models.reranker.scoreOffset ?? 'auto', ctx.config.models.reranker.excludeIrrelevant ?? true);
|
|
112
|
+
hits = result.hits;
|
|
113
|
+
qualification = result.qualification;
|
|
114
|
+
reranked = result.degraded === null;
|
|
115
|
+
if (result.degraded)
|
|
116
|
+
degraded.add(result.degraded);
|
|
117
|
+
if (result.note)
|
|
118
|
+
notes.push(result.note);
|
|
119
|
+
}
|
|
120
|
+
else if (shouldRerank && ctx.models.reranker.requested && !ctx.models.reranker.available) {
|
|
121
|
+
// `requested` rather than `enabled`: the resolved `enabled` is already false
|
|
122
|
+
// whenever the role is unusable, so testing it here could never fire and a
|
|
123
|
+
// user who asked for a reranker would never be told they are not getting one.
|
|
124
|
+
degraded.add(ctx.models.reranker.degradedReason({}));
|
|
125
|
+
if (ctx.models.reranker.unavailableReason)
|
|
126
|
+
notes.push(ctx.models.reranker.unavailableReason);
|
|
127
|
+
}
|
|
128
|
+
// Fused ranks only mean something relative to each other, so put them on a
|
|
129
|
+
// readable scale when a cross-encoder did not supply an absolute one. `relevance`
|
|
130
|
+
// survives this untouched — it is the field a caller may threshold.
|
|
131
|
+
if (!reranked)
|
|
132
|
+
hits = normalizeScores(hits);
|
|
133
|
+
const scores = hits.some((hit) => hit.relevance !== undefined)
|
|
134
|
+
? 'absolute'
|
|
135
|
+
: 'relative';
|
|
136
|
+
const assembled = ctx.assembler.assemble({
|
|
137
|
+
hits,
|
|
138
|
+
mode,
|
|
139
|
+
depth,
|
|
140
|
+
// A lookup wants deep line windows around what matched; a question wants
|
|
141
|
+
// tight ones across more cards, because the answer is usually one line and
|
|
142
|
+
// the surrounding paragraph is budget spent on nothing.
|
|
143
|
+
lineWindow: mode === 'question'
|
|
144
|
+
? Math.max(2, Math.ceil(ctx.config.recall.lineWindow / 2))
|
|
145
|
+
: ctx.config.recall.lineWindow,
|
|
146
|
+
limit,
|
|
147
|
+
budget,
|
|
148
|
+
concepts: dedupe(allConcepts),
|
|
149
|
+
include: input.include ?? null,
|
|
150
|
+
});
|
|
151
|
+
const documentStates = assembled.results.flatMap((result) => result.type === 'document'
|
|
152
|
+
? result.availability
|
|
153
|
+
? [result.availability]
|
|
154
|
+
: []
|
|
155
|
+
: (result.documents ?? []).flatMap((document) => document.availability ? [document.availability] : []));
|
|
156
|
+
const hasMissingDocumentEvidence = documentStates.some((state) => state.status !== 'available');
|
|
157
|
+
if (hasMissingDocumentEvidence) {
|
|
158
|
+
degraded.add('document_source_missing');
|
|
159
|
+
}
|
|
160
|
+
for (const reason of indexDegradation(ctx.store))
|
|
161
|
+
degraded.add(reason);
|
|
162
|
+
const reasons = [...degraded];
|
|
163
|
+
const searched = dedupe(allQueries);
|
|
164
|
+
if (assembled.results.length === 0) {
|
|
165
|
+
// `empty` carries the expanded queries that found nothing. That list is the
|
|
166
|
+
// proof an agent needs to say "not recorded" honestly.
|
|
167
|
+
return {
|
|
168
|
+
status: reasons.length > 0 ? 'degraded' : 'empty',
|
|
169
|
+
...(reasons.length > 0 ? { degraded: reasons } : {}),
|
|
170
|
+
results: [],
|
|
171
|
+
searched,
|
|
172
|
+
budget_used: 0,
|
|
173
|
+
mode,
|
|
174
|
+
scores,
|
|
175
|
+
...(assembled.coverage ? { coverage: assembled.coverage } : {}),
|
|
176
|
+
...(qualification ? { qualification } : {}),
|
|
177
|
+
note: reasons.length > 0
|
|
178
|
+
? 'nothing matched, and the search ran without part of its model stack — this is not proof of absence'
|
|
179
|
+
: qualification?.applied && qualification.rejected > 0
|
|
180
|
+
? `the reranker disqualified all ${qualification.rejected} judged candidates as irrelevant`
|
|
181
|
+
: 'nothing matched any of the queries listed in `searched`',
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
const unavailableOnly = assembled.results.every((result) => result.type === 'document' && result.availability?.status === 'unavailable');
|
|
185
|
+
if (unavailableOnly) {
|
|
186
|
+
return {
|
|
187
|
+
status: 'unavailable',
|
|
188
|
+
results: assembled.results,
|
|
189
|
+
searched,
|
|
190
|
+
budget_used: assembled.budgetUsed,
|
|
191
|
+
mode,
|
|
192
|
+
scores,
|
|
193
|
+
...(assembled.coverage ? { coverage: assembled.coverage } : {}),
|
|
194
|
+
...(qualification ? { qualification } : {}),
|
|
195
|
+
note: 'matching document records remain, but neither their originals nor a readable copy are available',
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
status: reasons.length > 0 ? 'degraded' : 'ok',
|
|
200
|
+
...(reasons.length > 0 ? { degraded: reasons } : {}),
|
|
201
|
+
results: assembled.results,
|
|
202
|
+
searched,
|
|
203
|
+
budget_used: assembled.budgetUsed,
|
|
204
|
+
mode,
|
|
205
|
+
scores,
|
|
206
|
+
...(assembled.coverage ? { coverage: assembled.coverage } : {}),
|
|
207
|
+
...(qualification ? { qualification } : {}),
|
|
208
|
+
...(hasMissingDocumentEvidence
|
|
209
|
+
? {
|
|
210
|
+
note: 'some document evidence is retained from an indexed copy or rendition because its original is missing',
|
|
211
|
+
}
|
|
212
|
+
: {}),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/** Filters resolve to native chunk identities so both page and document evidence can participate. */
|
|
216
|
+
function resolveFilter(ctx, input) {
|
|
217
|
+
const filter = input.filter;
|
|
218
|
+
const hasFilter = Boolean(filter?.folder ||
|
|
219
|
+
filter?.type ||
|
|
220
|
+
filter?.tags?.length ||
|
|
221
|
+
filter?.role ||
|
|
222
|
+
filter?.source ||
|
|
223
|
+
filter?.ownership ||
|
|
224
|
+
input.since ||
|
|
225
|
+
input.until);
|
|
226
|
+
if (!hasFilter)
|
|
227
|
+
return null;
|
|
228
|
+
const clauses = [];
|
|
229
|
+
const params = [];
|
|
230
|
+
if (filter?.folder) {
|
|
231
|
+
clauses.push(`((c.document_id IS NULL AND (p.slug = ? OR p.slug LIKE ?))
|
|
232
|
+
OR (c.document_id IS NOT NULL AND (d.rel_path = ? OR d.rel_path LIKE ?)))`);
|
|
233
|
+
params.push(filter.folder, `${filter.folder}/%`, filter.folder, `${filter.folder}/%`);
|
|
234
|
+
}
|
|
235
|
+
if (filter?.type) {
|
|
236
|
+
clauses.push('p.type = ?');
|
|
237
|
+
params.push(filter.type);
|
|
238
|
+
}
|
|
239
|
+
if (filter?.role) {
|
|
240
|
+
// NULL never equals a role, so orphan documents are explicitly excluded.
|
|
241
|
+
clauses.push('p.role = ?');
|
|
242
|
+
params.push(filter.role);
|
|
243
|
+
}
|
|
244
|
+
if (filter?.source === 'page')
|
|
245
|
+
clauses.push('c.document_id IS NULL');
|
|
246
|
+
if (filter?.source === 'document')
|
|
247
|
+
clauses.push('c.document_id IS NOT NULL');
|
|
248
|
+
if (filter?.ownership === 'orphan') {
|
|
249
|
+
clauses.push('c.document_id IS NOT NULL AND d.page_id IS NULL');
|
|
250
|
+
}
|
|
251
|
+
if (filter?.ownership === 'owned')
|
|
252
|
+
clauses.push('c.page_id IS NOT NULL');
|
|
253
|
+
if (input.since) {
|
|
254
|
+
clauses.push(`(CASE WHEN c.document_id IS NULL THEN p.updated_at
|
|
255
|
+
ELSE datetime(CAST(f.mtime_ns AS INTEGER) / 1000000000, 'unixepoch') END) >= ?`);
|
|
256
|
+
params.push(input.since);
|
|
257
|
+
}
|
|
258
|
+
if (input.until) {
|
|
259
|
+
// A `YYYY-MM` bound means "through the end of that month".
|
|
260
|
+
clauses.push(`(CASE WHEN c.document_id IS NULL THEN p.updated_at
|
|
261
|
+
ELSE datetime(CAST(f.mtime_ns AS INTEGER) / 1000000000, 'unixepoch') END) <= ?`);
|
|
262
|
+
params.push(`${input.until}`);
|
|
263
|
+
}
|
|
264
|
+
const sql = `SELECT c.id, p.tags
|
|
265
|
+
FROM chunks c
|
|
266
|
+
LEFT JOIN pages p ON p.id = c.page_id
|
|
267
|
+
LEFT JOIN documents d ON d.id = c.document_id
|
|
268
|
+
LEFT JOIN files f ON f.rel_path = d.rel_path
|
|
269
|
+
${clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : ''}`;
|
|
270
|
+
const rows = ctx.store.db.prepare(sql).all(...params);
|
|
271
|
+
const wanted = filter?.tags?.map((tag) => tag.toLowerCase()) ?? [];
|
|
272
|
+
const ids = new Set();
|
|
273
|
+
for (const row of rows) {
|
|
274
|
+
if (wanted.length > 0) {
|
|
275
|
+
if (!row.tags)
|
|
276
|
+
continue;
|
|
277
|
+
const tags = JSON.parse(row.tags).map((tag) => tag.toLowerCase());
|
|
278
|
+
if (!wanted.every((tag) => tags.includes(tag)))
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
ids.add(row.id);
|
|
282
|
+
}
|
|
283
|
+
return ids;
|
|
284
|
+
}
|
|
285
|
+
function dedupe(values) {
|
|
286
|
+
const seen = new Set();
|
|
287
|
+
const out = [];
|
|
288
|
+
for (const value of values) {
|
|
289
|
+
const key = value.toLowerCase().trim();
|
|
290
|
+
if (key.length === 0 || seen.has(key))
|
|
291
|
+
continue;
|
|
292
|
+
seen.add(key);
|
|
293
|
+
out.push(value);
|
|
294
|
+
}
|
|
295
|
+
return out;
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/ops/recall.ts"],"names":[],"mappings":"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"}
|