@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,55 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { DegradedReason, RecallMode } from '@tenphi/akno-protocol';
|
|
3
|
+
import { type ModelClient } from '../models/client.ts';
|
|
4
|
+
/**
|
|
5
|
+
* Detection is cheap and deterministic — question words, a trailing `?`,
|
|
6
|
+
* imperative phrasing — and it is only a default. Passing `mode` explicitly
|
|
7
|
+
* always wins, and getting it wrong costs relevance, never correctness.
|
|
8
|
+
*/
|
|
9
|
+
export declare function inferMode(query: string): RecallMode;
|
|
10
|
+
export interface Expansion {
|
|
11
|
+
/** Every query issued, reported verbatim in `searched` so absence is provable. */
|
|
12
|
+
queries: string[];
|
|
13
|
+
/**
|
|
14
|
+
* Sentences embedded *in place of* the query for the vector arm. In question
|
|
15
|
+
* mode these are hypothetical answers; they are never shown to anyone and
|
|
16
|
+
* never stored.
|
|
17
|
+
*/
|
|
18
|
+
vectorTexts: string[];
|
|
19
|
+
/** Concepts `coverage` is computed against, in question mode. */
|
|
20
|
+
concepts: string[];
|
|
21
|
+
degraded: DegradedReason | null;
|
|
22
|
+
/** Human-readable detail, for logs and `doctor`. */
|
|
23
|
+
note: string | null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* **A question does not embed near its answer.** "when does the car
|
|
27
|
+
* insurance renew?" is lexically and semantically closer to other questions than
|
|
28
|
+
* to the line `Renews: 2026-11-04`. So Akno generates a hypothetical answer
|
|
29
|
+
* sentence and embeds *that* alongside the question. The synthetic sentence
|
|
30
|
+
* exists only to put the query vector in the right neighbourhood.
|
|
31
|
+
*/
|
|
32
|
+
export declare function expandQuery(query: string, mode: RecallMode, model: ModelClient, enabled: boolean, timeoutMs: number): Promise<Expansion>;
|
|
33
|
+
/** Lookup and explore: alternative phrasings and the concepts coverage is measured against. */
|
|
34
|
+
export declare const QUERIES_SCHEMA: z.ZodObject<{
|
|
35
|
+
queries: z.ZodArray<z.ZodString>;
|
|
36
|
+
concepts: z.ZodArray<z.ZodString>;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
/** Question mode additionally wants the hypothetical answers the vector arm is steered by. */
|
|
39
|
+
export declare const QUESTION_SCHEMA: z.ZodObject<{
|
|
40
|
+
queries: z.ZodArray<z.ZodString>;
|
|
41
|
+
concepts: z.ZodArray<z.ZodString>;
|
|
42
|
+
answers: z.ZodArray<z.ZodString>;
|
|
43
|
+
}, z.core.$strip>;
|
|
44
|
+
/**
|
|
45
|
+
* Fallback concept extraction when there is no expansion model: content words, with a
|
|
46
|
+
* simple bigram pass so "car insurance" survives as one concept rather than two.
|
|
47
|
+
* Crude, but the coverage guarantee should not depend on a model being present.
|
|
48
|
+
*/
|
|
49
|
+
export declare function extractConcepts(query: string): string[];
|
|
50
|
+
/**
|
|
51
|
+
* Multi-part questions are split and searched separately, then merged.
|
|
52
|
+
* A conjunction between two clauses that each carry a content word is the signal.
|
|
53
|
+
*/
|
|
54
|
+
export declare function splitMultiPart(query: string): string[];
|
|
55
|
+
//# sourceMappingURL=expand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../src/recall/expand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAiDvE;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAmBnD;AAMD,MAAM,WAAW,SAAS;IACxB,kFAAkF;IAClF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;;OAIG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,oDAAoD;IACpD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC,CAwDpB;AAiBD,+FAA+F;AAC/F,eAAO,MAAM,cAAc;;;iBAGzB,CAAC;AAEH,8FAA8F;AAC9F,eAAO,MAAM,eAAe;;;;iBAA0D,CAAC;AA8FvF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBvD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAStD"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { parseJsonLoose } from "../models/client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Looking something up and answering a question are not the same retrieval
|
|
5
|
+
* problem, and they want different expansion. But they must not be different
|
|
6
|
+
* **ops** — every extra op is another chance for an agent to pick the wrong one,
|
|
7
|
+
* and an agent is not reliably able to tell which situation it is in.
|
|
8
|
+
*/
|
|
9
|
+
const QUESTION_WORDS = [
|
|
10
|
+
'who',
|
|
11
|
+
'what',
|
|
12
|
+
'when',
|
|
13
|
+
'where',
|
|
14
|
+
'why',
|
|
15
|
+
'how',
|
|
16
|
+
'which',
|
|
17
|
+
'whose',
|
|
18
|
+
'whom',
|
|
19
|
+
'is',
|
|
20
|
+
'are',
|
|
21
|
+
'was',
|
|
22
|
+
'were',
|
|
23
|
+
'do',
|
|
24
|
+
'does',
|
|
25
|
+
'did',
|
|
26
|
+
'can',
|
|
27
|
+
'could',
|
|
28
|
+
'should',
|
|
29
|
+
'would',
|
|
30
|
+
'will',
|
|
31
|
+
'have',
|
|
32
|
+
'has',
|
|
33
|
+
'am',
|
|
34
|
+
];
|
|
35
|
+
const EXPLORE_MARKERS = [
|
|
36
|
+
'anything about',
|
|
37
|
+
'everything about',
|
|
38
|
+
'all about',
|
|
39
|
+
'what do we know',
|
|
40
|
+
'what do you know',
|
|
41
|
+
'tell me about',
|
|
42
|
+
'overview of',
|
|
43
|
+
'summarize',
|
|
44
|
+
'summarise',
|
|
45
|
+
'remind me about',
|
|
46
|
+
];
|
|
47
|
+
/**
|
|
48
|
+
* Detection is cheap and deterministic — question words, a trailing `?`,
|
|
49
|
+
* imperative phrasing — and it is only a default. Passing `mode` explicitly
|
|
50
|
+
* always wins, and getting it wrong costs relevance, never correctness.
|
|
51
|
+
*/
|
|
52
|
+
export function inferMode(query) {
|
|
53
|
+
const normalized = query.trim().toLowerCase();
|
|
54
|
+
if (normalized.length === 0)
|
|
55
|
+
return 'lookup';
|
|
56
|
+
if (EXPLORE_MARKERS.some((marker) => normalized.startsWith(marker) || normalized.includes(marker))) {
|
|
57
|
+
return 'explore';
|
|
58
|
+
}
|
|
59
|
+
const words = normalized.replace(/[?!.]+$/, '').split(/\s+/);
|
|
60
|
+
const first = words[0] ?? '';
|
|
61
|
+
const endsWithQuestionMark = normalized.endsWith('?');
|
|
62
|
+
if (endsWithQuestionMark)
|
|
63
|
+
return inferBreadth(normalized);
|
|
64
|
+
if (QUESTION_WORDS.includes(first) && words.length >= 3)
|
|
65
|
+
return 'question';
|
|
66
|
+
// "do we have a lease" reads as a question without a question mark.
|
|
67
|
+
if (/^(do|does|did|is|are|was|were|can|should|will)\s+(i|we|you|they|he|she|it|the)\b/.test(normalized)) {
|
|
68
|
+
return 'question';
|
|
69
|
+
}
|
|
70
|
+
return 'lookup';
|
|
71
|
+
}
|
|
72
|
+
function inferBreadth(normalized) {
|
|
73
|
+
return EXPLORE_MARKERS.some((marker) => normalized.includes(marker)) ? 'explore' : 'question';
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* **A question does not embed near its answer.** "when does the car
|
|
77
|
+
* insurance renew?" is lexically and semantically closer to other questions than
|
|
78
|
+
* to the line `Renews: 2026-11-04`. So Akno generates a hypothetical answer
|
|
79
|
+
* sentence and embeds *that* alongside the question. The synthetic sentence
|
|
80
|
+
* exists only to put the query vector in the right neighbourhood.
|
|
81
|
+
*/
|
|
82
|
+
export async function expandQuery(query, mode, model, enabled, timeoutMs) {
|
|
83
|
+
const base = {
|
|
84
|
+
queries: [query],
|
|
85
|
+
vectorTexts: [query],
|
|
86
|
+
concepts: extractConcepts(query),
|
|
87
|
+
degraded: null,
|
|
88
|
+
note: null,
|
|
89
|
+
};
|
|
90
|
+
if (!enabled)
|
|
91
|
+
return base;
|
|
92
|
+
if (!model.available) {
|
|
93
|
+
return { ...base, degraded: model.degradedReason({}), note: model.unavailableReason };
|
|
94
|
+
}
|
|
95
|
+
const instruction = mode === 'question' ? QUESTION_PROMPT : mode === 'explore' ? EXPLORE_PROMPT : LOOKUP_PROMPT;
|
|
96
|
+
// Per mode, because the modes ask for different fields. Handing the question schema to a
|
|
97
|
+
// lookup would make `answers` mandatory for a query that has no answer to hypothesize.
|
|
98
|
+
const schema = mode === 'question' ? QUESTION_SCHEMA : QUERIES_SCHEMA;
|
|
99
|
+
const result = await model.chat([
|
|
100
|
+
{ role: 'system', content: instruction },
|
|
101
|
+
{ role: 'user', content: query },
|
|
102
|
+
],
|
|
103
|
+
// Its own deadline, not the role's ceiling: a busy or cold endpoint must cost a
|
|
104
|
+
// weaker search, never a hung one.
|
|
105
|
+
{ schema, maxTokens: 400, timeoutMs });
|
|
106
|
+
if (!result.ok || !result.value) {
|
|
107
|
+
return { ...base, degraded: model.degradedReason(result), note: result.error ?? null };
|
|
108
|
+
}
|
|
109
|
+
const parsed = parseJsonLoose(result.value);
|
|
110
|
+
if (!parsed) {
|
|
111
|
+
return { ...base, degraded: 'expansion_failed', note: 'query expansion returned unparseable JSON' };
|
|
112
|
+
}
|
|
113
|
+
const queries = dedupe([query, ...stringList(parsed.queries, 6)]);
|
|
114
|
+
const answers = stringList(parsed.answers, 4);
|
|
115
|
+
const concepts = stringList(parsed.concepts, 6);
|
|
116
|
+
return {
|
|
117
|
+
queries,
|
|
118
|
+
// The hypothetical answers go to the vector arm; the query text stays too, so
|
|
119
|
+
// a bad hypothetical cannot make recall worse than no expansion at all.
|
|
120
|
+
vectorTexts: dedupe([query, ...answers]),
|
|
121
|
+
concepts: concepts.length > 0 ? concepts.map((c) => c.toLowerCase()) : base.concepts,
|
|
122
|
+
degraded: null,
|
|
123
|
+
note: null,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const LOOKUP_PROMPT = `Expand a keyword search over a personal knowledge base. Reply with JSON only:
|
|
127
|
+
{ "queries": ["2-4 alternative phrasings: synonyms, singular/plural, common aliases and abbreviations"],
|
|
128
|
+
"concepts": ["the 1-3 distinct things being asked about, lowercase"] }
|
|
129
|
+
Keep every query short and keyword-like. Do not turn them into sentences.`;
|
|
130
|
+
const QUESTION_PROMPT = `A user asked a question of their personal knowledge base. Reply with JSON only:
|
|
131
|
+
{ "queries": ["2-4 keyword searches that would find the answer"],
|
|
132
|
+
"answers": ["1-3 short declarative sentences that a page containing the answer would plausibly contain. Invent concrete placeholder values — they are only used to steer a vector search and are never shown to anyone."],
|
|
133
|
+
"concepts": ["each distinct thing the question asks about, lowercase. A two-part question has two concepts."] }
|
|
134
|
+
For "when does the car insurance renew?" a good answer sentence is "The car insurance policy renews on 4 November 2026."`;
|
|
135
|
+
const EXPLORE_PROMPT = `A user wants a broad overview from their personal knowledge base. Reply with JSON only:
|
|
136
|
+
{ "queries": ["3-5 varied searches covering different facets of the subject"],
|
|
137
|
+
"concepts": ["the subject, lowercase"] }`;
|
|
138
|
+
/** Lookup and explore: alternative phrasings and the concepts coverage is measured against. */
|
|
139
|
+
export const QUERIES_SCHEMA = z.object({
|
|
140
|
+
queries: z.array(z.string()),
|
|
141
|
+
concepts: z.array(z.string()),
|
|
142
|
+
});
|
|
143
|
+
/** Question mode additionally wants the hypothetical answers the vector arm is steered by. */
|
|
144
|
+
export const QUESTION_SCHEMA = QUERIES_SCHEMA.extend({ answers: z.array(z.string()) });
|
|
145
|
+
function stringList(value, max) {
|
|
146
|
+
if (!Array.isArray(value))
|
|
147
|
+
return [];
|
|
148
|
+
const out = [];
|
|
149
|
+
for (const entry of value) {
|
|
150
|
+
if (typeof entry !== 'string')
|
|
151
|
+
continue;
|
|
152
|
+
const trimmed = entry.trim();
|
|
153
|
+
if (trimmed.length > 1 && trimmed.length <= 300)
|
|
154
|
+
out.push(trimmed);
|
|
155
|
+
if (out.length >= max)
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
function dedupe(values) {
|
|
161
|
+
const seen = new Set();
|
|
162
|
+
const out = [];
|
|
163
|
+
for (const value of values) {
|
|
164
|
+
const key = value.toLowerCase().trim();
|
|
165
|
+
if (key.length === 0 || seen.has(key))
|
|
166
|
+
continue;
|
|
167
|
+
seen.add(key);
|
|
168
|
+
out.push(value);
|
|
169
|
+
}
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
172
|
+
const STOPWORDS = new Set([
|
|
173
|
+
'a',
|
|
174
|
+
'an',
|
|
175
|
+
'and',
|
|
176
|
+
'are',
|
|
177
|
+
'as',
|
|
178
|
+
'at',
|
|
179
|
+
'be',
|
|
180
|
+
'been',
|
|
181
|
+
'but',
|
|
182
|
+
'by',
|
|
183
|
+
'can',
|
|
184
|
+
'did',
|
|
185
|
+
'do',
|
|
186
|
+
'does',
|
|
187
|
+
'for',
|
|
188
|
+
'from',
|
|
189
|
+
'had',
|
|
190
|
+
'has',
|
|
191
|
+
'have',
|
|
192
|
+
'how',
|
|
193
|
+
'i',
|
|
194
|
+
'if',
|
|
195
|
+
'in',
|
|
196
|
+
'into',
|
|
197
|
+
'is',
|
|
198
|
+
'it',
|
|
199
|
+
'its',
|
|
200
|
+
'me',
|
|
201
|
+
'my',
|
|
202
|
+
'of',
|
|
203
|
+
'on',
|
|
204
|
+
'or',
|
|
205
|
+
'our',
|
|
206
|
+
'should',
|
|
207
|
+
'so',
|
|
208
|
+
'that',
|
|
209
|
+
'the',
|
|
210
|
+
'their',
|
|
211
|
+
'them',
|
|
212
|
+
'then',
|
|
213
|
+
'there',
|
|
214
|
+
'these',
|
|
215
|
+
'they',
|
|
216
|
+
'this',
|
|
217
|
+
'to',
|
|
218
|
+
'under',
|
|
219
|
+
'was',
|
|
220
|
+
'we',
|
|
221
|
+
'were',
|
|
222
|
+
'what',
|
|
223
|
+
'when',
|
|
224
|
+
'where',
|
|
225
|
+
'which',
|
|
226
|
+
'who',
|
|
227
|
+
'why',
|
|
228
|
+
'will',
|
|
229
|
+
'with',
|
|
230
|
+
'would',
|
|
231
|
+
'you',
|
|
232
|
+
'your',
|
|
233
|
+
'about',
|
|
234
|
+
'any',
|
|
235
|
+
'much',
|
|
236
|
+
'many',
|
|
237
|
+
'does',
|
|
238
|
+
]);
|
|
239
|
+
/**
|
|
240
|
+
* Fallback concept extraction when there is no expansion model: content words, with a
|
|
241
|
+
* simple bigram pass so "car insurance" survives as one concept rather than two.
|
|
242
|
+
* Crude, but the coverage guarantee should not depend on a model being present.
|
|
243
|
+
*/
|
|
244
|
+
export function extractConcepts(query) {
|
|
245
|
+
const words = query
|
|
246
|
+
.toLowerCase()
|
|
247
|
+
// In these question shapes the adjective asks for the answer's dimension; it is not a term
|
|
248
|
+
// the answer must repeat. Treating "how long" as content marked an exact two-year warranty
|
|
249
|
+
// answer partial because its evidence quite correctly never contained the word "long".
|
|
250
|
+
.replace(/\bhow\s+(?:long|old|often|frequently|far|soon)\b/gu, ' ')
|
|
251
|
+
.replace(/[^\p{L}\p{N}\s-]/gu, ' ')
|
|
252
|
+
.split(/\s+/)
|
|
253
|
+
.filter((word) => word.length > 2 && !STOPWORDS.has(word));
|
|
254
|
+
if (words.length === 0)
|
|
255
|
+
return [];
|
|
256
|
+
if (words.length <= 2)
|
|
257
|
+
return [words.join(' ')];
|
|
258
|
+
const concepts = [];
|
|
259
|
+
for (let i = 0; i < words.length - 1; i += 2) {
|
|
260
|
+
concepts.push(words.slice(i, i + 2).join(' '));
|
|
261
|
+
}
|
|
262
|
+
if (words.length % 2 === 1)
|
|
263
|
+
concepts.push(words.at(-1));
|
|
264
|
+
return concepts.slice(0, 5);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Multi-part questions are split and searched separately, then merged.
|
|
268
|
+
* A conjunction between two clauses that each carry a content word is the signal.
|
|
269
|
+
*/
|
|
270
|
+
export function splitMultiPart(query) {
|
|
271
|
+
const parts = query
|
|
272
|
+
.split(/\s+(?:and|&)\s+|;\s*/i)
|
|
273
|
+
.map((part) => part.trim().replace(/^(?:also|then)\s+/i, ''))
|
|
274
|
+
.filter((part) => part.length > 0);
|
|
275
|
+
if (parts.length < 2)
|
|
276
|
+
return [query];
|
|
277
|
+
// A split that leaves a fragment with no content word is not a real split.
|
|
278
|
+
if (parts.some((part) => extractConcepts(part).length === 0))
|
|
279
|
+
return [query];
|
|
280
|
+
return parts.slice(0, 3);
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=expand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.js","sourceRoot":"","sources":["../../src/recall/expand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DegradedReason } from '@tenphi/akno-protocol';
|
|
2
|
+
import type { AknoContext } from '../context.ts';
|
|
3
|
+
import type { ChunkHit } from './search.ts';
|
|
4
|
+
export interface GraphRecallResult {
|
|
5
|
+
hits: ChunkHit[];
|
|
6
|
+
degraded: DegradedReason[];
|
|
7
|
+
notes: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Produce a third retrieval arm from bounded graph paths.
|
|
11
|
+
*
|
|
12
|
+
* Query names are exact graph seeds. A few strong lexical page hits may also seed traversal, which is what
|
|
13
|
+
* lets a descriptive query reach a related page whose own words never overlap the query. Graph confidence
|
|
14
|
+
* orders this arm only; recall later combines it with lexical and vector results by reciprocal rank.
|
|
15
|
+
*/
|
|
16
|
+
export declare function graphRecallCandidates(ctx: AknoContext, query: string, firstStageHits: ChunkHit[], chunkIds?: Set<number>): Promise<GraphRecallResult>;
|
|
17
|
+
//# sourceMappingURL=graph-arm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-arm.d.ts","sourceRoot":"","sources":["../../src/recall/graph-arm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAS5C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAQD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,QAAQ,EAAE,EAC1B,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,OAAO,CAAC,iBAAiB,CAAC,CA2C5B"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { graph } from "../ops/graph.js";
|
|
2
|
+
const MAX_PAGE_SEEDS = 3;
|
|
3
|
+
// Explore beyond the smaller final candidate window so a moderately connected seed does not report
|
|
4
|
+
// truncation merely because recall still returns only the strongest thirty graph candidates.
|
|
5
|
+
const MAX_GRAPH_PATHS_PER_SEED = 100;
|
|
6
|
+
const MAX_GRAPH_CANDIDATES = 30;
|
|
7
|
+
const MAX_PATHS_PER_CANDIDATE = 3;
|
|
8
|
+
/**
|
|
9
|
+
* Produce a third retrieval arm from bounded graph paths.
|
|
10
|
+
*
|
|
11
|
+
* Query names are exact graph seeds. A few strong lexical page hits may also seed traversal, which is what
|
|
12
|
+
* lets a descriptive query reach a related page whose own words never overlap the query. Graph confidence
|
|
13
|
+
* orders this arm only; recall later combines it with lexical and vector results by reciprocal rank.
|
|
14
|
+
*/
|
|
15
|
+
export async function graphRecallCandidates(ctx, query, firstStageHits, chunkIds) {
|
|
16
|
+
const degraded = new Set();
|
|
17
|
+
const notes = [];
|
|
18
|
+
const outputs = [];
|
|
19
|
+
const queryOutput = await graph(ctx, {
|
|
20
|
+
query,
|
|
21
|
+
max_hops: 2,
|
|
22
|
+
limit: MAX_GRAPH_PATHS_PER_SEED,
|
|
23
|
+
});
|
|
24
|
+
if (queryOutput.status === 'unavailable') {
|
|
25
|
+
return {
|
|
26
|
+
hits: [],
|
|
27
|
+
degraded: ['no_graph_index'],
|
|
28
|
+
notes: ['the structural graph candidate arm was unavailable'],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
outputs.push(queryOutput);
|
|
32
|
+
addDegradation(degraded, queryOutput);
|
|
33
|
+
const pageSeeds = queryOutput.degraded?.includes('entity_resolution_failed')
|
|
34
|
+
? []
|
|
35
|
+
: qualifiedPageSeeds(ctx, query, firstStageHits);
|
|
36
|
+
for (const slug of pageSeeds) {
|
|
37
|
+
const output = await graph(ctx, {
|
|
38
|
+
slug,
|
|
39
|
+
max_hops: 2,
|
|
40
|
+
limit: MAX_GRAPH_PATHS_PER_SEED,
|
|
41
|
+
});
|
|
42
|
+
if (output.status === 'unavailable') {
|
|
43
|
+
degraded.add('no_graph_index');
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
outputs.push(output);
|
|
47
|
+
addDegradation(degraded, output);
|
|
48
|
+
}
|
|
49
|
+
if (degraded.size > 0)
|
|
50
|
+
notes.push('the structural graph candidate arm was incomplete');
|
|
51
|
+
return {
|
|
52
|
+
hits: candidatesFromOutputs(ctx, outputs, chunkIds),
|
|
53
|
+
degraded: [...degraded],
|
|
54
|
+
notes,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function addDegradation(degraded, output) {
|
|
58
|
+
for (const reason of output.degraded ?? [])
|
|
59
|
+
degraded.add(reason);
|
|
60
|
+
}
|
|
61
|
+
/** Page-hit seeds are deliberately conservative: lexical evidence plus two meaningful query terms. */
|
|
62
|
+
function qualifiedPageSeeds(ctx, query, hits) {
|
|
63
|
+
const terms = contentTerms(query);
|
|
64
|
+
if (terms.length === 0)
|
|
65
|
+
return [];
|
|
66
|
+
const wantedMatches = Math.min(2, terms.length);
|
|
67
|
+
const page = ctx.store.db.prepare('SELECT slug, title FROM pages WHERE id = ?');
|
|
68
|
+
const chunk = ctx.store.db.prepare('SELECT text, heading_path FROM chunks WHERE id = ?');
|
|
69
|
+
const seen = new Set();
|
|
70
|
+
const seeds = [];
|
|
71
|
+
for (const hit of hits) {
|
|
72
|
+
if (seeds.length >= MAX_PAGE_SEEDS)
|
|
73
|
+
break;
|
|
74
|
+
if (!hit.pageId ||
|
|
75
|
+
!hit.from.includes('lexical') ||
|
|
76
|
+
(hit.relevance !== undefined && hit.relevance < 0.5)) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const pageRow = page.get(hit.pageId);
|
|
80
|
+
const chunkRow = chunk.get(hit.chunkId);
|
|
81
|
+
if (!pageRow || !chunkRow || seen.has(pageRow.slug))
|
|
82
|
+
continue;
|
|
83
|
+
const haystack = new Set(normalize(`${pageRow.title} ${chunkRow.heading_path} ${chunkRow.text}`).split(' '));
|
|
84
|
+
if (terms.filter((term) => haystack.has(term)).length < wantedMatches)
|
|
85
|
+
continue;
|
|
86
|
+
seen.add(pageRow.slug);
|
|
87
|
+
seeds.push(pageRow.slug);
|
|
88
|
+
}
|
|
89
|
+
return seeds;
|
|
90
|
+
}
|
|
91
|
+
function contentTerms(query) {
|
|
92
|
+
const stop = new Set([
|
|
93
|
+
'about',
|
|
94
|
+
'after',
|
|
95
|
+
'before',
|
|
96
|
+
'does',
|
|
97
|
+
'eventually',
|
|
98
|
+
'from',
|
|
99
|
+
'have',
|
|
100
|
+
'into',
|
|
101
|
+
'lead',
|
|
102
|
+
'related',
|
|
103
|
+
'that',
|
|
104
|
+
'their',
|
|
105
|
+
'there',
|
|
106
|
+
'these',
|
|
107
|
+
'this',
|
|
108
|
+
'through',
|
|
109
|
+
'what',
|
|
110
|
+
'when',
|
|
111
|
+
'where',
|
|
112
|
+
'which',
|
|
113
|
+
'with',
|
|
114
|
+
]);
|
|
115
|
+
return [
|
|
116
|
+
...new Set(normalize(query)
|
|
117
|
+
.split(' ')
|
|
118
|
+
.filter((term) => term.length > 2 && !stop.has(term))),
|
|
119
|
+
];
|
|
120
|
+
}
|
|
121
|
+
function normalize(value) {
|
|
122
|
+
return value
|
|
123
|
+
.normalize('NFKD')
|
|
124
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
125
|
+
.toLowerCase()
|
|
126
|
+
.replace(/[^\p{L}\p{N}]+/gu, ' ')
|
|
127
|
+
.trim();
|
|
128
|
+
}
|
|
129
|
+
function candidatesFromOutputs(ctx, outputs, chunkIds) {
|
|
130
|
+
const candidates = new Map();
|
|
131
|
+
for (const output of outputs) {
|
|
132
|
+
const nodes = new Map(output.nodes.map((node) => [node.id, node]));
|
|
133
|
+
const edges = new Map(output.edges.map((edge) => [edge.id, edge]));
|
|
134
|
+
for (const path of output.paths) {
|
|
135
|
+
const seed = nodes.get(path.nodes[0]);
|
|
136
|
+
const target = nodes.get(path.nodes.at(-1));
|
|
137
|
+
if (!seed || !target)
|
|
138
|
+
continue;
|
|
139
|
+
const pathNodes = path.nodes.flatMap((nodeId) => {
|
|
140
|
+
const node = nodes.get(nodeId);
|
|
141
|
+
return node ? [node] : [];
|
|
142
|
+
});
|
|
143
|
+
if (pathNodes.length !== path.nodes.length)
|
|
144
|
+
continue;
|
|
145
|
+
const relations = path.edges.flatMap((edgeId) => {
|
|
146
|
+
const edge = edges.get(edgeId);
|
|
147
|
+
return edge ? [edge.relation] : [];
|
|
148
|
+
});
|
|
149
|
+
if (relations.length !== path.hops)
|
|
150
|
+
continue;
|
|
151
|
+
const explanation = {
|
|
152
|
+
seed,
|
|
153
|
+
target,
|
|
154
|
+
nodes: pathNodes,
|
|
155
|
+
relations,
|
|
156
|
+
hops: path.hops,
|
|
157
|
+
confidence: path.confidence,
|
|
158
|
+
evidence: path.evidence,
|
|
159
|
+
};
|
|
160
|
+
const row = candidateForTarget(ctx, target, path.evidence, chunkIds);
|
|
161
|
+
if (!row)
|
|
162
|
+
continue;
|
|
163
|
+
const identity = row.pageId ? `page:${row.pageId}` : `document:${row.documentId}`;
|
|
164
|
+
const existing = candidates.get(identity);
|
|
165
|
+
if (existing) {
|
|
166
|
+
existing.score = Math.max(existing.score, path.confidence);
|
|
167
|
+
existing.graphPaths = mergePaths(existing.graphPaths ?? [], explanation);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
candidates.set(identity, {
|
|
171
|
+
chunkId: row.chunkId,
|
|
172
|
+
pageId: row.pageId,
|
|
173
|
+
documentId: row.documentId,
|
|
174
|
+
score: path.confidence,
|
|
175
|
+
from: ['graph'],
|
|
176
|
+
graphPaths: [explanation],
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return [...candidates.values()]
|
|
182
|
+
.sort((left, right) => right.score - left.score)
|
|
183
|
+
.slice(0, MAX_GRAPH_CANDIDATES);
|
|
184
|
+
}
|
|
185
|
+
function candidateForTarget(ctx, target, evidence, chunkIds) {
|
|
186
|
+
if (target.kind === 'document' && target.document) {
|
|
187
|
+
return documentChunk(ctx, target.document, chunkIds);
|
|
188
|
+
}
|
|
189
|
+
const slug = target.slug;
|
|
190
|
+
if (!slug)
|
|
191
|
+
return null;
|
|
192
|
+
const line = target.line_start ?? evidence.find((locator) => locator.slug === slug && locator.line_start)?.line_start;
|
|
193
|
+
return pageChunk(ctx, slug, line, chunkIds);
|
|
194
|
+
}
|
|
195
|
+
function pageChunk(ctx, slug, line, allowed) {
|
|
196
|
+
const rows = ctx.store.db
|
|
197
|
+
.prepare(`SELECT c.id AS chunk_id, c.page_id, c.document_id
|
|
198
|
+
FROM chunks c
|
|
199
|
+
JOIN pages p ON p.id = c.page_id
|
|
200
|
+
WHERE p.slug = ? AND c.document_id IS NULL
|
|
201
|
+
ORDER BY CASE WHEN ? BETWEEN c.line_start AND c.line_end THEN 0 ELSE 1 END, c.ord`)
|
|
202
|
+
.all(slug, line ?? -1);
|
|
203
|
+
const row = rows.find((candidate) => !allowed || allowed.has(candidate.chunk_id));
|
|
204
|
+
return row ? { chunkId: row.chunk_id, pageId: row.page_id, documentId: row.document_id } : null;
|
|
205
|
+
}
|
|
206
|
+
function documentChunk(ctx, documentId, allowed) {
|
|
207
|
+
const rows = ctx.store.db
|
|
208
|
+
.prepare(`SELECT id AS chunk_id, page_id, document_id
|
|
209
|
+
FROM chunks
|
|
210
|
+
WHERE document_id = ?
|
|
211
|
+
ORDER BY ord`)
|
|
212
|
+
.all(documentId);
|
|
213
|
+
const row = rows.find((candidate) => !allowed || allowed.has(candidate.chunk_id));
|
|
214
|
+
return row ? { chunkId: row.chunk_id, pageId: row.page_id, documentId: row.document_id } : null;
|
|
215
|
+
}
|
|
216
|
+
function mergePaths(paths, addition) {
|
|
217
|
+
const key = graphPathKey(addition);
|
|
218
|
+
if (paths.some((path) => graphPathKey(path) === key))
|
|
219
|
+
return paths;
|
|
220
|
+
return [...paths, addition].slice(0, MAX_PATHS_PER_CANDIDATE);
|
|
221
|
+
}
|
|
222
|
+
function graphPathKey(path) {
|
|
223
|
+
return `${path.seed.id}\0${path.target.id}\0${path.relations.join('\0')}\0${path.evidence
|
|
224
|
+
.map((locator) => [locator.kind, locator.slug, locator.document, locator.event, locator.fact, locator.line_start].join('\0'))
|
|
225
|
+
.join('\0')}`;
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=graph-arm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-arm.js","sourceRoot":"","sources":["../../src/recall/graph-arm.ts"],"names":[],"mappings":"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"}
|