@tenphi/akno-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +83 -0
- package/README.md +26 -0
- package/config/default.jsonc +548 -0
- package/dist/bench/answer-corpus.d.ts +48 -0
- package/dist/bench/answer-corpus.d.ts.map +1 -0
- package/dist/bench/answer-corpus.js +491 -0
- package/dist/bench/answer-corpus.js.map +1 -0
- package/dist/bench/answer.d.ts +156 -0
- package/dist/bench/answer.d.ts.map +1 -0
- package/dist/bench/answer.js +608 -0
- package/dist/bench/answer.js.map +1 -0
- package/dist/bench/auto-recall-answer-corpus.d.ts +21 -0
- package/dist/bench/auto-recall-answer-corpus.d.ts.map +1 -0
- package/dist/bench/auto-recall-answer-corpus.js +245 -0
- package/dist/bench/auto-recall-answer-corpus.js.map +1 -0
- package/dist/bench/auto-recall-answer.d.ts +198 -0
- package/dist/bench/auto-recall-answer.d.ts.map +1 -0
- package/dist/bench/auto-recall-answer.js +720 -0
- package/dist/bench/auto-recall-answer.js.map +1 -0
- package/dist/bench/auto-recall-corpus.d.ts +45 -0
- package/dist/bench/auto-recall-corpus.d.ts.map +1 -0
- package/dist/bench/auto-recall-corpus.js +221 -0
- package/dist/bench/auto-recall-corpus.js.map +1 -0
- package/dist/bench/auto-recall.d.ts +171 -0
- package/dist/bench/auto-recall.d.ts.map +1 -0
- package/dist/bench/auto-recall.js +651 -0
- package/dist/bench/auto-recall.js.map +1 -0
- package/dist/bench/entity-resolution.d.ts +37 -0
- package/dist/bench/entity-resolution.d.ts.map +1 -0
- package/dist/bench/entity-resolution.js +121 -0
- package/dist/bench/entity-resolution.js.map +1 -0
- package/dist/bench/graph.d.ts +57 -0
- package/dist/bench/graph.d.ts.map +1 -0
- package/dist/bench/graph.js +573 -0
- package/dist/bench/graph.js.map +1 -0
- package/dist/bench/llm-ranking-probe.d.ts +27 -0
- package/dist/bench/llm-ranking-probe.d.ts.map +1 -0
- package/dist/bench/llm-ranking-probe.js +105 -0
- package/dist/bench/llm-ranking-probe.js.map +1 -0
- package/dist/bench/merge-discovery-corpus.d.ts +26 -0
- package/dist/bench/merge-discovery-corpus.d.ts.map +1 -0
- package/dist/bench/merge-discovery-corpus.js +114 -0
- package/dist/bench/merge-discovery-corpus.js.map +1 -0
- package/dist/bench/merge-discovery-review.d.ts +81 -0
- package/dist/bench/merge-discovery-review.d.ts.map +1 -0
- package/dist/bench/merge-discovery-review.js +149 -0
- package/dist/bench/merge-discovery-review.js.map +1 -0
- package/dist/bench/merge-discovery.d.ts +122 -0
- package/dist/bench/merge-discovery.d.ts.map +1 -0
- package/dist/bench/merge-discovery.js +390 -0
- package/dist/bench/merge-discovery.js.map +1 -0
- package/dist/bench/mixed-retrieval.d.ts +35 -0
- package/dist/bench/mixed-retrieval.d.ts.map +1 -0
- package/dist/bench/mixed-retrieval.js +355 -0
- package/dist/bench/mixed-retrieval.js.map +1 -0
- package/dist/bench/ranking-corpus.d.ts +29 -0
- package/dist/bench/ranking-corpus.d.ts.map +1 -0
- package/dist/bench/ranking-corpus.js +514 -0
- package/dist/bench/ranking-corpus.js.map +1 -0
- package/dist/bench/ranking-end-to-end.d.ts +112 -0
- package/dist/bench/ranking-end-to-end.d.ts.map +1 -0
- package/dist/bench/ranking-end-to-end.js +479 -0
- package/dist/bench/ranking-end-to-end.js.map +1 -0
- package/dist/bench/ranking-latency.d.ts +71 -0
- package/dist/bench/ranking-latency.d.ts.map +1 -0
- package/dist/bench/ranking-latency.js +130 -0
- package/dist/bench/ranking-latency.js.map +1 -0
- package/dist/bench/ranking-matrix.d.ts +141 -0
- package/dist/bench/ranking-matrix.d.ts.map +1 -0
- package/dist/bench/ranking-matrix.js +526 -0
- package/dist/bench/ranking-matrix.js.map +1 -0
- package/dist/bench/ranking-review.d.ts +93 -0
- package/dist/bench/ranking-review.d.ts.map +1 -0
- package/dist/bench/ranking-review.js +249 -0
- package/dist/bench/ranking-review.js.map +1 -0
- package/dist/bench/ranking.d.ts +122 -0
- package/dist/bench/ranking.d.ts.map +1 -0
- package/dist/bench/ranking.js +547 -0
- package/dist/bench/ranking.js.map +1 -0
- package/dist/bench.d.ts +60 -0
- package/dist/bench.d.ts.map +1 -0
- package/dist/bench.js +167 -0
- package/dist/bench.js.map +1 -0
- package/dist/config/jsonc.d.ts +8 -0
- package/dist/config/jsonc.d.ts.map +1 -0
- package/dist/config/jsonc.js +85 -0
- package/dist/config/jsonc.js.map +1 -0
- package/dist/config/load.d.ts +43 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +608 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/paths.d.ts +10 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +38 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +698 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +394 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/write-rules.d.ts +41 -0
- package/dist/config/write-rules.d.ts.map +1 -0
- package/dist/config/write-rules.js +225 -0
- package/dist/config/write-rules.js.map +1 -0
- package/dist/config/write-setup.d.ts +42 -0
- package/dist/config/write-setup.d.ts.map +1 -0
- package/dist/config/write-setup.js +358 -0
- package/dist/config/write-setup.js.map +1 -0
- package/dist/context.d.ts +64 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +14 -0
- package/dist/context.js.map +1 -0
- package/dist/doctor.d.ts +115 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +388 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index/chunk.d.ts +62 -0
- package/dist/index/chunk.d.ts.map +1 -0
- package/dist/index/chunk.js +307 -0
- package/dist/index/chunk.js.map +1 -0
- package/dist/index/defer.d.ts +32 -0
- package/dist/index/defer.d.ts.map +1 -0
- package/dist/index/defer.js +66 -0
- package/dist/index/defer.js.map +1 -0
- package/dist/index/derive.d.ts +99 -0
- package/dist/index/derive.d.ts.map +1 -0
- package/dist/index/derive.js +378 -0
- package/dist/index/derive.js.map +1 -0
- package/dist/index/entity-resolution.d.ts +68 -0
- package/dist/index/entity-resolution.d.ts.map +1 -0
- package/dist/index/entity-resolution.js +305 -0
- package/dist/index/entity-resolution.js.map +1 -0
- package/dist/index/graph.d.ts +46 -0
- package/dist/index/graph.d.ts.map +1 -0
- package/dist/index/graph.js +618 -0
- package/dist/index/graph.js.map +1 -0
- package/dist/index/indexer.d.ts +301 -0
- package/dist/index/indexer.d.ts.map +1 -0
- package/dist/index/indexer.js +1398 -0
- package/dist/index/indexer.js.map +1 -0
- package/dist/index/revision-barrier.d.ts +30 -0
- package/dist/index/revision-barrier.d.ts.map +1 -0
- package/dist/index/revision-barrier.js +140 -0
- package/dist/index/revision-barrier.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/adoption-eligibility.d.ts +4 -0
- package/dist/ingest/adoption-eligibility.d.ts.map +1 -0
- package/dist/ingest/adoption-eligibility.js +18 -0
- package/dist/ingest/adoption-eligibility.js.map +1 -0
- package/dist/ingest/availability.d.ts +15 -0
- package/dist/ingest/availability.d.ts.map +1 -0
- package/dist/ingest/availability.js +37 -0
- package/dist/ingest/availability.js.map +1 -0
- package/dist/ingest/extract.d.ts +58 -0
- package/dist/ingest/extract.d.ts.map +1 -0
- package/dist/ingest/extract.js +255 -0
- package/dist/ingest/extract.js.map +1 -0
- package/dist/ingest/fetch.d.ts +35 -0
- package/dist/ingest/fetch.d.ts.map +1 -0
- package/dist/ingest/fetch.js +142 -0
- package/dist/ingest/fetch.js.map +1 -0
- package/dist/ingest/inbox.d.ts +53 -0
- package/dist/ingest/inbox.d.ts.map +1 -0
- package/dist/ingest/inbox.js +110 -0
- package/dist/ingest/inbox.js.map +1 -0
- package/dist/ingest/name.d.ts +72 -0
- package/dist/ingest/name.d.ts.map +1 -0
- package/dist/ingest/name.js +208 -0
- package/dist/ingest/name.js.map +1 -0
- package/dist/ingest/parts.d.ts +78 -0
- package/dist/ingest/parts.d.ts.map +1 -0
- package/dist/ingest/parts.js +52 -0
- package/dist/ingest/parts.js.map +1 -0
- package/dist/ingest/rendition.d.ts +75 -0
- package/dist/ingest/rendition.d.ts.map +1 -0
- package/dist/ingest/rendition.js +92 -0
- package/dist/ingest/rendition.js.map +1 -0
- package/dist/ingest/store.d.ts +66 -0
- package/dist/ingest/store.d.ts.map +1 -0
- package/dist/ingest/store.js +92 -0
- package/dist/ingest/store.js.map +1 -0
- package/dist/kb/folders.d.ts +37 -0
- package/dist/kb/folders.d.ts.map +1 -0
- package/dist/kb/folders.js +133 -0
- package/dist/kb/folders.js.map +1 -0
- package/dist/kb/frontmatter.d.ts +91 -0
- package/dist/kb/frontmatter.d.ts.map +1 -0
- package/dist/kb/frontmatter.js +274 -0
- package/dist/kb/frontmatter.js.map +1 -0
- package/dist/kb/line-facts.d.ts +29 -0
- package/dist/kb/line-facts.d.ts.map +1 -0
- package/dist/kb/line-facts.js +23 -0
- package/dist/kb/line-facts.js.map +1 -0
- package/dist/kb/page.d.ts +92 -0
- package/dist/kb/page.d.ts.map +1 -0
- package/dist/kb/page.js +243 -0
- package/dist/kb/page.js.map +1 -0
- package/dist/kb/scan.d.ts +38 -0
- package/dist/kb/scan.d.ts.map +1 -0
- package/dist/kb/scan.js +109 -0
- package/dist/kb/scan.js.map +1 -0
- package/dist/kb/words.d.ts +30 -0
- package/dist/kb/words.d.ts.map +1 -0
- package/dist/kb/words.js +107 -0
- package/dist/kb/words.js.map +1 -0
- package/dist/maintenance/adopt.d.ts +65 -0
- package/dist/maintenance/adopt.d.ts.map +1 -0
- package/dist/maintenance/adopt.js +238 -0
- package/dist/maintenance/adopt.js.map +1 -0
- package/dist/maintenance/budget.d.ts +55 -0
- package/dist/maintenance/budget.d.ts.map +1 -0
- package/dist/maintenance/budget.js +61 -0
- package/dist/maintenance/budget.js.map +1 -0
- package/dist/maintenance/conflicts.d.ts +105 -0
- package/dist/maintenance/conflicts.d.ts.map +1 -0
- package/dist/maintenance/conflicts.js +368 -0
- package/dist/maintenance/conflicts.js.map +1 -0
- package/dist/maintenance/contradictions.d.ts +34 -0
- package/dist/maintenance/contradictions.d.ts.map +1 -0
- package/dist/maintenance/contradictions.js +199 -0
- package/dist/maintenance/contradictions.js.map +1 -0
- package/dist/maintenance/curate.d.ts +156 -0
- package/dist/maintenance/curate.d.ts.map +1 -0
- package/dist/maintenance/curate.js +2070 -0
- package/dist/maintenance/curate.js.map +1 -0
- package/dist/maintenance/dream.d.ts +139 -0
- package/dist/maintenance/dream.d.ts.map +1 -0
- package/dist/maintenance/dream.js +1632 -0
- package/dist/maintenance/dream.js.map +1 -0
- package/dist/maintenance/graph-candidates.d.ts +19 -0
- package/dist/maintenance/graph-candidates.d.ts.map +1 -0
- package/dist/maintenance/graph-candidates.js +120 -0
- package/dist/maintenance/graph-candidates.js.map +1 -0
- package/dist/maintenance/housekeeping.d.ts +81 -0
- package/dist/maintenance/housekeeping.d.ts.map +1 -0
- package/dist/maintenance/housekeeping.js +281 -0
- package/dist/maintenance/housekeeping.js.map +1 -0
- package/dist/maintenance/link-repairs.d.ts +58 -0
- package/dist/maintenance/link-repairs.d.ts.map +1 -0
- package/dist/maintenance/link-repairs.js +281 -0
- package/dist/maintenance/link-repairs.js.map +1 -0
- package/dist/maintenance/log.d.ts +41 -0
- package/dist/maintenance/log.d.ts.map +1 -0
- package/dist/maintenance/log.js +72 -0
- package/dist/maintenance/log.js.map +1 -0
- package/dist/maintenance/managed-item-routing.d.ts +48 -0
- package/dist/maintenance/managed-item-routing.d.ts.map +1 -0
- package/dist/maintenance/managed-item-routing.js +281 -0
- package/dist/maintenance/managed-item-routing.js.map +1 -0
- package/dist/maintenance/managed-item-sources.d.ts +38 -0
- package/dist/maintenance/managed-item-sources.d.ts.map +1 -0
- package/dist/maintenance/managed-item-sources.js +324 -0
- package/dist/maintenance/managed-item-sources.js.map +1 -0
- package/dist/maintenance/managed-items.d.ts +162 -0
- package/dist/maintenance/managed-items.d.ts.map +1 -0
- package/dist/maintenance/managed-items.js +1329 -0
- package/dist/maintenance/managed-items.js.map +1 -0
- package/dist/maintenance/merge-classifier.d.ts +19 -0
- package/dist/maintenance/merge-classifier.d.ts.map +1 -0
- package/dist/maintenance/merge-classifier.js +49 -0
- package/dist/maintenance/merge-classifier.js.map +1 -0
- package/dist/maintenance/model-telemetry.d.ts +45 -0
- package/dist/maintenance/model-telemetry.d.ts.map +1 -0
- package/dist/maintenance/model-telemetry.js +107 -0
- package/dist/maintenance/model-telemetry.js.map +1 -0
- package/dist/maintenance/observe.d.ts +72 -0
- package/dist/maintenance/observe.d.ts.map +1 -0
- package/dist/maintenance/observe.js +265 -0
- package/dist/maintenance/observe.js.map +1 -0
- package/dist/maintenance/path-policy.d.ts +83 -0
- package/dist/maintenance/path-policy.d.ts.map +1 -0
- package/dist/maintenance/path-policy.js +360 -0
- package/dist/maintenance/path-policy.js.map +1 -0
- package/dist/maintenance/plans.d.ts +366 -0
- package/dist/maintenance/plans.d.ts.map +1 -0
- package/dist/maintenance/plans.js +4060 -0
- package/dist/maintenance/plans.js.map +1 -0
- package/dist/maintenance/profile.d.ts +33 -0
- package/dist/maintenance/profile.d.ts.map +1 -0
- package/dist/maintenance/profile.js +99 -0
- package/dist/maintenance/profile.js.map +1 -0
- package/dist/maintenance/recovery.d.ts +38 -0
- package/dist/maintenance/recovery.d.ts.map +1 -0
- package/dist/maintenance/recovery.js +217 -0
- package/dist/maintenance/recovery.js.map +1 -0
- package/dist/maintenance/repair.d.ts +37 -0
- package/dist/maintenance/repair.d.ts.map +1 -0
- package/dist/maintenance/repair.js +183 -0
- package/dist/maintenance/repair.js.map +1 -0
- package/dist/maintenance/rule-drift.d.ts +104 -0
- package/dist/maintenance/rule-drift.d.ts.map +1 -0
- package/dist/maintenance/rule-drift.js +507 -0
- package/dist/maintenance/rule-drift.js.map +1 -0
- package/dist/maintenance/run-verification.d.ts +44 -0
- package/dist/maintenance/run-verification.d.ts.map +1 -0
- package/dist/maintenance/run-verification.js +253 -0
- package/dist/maintenance/run-verification.js.map +1 -0
- package/dist/maintenance/runs.d.ts +142 -0
- package/dist/maintenance/runs.d.ts.map +1 -0
- package/dist/maintenance/runs.js +439 -0
- package/dist/maintenance/runs.js.map +1 -0
- package/dist/maintenance/semantic-merge-discovery.d.ts +54 -0
- package/dist/maintenance/semantic-merge-discovery.d.ts.map +1 -0
- package/dist/maintenance/semantic-merge-discovery.js +308 -0
- package/dist/maintenance/semantic-merge-discovery.js.map +1 -0
- package/dist/maintenance/temporal.d.ts +44 -0
- package/dist/maintenance/temporal.d.ts.map +1 -0
- package/dist/maintenance/temporal.js +295 -0
- package/dist/maintenance/temporal.js.map +1 -0
- package/dist/models/client.d.ts +214 -0
- package/dist/models/client.d.ts.map +1 -0
- package/dist/models/client.js +904 -0
- package/dist/models/client.js.map +1 -0
- package/dist/models/provider-api.d.ts +28 -0
- package/dist/models/provider-api.d.ts.map +1 -0
- package/dist/models/provider-api.js +320 -0
- package/dist/models/provider-api.js.map +1 -0
- package/dist/open.d.ts +163 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +382 -0
- package/dist/open.js.map +1 -0
- package/dist/ops/adopt.d.ts +12 -0
- package/dist/ops/adopt.d.ts.map +1 -0
- package/dist/ops/adopt.js +138 -0
- package/dist/ops/adopt.js.map +1 -0
- package/dist/ops/answer.d.ts +29 -0
- package/dist/ops/answer.d.ts.map +1 -0
- package/dist/ops/answer.js +557 -0
- package/dist/ops/answer.js.map +1 -0
- package/dist/ops/context.d.ts +18 -0
- package/dist/ops/context.d.ts.map +1 -0
- package/dist/ops/context.js +713 -0
- package/dist/ops/context.js.map +1 -0
- package/dist/ops/folder.d.ts +23 -0
- package/dist/ops/folder.d.ts.map +1 -0
- package/dist/ops/folder.js +130 -0
- package/dist/ops/folder.js.map +1 -0
- package/dist/ops/forget.d.ts +14 -0
- package/dist/ops/forget.d.ts.map +1 -0
- package/dist/ops/forget.js +212 -0
- package/dist/ops/forget.js.map +1 -0
- package/dist/ops/graph.d.ts +10 -0
- package/dist/ops/graph.d.ts.map +1 -0
- package/dist/ops/graph.js +480 -0
- package/dist/ops/graph.js.map +1 -0
- package/dist/ops/ingest.d.ts +40 -0
- package/dist/ops/ingest.d.ts.map +1 -0
- package/dist/ops/ingest.js +434 -0
- package/dist/ops/ingest.js.map +1 -0
- package/dist/ops/list.d.ts +9 -0
- package/dist/ops/list.d.ts.map +1 -0
- package/dist/ops/list.js +217 -0
- package/dist/ops/list.js.map +1 -0
- package/dist/ops/move.d.ts +20 -0
- package/dist/ops/move.d.ts.map +1 -0
- package/dist/ops/move.js +173 -0
- package/dist/ops/move.js.map +1 -0
- package/dist/ops/read.d.ts +9 -0
- package/dist/ops/read.d.ts.map +1 -0
- package/dist/ops/read.js +271 -0
- package/dist/ops/read.js.map +1 -0
- package/dist/ops/recall.d.ts +13 -0
- package/dist/ops/recall.d.ts.map +1 -0
- package/dist/ops/recall.js +297 -0
- package/dist/ops/recall.js.map +1 -0
- package/dist/ops/remember.d.ts +34 -0
- package/dist/ops/remember.d.ts.map +1 -0
- package/dist/ops/remember.js +660 -0
- package/dist/ops/remember.js.map +1 -0
- package/dist/ops/timeline.d.ts +11 -0
- package/dist/ops/timeline.d.ts.map +1 -0
- package/dist/ops/timeline.js +111 -0
- package/dist/ops/timeline.js.map +1 -0
- package/dist/ops/undo.d.ts +9 -0
- package/dist/ops/undo.d.ts.map +1 -0
- package/dist/ops/undo.js +38 -0
- package/dist/ops/undo.js.map +1 -0
- package/dist/ops/write.d.ts +55 -0
- package/dist/ops/write.d.ts.map +1 -0
- package/dist/ops/write.js +463 -0
- package/dist/ops/write.js.map +1 -0
- package/dist/recall/assemble.d.ts +81 -0
- package/dist/recall/assemble.d.ts.map +1 -0
- package/dist/recall/assemble.js +603 -0
- package/dist/recall/assemble.js.map +1 -0
- package/dist/recall/expand.d.ts +55 -0
- package/dist/recall/expand.d.ts.map +1 -0
- package/dist/recall/expand.js +282 -0
- package/dist/recall/expand.js.map +1 -0
- package/dist/recall/graph-arm.d.ts +17 -0
- package/dist/recall/graph-arm.d.ts.map +1 -0
- package/dist/recall/graph-arm.js +227 -0
- package/dist/recall/graph-arm.js.map +1 -0
- package/dist/recall/llm-rerank.d.ts +55 -0
- package/dist/recall/llm-rerank.d.ts.map +1 -0
- package/dist/recall/llm-rerank.js +213 -0
- package/dist/recall/llm-rerank.js.map +1 -0
- package/dist/recall/reranker-calibration.d.ts +23 -0
- package/dist/recall/reranker-calibration.d.ts.map +1 -0
- package/dist/recall/reranker-calibration.js +161 -0
- package/dist/recall/reranker-calibration.js.map +1 -0
- package/dist/recall/search.d.ts +107 -0
- package/dist/recall/search.d.ts.map +1 -0
- package/dist/recall/search.js +530 -0
- package/dist/recall/search.js.map +1 -0
- package/dist/reserved.d.ts +39 -0
- package/dist/reserved.d.ts.map +1 -0
- package/dist/reserved.js +63 -0
- package/dist/reserved.js.map +1 -0
- package/dist/rules/compile.d.ts +27 -0
- package/dist/rules/compile.d.ts.map +1 -0
- package/dist/rules/compile.js +105 -0
- package/dist/rules/compile.js.map +1 -0
- package/dist/setup/model-free.d.ts +15 -0
- package/dist/setup/model-free.d.ts.map +1 -0
- package/dist/setup/model-free.js +26 -0
- package/dist/setup/model-free.js.map +1 -0
- package/dist/setup/openai.d.ts +46 -0
- package/dist/setup/openai.d.ts.map +1 -0
- package/dist/setup/openai.js +165 -0
- package/dist/setup/openai.js.map +1 -0
- package/dist/store/db.d.ts +61 -0
- package/dist/store/db.d.ts.map +1 -0
- package/dist/store/db.js +265 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/ids.d.ts +29 -0
- package/dist/store/ids.d.ts.map +1 -0
- package/dist/store/ids.js +0 -0
- package/dist/store/ids.js.map +1 -0
- package/dist/store/migrations.d.ts +54 -0
- package/dist/store/migrations.d.ts.map +1 -0
- package/dist/store/migrations.js +923 -0
- package/dist/store/migrations.js.map +1 -0
- package/dist/store/vectors.d.ts +34 -0
- package/dist/store/vectors.d.ts.map +1 -0
- package/dist/store/vectors.js +158 -0
- package/dist/store/vectors.js.map +1 -0
- package/dist/timeline/documents.d.ts +23 -0
- package/dist/timeline/documents.d.ts.map +1 -0
- package/dist/timeline/documents.js +262 -0
- package/dist/timeline/documents.js.map +1 -0
- package/dist/watch/watcher.d.ts +43 -0
- package/dist/watch/watcher.d.ts.map +1 -0
- package/dist/watch/watcher.js +143 -0
- package/dist/watch/watcher.js.map +1 -0
- package/dist/write/atomic.d.ts +34 -0
- package/dist/write/atomic.d.ts.map +1 -0
- package/dist/write/atomic.js +58 -0
- package/dist/write/atomic.js.map +1 -0
- package/dist/write/conflict.d.ts +43 -0
- package/dist/write/conflict.d.ts.map +1 -0
- package/dist/write/conflict.js +149 -0
- package/dist/write/conflict.js.map +1 -0
- package/dist/write/edit.d.ts +59 -0
- package/dist/write/edit.d.ts.map +1 -0
- package/dist/write/edit.js +231 -0
- package/dist/write/edit.js.map +1 -0
- package/dist/write/gate.d.ts +59 -0
- package/dist/write/gate.d.ts.map +1 -0
- package/dist/write/gate.js +99 -0
- package/dist/write/gate.js.map +1 -0
- package/dist/write/journal.d.ts +90 -0
- package/dist/write/journal.d.ts.map +1 -0
- package/dist/write/journal.js +187 -0
- package/dist/write/journal.js.map +1 -0
- package/dist/write/ledger.d.ts +28 -0
- package/dist/write/ledger.d.ts.map +1 -0
- package/dist/write/ledger.js +141 -0
- package/dist/write/ledger.js.map +1 -0
- package/dist/write/placement.d.ts +29 -0
- package/dist/write/placement.d.ts.map +1 -0
- package/dist/write/placement.js +140 -0
- package/dist/write/placement.js.map +1 -0
- package/dist/write/remember-fallback.d.ts +18 -0
- package/dist/write/remember-fallback.d.ts.map +1 -0
- package/dist/write/remember-fallback.js +48 -0
- package/dist/write/remember-fallback.js.map +1 -0
- package/dist/write/retain.d.ts +61 -0
- package/dist/write/retain.d.ts.map +1 -0
- package/dist/write/retain.js +272 -0
- package/dist/write/retain.js.map +1 -0
- package/package.json +50 -0
- package/swift/extract.swift +232 -0
package/dist/kb/page.js
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { parseFrontmatter, readString, readTags } from "./frontmatter.js";
|
|
3
|
+
import { sha256 } from "../store/ids.js";
|
|
4
|
+
/**
|
|
5
|
+
* Reserved markers inside a page. This is the complete list — everything
|
|
6
|
+
* else in a body is prose Akno does not interpret.
|
|
7
|
+
*/
|
|
8
|
+
const SOURCE_FENCE = /^<!--\s*source\s*-->\s*$/i;
|
|
9
|
+
export const AKNO_ITEM = /^\s*<!--\s*akno:item\s+(.+?)\s*-->\s*$/i;
|
|
10
|
+
export function aknoItemId(line) {
|
|
11
|
+
const match = AKNO_ITEM.exec(line);
|
|
12
|
+
const id = match?.[1]?.trim().split(/\s+/)[0] ?? null;
|
|
13
|
+
return id && /^[A-Za-z0-9_-]{4,80}$/.test(id) ? id : null;
|
|
14
|
+
}
|
|
15
|
+
/** `- **2026-06-02** | Renewed the apartment lease. [[home/lease]]` */
|
|
16
|
+
const EVENT_LINE = /^\s*[-*]\s+\*\*(\d{4}-\d{2}-\d{2})\*\*\s*\|\s*(.+?)\s*$/;
|
|
17
|
+
const WIKILINK = /\[\[([^\]|#]+)(?:[#|][^\]]*)?\]\]/g;
|
|
18
|
+
const MARKDOWN_LINK = /\[[^\]]*\]\(([^)\s]+\.md)(?:#[^)]*)?\)/g;
|
|
19
|
+
/** `<page-basename>-<8 hex>.<ext>` is read as an attachment of that page. */
|
|
20
|
+
export const ATTACHMENT_NAME = /^(.+)-([0-9a-f]{8})\.([A-Za-z0-9]+)$/;
|
|
21
|
+
export function parsePage(relPath, content) {
|
|
22
|
+
const frontmatter = parseFrontmatter(content);
|
|
23
|
+
const body = content.slice(frontmatter.bodyOffset);
|
|
24
|
+
const lines = body.split('\n');
|
|
25
|
+
const bodyLine = frontmatter.bodyLine;
|
|
26
|
+
const slug = relPathToSlug(relPath);
|
|
27
|
+
let sourceFenceLine = null;
|
|
28
|
+
const events = [];
|
|
29
|
+
const links = [];
|
|
30
|
+
for (let i = 0; i < lines.length; i++) {
|
|
31
|
+
const raw = lines[i];
|
|
32
|
+
const absoluteLine = bodyLine + i;
|
|
33
|
+
if (sourceFenceLine === null && SOURCE_FENCE.test(raw)) {
|
|
34
|
+
sourceFenceLine = absoluteLine;
|
|
35
|
+
}
|
|
36
|
+
const event = EVENT_LINE.exec(raw);
|
|
37
|
+
if (event) {
|
|
38
|
+
const summary = event[2];
|
|
39
|
+
events.push({
|
|
40
|
+
date: event[1],
|
|
41
|
+
// The link is part of the line's syntax, not part of what happened.
|
|
42
|
+
summary: summary
|
|
43
|
+
.replace(WIKILINK, '')
|
|
44
|
+
.replace(/\s{2,}/g, ' ')
|
|
45
|
+
.trim(),
|
|
46
|
+
targetSlug: firstWikilink(summary),
|
|
47
|
+
line: absoluteLine,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
for (const match of raw.matchAll(WIKILINK)) {
|
|
51
|
+
const target = normalizeLinkTarget(match[1]);
|
|
52
|
+
links.push({
|
|
53
|
+
toSlug: target,
|
|
54
|
+
kind: isFileTarget(target) ? 'embed' : 'wikilink',
|
|
55
|
+
line: absoluteLine,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
for (const match of raw.matchAll(MARKDOWN_LINK)) {
|
|
59
|
+
links.push({
|
|
60
|
+
toSlug: normalizeLinkTarget(match[1], slug),
|
|
61
|
+
kind: 'markdown',
|
|
62
|
+
line: absoluteLine,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const akno = readAknoData(frontmatter.data);
|
|
67
|
+
const declaredRole = readPageRole(akno.role);
|
|
68
|
+
const title = readString(frontmatter.data, 'title') ?? deriveTitle(lines, relPath);
|
|
69
|
+
const rawAbout = readStringArray(akno.about);
|
|
70
|
+
const rawAliases = readStringArray(akno.aliases);
|
|
71
|
+
const identityKeys = new Set([title, slug, slug.split('/').pop() ?? slug].map(identityKey));
|
|
72
|
+
return {
|
|
73
|
+
slug,
|
|
74
|
+
relPath,
|
|
75
|
+
frontmatter,
|
|
76
|
+
title,
|
|
77
|
+
type: readString(frontmatter.data, 'type'),
|
|
78
|
+
tags: readTags(frontmatter.data),
|
|
79
|
+
declaredRole,
|
|
80
|
+
declaredManagement: readManagement(akno.management),
|
|
81
|
+
about: rawAbout.filter((entry) => normalizeLinkTarget(entry) !== slug),
|
|
82
|
+
aliases: rawAliases.filter((entry) => !identityKeys.has(identityKey(entry))),
|
|
83
|
+
content,
|
|
84
|
+
body,
|
|
85
|
+
lines,
|
|
86
|
+
bodyLine,
|
|
87
|
+
bodyHash: sha256(body),
|
|
88
|
+
sourceFenceLine,
|
|
89
|
+
events: dedupeEvents(events),
|
|
90
|
+
links: dedupeLinks(links),
|
|
91
|
+
frontmatterId: readString(frontmatter.data, 'id'),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function readAknoData(data) {
|
|
95
|
+
const value = data.akno;
|
|
96
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
97
|
+
? value
|
|
98
|
+
: {};
|
|
99
|
+
}
|
|
100
|
+
function readPageRole(value) {
|
|
101
|
+
return value === 'knowledge' || value === 'source' || value === 'inference' || value === 'ignored'
|
|
102
|
+
? value
|
|
103
|
+
: null;
|
|
104
|
+
}
|
|
105
|
+
function readManagement(value) {
|
|
106
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
107
|
+
return {};
|
|
108
|
+
const record = value;
|
|
109
|
+
const remember = record.remember === 'deny' || record.remember === 'integrate' ? record.remember : null;
|
|
110
|
+
const dream = record.dream === 'none' || record.dream === 'hygiene' || record.dream === 'synthesize'
|
|
111
|
+
? record.dream
|
|
112
|
+
: null;
|
|
113
|
+
return {
|
|
114
|
+
...(remember ? { remember } : {}),
|
|
115
|
+
...(dream ? { dream } : {}),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function readStringArray(value) {
|
|
119
|
+
if (!Array.isArray(value))
|
|
120
|
+
return [];
|
|
121
|
+
return [
|
|
122
|
+
...new Set(value
|
|
123
|
+
.filter((entry) => typeof entry === 'string')
|
|
124
|
+
.map((entry) => entry.trim())
|
|
125
|
+
.filter(Boolean)),
|
|
126
|
+
];
|
|
127
|
+
}
|
|
128
|
+
function identityKey(value) {
|
|
129
|
+
return value
|
|
130
|
+
.normalize('NFKC')
|
|
131
|
+
.toLowerCase()
|
|
132
|
+
.replace(/[^\p{L}\p{N}]+/gu, '');
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Frontmatter `title:` wins; then the first `#` heading; then the filename
|
|
136
|
+
* un-slugified. A page with no title at all is common and should not read as
|
|
137
|
+
* `untitled` in a card.
|
|
138
|
+
*/
|
|
139
|
+
function deriveTitle(lines, relPath) {
|
|
140
|
+
for (const line of lines) {
|
|
141
|
+
const heading = /^#{1,3}\s+(.+?)\s*$/.exec(line);
|
|
142
|
+
if (heading)
|
|
143
|
+
return heading[1].replace(/[#*`]/g, '').trim();
|
|
144
|
+
}
|
|
145
|
+
const base = path.basename(relPath).replace(/\.(md|markdown)$/i, '');
|
|
146
|
+
return base.replace(/[-_]+/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
|
|
147
|
+
}
|
|
148
|
+
function relPathToSlug(relPath) {
|
|
149
|
+
return relPath.replace(/\\/g, '/').replace(/\.(md|markdown)$/i, '');
|
|
150
|
+
}
|
|
151
|
+
function firstWikilink(text) {
|
|
152
|
+
const match = WIKILINK.exec(text);
|
|
153
|
+
WIKILINK.lastIndex = 0;
|
|
154
|
+
return match ? normalizeLinkTarget(match[1]) : null;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* A link target may be written a dozen ways: `[[home/lease]]`, `[[Home/Lease]]`,
|
|
158
|
+
* `[[lease.md]]`, `[../home/lease.md]`. They all mean one page, and resolving
|
|
159
|
+
* that here is the difference between a working backlink graph and a wall of
|
|
160
|
+
* false "broken link" reports.
|
|
161
|
+
*/
|
|
162
|
+
/**
|
|
163
|
+
* True for a target that names a file rather than a page.
|
|
164
|
+
*
|
|
165
|
+
* `normalizeLinkTarget` has already stripped `.md`, so anything with an extension left is
|
|
166
|
+
* not a page: `[[receipt-3f8c1a2b.pdf]]`, `[[scan.jpg]]`. Counting those as page links made
|
|
167
|
+
* every embedded attachment show up in `doctor` as a wikilink pointing at a page that does
|
|
168
|
+
* not exist — noise that buries the real broken links.
|
|
169
|
+
*/
|
|
170
|
+
function isFileTarget(target) {
|
|
171
|
+
return /\.[A-Za-z0-9]{1,8}$/.test(target);
|
|
172
|
+
}
|
|
173
|
+
export function normalizeLinkTarget(target, fromSlug) {
|
|
174
|
+
let cleaned = target
|
|
175
|
+
.trim()
|
|
176
|
+
.replace(/\\/g, '/')
|
|
177
|
+
.replace(/\.(md|markdown)$/i, '');
|
|
178
|
+
if (cleaned.startsWith('./'))
|
|
179
|
+
cleaned = cleaned.slice(2);
|
|
180
|
+
if (fromSlug && (cleaned.startsWith('../') || !cleaned.includes('/'))) {
|
|
181
|
+
const fromDir = fromSlug.includes('/') ? fromSlug.slice(0, fromSlug.lastIndexOf('/')) : '';
|
|
182
|
+
cleaned = path.posix.normalize(path.posix.join(fromDir, cleaned));
|
|
183
|
+
}
|
|
184
|
+
// A target that resolves above the knowledge base root is clamped to it rather
|
|
185
|
+
// than kept with its `..` intact. These strings are only ever compared against
|
|
186
|
+
// `pages.slug`, never used as a path — but a slug that can express "outside the
|
|
187
|
+
// knowledge base" is one refactor away from being used as one.
|
|
188
|
+
return cleaned.replace(/^(?:\.\.\/)+/, '').replace(/^\/+/, '');
|
|
189
|
+
}
|
|
190
|
+
/** The same event written twice in one file is one event. */
|
|
191
|
+
function dedupeEvents(events) {
|
|
192
|
+
const seen = new Set();
|
|
193
|
+
return events.filter((event) => {
|
|
194
|
+
const key = `${event.date}|${event.targetSlug ?? ''}|${event.summary.toLowerCase()}`;
|
|
195
|
+
if (seen.has(key))
|
|
196
|
+
return false;
|
|
197
|
+
seen.add(key);
|
|
198
|
+
return true;
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
function dedupeLinks(links) {
|
|
202
|
+
const seen = new Set();
|
|
203
|
+
return links.filter((link) => {
|
|
204
|
+
if (link.toSlug.length === 0)
|
|
205
|
+
return false;
|
|
206
|
+
const key = `${link.toSlug}|${link.kind}`;
|
|
207
|
+
if (seen.has(key))
|
|
208
|
+
return false;
|
|
209
|
+
seen.add(key);
|
|
210
|
+
return true;
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
export function resolveRole(page, rule, observationsPath) {
|
|
214
|
+
if (page.declaredRole)
|
|
215
|
+
return { role: page.declaredRole, source: 'frontmatter' };
|
|
216
|
+
if (rule?.role)
|
|
217
|
+
return { role: rule.role, source: 'rule', via: rule.glob };
|
|
218
|
+
// Provenance: pages the observe tier authored are inferences, not authored
|
|
219
|
+
// claims, and must never be admissible evidence for another observation.
|
|
220
|
+
if (page.slug === observationsPath || page.slug.startsWith(`${observationsPath}/`)) {
|
|
221
|
+
return { role: 'inference', source: 'provenance' };
|
|
222
|
+
}
|
|
223
|
+
return { role: 'knowledge', source: 'default' };
|
|
224
|
+
}
|
|
225
|
+
export function resolvePagePolicy(page, rule, observationsPath) {
|
|
226
|
+
const role = resolveRole(page, rule, observationsPath).role;
|
|
227
|
+
return {
|
|
228
|
+
role,
|
|
229
|
+
// Searchability is not write consent. A plain Markdown page remains useful knowledge,
|
|
230
|
+
// but `remember` may change it only when the page or its folder says so explicitly.
|
|
231
|
+
remember: page.declaredManagement.remember ?? rule?.remember ?? 'deny',
|
|
232
|
+
// Whole-page automatic authority must be visible on the page itself. Folder rules cannot
|
|
233
|
+
// make an existing page rewritable merely because it was moved under another path.
|
|
234
|
+
dream: page.declaredManagement.dream ?? 'none',
|
|
235
|
+
about: page.about.length > 0 ? page.about : (rule?.about ?? []).filter((slug) => slug !== page.slug),
|
|
236
|
+
aliases: page.aliases,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/** True for a page written by the observe tier — ranked below authored pages. */
|
|
240
|
+
export function isObservation(slug, observationsPath) {
|
|
241
|
+
return slug === observationsPath || slug.startsWith(`${observationsPath}/`);
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/kb/page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
type FileKind = 'page' | 'attachment';
|
|
2
|
+
export interface ScannedFile {
|
|
3
|
+
relPath: string;
|
|
4
|
+
absPath: string;
|
|
5
|
+
size: number;
|
|
6
|
+
/** Nanosecond mtime as a string — a float loses precision above ~2^53 ns. */
|
|
7
|
+
mtimeNs: string;
|
|
8
|
+
/** Filesystem birth time, kept only as visibly labelled metadata evidence. */
|
|
9
|
+
birthtimeNs: string;
|
|
10
|
+
kind: FileKind;
|
|
11
|
+
/** Present only once the file has actually been hashed. */
|
|
12
|
+
sha256?: string;
|
|
13
|
+
/**
|
|
14
|
+
* A knowledge base inside iCloud Drive or Dropbox with storage
|
|
15
|
+
* optimization on will have evicted files that look present but read as
|
|
16
|
+
* placeholders. Indexing a zero-byte stand-in as though the document were
|
|
17
|
+
* empty is worse than skipping it and saying so.
|
|
18
|
+
*/
|
|
19
|
+
dataless?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface ScanOptions {
|
|
22
|
+
root: string;
|
|
23
|
+
ignore: string[];
|
|
24
|
+
pageExtensions: string[];
|
|
25
|
+
maxPageBytes: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Walks the knowledge base and stats every file. Deliberately does not hash:
|
|
29
|
+
* The fast path is that a restart *stats* rather than re-indexing, and only
|
|
30
|
+
* files whose mtime or size moved get hashed.
|
|
31
|
+
*/
|
|
32
|
+
export declare function scanTree(options: ScanOptions): Promise<ScannedFile[]>;
|
|
33
|
+
export declare function hashFile(absPath: string): Promise<string>;
|
|
34
|
+
/** Bounded-concurrency map. Hashing 5,000 files takes ~116ms; the bound keeps a
|
|
35
|
+
* slow disk or a network mount from opening every file at once. */
|
|
36
|
+
export declare function mapWithConcurrency<T, R>(items: T[], limit: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/kb/scan.ts"],"names":[],"mappings":"AAKA,KAAK,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAK3E;AAoED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc/D;AAED;oEACoE;AACpE,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,EAAE,CAAC,CAYd"}
|
package/dist/kb/scan.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import fsp from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
/**
|
|
5
|
+
* Walks the knowledge base and stats every file. Deliberately does not hash:
|
|
6
|
+
* The fast path is that a restart *stats* rather than re-indexing, and only
|
|
7
|
+
* files whose mtime or size moved get hashed.
|
|
8
|
+
*/
|
|
9
|
+
export async function scanTree(options) {
|
|
10
|
+
const out = [];
|
|
11
|
+
const ignore = new Set(options.ignore.map((entry) => entry.replace(/\/+$/, '')));
|
|
12
|
+
await walk(options.root, '', out, ignore, options);
|
|
13
|
+
return out;
|
|
14
|
+
}
|
|
15
|
+
async function walk(root, relDir, out, ignore, options) {
|
|
16
|
+
const absDir = relDir ? path.join(root, relDir) : root;
|
|
17
|
+
let entries;
|
|
18
|
+
try {
|
|
19
|
+
entries = await fsp.readdir(absDir, { withFileTypes: true });
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// An unreadable directory is reported by `doctor`, not fatal here — a
|
|
23
|
+
// permissions problem in one folder should not cost the whole index.
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
if (ignore.has(entry.name))
|
|
28
|
+
continue;
|
|
29
|
+
// Dotfiles are never knowledge. Obsidian, git, sync clients and editors all
|
|
30
|
+
// put working state in them, and none of it is a note.
|
|
31
|
+
if (entry.name.startsWith('.'))
|
|
32
|
+
continue;
|
|
33
|
+
const rel = relDir ? `${relDir}/${entry.name}` : entry.name;
|
|
34
|
+
if (ignore.has(rel))
|
|
35
|
+
continue;
|
|
36
|
+
if (entry.isDirectory()) {
|
|
37
|
+
await walk(root, rel, out, ignore, options);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// A symlink could point outside the knowledge base; following one turns
|
|
41
|
+
// "index this folder" into something the user did not agree to.
|
|
42
|
+
if (!entry.isFile())
|
|
43
|
+
continue;
|
|
44
|
+
const absPath = path.join(root, rel);
|
|
45
|
+
// `bigint: true` is what exposes mtimeNs. A float mtime loses precision above
|
|
46
|
+
// ~2^53 nanoseconds, which is well inside the range real timestamps use, and
|
|
47
|
+
// an imprecise mtime silently defeats the stat fast path.
|
|
48
|
+
let stat;
|
|
49
|
+
try {
|
|
50
|
+
stat = await fsp.stat(absPath, { bigint: true });
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const extension = path.extname(entry.name).toLowerCase();
|
|
56
|
+
const isPage = options.pageExtensions.includes(extension);
|
|
57
|
+
const size = Number(stat.size);
|
|
58
|
+
const file = {
|
|
59
|
+
relPath: rel,
|
|
60
|
+
absPath,
|
|
61
|
+
size,
|
|
62
|
+
mtimeNs: String(stat.mtimeNs),
|
|
63
|
+
birthtimeNs: String(stat.birthtimeNs),
|
|
64
|
+
kind: isPage ? 'page' : 'attachment',
|
|
65
|
+
};
|
|
66
|
+
// A file that reports a size but occupies no blocks is the classic
|
|
67
|
+
// dataless signature: iCloud or Dropbox has evicted the contents and left a
|
|
68
|
+
// placeholder that reads as empty.
|
|
69
|
+
if (size > 0 && stat.blocks === 0n)
|
|
70
|
+
file.dataless = true;
|
|
71
|
+
if (isPage && size > options.maxPageBytes)
|
|
72
|
+
continue;
|
|
73
|
+
out.push(file);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export async function hashFile(absPath) {
|
|
77
|
+
const hash = createHash('sha256');
|
|
78
|
+
const handle = await fsp.open(absPath, 'r');
|
|
79
|
+
try {
|
|
80
|
+
const buffer = Buffer.allocUnsafe(64 * 1024);
|
|
81
|
+
for (;;) {
|
|
82
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, null);
|
|
83
|
+
if (bytesRead === 0)
|
|
84
|
+
break;
|
|
85
|
+
hash.update(buffer.subarray(0, bytesRead));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
await handle.close();
|
|
90
|
+
}
|
|
91
|
+
return hash.digest('hex');
|
|
92
|
+
}
|
|
93
|
+
/** Bounded-concurrency map. Hashing 5,000 files takes ~116ms; the bound keeps a
|
|
94
|
+
* slow disk or a network mount from opening every file at once. */
|
|
95
|
+
export async function mapWithConcurrency(items, limit, fn) {
|
|
96
|
+
const results = new Array(items.length);
|
|
97
|
+
let next = 0;
|
|
98
|
+
const workers = Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, async () => {
|
|
99
|
+
for (;;) {
|
|
100
|
+
const index = next++;
|
|
101
|
+
if (index >= items.length)
|
|
102
|
+
return;
|
|
103
|
+
results[index] = await fn(items[index], index);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
await Promise.all(workers);
|
|
107
|
+
return results;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/kb/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comparing two sentences by what they are about rather than how they are worded.
|
|
3
|
+
*
|
|
4
|
+
* Used where the same claim can arrive twice in different words and only one copy should survive:
|
|
5
|
+
* a nightly observation re-derived from unchanged facts, and a timeline event added twice for one
|
|
6
|
+
* day. Both were caught only by exact string equality before, which is to say not caught at all —
|
|
7
|
+
* `They watched "Wicked: For Good"` and `The user watched "Wicked: For Good"` are one event and two
|
|
8
|
+
* strings.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately not a model call. This runs on every write, and a comparison that costs a model is
|
|
11
|
+
* one that gets skipped when the model is missing — which is exactly when a knowledge base is
|
|
12
|
+
* accumulating duplicates fastest.
|
|
13
|
+
*/
|
|
14
|
+
/** The words of a sentence that say what it is about. */
|
|
15
|
+
export declare function contentWords(text: string): Set<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Whether two sentences are about the same thing.
|
|
18
|
+
*
|
|
19
|
+
* **Containment, not symmetric overlap.** The second telling of an event is rarely the first one
|
|
20
|
+
* reworded — it is usually the first one *plus something*: "They watched Wicked: For Good in the
|
|
21
|
+
* evening" and "Watched Wicked: For Good and rated it 8 out of 10" are one evening, and they share
|
|
22
|
+
* three quarters of the shorter sentence while sharing only half of the two combined. Symmetric
|
|
23
|
+
* overlap therefore misses exactly the case that matters, and lowering its threshold far enough to
|
|
24
|
+
* catch it would also merge "the flight departed" with "the flight landed".
|
|
25
|
+
*
|
|
26
|
+
* The floor on the shorter sentence is what keeps that safe: two three-word summaries can share
|
|
27
|
+
* two words by accident, and without a minimum there is not enough sentence to be sure with.
|
|
28
|
+
*/
|
|
29
|
+
export declare function saysTheSame(a: string, b: string, threshold?: number): boolean;
|
|
30
|
+
//# sourceMappingURL=words.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../../src/kb/words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA6DH,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAUtD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,CAS1E"}
|
package/dist/kb/words.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comparing two sentences by what they are about rather than how they are worded.
|
|
3
|
+
*
|
|
4
|
+
* Used where the same claim can arrive twice in different words and only one copy should survive:
|
|
5
|
+
* a nightly observation re-derived from unchanged facts, and a timeline event added twice for one
|
|
6
|
+
* day. Both were caught only by exact string equality before, which is to say not caught at all —
|
|
7
|
+
* `They watched "Wicked: For Good"` and `The user watched "Wicked: For Good"` are one event and two
|
|
8
|
+
* strings.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately not a model call. This runs on every write, and a comparison that costs a model is
|
|
11
|
+
* one that gets skipped when the model is missing — which is exactly when a knowledge base is
|
|
12
|
+
* accumulating duplicates fastest.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Words that carry no subject matter, plus the ones a rephrasing swaps freely.
|
|
16
|
+
*
|
|
17
|
+
* `they`/`user`/`we` are here because who is being talked about is not what distinguishes two
|
|
18
|
+
* events on the same day: an assistant writing "they watched X" and "the user watched X" has
|
|
19
|
+
* written the same line twice.
|
|
20
|
+
*/
|
|
21
|
+
const STOPWORDS = new Set([
|
|
22
|
+
'the',
|
|
23
|
+
'a',
|
|
24
|
+
'an',
|
|
25
|
+
'and',
|
|
26
|
+
'or',
|
|
27
|
+
'of',
|
|
28
|
+
'to',
|
|
29
|
+
'in',
|
|
30
|
+
'on',
|
|
31
|
+
'at',
|
|
32
|
+
'for',
|
|
33
|
+
'with',
|
|
34
|
+
'is',
|
|
35
|
+
'are',
|
|
36
|
+
'was',
|
|
37
|
+
'were',
|
|
38
|
+
'be',
|
|
39
|
+
'been',
|
|
40
|
+
'has',
|
|
41
|
+
'have',
|
|
42
|
+
'had',
|
|
43
|
+
'this',
|
|
44
|
+
'that',
|
|
45
|
+
'these',
|
|
46
|
+
'those',
|
|
47
|
+
'it',
|
|
48
|
+
'its',
|
|
49
|
+
'as',
|
|
50
|
+
'by',
|
|
51
|
+
'from',
|
|
52
|
+
'usually',
|
|
53
|
+
'often',
|
|
54
|
+
'always',
|
|
55
|
+
'each',
|
|
56
|
+
'every',
|
|
57
|
+
'they',
|
|
58
|
+
'them',
|
|
59
|
+
'their',
|
|
60
|
+
'we',
|
|
61
|
+
'our',
|
|
62
|
+
'us',
|
|
63
|
+
'he',
|
|
64
|
+
'she',
|
|
65
|
+
'his',
|
|
66
|
+
'her',
|
|
67
|
+
'you',
|
|
68
|
+
'your',
|
|
69
|
+
'user',
|
|
70
|
+
'users',
|
|
71
|
+
]);
|
|
72
|
+
/** The words of a sentence that say what it is about. */
|
|
73
|
+
export function contentWords(text) {
|
|
74
|
+
return new Set(text
|
|
75
|
+
.toLowerCase()
|
|
76
|
+
// Wikilinks are addresses, not content: two lines that differ only by a citation are one line.
|
|
77
|
+
.replace(/\[\[[^\]]*\]\]/g, ' ')
|
|
78
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
79
|
+
.split(/\s+/)
|
|
80
|
+
.filter((word) => word.length > 2 && !STOPWORDS.has(word)));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Whether two sentences are about the same thing.
|
|
84
|
+
*
|
|
85
|
+
* **Containment, not symmetric overlap.** The second telling of an event is rarely the first one
|
|
86
|
+
* reworded — it is usually the first one *plus something*: "They watched Wicked: For Good in the
|
|
87
|
+
* evening" and "Watched Wicked: For Good and rated it 8 out of 10" are one evening, and they share
|
|
88
|
+
* three quarters of the shorter sentence while sharing only half of the two combined. Symmetric
|
|
89
|
+
* overlap therefore misses exactly the case that matters, and lowering its threshold far enough to
|
|
90
|
+
* catch it would also merge "the flight departed" with "the flight landed".
|
|
91
|
+
*
|
|
92
|
+
* The floor on the shorter sentence is what keeps that safe: two three-word summaries can share
|
|
93
|
+
* two words by accident, and without a minimum there is not enough sentence to be sure with.
|
|
94
|
+
*/
|
|
95
|
+
export function saysTheSame(a, b, threshold = 0.7) {
|
|
96
|
+
const left = contentWords(a);
|
|
97
|
+
const right = contentWords(b);
|
|
98
|
+
const smaller = Math.min(left.size, right.size);
|
|
99
|
+
if (smaller < 3)
|
|
100
|
+
return false;
|
|
101
|
+
let shared = 0;
|
|
102
|
+
for (const word of right)
|
|
103
|
+
if (left.has(word))
|
|
104
|
+
shared += 1;
|
|
105
|
+
return shared / smaller >= threshold;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=words.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"words.js","sourceRoot":"","sources":["../../src/kb/words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;GAMG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,KAAK;IACL,GAAG;IACH,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,MAAM;IACN,IAAI;IACJ,KAAK;IACL,KAAK;IACL,MAAM;IACN,IAAI;IACJ,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,yDAAyD;AACzD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,GAAG,CACZ,IAAI;SACD,WAAW,EAAE;QACd,+FAA+F;SAC9F,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS,EAAE,SAAS,GAAG,GAAG;IAC/D,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,CAAC,CAAC;IAC1D,OAAO,MAAM,GAAG,OAAO,IAAI,SAAS,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { AknoContext } from '../context.ts';
|
|
2
|
+
/**
|
|
3
|
+
* A page for a document that has none, written beside the file.
|
|
4
|
+
*
|
|
5
|
+
* An attachment nobody's page points at is already returned as a standalone document card.
|
|
6
|
+
* Adoption gives that evidence a durable, browsable home with page policy and links.
|
|
7
|
+
*
|
|
8
|
+
* The filing operation is the one `ingest` already applies to every arrival: give it a page that says what
|
|
9
|
+
* it is and embeds it. An orphan is simply an arrival nobody ran `ingest` on, so it gets the
|
|
10
|
+
* same shape of page, from the summary the extraction pass already produced — no model call of
|
|
11
|
+
* its own, and no inference beyond what the document says about itself.
|
|
12
|
+
*
|
|
13
|
+
* Three limits, because this writes files into somebody's notes:
|
|
14
|
+
*
|
|
15
|
+
* - **`ingest: "file"` is honoured.** That rule exists precisely for a folder of media where a
|
|
16
|
+
* stub page per file would be noise rather than memory, and this is the behaviour it turns
|
|
17
|
+
* off. `ingest: "ignore"` is skipped too.
|
|
18
|
+
* - **Capped per run.** A folder of 500 unowned PDFs should not become 500 pages overnight
|
|
19
|
+
* before anyone has seen the first one; the cap makes the first night's report arrive while
|
|
20
|
+
* it is still small enough to read — and `--dry-run` shows it without writing.
|
|
21
|
+
* - **The file is never touched.** Only the inbox moves files, ever. Nothing
|
|
22
|
+
* here renames, moves, or rewrites a byte of the document.
|
|
23
|
+
*/
|
|
24
|
+
export interface AdoptedDocument {
|
|
25
|
+
slug: string;
|
|
26
|
+
/** The files the page now owns — parts of one document share a page. */
|
|
27
|
+
files: string[];
|
|
28
|
+
action: 'planned' | 'created' | 'skipped' | 'blocked' | 'rejected';
|
|
29
|
+
reason?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface AdoptionDraft {
|
|
32
|
+
slug: string;
|
|
33
|
+
relPath: string;
|
|
34
|
+
inputHash: string;
|
|
35
|
+
after: string;
|
|
36
|
+
/** Persist the exact proposal, but do not decide or apply it until this condition is resolved. */
|
|
37
|
+
blockedReason?: string;
|
|
38
|
+
documents: {
|
|
39
|
+
id: string;
|
|
40
|
+
relPath: string;
|
|
41
|
+
sha256: string;
|
|
42
|
+
metadataHash: string;
|
|
43
|
+
groupKey: string;
|
|
44
|
+
}[];
|
|
45
|
+
}
|
|
46
|
+
export interface AdoptionSnapshot {
|
|
47
|
+
indexRevision: string;
|
|
48
|
+
knowledgeBaseFingerprint: string;
|
|
49
|
+
configurationFingerprint: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Seal exact page creations without touching the knowledge base.
|
|
53
|
+
*
|
|
54
|
+
* The document hashes become item inputs and the run-start manifest is retained as plan evidence.
|
|
55
|
+
* Apply rechecks both the source files and their orphaned index rows, so a page is never created
|
|
56
|
+
* from a stale summary or for a document somebody filed while the plan was waiting.
|
|
57
|
+
*/
|
|
58
|
+
export declare function planOrphanAdoptions(ctx: AknoContext, options: {
|
|
59
|
+
limit: number;
|
|
60
|
+
documentId?: string;
|
|
61
|
+
}): Promise<{
|
|
62
|
+
adopted: AdoptedDocument[];
|
|
63
|
+
drafts: AdoptionDraft[];
|
|
64
|
+
}>;
|
|
65
|
+
//# sourceMappingURL=adopt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adopt.d.ts","sourceRoot":"","sources":["../../src/maintenance/adopt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAOjD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,kGAAkG;IAClG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;CACL;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB,EAAE,MAAM,CAAC;IACjC,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAgBD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,MAAM,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CAgGlE"}
|