@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,434 @@
|
|
|
1
|
+
import fsp from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { AknoError, IngestInput } from '@tenphi/akno-protocol';
|
|
4
|
+
import { effectiveRule } from "../rules/compile.js";
|
|
5
|
+
import { extract } from "../ingest/extract.js";
|
|
6
|
+
import { cleanupFetch, fetchDocument } from "../ingest/fetch.js";
|
|
7
|
+
import { nameDocument, nameIsUseless } from "../ingest/name.js";
|
|
8
|
+
import { provenanceLines, recordDocument, storeDocument } from "../ingest/store.js";
|
|
9
|
+
import { hashFile } from "../kb/scan.js";
|
|
10
|
+
import { physicalFolders } from "../kb/folders.js";
|
|
11
|
+
import { newPrefixedId } from "../store/ids.js";
|
|
12
|
+
import { writeFileAtomic } from "../write/atomic.js";
|
|
13
|
+
import { recall } from "./recall.js";
|
|
14
|
+
import { normalizeSlug } from "./write.js";
|
|
15
|
+
/**
|
|
16
|
+
* Pull documents into memory — **a file, a folder, a URL** — and for each:
|
|
17
|
+
* extract, OCR, name, summarize, and route.
|
|
18
|
+
*
|
|
19
|
+
* `ingest` is the op that earns the most from living in the layer. "Run text extraction and
|
|
20
|
+
* OCR on documents", "give `IMG_4821.HEIC` a name that means something" and "decide where a
|
|
21
|
+
* dropped file belongs" are three things usually asked of a model in a prompt, replaced here
|
|
22
|
+
* by one call that happens every time.
|
|
23
|
+
*
|
|
24
|
+
* The order matters: extract first, because everything else depends on having the text;
|
|
25
|
+
* then name from the content; then route; then gate. A file whose text cannot be read is
|
|
26
|
+
* never given a confident name, and one whose destination is unclear is left where it is
|
|
27
|
+
* rather than filed confidently into the wrong place.
|
|
28
|
+
*/
|
|
29
|
+
export async function ingest(ctx, rawInput) {
|
|
30
|
+
const input = IngestInput.parse(rawInput);
|
|
31
|
+
if (input.url)
|
|
32
|
+
return ingestUrl(ctx, input);
|
|
33
|
+
const source = path.resolve(input.path);
|
|
34
|
+
const stat = await fsp.stat(source).catch(() => null);
|
|
35
|
+
if (!stat)
|
|
36
|
+
throw new AknoError('not_found', `no file at ${source}`);
|
|
37
|
+
if (stat.isDirectory())
|
|
38
|
+
return ingestFolder(ctx, input, source);
|
|
39
|
+
return ingestFile(ctx, input, {
|
|
40
|
+
source,
|
|
41
|
+
originalName: path.basename(source),
|
|
42
|
+
move: input.route ?? false,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// ─── A URL ──────────────────────────────────────────────────────────────────
|
|
46
|
+
async function ingestUrl(ctx, input) {
|
|
47
|
+
const fetched = await fetchDocument({ url: input.url, maxBytes: ctx.config.ingest.maxFileBytes });
|
|
48
|
+
try {
|
|
49
|
+
return await ingestFile(ctx, input, {
|
|
50
|
+
source: fetched.path,
|
|
51
|
+
originalName: fetched.originalName,
|
|
52
|
+
// The temp copy is ours; moving it saves a copy and leaves nothing behind.
|
|
53
|
+
move: true,
|
|
54
|
+
// Worth recording: months later, "where did this come from" is the question a
|
|
55
|
+
// downloaded document cannot otherwise answer.
|
|
56
|
+
sourceUrl: fetched.finalUrl,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
await cleanupFetch(fetched);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// ─── A folder ───────────────────────────────────────────────────────────────
|
|
64
|
+
/**
|
|
65
|
+
* One level deep, deliberately. A recursive walk of a folder someone pointed at by
|
|
66
|
+
* mistake is a thousand model calls and a knowledge base full of pages nobody asked for;
|
|
67
|
+
* a flat pass over a downloads folder is the case that actually comes up.
|
|
68
|
+
*
|
|
69
|
+
* Every file gets its own verdict. Three filing themselves and two needing a decision is
|
|
70
|
+
* not one outcome, and collapsing it would lose the two.
|
|
71
|
+
*/
|
|
72
|
+
async function ingestFolder(ctx, input, folder) {
|
|
73
|
+
const limit = input.limit ?? 50;
|
|
74
|
+
const entries = (await fsp.readdir(folder, { withFileTypes: true }))
|
|
75
|
+
.filter((entry) => entry.isFile() && !entry.name.startsWith('.'))
|
|
76
|
+
.map((entry) => entry.name)
|
|
77
|
+
.sort();
|
|
78
|
+
if (entries.length === 0) {
|
|
79
|
+
return { status: 'empty', outcome: 'skipped', note: `${folder} holds no files` };
|
|
80
|
+
}
|
|
81
|
+
const batch = [];
|
|
82
|
+
let landed = 0;
|
|
83
|
+
for (const name of entries.slice(0, limit)) {
|
|
84
|
+
try {
|
|
85
|
+
const result = await ingestFile(ctx, input, {
|
|
86
|
+
source: path.join(folder, name),
|
|
87
|
+
originalName: name,
|
|
88
|
+
move: input.route ?? false,
|
|
89
|
+
});
|
|
90
|
+
batch.push({
|
|
91
|
+
source: name,
|
|
92
|
+
outcome: result.outcome,
|
|
93
|
+
...(result.slug ? { slug: result.slug } : {}),
|
|
94
|
+
...(result.note ? { note: result.note } : {}),
|
|
95
|
+
});
|
|
96
|
+
if (result.outcome === 'ok')
|
|
97
|
+
landed++;
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
// One unreadable file must not abandon the rest of the folder.
|
|
101
|
+
batch.push({
|
|
102
|
+
source: name,
|
|
103
|
+
outcome: 'error',
|
|
104
|
+
note: err instanceof Error ? err.message : String(err),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const notLookedAt = entries.length - Math.min(entries.length, limit);
|
|
109
|
+
return {
|
|
110
|
+
status: 'ok',
|
|
111
|
+
outcome: landed > 0 ? 'ok' : 'skipped',
|
|
112
|
+
batch,
|
|
113
|
+
// Default to visible. A silent cap reads as "that was all of them".
|
|
114
|
+
note: notLookedAt > 0
|
|
115
|
+
? `${landed} of ${Math.min(entries.length, limit)} filed; ${notLookedAt} more were not looked at (--limit)`
|
|
116
|
+
: `${landed} of ${entries.length} filed`,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export async function ingestFile(ctx, input, file) {
|
|
120
|
+
const extension = path.extname(file.originalName).toLowerCase();
|
|
121
|
+
if (ctx.config.ingest.blockedExtensions.includes(extension.replace(/^\./, ''))) {
|
|
122
|
+
throw new AknoError('invalid', `${extension} files are not ingested (ingest.blocked_extensions)`);
|
|
123
|
+
}
|
|
124
|
+
// ── Dedupe ──────────────────────────────────────────────────────────────
|
|
125
|
+
// Re-ingesting a document is a no-op that returns where it already lives.
|
|
126
|
+
const sha = await hashFile(file.source);
|
|
127
|
+
const existing = ctx.store.db
|
|
128
|
+
.prepare(`SELECT d.id, d.rel_path, p.slug FROM documents d
|
|
129
|
+
LEFT JOIN pages p ON p.id = d.page_id WHERE d.sha256 = ?`)
|
|
130
|
+
.get(sha);
|
|
131
|
+
if (existing) {
|
|
132
|
+
return {
|
|
133
|
+
status: 'ok',
|
|
134
|
+
outcome: 'duplicate',
|
|
135
|
+
document: existing.id,
|
|
136
|
+
rel_path: existing.rel_path,
|
|
137
|
+
...(existing.slug ? { slug: existing.slug } : {}),
|
|
138
|
+
note: 'the same bytes are already stored — nothing was added',
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// ── Extract ─────────────────────────────────────────────────────────────
|
|
142
|
+
const extraction = await extract({
|
|
143
|
+
absPath: file.source,
|
|
144
|
+
maxOcrPages: ctx.config.ingest.maxOcrPages,
|
|
145
|
+
maxBytes: ctx.config.ingest.maxFileBytes,
|
|
146
|
+
...(ctx.models.vision.available ? { vision: ctx.models.vision } : {}),
|
|
147
|
+
});
|
|
148
|
+
// ── Name ────────────────────────────────────────────────────────────────
|
|
149
|
+
const named = extraction.text.length > 0
|
|
150
|
+
? await nameDocument({
|
|
151
|
+
text: extraction.text,
|
|
152
|
+
originalName: file.originalName,
|
|
153
|
+
folders: existingFolders(ctx),
|
|
154
|
+
derive: ctx.models.derive,
|
|
155
|
+
})
|
|
156
|
+
: null;
|
|
157
|
+
const confident = named !== null && named.confidence >= ctx.config.ingest.nameConfidence;
|
|
158
|
+
if (!confident) {
|
|
159
|
+
// The second guard. A photo of a garden or a corrupt scan keeps its name, gets no
|
|
160
|
+
// page, and is flagged rather than given a confident wrong one. Skipping is a
|
|
161
|
+
// *result*, not a failure — the caller is told exactly which guard fired.
|
|
162
|
+
return {
|
|
163
|
+
status: extraction.text.length === 0 ? 'degraded' : 'ok',
|
|
164
|
+
outcome: 'skipped',
|
|
165
|
+
...(extraction.pageCount !== null ? { page_count: extraction.pageCount } : {}),
|
|
166
|
+
ocr: extraction.ocr,
|
|
167
|
+
text_from: extraction.via,
|
|
168
|
+
note: extraction.text.length === 0
|
|
169
|
+
? `nothing could be extracted: ${extraction.note ?? 'no text found'}. The file was left where it is.`
|
|
170
|
+
: named?.error
|
|
171
|
+
? `could not name it: ${named.error}. The file was left where it is.`
|
|
172
|
+
: `naming confidence ${named?.confidence ?? 0} is below ${ctx.config.ingest.nameConfidence}. ` +
|
|
173
|
+
'The file was left where it is rather than given a confident wrong name.',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// ── Route ───────────────────────────────────────────────────────────────
|
|
177
|
+
const destination = await route(ctx, input, named);
|
|
178
|
+
if (destination.kind === 'unrouted') {
|
|
179
|
+
// An unrouted file sits visibly where you dropped it, rather than being filed
|
|
180
|
+
// confidently into the wrong place, where you would never look for it. An inbox with
|
|
181
|
+
// three things in it is a to-do list; a misfiled document is a lost one.
|
|
182
|
+
return {
|
|
183
|
+
status: 'ok',
|
|
184
|
+
outcome: 'requires_approval',
|
|
185
|
+
summary: named.summary,
|
|
186
|
+
...(extraction.pageCount !== null ? { page_count: extraction.pageCount } : {}),
|
|
187
|
+
ocr: extraction.ocr,
|
|
188
|
+
text_from: extraction.via,
|
|
189
|
+
approval: proposeDestination(ctx, named, destination.nearest, file),
|
|
190
|
+
note: `nothing scored above ${ctx.config.routeThreshold} — the file stays where it is`,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const folder = destination.folder;
|
|
194
|
+
const pageSlug = normalizeSlug(folder ? `${folder}/${named.slug}` : named.slug);
|
|
195
|
+
// **Ingestion behaviour is a rule, not a heuristic**, because the right answer
|
|
196
|
+
// genuinely differs by folder — a research paper you want mined, a contract you do not.
|
|
197
|
+
// Declaring it once per folder is cheaper and more predictable than classifying every
|
|
198
|
+
// arrival with a model.
|
|
199
|
+
const rule = effectiveRule(pageSlug, ctx.config.rules);
|
|
200
|
+
if (rule.ingest === 'ignore') {
|
|
201
|
+
return {
|
|
202
|
+
status: 'ok',
|
|
203
|
+
outcome: 'skipped',
|
|
204
|
+
note: `the rule for '${folder ?? '.'}' says ingest: ignore — the file was left where it is`,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
// A new folder is checked exactly as a `write` into it would be.
|
|
208
|
+
const gated = ctx.gate.check(pageSlug, ctx.actor);
|
|
209
|
+
if (!gated.allowed) {
|
|
210
|
+
return {
|
|
211
|
+
status: 'ok',
|
|
212
|
+
outcome: 'requires_folder',
|
|
213
|
+
summary: named.summary,
|
|
214
|
+
ocr: extraction.ocr,
|
|
215
|
+
text_from: extraction.via,
|
|
216
|
+
requires_folder: gated.requiresFolder,
|
|
217
|
+
note: `'${gated.requiresFolder.folder}' has not been declared — the file stays where it is. ` +
|
|
218
|
+
'Call `folder` with a description of what belongs there, then ingest it again.',
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// ── Store ───────────────────────────────────────────────────────────────
|
|
222
|
+
const finalSlug = await uniqueSlug(ctx, pageSlug);
|
|
223
|
+
const stored = await storeDocument({
|
|
224
|
+
ctx,
|
|
225
|
+
source: file.source,
|
|
226
|
+
pageSlug: finalSlug,
|
|
227
|
+
move: file.move,
|
|
228
|
+
});
|
|
229
|
+
const files = [stored.file];
|
|
230
|
+
// `ingest: "file"` indexes the bytes and their text with no page at all — for a folder
|
|
231
|
+
// of media where a stub page per file would be noise, not memory.
|
|
232
|
+
const wantsPage = rule.ingest !== 'file';
|
|
233
|
+
let pageRel = null;
|
|
234
|
+
if (wantsPage) {
|
|
235
|
+
pageRel = `${finalSlug}.md`;
|
|
236
|
+
const page = composePage({
|
|
237
|
+
named,
|
|
238
|
+
extraction,
|
|
239
|
+
attachment: path.basename(stored.relPath),
|
|
240
|
+
...(file.sourceUrl ? { sourceUrl: file.sourceUrl } : {}),
|
|
241
|
+
...(input.label ? { label: input.label } : {}),
|
|
242
|
+
});
|
|
243
|
+
const written = await writeFileAtomic(ctx.config.aknoPath, pageRel, page);
|
|
244
|
+
files.push({ relPath: pageRel, action: 'created', before: null, after: written.after });
|
|
245
|
+
}
|
|
246
|
+
const changeId = ctx.journal.record({
|
|
247
|
+
actor: ctx.actor,
|
|
248
|
+
op: 'ingest',
|
|
249
|
+
summary: `ingested ${file.originalName} as ${finalSlug}`,
|
|
250
|
+
files,
|
|
251
|
+
});
|
|
252
|
+
await ctx.indexer.runForeground({ only: files.map((entry) => entry.relPath) });
|
|
253
|
+
const documentId = recordDocument({
|
|
254
|
+
ctx,
|
|
255
|
+
relPath: stored.relPath,
|
|
256
|
+
extraction,
|
|
257
|
+
summary: named.summary,
|
|
258
|
+
label: input.label ?? named.title,
|
|
259
|
+
});
|
|
260
|
+
const related = destination.related.filter((slug) => slug !== finalSlug).slice(0, 4);
|
|
261
|
+
return {
|
|
262
|
+
status: 'ok',
|
|
263
|
+
outcome: 'ok',
|
|
264
|
+
change_id: changeId,
|
|
265
|
+
...(documentId ? { document: documentId } : {}),
|
|
266
|
+
...(pageRel ? { slug: finalSlug } : {}),
|
|
267
|
+
rel_path: stored.relPath,
|
|
268
|
+
summary: named.summary,
|
|
269
|
+
...(extraction.pageCount !== null ? { page_count: extraction.pageCount } : {}),
|
|
270
|
+
ocr: extraction.ocr,
|
|
271
|
+
text_from: extraction.via,
|
|
272
|
+
...(nameIsUseless(file.originalName) ? { renamed_from: file.originalName } : {}),
|
|
273
|
+
...(related.length > 0 ? { related } : {}),
|
|
274
|
+
...(extraction.note ? { note: extraction.note } : {}),
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* **Routing is a folder decision, not a page-level one** — Akno picks *where a
|
|
279
|
+
* document belongs*, not what it is called relative to its neighbours. It never invents a
|
|
280
|
+
* new folder to route into; a document with no home clears no threshold and stays put.
|
|
281
|
+
*
|
|
282
|
+
* Thresholds `relevance`, never `score`. `score` orders one result set: the best hit is
|
|
283
|
+
* 1.0 whether it is a perfect match or the least bad of a bad batch. Thresholding it
|
|
284
|
+
* meant every document found a home and "a document with no home stays put" could never
|
|
285
|
+
* fire — routing looked like it worked and was in fact unconditional.
|
|
286
|
+
*/
|
|
287
|
+
async function route(ctx, input, named) {
|
|
288
|
+
const result = await recall(ctx, {
|
|
289
|
+
// Title, type and summary — and deliberately *not* the document's raw text.
|
|
290
|
+
//
|
|
291
|
+
// Measured on a real 223-page knowledge base: adding 400 characters of extracted text
|
|
292
|
+
// collapsed the spread across candidate folders from 0.49 to 0.014, with everything
|
|
293
|
+
// sitting at 0.98–0.99. A query that long resembles everything a little, so nothing
|
|
294
|
+
// can fail `route_threshold` and the winner is decided by noise — a water bill was
|
|
295
|
+
// filed under `travel/2026` while the folder holding its own previous statement did
|
|
296
|
+
// not make the top eight. The threshold was not too low; the query made it unusable.
|
|
297
|
+
query: routingQuery(named),
|
|
298
|
+
mode: 'lookup',
|
|
299
|
+
limit: 8,
|
|
300
|
+
depth: 'summary',
|
|
301
|
+
// The query *is* the document's own summary. Asking a model to rewrite it costs a
|
|
302
|
+
// round trip and cannot improve on the thing being matched.
|
|
303
|
+
expand: false,
|
|
304
|
+
});
|
|
305
|
+
const pages = result.results.filter((entry) => entry.type === 'page');
|
|
306
|
+
const related = pages.map((page) => page.slug);
|
|
307
|
+
// An explicit destination is the caller's decision, not a guess to second-guess.
|
|
308
|
+
if (input.folder) {
|
|
309
|
+
return { kind: 'folder', folder: input.folder.replace(/\/+$/, ''), related };
|
|
310
|
+
}
|
|
311
|
+
const scored = new Map();
|
|
312
|
+
for (const card of pages) {
|
|
313
|
+
if (!card.slug.includes('/'))
|
|
314
|
+
continue;
|
|
315
|
+
if (card.relevance === undefined)
|
|
316
|
+
continue;
|
|
317
|
+
const folder = card.slug.slice(0, card.slug.lastIndexOf('/'));
|
|
318
|
+
// Best relevance wins per folder rather than a sum: three weak pages in one folder
|
|
319
|
+
// should not outvote one strong page elsewhere.
|
|
320
|
+
scored.set(folder, Math.max(scored.get(folder) ?? 0, card.relevance));
|
|
321
|
+
}
|
|
322
|
+
const ranked = [...scored.entries()].sort((a, b) => b[1] - a[1]);
|
|
323
|
+
const nearest = ranked.length > 0
|
|
324
|
+
? ranked.slice(0, 5).map(([folder]) => folder)
|
|
325
|
+
: [...new Set(pages.map((card) => card.slug.split('/')[0]))].slice(0, 5);
|
|
326
|
+
// Folders the *evidence* supports. Everything below is chosen from this set and never
|
|
327
|
+
// from outside it, which is the whole content of the threshold.
|
|
328
|
+
const clears = ranked.filter(([, relevance]) => relevance >= ctx.config.routeThreshold);
|
|
329
|
+
if (clears.length > 0) {
|
|
330
|
+
// The model's suggestion is a tie-breaker among folders that already cleared, not a
|
|
331
|
+
// candidate of its own. Two independent signals agreeing is worth more than the
|
|
332
|
+
// ranking's own margin, which between neighbours is often a rounding error.
|
|
333
|
+
const seconded = clears.find(([folder]) => folder === named.suggestedFolder);
|
|
334
|
+
return { kind: 'folder', folder: (seconded ?? clears[0])[0], related };
|
|
335
|
+
}
|
|
336
|
+
// Nothing cleared. The suggestion does **not** get to overrule that.
|
|
337
|
+
//
|
|
338
|
+
// It used to: below the threshold, routing fell through to whatever folder the
|
|
339
|
+
// model had named. On a real knowledge base that filed a water bill into an employment
|
|
340
|
+
// folder — `receipts/` was the top-scoring folder at 0.383 against a threshold of 0.5,
|
|
341
|
+
// the refusal was correct, and the fallback then overrode it with a signal weaker than
|
|
342
|
+
// the one that had just been rejected. There are exactly two outcomes here, and
|
|
343
|
+
// "somewhere plausible" is not one of them: a misfiled document is a lost one.
|
|
344
|
+
return { kind: 'unrouted', nearest, related };
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* What routing asks about: what the document *is*, not what it says.
|
|
348
|
+
*
|
|
349
|
+
* Exported so the shape is pinned by a test. It is a one-line function guarding a
|
|
350
|
+
* measured cliff — see `route` above — and one well-meant "include a bit of the text for
|
|
351
|
+
* context" edit puts every folder back at 0.99.
|
|
352
|
+
*/
|
|
353
|
+
export function routingQuery(named) {
|
|
354
|
+
return [named.title, named.type, named.summary].filter(Boolean).join('. ');
|
|
355
|
+
}
|
|
356
|
+
function proposeDestination(ctx, named, nearest, file) {
|
|
357
|
+
const id = newPrefixedId('prop');
|
|
358
|
+
ctx.store.db
|
|
359
|
+
.prepare(`INSERT INTO proposals(id, at, kind, reason, subject, payload, nearest, status)
|
|
360
|
+
VALUES(?, ?, 'ingest', ?, ?, ?, ?, 'pending')`)
|
|
361
|
+
.run(id, new Date().toISOString(), `where does "${named.title}" go?`, named.slug,
|
|
362
|
+
// Enough to replay on approval. A fetched temp file is gone by then, which is why
|
|
363
|
+
// a URL ingest records the URL instead of the path.
|
|
364
|
+
JSON.stringify(file.sourceUrl ? { url: file.sourceUrl } : { path: file.source }), JSON.stringify(nearest));
|
|
365
|
+
return { proposal_id: id, reason: `"${named.title}" — ${named.summary}`, nearest };
|
|
366
|
+
}
|
|
367
|
+
// ─── Page composition ───────────────────────────────────────────────────────
|
|
368
|
+
/**
|
|
369
|
+
* A short writeup and a pointer to the file — **not** the file's text.
|
|
370
|
+
*
|
|
371
|
+
* The extracted text used to be pasted in below a `<!-- reference -->` fence, and it was a
|
|
372
|
+
* copy: document text is invalidated by the *file* hash, which a page body cannot honour,
|
|
373
|
+
* and indexing the same words twice made every match inside a document arrive as two hits
|
|
374
|
+
* against one budget. The text is indexed against the document instead, where a hit can
|
|
375
|
+
* name the page within the PDF that produced it. What the reader gets here is what a
|
|
376
|
+
* person would have written: what it is, and where the thing itself lives.
|
|
377
|
+
*/
|
|
378
|
+
function composePage(options) {
|
|
379
|
+
const { named, extraction } = options;
|
|
380
|
+
const front = [`title: ${titleCase(named.title)}`];
|
|
381
|
+
if (named.type)
|
|
382
|
+
front.push(`type: ${named.type}`);
|
|
383
|
+
// Frontmatter, not prose: a URL is machine-readable provenance, and every key Akno does
|
|
384
|
+
// not own is preserved untouched, so adding one of its own here is safe.
|
|
385
|
+
if (options.sourceUrl)
|
|
386
|
+
front.push(`source_url: ${options.sourceUrl}`);
|
|
387
|
+
const facts = provenanceLines(extraction);
|
|
388
|
+
if (options.label)
|
|
389
|
+
facts.push(`- Label: ${options.label}`);
|
|
390
|
+
return (`---\n${front.join('\n')}\n---\n\n` +
|
|
391
|
+
`# ${titleCase(named.title)}\n\n` +
|
|
392
|
+
`${named.summary}\n\n` +
|
|
393
|
+
`![[${options.attachment}]]\n` +
|
|
394
|
+
(facts.length > 0 ? `\n${facts.join('\n')}\n` : ''));
|
|
395
|
+
}
|
|
396
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
397
|
+
/**
|
|
398
|
+
* Only the first letter. A model asked for a title often answers in lowercase, and
|
|
399
|
+
* `# car rental invoice` reads as sloppy beside pages a person wrote — but title-casing
|
|
400
|
+
* every word would mangle `Zephyr QX-100` and proper nouns the model got right.
|
|
401
|
+
*/
|
|
402
|
+
function titleCase(title) {
|
|
403
|
+
return title.charAt(0).toUpperCase() + title.slice(1);
|
|
404
|
+
}
|
|
405
|
+
function existingFolders(ctx) {
|
|
406
|
+
const rows = ctx.store.db.prepare("SELECT slug FROM pages WHERE instr(slug, '/') > 0").all();
|
|
407
|
+
const folders = new Set();
|
|
408
|
+
for (const row of rows)
|
|
409
|
+
folders.add(row.slug.slice(0, row.slug.lastIndexOf('/')));
|
|
410
|
+
for (const folder of physicalFolders(ctx.config))
|
|
411
|
+
folders.add(folder);
|
|
412
|
+
for (const rule of ctx.config.rules) {
|
|
413
|
+
const folder = rule.glob.replace(/\/\*+$/, '');
|
|
414
|
+
if (folder &&
|
|
415
|
+
!folder.includes('*') &&
|
|
416
|
+
effectiveRule(`${folder}/x`, ctx.config.rules).role !== 'ignored') {
|
|
417
|
+
folders.add(folder);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return [...folders].sort();
|
|
421
|
+
}
|
|
422
|
+
/** Content addressing makes attachments unique; page slugs still have to be. */
|
|
423
|
+
async function uniqueSlug(ctx, slug) {
|
|
424
|
+
const taken = ctx.store.db.prepare('SELECT 1 FROM pages WHERE slug = ?');
|
|
425
|
+
if (!taken.get(slug))
|
|
426
|
+
return slug;
|
|
427
|
+
for (let suffix = 2; suffix < 100; suffix++) {
|
|
428
|
+
const candidate = `${slug}-${suffix}`;
|
|
429
|
+
if (!taken.get(candidate))
|
|
430
|
+
return candidate;
|
|
431
|
+
}
|
|
432
|
+
throw new AknoError('invalid', `could not find a free slug near ${slug}`);
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/ops/ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ListOutput } from '@tenphi/akno-protocol';
|
|
2
|
+
import type { AknoContext } from '../context.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Browse structure rather than search it. The point of this op is that an agent
|
|
5
|
+
* that knows what folders exist stops guessing slugs: choosing one and avoiding a duplicate
|
|
6
|
+
* page is much easier when the structure is legible.
|
|
7
|
+
*/
|
|
8
|
+
export declare function list(ctx: AknoContext, rawInput: unknown): Promise<ListOutput>;
|
|
9
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/ops/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,UAAU,EAAiB,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjD;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAOnF"}
|