@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,713 @@
|
|
|
1
|
+
import { ContextInput, } from '@tenphi/akno-protocol';
|
|
2
|
+
import { estimateTokens } from "../recall/assemble.js";
|
|
3
|
+
import { recall } from "./recall.js";
|
|
4
|
+
import { read } from "./read.js";
|
|
5
|
+
import { timeline } from "./timeline.js";
|
|
6
|
+
import { list } from "./list.js";
|
|
7
|
+
/**
|
|
8
|
+
* **One budget, one assembly.** `context` composes the whole pre-turn bundle
|
|
9
|
+
* — pinned pages, recent timeline, structure tree, and this turn's recall —
|
|
10
|
+
* against a single budget. Separate injections with separate budgets overrun
|
|
11
|
+
* together.
|
|
12
|
+
*
|
|
13
|
+
* Why this matters: with the bundle assembled, a turn like "when does
|
|
14
|
+
* the car insurance renew?" costs **zero tool calls**, and the assistant cannot
|
|
15
|
+
* invent the date because every line it was handed says which file and which line
|
|
16
|
+
* it came from.
|
|
17
|
+
*/
|
|
18
|
+
export async function context(ctx, rawInput) {
|
|
19
|
+
const input = ContextInput.parse(rawInput);
|
|
20
|
+
if (input.profile === 'auto_recall') {
|
|
21
|
+
return autoRecallContext(ctx, { ...input, profile: 'auto_recall', query: input.query });
|
|
22
|
+
}
|
|
23
|
+
const budget = input.budget ?? 20_000;
|
|
24
|
+
let remaining = budget;
|
|
25
|
+
const degraded = new Set();
|
|
26
|
+
let droppedPinned = 0;
|
|
27
|
+
const droppedResults = 0;
|
|
28
|
+
let droppedTimeline = 0;
|
|
29
|
+
// ── Pinned pages first ───────────────────────────────────────────────────
|
|
30
|
+
// They were pinned precisely so they do not have to compete for room.
|
|
31
|
+
const pinned = [];
|
|
32
|
+
for (const slug of input.pinned ?? []) {
|
|
33
|
+
try {
|
|
34
|
+
const result = await read(ctx, { slug });
|
|
35
|
+
if (!result.page)
|
|
36
|
+
continue;
|
|
37
|
+
const card = cardFromPage(result.page);
|
|
38
|
+
const cost = estimateTokens(card);
|
|
39
|
+
if (cost > remaining) {
|
|
40
|
+
droppedPinned++;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
pinned.push(card);
|
|
44
|
+
remaining -= cost;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// A pinned page that no longer exists should not fail the whole bundle;
|
|
48
|
+
// the host's pin list is allowed to go stale.
|
|
49
|
+
droppedPinned++;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ── Structure outline ────────────────────────────────────────────────────
|
|
53
|
+
let structure;
|
|
54
|
+
if (input.structure !== false) {
|
|
55
|
+
const tree = await list(ctx, { kind: 'tree', depth: 2 });
|
|
56
|
+
if (tree.tree) {
|
|
57
|
+
const cost = Math.ceil(tree.tree.length / 4);
|
|
58
|
+
if (cost <= remaining * 0.15) {
|
|
59
|
+
structure = tree.tree;
|
|
60
|
+
remaining -= cost;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// ── Recent timeline ──────────────────────────────────────────────────────
|
|
65
|
+
const recentTimeline = [];
|
|
66
|
+
const days = input.timeline_days ?? 90;
|
|
67
|
+
if (days > 0) {
|
|
68
|
+
const since = new Date(Date.now() - days * 86_400_000).toISOString().slice(0, 10);
|
|
69
|
+
const ledger = await timeline(ctx, { since, limit: 60 });
|
|
70
|
+
// The ledger is capped at a fraction of the budget: recent history is
|
|
71
|
+
// context, not the answer, and a long ledger must not crowd out the cards.
|
|
72
|
+
let ledgerBudget = Math.floor(remaining * 0.25);
|
|
73
|
+
for (const [index, entry] of ledger.results.entries()) {
|
|
74
|
+
const content = entry.type === 'event' ? entry.summary : `${entry.path} ${entry.quote ?? ''} ${entry.date_basis}`;
|
|
75
|
+
const cost = Math.ceil((content.length + entry.date.length + 20) / 4);
|
|
76
|
+
if (cost > ledgerBudget) {
|
|
77
|
+
droppedTimeline = ledger.results.length - index;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
recentTimeline.push(entry);
|
|
81
|
+
ledgerBudget -= cost;
|
|
82
|
+
remaining -= cost;
|
|
83
|
+
}
|
|
84
|
+
for (const reason of ledger.degraded ?? [])
|
|
85
|
+
degraded.add(reason);
|
|
86
|
+
}
|
|
87
|
+
// ── This turn's recall ───────────────────────────────────────────────────
|
|
88
|
+
let results = [];
|
|
89
|
+
let searched = [];
|
|
90
|
+
let coverage;
|
|
91
|
+
let qualification;
|
|
92
|
+
if (input.query) {
|
|
93
|
+
const pinnedSlugs = new Set(pinned.map((card) => card.slug));
|
|
94
|
+
const result = await recall(ctx, {
|
|
95
|
+
query: input.query,
|
|
96
|
+
budget: remaining,
|
|
97
|
+
...(input.mode ? { mode: input.mode } : {}),
|
|
98
|
+
...(input.include ? { include: input.include } : {}),
|
|
99
|
+
...(input.filter ? { filter: input.filter } : {}),
|
|
100
|
+
});
|
|
101
|
+
searched = result.searched;
|
|
102
|
+
if (result.coverage)
|
|
103
|
+
coverage = result.coverage;
|
|
104
|
+
if (result.qualification)
|
|
105
|
+
qualification = result.qualification;
|
|
106
|
+
for (const reason of result.degraded ?? [])
|
|
107
|
+
degraded.add(reason);
|
|
108
|
+
// A pinned page already in the bundle must not be returned twice.
|
|
109
|
+
results = result.results.filter((entry) => entry.type === 'document' || !pinnedSlugs.has(entry.slug));
|
|
110
|
+
remaining -= result.budget_used;
|
|
111
|
+
}
|
|
112
|
+
const budgetUsed = budget - Math.max(0, remaining);
|
|
113
|
+
const anyDropped = droppedPinned > 0 || droppedResults > 0 || droppedTimeline > 0;
|
|
114
|
+
const unavailableTimelineOnly = results.length === 0 &&
|
|
115
|
+
pinned.length === 0 &&
|
|
116
|
+
recentTimeline.length > 0 &&
|
|
117
|
+
recentTimeline.every((entry) => entry.type === 'document_evidence' && entry.availability.status === 'unavailable');
|
|
118
|
+
return {
|
|
119
|
+
status: unavailableTimelineOnly
|
|
120
|
+
? 'unavailable'
|
|
121
|
+
: degraded.size > 0
|
|
122
|
+
? 'degraded'
|
|
123
|
+
: results.length === 0 && pinned.length === 0 && recentTimeline.length === 0
|
|
124
|
+
? 'empty'
|
|
125
|
+
: 'ok',
|
|
126
|
+
profile: 'default',
|
|
127
|
+
...(!unavailableTimelineOnly && degraded.size > 0 ? { degraded: [...degraded] } : {}),
|
|
128
|
+
...(unavailableTimelineOnly
|
|
129
|
+
? { note: 'recent document date metadata remains, but no readable source copy is available' }
|
|
130
|
+
: {}),
|
|
131
|
+
pinned,
|
|
132
|
+
results,
|
|
133
|
+
timeline: recentTimeline,
|
|
134
|
+
...(structure ? { structure } : {}),
|
|
135
|
+
searched,
|
|
136
|
+
...(coverage ? { coverage } : {}),
|
|
137
|
+
...(qualification ? { qualification } : {}),
|
|
138
|
+
budget_used: budgetUsed,
|
|
139
|
+
// Default to visible. A silent trim reads as "that's everything".
|
|
140
|
+
...(anyDropped
|
|
141
|
+
? { dropped: { pinned: droppedPinned, results: droppedResults, timeline: droppedTimeline } }
|
|
142
|
+
: {}),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export const AUTO_RECALL_POLICY_VERSION = 'auto-recall-v1';
|
|
146
|
+
export const AUTO_RECALL_SEMANTIC_THRESHOLD = 0.9;
|
|
147
|
+
// Auto-injection needs a substantially stronger boundary than explicit recall. On the invented development
|
|
148
|
+
// corpus, calibrated native scores for topical-but-non-answering pages reached 0.9728 while direct support
|
|
149
|
+
// reached 0.9999. Freezing 0.99 keeps that measured separation; the held-out gate checks it independently.
|
|
150
|
+
export const AUTO_RECALL_NATIVE_QUALIFICATION_THRESHOLD = 0.99;
|
|
151
|
+
const AUTO_RECALL_DUAL_ARM_THRESHOLD = 0.85;
|
|
152
|
+
const AUTO_RECALL_DEFAULT_BUDGET = 1200;
|
|
153
|
+
const AUTO_RECALL_CANDIDATE_LIMIT = 8;
|
|
154
|
+
const AUTO_RECALL_CANDIDATE_BUDGET = 6000;
|
|
155
|
+
const AUTO_RECALL_MAX_RESULTS = 3;
|
|
156
|
+
/**
|
|
157
|
+
* Precision-first evidence for a host turn. Unlike broad context, this profile never adds
|
|
158
|
+
* ambient structure, timeline entries, pins, or generated prose. It first performs cheap
|
|
159
|
+
* retrieval without reranking. Strong deterministic evidence can be returned immediately;
|
|
160
|
+
* only a plausible ambiguous boundary pays for model qualification.
|
|
161
|
+
*/
|
|
162
|
+
async function autoRecallContext(ctx, input) {
|
|
163
|
+
const budget = input.budget ?? AUTO_RECALL_DEFAULT_BUDGET;
|
|
164
|
+
const resolutionContext = referenceContext(input.query, input.conversation_context ?? []);
|
|
165
|
+
const retrievalQuery = resolutionContext ? `${input.query}\n${resolutionContext}` : input.query;
|
|
166
|
+
const recallInput = {
|
|
167
|
+
query: retrievalQuery,
|
|
168
|
+
mode: input.mode ?? 'lookup',
|
|
169
|
+
depth: 'lines',
|
|
170
|
+
limit: AUTO_RECALL_CANDIDATE_LIMIT,
|
|
171
|
+
budget: AUTO_RECALL_CANDIDATE_BUDGET,
|
|
172
|
+
expand: false,
|
|
173
|
+
graph: false,
|
|
174
|
+
...(input.include ? { include: input.include } : {}),
|
|
175
|
+
...(input.filter ? { filter: input.filter } : {}),
|
|
176
|
+
};
|
|
177
|
+
const initial = await recall(ctx, { ...recallInput, rerank: false });
|
|
178
|
+
if (initial.status === 'unavailable') {
|
|
179
|
+
return emptyAutoRecall({
|
|
180
|
+
status: 'unavailable',
|
|
181
|
+
budget,
|
|
182
|
+
searched: [input.query],
|
|
183
|
+
candidates: 0,
|
|
184
|
+
degraded: initial.degraded,
|
|
185
|
+
note: initial.note ?? 'memory evidence could not be read',
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
const degraded = new Set(initial.degraded ?? []);
|
|
189
|
+
const signals = initial.results.map((result) => activationSignal(result, input.query, resolutionContext));
|
|
190
|
+
const mechanicalCompoundConflict = hasMechanicalCompoundConflict(signals, input.query);
|
|
191
|
+
const complementary = complementaryCompoundSignals(signals, input.query);
|
|
192
|
+
if (complementary.length > 0) {
|
|
193
|
+
return assembledAutoRecall({
|
|
194
|
+
budget,
|
|
195
|
+
searched: [input.query],
|
|
196
|
+
selected: complementary.map((signal) => signal.result),
|
|
197
|
+
candidates: initial.results.length,
|
|
198
|
+
degraded,
|
|
199
|
+
activationBasis: 'exact',
|
|
200
|
+
qualificationRun: false,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
const strongSignals = signals
|
|
204
|
+
.filter((signal) => signal.strong)
|
|
205
|
+
.sort((left, right) => right.strength - left.strength);
|
|
206
|
+
// An exact marker, identity plus supported attribute, or exact phrase is stronger than a nearby
|
|
207
|
+
// semantic duplicate. Once one exists, adding semantic neighbours only increases disclosure.
|
|
208
|
+
const deterministic = (strongSignals.some((signal) => signal.basis === 'exact')
|
|
209
|
+
? strongSignals.filter((signal) => signal.basis === 'exact')
|
|
210
|
+
: strongSignals).slice(0, AUTO_RECALL_MAX_RESULTS);
|
|
211
|
+
const ambiguousSingularFact = asksForSingularFact(input.query) && deterministic.length > 1;
|
|
212
|
+
const unresolvedMechanicalCompound = requestedMechanicalValueKinds(input.query).length > 1;
|
|
213
|
+
if (deterministic.length > 0 && !ambiguousSingularFact && !unresolvedMechanicalCompound) {
|
|
214
|
+
return assembledAutoRecall({
|
|
215
|
+
budget,
|
|
216
|
+
searched: [input.query],
|
|
217
|
+
selected: deterministic.map((signal) => signal.result),
|
|
218
|
+
candidates: initial.results.length,
|
|
219
|
+
degraded,
|
|
220
|
+
activationBasis: deterministic.some((signal) => signal.basis === 'exact') ? 'exact' : 'semantic',
|
|
221
|
+
qualificationRun: false,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
const plausible = signals.some((signal) => signal.plausible);
|
|
225
|
+
if (!plausible) {
|
|
226
|
+
return emptyAutoRecall({
|
|
227
|
+
status: degraded.size > 0 ? 'degraded' : 'empty',
|
|
228
|
+
budget,
|
|
229
|
+
searched: [input.query],
|
|
230
|
+
candidates: initial.results.length,
|
|
231
|
+
degraded: [...degraded],
|
|
232
|
+
note: 'no memory evidence was strong enough for automatic injection',
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
const qualified = await recall(ctx, { ...recallInput, rerank: true });
|
|
236
|
+
for (const reason of qualified.degraded ?? [])
|
|
237
|
+
degraded.add(reason);
|
|
238
|
+
if (qualified.status === 'unavailable') {
|
|
239
|
+
return emptyAutoRecall({
|
|
240
|
+
status: 'unavailable',
|
|
241
|
+
budget,
|
|
242
|
+
searched: [input.query],
|
|
243
|
+
candidates: initial.results.length,
|
|
244
|
+
degraded: [...degraded],
|
|
245
|
+
qualification: qualified.qualification,
|
|
246
|
+
qualificationRun: true,
|
|
247
|
+
note: qualified.note ?? 'memory evidence could not be read during qualification',
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
const qualificationApplied = qualified.qualification?.applied === true;
|
|
251
|
+
const minimumRelevance = qualified.qualification?.model === 'llm' ? 2 / 3 : AUTO_RECALL_NATIVE_QUALIFICATION_THRESHOLD;
|
|
252
|
+
const qualifiedSelection = qualificationApplied
|
|
253
|
+
? qualified.results
|
|
254
|
+
.filter((result) => temporalEvidenceEligible(result, input.query) && (result.relevance ?? 0) >= minimumRelevance)
|
|
255
|
+
.slice(0, AUTO_RECALL_MAX_RESULTS)
|
|
256
|
+
: [];
|
|
257
|
+
const qualifiedComplementary = complementaryCompoundSignals(qualifiedSelection.map((result) => activationSignal(result, input.query, resolutionContext)), input.query);
|
|
258
|
+
const selected = unresolvedMechanicalCompound
|
|
259
|
+
? mechanicalCompoundConflict
|
|
260
|
+
? []
|
|
261
|
+
: qualifiedComplementary.map((signal) => signal.result)
|
|
262
|
+
: qualifiedSelection;
|
|
263
|
+
const qualifiedReferenceAmbiguous = asksForSingularFact(input.query) && selected.length > 1;
|
|
264
|
+
if (selected.length === 0 || qualifiedReferenceAmbiguous) {
|
|
265
|
+
return emptyAutoRecall({
|
|
266
|
+
status: degraded.size > 0 ? 'degraded' : 'empty',
|
|
267
|
+
budget,
|
|
268
|
+
searched: [input.query],
|
|
269
|
+
candidates: initial.results.length,
|
|
270
|
+
degraded: [...degraded],
|
|
271
|
+
qualification: qualified.qualification,
|
|
272
|
+
qualificationRun: true,
|
|
273
|
+
note: qualifiedReferenceAmbiguous
|
|
274
|
+
? 'a singular fact remained ambiguous between multiple sources'
|
|
275
|
+
: qualificationApplied
|
|
276
|
+
? 'qualification found no evidence strong enough for automatic injection'
|
|
277
|
+
: 'automatic injection requires calibrated qualification for ambiguous evidence',
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return assembledAutoRecall({
|
|
281
|
+
budget,
|
|
282
|
+
searched: [input.query],
|
|
283
|
+
selected,
|
|
284
|
+
candidates: initial.results.length,
|
|
285
|
+
degraded,
|
|
286
|
+
activationBasis: 'qualified',
|
|
287
|
+
qualification: qualified.qualification,
|
|
288
|
+
qualificationRun: true,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
function emptyAutoRecall(options) {
|
|
292
|
+
return {
|
|
293
|
+
status: options.status,
|
|
294
|
+
...(options.status === 'degraded' && options.degraded?.length ? { degraded: options.degraded } : {}),
|
|
295
|
+
note: options.note,
|
|
296
|
+
profile: 'auto_recall',
|
|
297
|
+
activation: {
|
|
298
|
+
activated: false,
|
|
299
|
+
basis: 'none',
|
|
300
|
+
candidates: options.candidates,
|
|
301
|
+
selected: 0,
|
|
302
|
+
qualification_run: options.qualificationRun ?? false,
|
|
303
|
+
},
|
|
304
|
+
pinned: [],
|
|
305
|
+
results: [],
|
|
306
|
+
timeline: [],
|
|
307
|
+
searched: options.searched,
|
|
308
|
+
...(options.qualification ? { qualification: options.qualification } : {}),
|
|
309
|
+
budget_used: 0,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
function assembledAutoRecall(options) {
|
|
313
|
+
const fitted = fitAutoRecallResults(options.selected, options.budget);
|
|
314
|
+
const reasons = [...options.degraded];
|
|
315
|
+
const activated = fitted.results.length > 0;
|
|
316
|
+
const dropped = options.selected.length - fitted.results.length;
|
|
317
|
+
return {
|
|
318
|
+
status: reasons.length > 0 ? 'degraded' : activated ? 'ok' : 'empty',
|
|
319
|
+
...(reasons.length > 0 ? { degraded: reasons } : {}),
|
|
320
|
+
...(!activated ? { note: 'relevant evidence could not fit the requested context budget' } : {}),
|
|
321
|
+
profile: 'auto_recall',
|
|
322
|
+
activation: {
|
|
323
|
+
activated,
|
|
324
|
+
basis: activated ? options.activationBasis : 'none',
|
|
325
|
+
candidates: options.candidates,
|
|
326
|
+
selected: fitted.results.length,
|
|
327
|
+
qualification_run: options.qualificationRun,
|
|
328
|
+
},
|
|
329
|
+
pinned: [],
|
|
330
|
+
results: fitted.results,
|
|
331
|
+
timeline: [],
|
|
332
|
+
searched: options.searched,
|
|
333
|
+
...(options.qualification ? { qualification: options.qualification } : {}),
|
|
334
|
+
budget_used: fitted.budgetUsed,
|
|
335
|
+
...(dropped > 0 ? { dropped: { pinned: 0, results: dropped, timeline: 0 } } : {}),
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* A compound answer may legitimately live on separate pages. Admit that set without lowering the global
|
|
340
|
+
* qualifier threshold only when the decision is mechanical: every requested value class has exactly one
|
|
341
|
+
* source, every source states an explicit value, and every source contains the same non-field subject tokens.
|
|
342
|
+
* Two candidates for one field are a conflict and therefore produce no deterministic set.
|
|
343
|
+
*/
|
|
344
|
+
function complementaryCompoundSignals(signals, query) {
|
|
345
|
+
const kinds = requestedMechanicalValueKinds(query);
|
|
346
|
+
if (kinds.length < 2)
|
|
347
|
+
return [];
|
|
348
|
+
const eligible = mechanicalCompoundCandidates(signals, query);
|
|
349
|
+
const selected = [];
|
|
350
|
+
for (const kind of kinds) {
|
|
351
|
+
const matches = eligible.filter((signal) => evidenceSupportsMechanicalKind(evidenceText(signal.result), kind));
|
|
352
|
+
if (matches.length !== 1)
|
|
353
|
+
return [];
|
|
354
|
+
selected.push(matches[0]);
|
|
355
|
+
}
|
|
356
|
+
return [...new Map(selected.map((signal) => [resultIdentity(signal.result), signal])).values()].slice(0, AUTO_RECALL_MAX_RESULTS);
|
|
357
|
+
}
|
|
358
|
+
function hasMechanicalCompoundConflict(signals, query) {
|
|
359
|
+
const kinds = requestedMechanicalValueKinds(query);
|
|
360
|
+
if (kinds.length < 2)
|
|
361
|
+
return false;
|
|
362
|
+
const eligible = mechanicalCompoundCandidates(signals, query);
|
|
363
|
+
return kinds.some((kind) => eligible.filter((signal) => evidenceSupportsMechanicalKind(evidenceText(signal.result), kind)).length >
|
|
364
|
+
1);
|
|
365
|
+
}
|
|
366
|
+
function mechanicalCompoundCandidates(signals, query) {
|
|
367
|
+
const subjectTokens = meaningfulTokens(query).filter((token) => !COMPOUND_FIELD_TOKENS.has(token));
|
|
368
|
+
if (subjectTokens.length === 0)
|
|
369
|
+
return [];
|
|
370
|
+
return signals.filter((signal) => signal.plausible &&
|
|
371
|
+
temporalEvidenceEligible(signal.result, query) &&
|
|
372
|
+
overlapRatio(subjectTokens, evidenceText(signal.result)) === 1);
|
|
373
|
+
}
|
|
374
|
+
function activationSignal(result, query, resolutionContext) {
|
|
375
|
+
const evidence = evidenceText(result);
|
|
376
|
+
const queryTokens = meaningfulTokens(query);
|
|
377
|
+
const contextTokens = meaningfulTokens(resolutionContext ?? '');
|
|
378
|
+
const overlap = overlapRatio(queryTokens, evidence);
|
|
379
|
+
const contextOverlap = overlapRatio(contextTokens, evidence);
|
|
380
|
+
const identities = result.type === 'page'
|
|
381
|
+
? [result.title, result.slug.split('/').at(-1)?.replaceAll('-', ' ') ?? '']
|
|
382
|
+
: [
|
|
383
|
+
result.label,
|
|
384
|
+
result.path
|
|
385
|
+
.split('/')
|
|
386
|
+
.at(-1)
|
|
387
|
+
?.replace(/\.[^.]+$/, '')
|
|
388
|
+
.replaceAll('-', ' ') ?? '',
|
|
389
|
+
];
|
|
390
|
+
const promptHaystack = normalize(`${query} ${resolutionContext ?? ''}`);
|
|
391
|
+
const matchedIdentityTokens = identities.flatMap((identity) => {
|
|
392
|
+
const normalized = normalize(identity);
|
|
393
|
+
const tokens = meaningfulTokens(identity);
|
|
394
|
+
return tokens.length >= 2 && promptHaystack.includes(normalized) ? [tokens] : [];
|
|
395
|
+
});
|
|
396
|
+
const identityResidual = matchedIdentityTokens
|
|
397
|
+
.map((identityTokens) => queryTokens.filter((token) => !identityTokens.includes(token)))
|
|
398
|
+
.sort((left, right) => left.length - right.length)[0];
|
|
399
|
+
const identityRelationSupported = identityResidual !== undefined &&
|
|
400
|
+
(identityResidual.length === 0 || overlapRatio(identityResidual, evidence) === 1);
|
|
401
|
+
const exactEvidence = queryTokens.length >= 2 && overlap === 1;
|
|
402
|
+
const resolvedIdentity = Boolean(resolutionContext) &&
|
|
403
|
+
identities.some((identity) => {
|
|
404
|
+
const normalized = normalize(identity);
|
|
405
|
+
return (meaningfulTokens(identity).length >= 2 && normalize(resolutionContext ?? '').includes(normalized));
|
|
406
|
+
});
|
|
407
|
+
const semantic = result.relevance ?? 0;
|
|
408
|
+
const temporallyEligible = temporalEvidenceEligible(result, query);
|
|
409
|
+
// A topical page can repeat the requested field without containing its value: “the price record was
|
|
410
|
+
// reviewed” is not the price. Mechanical numeric and duration questions therefore need an explicit value
|
|
411
|
+
// before lexical overlap may bypass qualification. The qualifier handles less mechanical attribute/value
|
|
412
|
+
// boundaries.
|
|
413
|
+
const requestedValueMissing = (asksForNumericValue(query) && !containsExplicitNumericValue(evidence)) ||
|
|
414
|
+
(asksForDurationValue(query) && !containsExplicitDurationValue(evidence));
|
|
415
|
+
const semanticRelationSupported = identityResidual === undefined || identityRelationSupported;
|
|
416
|
+
const strongSemantic = !requestedValueMissing &&
|
|
417
|
+
semantic >= AUTO_RECALL_SEMANTIC_THRESHOLD &&
|
|
418
|
+
overlap >= 0.5 &&
|
|
419
|
+
semanticRelationSupported;
|
|
420
|
+
const dualArmSemantic = !requestedValueMissing &&
|
|
421
|
+
semantic >= AUTO_RECALL_DUAL_ARM_THRESHOLD &&
|
|
422
|
+
overlap >= 0.5 &&
|
|
423
|
+
semanticRelationSupported &&
|
|
424
|
+
result.matched_by?.includes('lexical') === true &&
|
|
425
|
+
result.matched_by.includes('vector');
|
|
426
|
+
const exact = !requestedValueMissing &&
|
|
427
|
+
(identityRelationSupported || exactEvidence || (resolvedIdentity && overlap > 0));
|
|
428
|
+
const strong = temporallyEligible && (exact || strongSemantic || dualArmSemantic);
|
|
429
|
+
const plausible = temporallyEligible && (strong || overlap > 0 || contextOverlap > 0 || semantic >= 0.45);
|
|
430
|
+
return {
|
|
431
|
+
result,
|
|
432
|
+
basis: exact ? 'exact' : 'semantic',
|
|
433
|
+
strength: exact ? 2 + Math.max(overlap, contextOverlap) : semantic + overlap,
|
|
434
|
+
strong,
|
|
435
|
+
plausible,
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
/** The recent turns are not a second query. They are admitted only when the current prompt has a local
|
|
439
|
+
* reference to resolve, and even then only the last 1,000 characters are allowed into retrieval. */
|
|
440
|
+
function referenceContext(query, turns) {
|
|
441
|
+
if (turns.length === 0 || !hasLocalReference(query))
|
|
442
|
+
return null;
|
|
443
|
+
const recent = turns
|
|
444
|
+
.slice(-2)
|
|
445
|
+
.map((turn) => turn.content.trim())
|
|
446
|
+
.filter(Boolean)
|
|
447
|
+
.join('\n');
|
|
448
|
+
if (!recent)
|
|
449
|
+
return null;
|
|
450
|
+
return recent.slice(-1000);
|
|
451
|
+
}
|
|
452
|
+
function hasLocalReference(query) {
|
|
453
|
+
return (/\b(it|its|that|this|they|them|those|these|one|other|former|latter|same)\b/i.test(query) ||
|
|
454
|
+
/\b(what|how) about\b/i.test(query));
|
|
455
|
+
}
|
|
456
|
+
function hasSingularReference(query) {
|
|
457
|
+
return /\b(it|its|that|this|one|other|former|latter|same)\b/i.test(query);
|
|
458
|
+
}
|
|
459
|
+
function asksForSingularFact(query) {
|
|
460
|
+
if (/\b(and|both|compare|list)\b/i.test(query) || /\bwhat are\b/i.test(query))
|
|
461
|
+
return false;
|
|
462
|
+
return (hasSingularReference(query) ||
|
|
463
|
+
/\bwhat (?:is|was)\b/i.test(query) ||
|
|
464
|
+
/\bwhen (?:does|did|is|was)\b/i.test(query) ||
|
|
465
|
+
/\bhow (?:long|often|much|many)\b/i.test(query) ||
|
|
466
|
+
/\bdoes\b/i.test(query));
|
|
467
|
+
}
|
|
468
|
+
function asksForNumericValue(query) {
|
|
469
|
+
return /\b(price|cost|fee|amount|total|balance|rate)\b/i.test(query);
|
|
470
|
+
}
|
|
471
|
+
function asksForDurationValue(query) {
|
|
472
|
+
return /\bhow (?:long|often)\b/i.test(query);
|
|
473
|
+
}
|
|
474
|
+
function containsExplicitNumericValue(evidence) {
|
|
475
|
+
return /(?:[$€£¥]\s*\d|\b\d+(?:[.,]\d+)?\s*(?:eur|usd|gbp|jpy|%|percent)\b)/i.test(evidence);
|
|
476
|
+
}
|
|
477
|
+
function containsExplicitDurationValue(evidence) {
|
|
478
|
+
return /\b(?:(?:\d+(?:[.,]\d+)?)|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve)[ -](?:minute|hour|day|week|month|year)s?\b|\b(?:hourly|daily|weekly|monthly|quarterly|annually|yearly|twice a year)\b/i.test(evidence);
|
|
479
|
+
}
|
|
480
|
+
const COMPOUND_FIELD_TOKENS = new Set([
|
|
481
|
+
'amount',
|
|
482
|
+
'balance',
|
|
483
|
+
'cost',
|
|
484
|
+
'date',
|
|
485
|
+
'deadline',
|
|
486
|
+
'due',
|
|
487
|
+
'duration',
|
|
488
|
+
'fee',
|
|
489
|
+
'interval',
|
|
490
|
+
'next',
|
|
491
|
+
'price',
|
|
492
|
+
'rate',
|
|
493
|
+
'renewal',
|
|
494
|
+
'total',
|
|
495
|
+
]);
|
|
496
|
+
function requestedMechanicalValueKinds(query) {
|
|
497
|
+
const kinds = [];
|
|
498
|
+
if (/\b(price|cost|fee|amount|total|balance)\b/i.test(query))
|
|
499
|
+
kinds.push('money');
|
|
500
|
+
if (/\b(date|deadline)\b/i.test(query))
|
|
501
|
+
kinds.push('date');
|
|
502
|
+
if (/\b(duration|interval|cadence)\b/i.test(query) || /\bhow (?:long|often)\b/i.test(query))
|
|
503
|
+
kinds.push('duration');
|
|
504
|
+
return kinds;
|
|
505
|
+
}
|
|
506
|
+
function evidenceSupportsMechanicalKind(evidence, kind) {
|
|
507
|
+
if (kind === 'money')
|
|
508
|
+
return containsExplicitNumericValue(evidence);
|
|
509
|
+
if (kind === 'duration')
|
|
510
|
+
return containsExplicitDurationValue(evidence);
|
|
511
|
+
return containsExplicitDateValue(evidence);
|
|
512
|
+
}
|
|
513
|
+
function containsExplicitDateValue(evidence) {
|
|
514
|
+
return /\b(?:\d{4}-\d{2}-\d{2}|\d{1,2}[/.]\d{1,2}[/.]\d{2,4}|\d{1,2}\s+(?:january|february|march|april|may|june|july|august|september|october|november|december)\s+\d{4}|(?:january|february|march|april|may|june|july|august|september|october|november|december)\s+\d{1,2},?\s+\d{4})\b/i.test(evidence);
|
|
515
|
+
}
|
|
516
|
+
function resultIdentity(result) {
|
|
517
|
+
return result.type === 'page' ? `page:${result.slug}` : `document:${result.id}`;
|
|
518
|
+
}
|
|
519
|
+
function temporalEvidenceEligible(result, query) {
|
|
520
|
+
if (!/\b(current|active|latest)\b/i.test(query))
|
|
521
|
+
return true;
|
|
522
|
+
if (result.type === 'page' && result.superseded)
|
|
523
|
+
return false;
|
|
524
|
+
const evidence = evidenceText(result);
|
|
525
|
+
const stale = /(?:^|\s)(?:the\s+)?(?:old|former|archived|superseded)\s+/im.test(evidence);
|
|
526
|
+
const fresh = /(?:^|\s)(?:the\s+)?(?:current|active|latest)\s+/im.test(evidence);
|
|
527
|
+
return !stale || fresh;
|
|
528
|
+
}
|
|
529
|
+
const AUTO_RECALL_STOPWORDS = new Set([
|
|
530
|
+
'about',
|
|
531
|
+
'again',
|
|
532
|
+
'also',
|
|
533
|
+
'and',
|
|
534
|
+
'are',
|
|
535
|
+
'can',
|
|
536
|
+
'could',
|
|
537
|
+
'does',
|
|
538
|
+
'for',
|
|
539
|
+
'from',
|
|
540
|
+
'have',
|
|
541
|
+
'how',
|
|
542
|
+
'into',
|
|
543
|
+
'its',
|
|
544
|
+
'long',
|
|
545
|
+
'many',
|
|
546
|
+
'memory',
|
|
547
|
+
'much',
|
|
548
|
+
'often',
|
|
549
|
+
'under',
|
|
550
|
+
'please',
|
|
551
|
+
'remember',
|
|
552
|
+
'tell',
|
|
553
|
+
'that',
|
|
554
|
+
'the',
|
|
555
|
+
'their',
|
|
556
|
+
'them',
|
|
557
|
+
'there',
|
|
558
|
+
'these',
|
|
559
|
+
'they',
|
|
560
|
+
'this',
|
|
561
|
+
'those',
|
|
562
|
+
'was',
|
|
563
|
+
'what',
|
|
564
|
+
'when',
|
|
565
|
+
'where',
|
|
566
|
+
'which',
|
|
567
|
+
'who',
|
|
568
|
+
'why',
|
|
569
|
+
'with',
|
|
570
|
+
'would',
|
|
571
|
+
'you',
|
|
572
|
+
]);
|
|
573
|
+
function meaningfulTokens(text) {
|
|
574
|
+
return [
|
|
575
|
+
...new Set(normalize(text)
|
|
576
|
+
.split(' ')
|
|
577
|
+
.filter((token) => token.length > 2 && !AUTO_RECALL_STOPWORDS.has(token))
|
|
578
|
+
.map(autoRecallRoot)),
|
|
579
|
+
];
|
|
580
|
+
}
|
|
581
|
+
function normalize(text) {
|
|
582
|
+
return text
|
|
583
|
+
.toLowerCase()
|
|
584
|
+
.replace(/[^\p{L}\p{N}]+/gu, ' ')
|
|
585
|
+
.trim();
|
|
586
|
+
}
|
|
587
|
+
function overlapRatio(tokens, evidence) {
|
|
588
|
+
if (tokens.length === 0)
|
|
589
|
+
return 0;
|
|
590
|
+
const haystack = new Set(normalize(evidence).split(' ').map(autoRecallRoot));
|
|
591
|
+
return tokens.filter((token) => haystack.has(token)).length / tokens.length;
|
|
592
|
+
}
|
|
593
|
+
function autoRecallRoot(token) {
|
|
594
|
+
if (token.length > 5 && token.endsWith('ies'))
|
|
595
|
+
return token.slice(0, -3);
|
|
596
|
+
if (token.length > 4 && token.endsWith('es'))
|
|
597
|
+
return token.slice(0, -2);
|
|
598
|
+
if (token.length > 3 && token.endsWith('s') && !token.endsWith('ss'))
|
|
599
|
+
return token.slice(0, -1);
|
|
600
|
+
return token;
|
|
601
|
+
}
|
|
602
|
+
function evidenceText(result) {
|
|
603
|
+
if (result.type === 'document')
|
|
604
|
+
return `${result.path} ${result.label} ${result.quote ?? ''}`;
|
|
605
|
+
return `${result.slug} ${result.title} ${result.breadcrumb ?? ''} ${result.lines.map((line) => line.text).join(' ')}`;
|
|
606
|
+
}
|
|
607
|
+
function fitAutoRecallResults(selected, budget) {
|
|
608
|
+
const results = [];
|
|
609
|
+
let budgetUsed = 0;
|
|
610
|
+
for (const raw of selected) {
|
|
611
|
+
const remaining = budget - budgetUsed;
|
|
612
|
+
if (remaining <= 0)
|
|
613
|
+
break;
|
|
614
|
+
const result = fitAutoRecallResult(sanitizeAutoRecallResult(raw), remaining);
|
|
615
|
+
if (!result)
|
|
616
|
+
continue;
|
|
617
|
+
const cost = estimateTokens(result);
|
|
618
|
+
if (cost > remaining)
|
|
619
|
+
continue;
|
|
620
|
+
results.push(result);
|
|
621
|
+
budgetUsed += cost;
|
|
622
|
+
}
|
|
623
|
+
return { results, budgetUsed };
|
|
624
|
+
}
|
|
625
|
+
/** Clip only at exact line/quote boundaries. Auto-recall never asks a model to summarize evidence to fit. */
|
|
626
|
+
function fitAutoRecallResult(result, budget) {
|
|
627
|
+
if (estimateTokens(result) <= budget && hasExactEvidence(result))
|
|
628
|
+
return result;
|
|
629
|
+
if (result.type === 'document') {
|
|
630
|
+
const lines = result.quote?.split('\n') ?? [];
|
|
631
|
+
let fitted = null;
|
|
632
|
+
for (const line of lines) {
|
|
633
|
+
const quote = fitted ? `${fitted.quote ?? ''}\n${line}`.trim() : line;
|
|
634
|
+
const candidate = { ...result, quote };
|
|
635
|
+
if (estimateTokens(candidate) > budget)
|
|
636
|
+
break;
|
|
637
|
+
fitted = candidate;
|
|
638
|
+
}
|
|
639
|
+
return fitted;
|
|
640
|
+
}
|
|
641
|
+
let fittedLines = [];
|
|
642
|
+
let fittedDocuments = [];
|
|
643
|
+
let fitted = null;
|
|
644
|
+
for (const line of result.lines) {
|
|
645
|
+
const candidate = { ...result, lines: fittedLines.concat(line), documents: fittedDocuments };
|
|
646
|
+
if (estimateTokens(candidate) > budget)
|
|
647
|
+
break;
|
|
648
|
+
fittedLines = candidate.lines;
|
|
649
|
+
fitted = candidate;
|
|
650
|
+
}
|
|
651
|
+
for (const document of result.documents ?? []) {
|
|
652
|
+
if (!document.quote)
|
|
653
|
+
continue;
|
|
654
|
+
const quoteLines = document.quote.split('\n');
|
|
655
|
+
let clipped = { ...document, quote: '' };
|
|
656
|
+
for (const line of quoteLines) {
|
|
657
|
+
const candidateDocument = { ...clipped, quote: `${clipped.quote}\n${line}`.trim() };
|
|
658
|
+
const candidate = {
|
|
659
|
+
...result,
|
|
660
|
+
lines: fittedLines,
|
|
661
|
+
documents: fittedDocuments.concat(candidateDocument),
|
|
662
|
+
};
|
|
663
|
+
if (estimateTokens(candidate) > budget)
|
|
664
|
+
break;
|
|
665
|
+
clipped = candidateDocument;
|
|
666
|
+
fitted = candidate;
|
|
667
|
+
}
|
|
668
|
+
if (clipped.quote)
|
|
669
|
+
fittedDocuments = fittedDocuments.concat(clipped);
|
|
670
|
+
}
|
|
671
|
+
return fitted;
|
|
672
|
+
}
|
|
673
|
+
function sanitizeAutoRecallResult(result) {
|
|
674
|
+
if (result.type === 'document') {
|
|
675
|
+
const { summary: _summary, graph_paths: _graphPaths, suggested_actions: _actions, ...exact } = result;
|
|
676
|
+
return exact;
|
|
677
|
+
}
|
|
678
|
+
const { links: _links, summary: _summary, superseded: _superseded, graph_paths: _graphPaths, documents, ...exact } = result;
|
|
679
|
+
return {
|
|
680
|
+
...exact,
|
|
681
|
+
summary: null,
|
|
682
|
+
...(documents?.some((document) => document.quote)
|
|
683
|
+
? {
|
|
684
|
+
documents: documents
|
|
685
|
+
.filter((document) => document.quote)
|
|
686
|
+
.map(({ summary: _documentSummary, ...document }) => document),
|
|
687
|
+
}
|
|
688
|
+
: {}),
|
|
689
|
+
};
|
|
690
|
+
}
|
|
691
|
+
function hasExactEvidence(result) {
|
|
692
|
+
return result.type === 'document'
|
|
693
|
+
? Boolean(result.quote?.trim())
|
|
694
|
+
: result.lines.length > 0 ||
|
|
695
|
+
result.documents?.some((document) => Boolean(document.quote?.trim())) === true;
|
|
696
|
+
}
|
|
697
|
+
/** A pinned page is delivered in the same card shape as a recalled one, so the
|
|
698
|
+
* host has one thing to render and the model one thing to read. */
|
|
699
|
+
function cardFromPage(page) {
|
|
700
|
+
return {
|
|
701
|
+
slug: page.slug,
|
|
702
|
+
title: page.title,
|
|
703
|
+
role: page.role,
|
|
704
|
+
summary: page.summary,
|
|
705
|
+
score: 1,
|
|
706
|
+
lines: page.lines.filter((line) => line.text.trim().length > 0),
|
|
707
|
+
...(page.superseded ? { superseded: page.superseded } : {}),
|
|
708
|
+
...(page.links.length > 0 ? { links: page.links } : {}),
|
|
709
|
+
...(page.documents ? { documents: page.documents } : {}),
|
|
710
|
+
...(page.updated ? { updated: page.updated } : {}),
|
|
711
|
+
};
|
|
712
|
+
}
|
|
713
|
+
//# sourceMappingURL=context.js.map
|