@tenphi/akno-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +83 -0
- package/README.md +26 -0
- package/config/default.jsonc +548 -0
- package/dist/bench/answer-corpus.d.ts +48 -0
- package/dist/bench/answer-corpus.d.ts.map +1 -0
- package/dist/bench/answer-corpus.js +491 -0
- package/dist/bench/answer-corpus.js.map +1 -0
- package/dist/bench/answer.d.ts +156 -0
- package/dist/bench/answer.d.ts.map +1 -0
- package/dist/bench/answer.js +608 -0
- package/dist/bench/answer.js.map +1 -0
- package/dist/bench/auto-recall-answer-corpus.d.ts +21 -0
- package/dist/bench/auto-recall-answer-corpus.d.ts.map +1 -0
- package/dist/bench/auto-recall-answer-corpus.js +245 -0
- package/dist/bench/auto-recall-answer-corpus.js.map +1 -0
- package/dist/bench/auto-recall-answer.d.ts +198 -0
- package/dist/bench/auto-recall-answer.d.ts.map +1 -0
- package/dist/bench/auto-recall-answer.js +720 -0
- package/dist/bench/auto-recall-answer.js.map +1 -0
- package/dist/bench/auto-recall-corpus.d.ts +45 -0
- package/dist/bench/auto-recall-corpus.d.ts.map +1 -0
- package/dist/bench/auto-recall-corpus.js +221 -0
- package/dist/bench/auto-recall-corpus.js.map +1 -0
- package/dist/bench/auto-recall.d.ts +171 -0
- package/dist/bench/auto-recall.d.ts.map +1 -0
- package/dist/bench/auto-recall.js +651 -0
- package/dist/bench/auto-recall.js.map +1 -0
- package/dist/bench/entity-resolution.d.ts +37 -0
- package/dist/bench/entity-resolution.d.ts.map +1 -0
- package/dist/bench/entity-resolution.js +121 -0
- package/dist/bench/entity-resolution.js.map +1 -0
- package/dist/bench/graph.d.ts +57 -0
- package/dist/bench/graph.d.ts.map +1 -0
- package/dist/bench/graph.js +573 -0
- package/dist/bench/graph.js.map +1 -0
- package/dist/bench/llm-ranking-probe.d.ts +27 -0
- package/dist/bench/llm-ranking-probe.d.ts.map +1 -0
- package/dist/bench/llm-ranking-probe.js +105 -0
- package/dist/bench/llm-ranking-probe.js.map +1 -0
- package/dist/bench/merge-discovery-corpus.d.ts +26 -0
- package/dist/bench/merge-discovery-corpus.d.ts.map +1 -0
- package/dist/bench/merge-discovery-corpus.js +114 -0
- package/dist/bench/merge-discovery-corpus.js.map +1 -0
- package/dist/bench/merge-discovery-review.d.ts +81 -0
- package/dist/bench/merge-discovery-review.d.ts.map +1 -0
- package/dist/bench/merge-discovery-review.js +149 -0
- package/dist/bench/merge-discovery-review.js.map +1 -0
- package/dist/bench/merge-discovery.d.ts +122 -0
- package/dist/bench/merge-discovery.d.ts.map +1 -0
- package/dist/bench/merge-discovery.js +390 -0
- package/dist/bench/merge-discovery.js.map +1 -0
- package/dist/bench/mixed-retrieval.d.ts +35 -0
- package/dist/bench/mixed-retrieval.d.ts.map +1 -0
- package/dist/bench/mixed-retrieval.js +355 -0
- package/dist/bench/mixed-retrieval.js.map +1 -0
- package/dist/bench/ranking-corpus.d.ts +29 -0
- package/dist/bench/ranking-corpus.d.ts.map +1 -0
- package/dist/bench/ranking-corpus.js +514 -0
- package/dist/bench/ranking-corpus.js.map +1 -0
- package/dist/bench/ranking-end-to-end.d.ts +112 -0
- package/dist/bench/ranking-end-to-end.d.ts.map +1 -0
- package/dist/bench/ranking-end-to-end.js +479 -0
- package/dist/bench/ranking-end-to-end.js.map +1 -0
- package/dist/bench/ranking-latency.d.ts +71 -0
- package/dist/bench/ranking-latency.d.ts.map +1 -0
- package/dist/bench/ranking-latency.js +130 -0
- package/dist/bench/ranking-latency.js.map +1 -0
- package/dist/bench/ranking-matrix.d.ts +141 -0
- package/dist/bench/ranking-matrix.d.ts.map +1 -0
- package/dist/bench/ranking-matrix.js +526 -0
- package/dist/bench/ranking-matrix.js.map +1 -0
- package/dist/bench/ranking-review.d.ts +93 -0
- package/dist/bench/ranking-review.d.ts.map +1 -0
- package/dist/bench/ranking-review.js +249 -0
- package/dist/bench/ranking-review.js.map +1 -0
- package/dist/bench/ranking.d.ts +122 -0
- package/dist/bench/ranking.d.ts.map +1 -0
- package/dist/bench/ranking.js +547 -0
- package/dist/bench/ranking.js.map +1 -0
- package/dist/bench.d.ts +60 -0
- package/dist/bench.d.ts.map +1 -0
- package/dist/bench.js +167 -0
- package/dist/bench.js.map +1 -0
- package/dist/config/jsonc.d.ts +8 -0
- package/dist/config/jsonc.d.ts.map +1 -0
- package/dist/config/jsonc.js +85 -0
- package/dist/config/jsonc.js.map +1 -0
- package/dist/config/load.d.ts +43 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +608 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/paths.d.ts +10 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +38 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +698 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +394 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/write-rules.d.ts +41 -0
- package/dist/config/write-rules.d.ts.map +1 -0
- package/dist/config/write-rules.js +225 -0
- package/dist/config/write-rules.js.map +1 -0
- package/dist/config/write-setup.d.ts +42 -0
- package/dist/config/write-setup.d.ts.map +1 -0
- package/dist/config/write-setup.js +358 -0
- package/dist/config/write-setup.js.map +1 -0
- package/dist/context.d.ts +64 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +14 -0
- package/dist/context.js.map +1 -0
- package/dist/doctor.d.ts +115 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +388 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index/chunk.d.ts +62 -0
- package/dist/index/chunk.d.ts.map +1 -0
- package/dist/index/chunk.js +307 -0
- package/dist/index/chunk.js.map +1 -0
- package/dist/index/defer.d.ts +32 -0
- package/dist/index/defer.d.ts.map +1 -0
- package/dist/index/defer.js +66 -0
- package/dist/index/defer.js.map +1 -0
- package/dist/index/derive.d.ts +99 -0
- package/dist/index/derive.d.ts.map +1 -0
- package/dist/index/derive.js +378 -0
- package/dist/index/derive.js.map +1 -0
- package/dist/index/entity-resolution.d.ts +68 -0
- package/dist/index/entity-resolution.d.ts.map +1 -0
- package/dist/index/entity-resolution.js +305 -0
- package/dist/index/entity-resolution.js.map +1 -0
- package/dist/index/graph.d.ts +46 -0
- package/dist/index/graph.d.ts.map +1 -0
- package/dist/index/graph.js +618 -0
- package/dist/index/graph.js.map +1 -0
- package/dist/index/indexer.d.ts +301 -0
- package/dist/index/indexer.d.ts.map +1 -0
- package/dist/index/indexer.js +1398 -0
- package/dist/index/indexer.js.map +1 -0
- package/dist/index/revision-barrier.d.ts +30 -0
- package/dist/index/revision-barrier.d.ts.map +1 -0
- package/dist/index/revision-barrier.js +140 -0
- package/dist/index/revision-barrier.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/adoption-eligibility.d.ts +4 -0
- package/dist/ingest/adoption-eligibility.d.ts.map +1 -0
- package/dist/ingest/adoption-eligibility.js +18 -0
- package/dist/ingest/adoption-eligibility.js.map +1 -0
- package/dist/ingest/availability.d.ts +15 -0
- package/dist/ingest/availability.d.ts.map +1 -0
- package/dist/ingest/availability.js +37 -0
- package/dist/ingest/availability.js.map +1 -0
- package/dist/ingest/extract.d.ts +58 -0
- package/dist/ingest/extract.d.ts.map +1 -0
- package/dist/ingest/extract.js +255 -0
- package/dist/ingest/extract.js.map +1 -0
- package/dist/ingest/fetch.d.ts +35 -0
- package/dist/ingest/fetch.d.ts.map +1 -0
- package/dist/ingest/fetch.js +142 -0
- package/dist/ingest/fetch.js.map +1 -0
- package/dist/ingest/inbox.d.ts +53 -0
- package/dist/ingest/inbox.d.ts.map +1 -0
- package/dist/ingest/inbox.js +110 -0
- package/dist/ingest/inbox.js.map +1 -0
- package/dist/ingest/name.d.ts +72 -0
- package/dist/ingest/name.d.ts.map +1 -0
- package/dist/ingest/name.js +208 -0
- package/dist/ingest/name.js.map +1 -0
- package/dist/ingest/parts.d.ts +78 -0
- package/dist/ingest/parts.d.ts.map +1 -0
- package/dist/ingest/parts.js +52 -0
- package/dist/ingest/parts.js.map +1 -0
- package/dist/ingest/rendition.d.ts +75 -0
- package/dist/ingest/rendition.d.ts.map +1 -0
- package/dist/ingest/rendition.js +92 -0
- package/dist/ingest/rendition.js.map +1 -0
- package/dist/ingest/store.d.ts +66 -0
- package/dist/ingest/store.d.ts.map +1 -0
- package/dist/ingest/store.js +92 -0
- package/dist/ingest/store.js.map +1 -0
- package/dist/kb/folders.d.ts +37 -0
- package/dist/kb/folders.d.ts.map +1 -0
- package/dist/kb/folders.js +133 -0
- package/dist/kb/folders.js.map +1 -0
- package/dist/kb/frontmatter.d.ts +91 -0
- package/dist/kb/frontmatter.d.ts.map +1 -0
- package/dist/kb/frontmatter.js +274 -0
- package/dist/kb/frontmatter.js.map +1 -0
- package/dist/kb/line-facts.d.ts +29 -0
- package/dist/kb/line-facts.d.ts.map +1 -0
- package/dist/kb/line-facts.js +23 -0
- package/dist/kb/line-facts.js.map +1 -0
- package/dist/kb/page.d.ts +92 -0
- package/dist/kb/page.d.ts.map +1 -0
- package/dist/kb/page.js +243 -0
- package/dist/kb/page.js.map +1 -0
- package/dist/kb/scan.d.ts +38 -0
- package/dist/kb/scan.d.ts.map +1 -0
- package/dist/kb/scan.js +109 -0
- package/dist/kb/scan.js.map +1 -0
- package/dist/kb/words.d.ts +30 -0
- package/dist/kb/words.d.ts.map +1 -0
- package/dist/kb/words.js +107 -0
- package/dist/kb/words.js.map +1 -0
- package/dist/maintenance/adopt.d.ts +65 -0
- package/dist/maintenance/adopt.d.ts.map +1 -0
- package/dist/maintenance/adopt.js +238 -0
- package/dist/maintenance/adopt.js.map +1 -0
- package/dist/maintenance/budget.d.ts +55 -0
- package/dist/maintenance/budget.d.ts.map +1 -0
- package/dist/maintenance/budget.js +61 -0
- package/dist/maintenance/budget.js.map +1 -0
- package/dist/maintenance/conflicts.d.ts +105 -0
- package/dist/maintenance/conflicts.d.ts.map +1 -0
- package/dist/maintenance/conflicts.js +368 -0
- package/dist/maintenance/conflicts.js.map +1 -0
- package/dist/maintenance/contradictions.d.ts +34 -0
- package/dist/maintenance/contradictions.d.ts.map +1 -0
- package/dist/maintenance/contradictions.js +199 -0
- package/dist/maintenance/contradictions.js.map +1 -0
- package/dist/maintenance/curate.d.ts +156 -0
- package/dist/maintenance/curate.d.ts.map +1 -0
- package/dist/maintenance/curate.js +2070 -0
- package/dist/maintenance/curate.js.map +1 -0
- package/dist/maintenance/dream.d.ts +139 -0
- package/dist/maintenance/dream.d.ts.map +1 -0
- package/dist/maintenance/dream.js +1632 -0
- package/dist/maintenance/dream.js.map +1 -0
- package/dist/maintenance/graph-candidates.d.ts +19 -0
- package/dist/maintenance/graph-candidates.d.ts.map +1 -0
- package/dist/maintenance/graph-candidates.js +120 -0
- package/dist/maintenance/graph-candidates.js.map +1 -0
- package/dist/maintenance/housekeeping.d.ts +81 -0
- package/dist/maintenance/housekeeping.d.ts.map +1 -0
- package/dist/maintenance/housekeeping.js +281 -0
- package/dist/maintenance/housekeeping.js.map +1 -0
- package/dist/maintenance/link-repairs.d.ts +58 -0
- package/dist/maintenance/link-repairs.d.ts.map +1 -0
- package/dist/maintenance/link-repairs.js +281 -0
- package/dist/maintenance/link-repairs.js.map +1 -0
- package/dist/maintenance/log.d.ts +41 -0
- package/dist/maintenance/log.d.ts.map +1 -0
- package/dist/maintenance/log.js +72 -0
- package/dist/maintenance/log.js.map +1 -0
- package/dist/maintenance/managed-item-routing.d.ts +48 -0
- package/dist/maintenance/managed-item-routing.d.ts.map +1 -0
- package/dist/maintenance/managed-item-routing.js +281 -0
- package/dist/maintenance/managed-item-routing.js.map +1 -0
- package/dist/maintenance/managed-item-sources.d.ts +38 -0
- package/dist/maintenance/managed-item-sources.d.ts.map +1 -0
- package/dist/maintenance/managed-item-sources.js +324 -0
- package/dist/maintenance/managed-item-sources.js.map +1 -0
- package/dist/maintenance/managed-items.d.ts +162 -0
- package/dist/maintenance/managed-items.d.ts.map +1 -0
- package/dist/maintenance/managed-items.js +1329 -0
- package/dist/maintenance/managed-items.js.map +1 -0
- package/dist/maintenance/merge-classifier.d.ts +19 -0
- package/dist/maintenance/merge-classifier.d.ts.map +1 -0
- package/dist/maintenance/merge-classifier.js +49 -0
- package/dist/maintenance/merge-classifier.js.map +1 -0
- package/dist/maintenance/model-telemetry.d.ts +45 -0
- package/dist/maintenance/model-telemetry.d.ts.map +1 -0
- package/dist/maintenance/model-telemetry.js +107 -0
- package/dist/maintenance/model-telemetry.js.map +1 -0
- package/dist/maintenance/observe.d.ts +72 -0
- package/dist/maintenance/observe.d.ts.map +1 -0
- package/dist/maintenance/observe.js +265 -0
- package/dist/maintenance/observe.js.map +1 -0
- package/dist/maintenance/path-policy.d.ts +83 -0
- package/dist/maintenance/path-policy.d.ts.map +1 -0
- package/dist/maintenance/path-policy.js +360 -0
- package/dist/maintenance/path-policy.js.map +1 -0
- package/dist/maintenance/plans.d.ts +366 -0
- package/dist/maintenance/plans.d.ts.map +1 -0
- package/dist/maintenance/plans.js +4060 -0
- package/dist/maintenance/plans.js.map +1 -0
- package/dist/maintenance/profile.d.ts +33 -0
- package/dist/maintenance/profile.d.ts.map +1 -0
- package/dist/maintenance/profile.js +99 -0
- package/dist/maintenance/profile.js.map +1 -0
- package/dist/maintenance/recovery.d.ts +38 -0
- package/dist/maintenance/recovery.d.ts.map +1 -0
- package/dist/maintenance/recovery.js +217 -0
- package/dist/maintenance/recovery.js.map +1 -0
- package/dist/maintenance/repair.d.ts +37 -0
- package/dist/maintenance/repair.d.ts.map +1 -0
- package/dist/maintenance/repair.js +183 -0
- package/dist/maintenance/repair.js.map +1 -0
- package/dist/maintenance/rule-drift.d.ts +104 -0
- package/dist/maintenance/rule-drift.d.ts.map +1 -0
- package/dist/maintenance/rule-drift.js +507 -0
- package/dist/maintenance/rule-drift.js.map +1 -0
- package/dist/maintenance/run-verification.d.ts +44 -0
- package/dist/maintenance/run-verification.d.ts.map +1 -0
- package/dist/maintenance/run-verification.js +253 -0
- package/dist/maintenance/run-verification.js.map +1 -0
- package/dist/maintenance/runs.d.ts +142 -0
- package/dist/maintenance/runs.d.ts.map +1 -0
- package/dist/maintenance/runs.js +439 -0
- package/dist/maintenance/runs.js.map +1 -0
- package/dist/maintenance/semantic-merge-discovery.d.ts +54 -0
- package/dist/maintenance/semantic-merge-discovery.d.ts.map +1 -0
- package/dist/maintenance/semantic-merge-discovery.js +308 -0
- package/dist/maintenance/semantic-merge-discovery.js.map +1 -0
- package/dist/maintenance/temporal.d.ts +44 -0
- package/dist/maintenance/temporal.d.ts.map +1 -0
- package/dist/maintenance/temporal.js +295 -0
- package/dist/maintenance/temporal.js.map +1 -0
- package/dist/models/client.d.ts +214 -0
- package/dist/models/client.d.ts.map +1 -0
- package/dist/models/client.js +904 -0
- package/dist/models/client.js.map +1 -0
- package/dist/models/provider-api.d.ts +28 -0
- package/dist/models/provider-api.d.ts.map +1 -0
- package/dist/models/provider-api.js +320 -0
- package/dist/models/provider-api.js.map +1 -0
- package/dist/open.d.ts +163 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +382 -0
- package/dist/open.js.map +1 -0
- package/dist/ops/adopt.d.ts +12 -0
- package/dist/ops/adopt.d.ts.map +1 -0
- package/dist/ops/adopt.js +138 -0
- package/dist/ops/adopt.js.map +1 -0
- package/dist/ops/answer.d.ts +29 -0
- package/dist/ops/answer.d.ts.map +1 -0
- package/dist/ops/answer.js +557 -0
- package/dist/ops/answer.js.map +1 -0
- package/dist/ops/context.d.ts +18 -0
- package/dist/ops/context.d.ts.map +1 -0
- package/dist/ops/context.js +713 -0
- package/dist/ops/context.js.map +1 -0
- package/dist/ops/folder.d.ts +23 -0
- package/dist/ops/folder.d.ts.map +1 -0
- package/dist/ops/folder.js +130 -0
- package/dist/ops/folder.js.map +1 -0
- package/dist/ops/forget.d.ts +14 -0
- package/dist/ops/forget.d.ts.map +1 -0
- package/dist/ops/forget.js +212 -0
- package/dist/ops/forget.js.map +1 -0
- package/dist/ops/graph.d.ts +10 -0
- package/dist/ops/graph.d.ts.map +1 -0
- package/dist/ops/graph.js +480 -0
- package/dist/ops/graph.js.map +1 -0
- package/dist/ops/ingest.d.ts +40 -0
- package/dist/ops/ingest.d.ts.map +1 -0
- package/dist/ops/ingest.js +434 -0
- package/dist/ops/ingest.js.map +1 -0
- package/dist/ops/list.d.ts +9 -0
- package/dist/ops/list.d.ts.map +1 -0
- package/dist/ops/list.js +217 -0
- package/dist/ops/list.js.map +1 -0
- package/dist/ops/move.d.ts +20 -0
- package/dist/ops/move.d.ts.map +1 -0
- package/dist/ops/move.js +173 -0
- package/dist/ops/move.js.map +1 -0
- package/dist/ops/read.d.ts +9 -0
- package/dist/ops/read.d.ts.map +1 -0
- package/dist/ops/read.js +271 -0
- package/dist/ops/read.js.map +1 -0
- package/dist/ops/recall.d.ts +13 -0
- package/dist/ops/recall.d.ts.map +1 -0
- package/dist/ops/recall.js +297 -0
- package/dist/ops/recall.js.map +1 -0
- package/dist/ops/remember.d.ts +34 -0
- package/dist/ops/remember.d.ts.map +1 -0
- package/dist/ops/remember.js +660 -0
- package/dist/ops/remember.js.map +1 -0
- package/dist/ops/timeline.d.ts +11 -0
- package/dist/ops/timeline.d.ts.map +1 -0
- package/dist/ops/timeline.js +111 -0
- package/dist/ops/timeline.js.map +1 -0
- package/dist/ops/undo.d.ts +9 -0
- package/dist/ops/undo.d.ts.map +1 -0
- package/dist/ops/undo.js +38 -0
- package/dist/ops/undo.js.map +1 -0
- package/dist/ops/write.d.ts +55 -0
- package/dist/ops/write.d.ts.map +1 -0
- package/dist/ops/write.js +463 -0
- package/dist/ops/write.js.map +1 -0
- package/dist/recall/assemble.d.ts +81 -0
- package/dist/recall/assemble.d.ts.map +1 -0
- package/dist/recall/assemble.js +603 -0
- package/dist/recall/assemble.js.map +1 -0
- package/dist/recall/expand.d.ts +55 -0
- package/dist/recall/expand.d.ts.map +1 -0
- package/dist/recall/expand.js +282 -0
- package/dist/recall/expand.js.map +1 -0
- package/dist/recall/graph-arm.d.ts +17 -0
- package/dist/recall/graph-arm.d.ts.map +1 -0
- package/dist/recall/graph-arm.js +227 -0
- package/dist/recall/graph-arm.js.map +1 -0
- package/dist/recall/llm-rerank.d.ts +55 -0
- package/dist/recall/llm-rerank.d.ts.map +1 -0
- package/dist/recall/llm-rerank.js +213 -0
- package/dist/recall/llm-rerank.js.map +1 -0
- package/dist/recall/reranker-calibration.d.ts +23 -0
- package/dist/recall/reranker-calibration.d.ts.map +1 -0
- package/dist/recall/reranker-calibration.js +161 -0
- package/dist/recall/reranker-calibration.js.map +1 -0
- package/dist/recall/search.d.ts +107 -0
- package/dist/recall/search.d.ts.map +1 -0
- package/dist/recall/search.js +530 -0
- package/dist/recall/search.js.map +1 -0
- package/dist/reserved.d.ts +39 -0
- package/dist/reserved.d.ts.map +1 -0
- package/dist/reserved.js +63 -0
- package/dist/reserved.js.map +1 -0
- package/dist/rules/compile.d.ts +27 -0
- package/dist/rules/compile.d.ts.map +1 -0
- package/dist/rules/compile.js +105 -0
- package/dist/rules/compile.js.map +1 -0
- package/dist/setup/model-free.d.ts +15 -0
- package/dist/setup/model-free.d.ts.map +1 -0
- package/dist/setup/model-free.js +26 -0
- package/dist/setup/model-free.js.map +1 -0
- package/dist/setup/openai.d.ts +46 -0
- package/dist/setup/openai.d.ts.map +1 -0
- package/dist/setup/openai.js +165 -0
- package/dist/setup/openai.js.map +1 -0
- package/dist/store/db.d.ts +61 -0
- package/dist/store/db.d.ts.map +1 -0
- package/dist/store/db.js +265 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/ids.d.ts +29 -0
- package/dist/store/ids.d.ts.map +1 -0
- package/dist/store/ids.js +0 -0
- package/dist/store/ids.js.map +1 -0
- package/dist/store/migrations.d.ts +54 -0
- package/dist/store/migrations.d.ts.map +1 -0
- package/dist/store/migrations.js +923 -0
- package/dist/store/migrations.js.map +1 -0
- package/dist/store/vectors.d.ts +34 -0
- package/dist/store/vectors.d.ts.map +1 -0
- package/dist/store/vectors.js +158 -0
- package/dist/store/vectors.js.map +1 -0
- package/dist/timeline/documents.d.ts +23 -0
- package/dist/timeline/documents.d.ts.map +1 -0
- package/dist/timeline/documents.js +262 -0
- package/dist/timeline/documents.js.map +1 -0
- package/dist/watch/watcher.d.ts +43 -0
- package/dist/watch/watcher.d.ts.map +1 -0
- package/dist/watch/watcher.js +143 -0
- package/dist/watch/watcher.js.map +1 -0
- package/dist/write/atomic.d.ts +34 -0
- package/dist/write/atomic.d.ts.map +1 -0
- package/dist/write/atomic.js +58 -0
- package/dist/write/atomic.js.map +1 -0
- package/dist/write/conflict.d.ts +43 -0
- package/dist/write/conflict.d.ts.map +1 -0
- package/dist/write/conflict.js +149 -0
- package/dist/write/conflict.js.map +1 -0
- package/dist/write/edit.d.ts +59 -0
- package/dist/write/edit.d.ts.map +1 -0
- package/dist/write/edit.js +231 -0
- package/dist/write/edit.js.map +1 -0
- package/dist/write/gate.d.ts +59 -0
- package/dist/write/gate.d.ts.map +1 -0
- package/dist/write/gate.js +99 -0
- package/dist/write/gate.js.map +1 -0
- package/dist/write/journal.d.ts +90 -0
- package/dist/write/journal.d.ts.map +1 -0
- package/dist/write/journal.js +187 -0
- package/dist/write/journal.js.map +1 -0
- package/dist/write/ledger.d.ts +28 -0
- package/dist/write/ledger.d.ts.map +1 -0
- package/dist/write/ledger.js +141 -0
- package/dist/write/ledger.js.map +1 -0
- package/dist/write/placement.d.ts +29 -0
- package/dist/write/placement.d.ts.map +1 -0
- package/dist/write/placement.js +140 -0
- package/dist/write/placement.js.map +1 -0
- package/dist/write/remember-fallback.d.ts +18 -0
- package/dist/write/remember-fallback.d.ts.map +1 -0
- package/dist/write/remember-fallback.js +48 -0
- package/dist/write/remember-fallback.js.map +1 -0
- package/dist/write/retain.d.ts +61 -0
- package/dist/write/retain.d.ts.map +1 -0
- package/dist/write/retain.js +272 -0
- package/dist/write/retain.js.map +1 -0
- package/package.json +50 -0
- package/swift/extract.swift +232 -0
package/dist/ops/list.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { ListInput } from '@tenphi/akno-protocol';
|
|
2
|
+
import { physicalFolders } from "../kb/folders.js";
|
|
3
|
+
import { effectiveRule, matchRules } from "../rules/compile.js";
|
|
4
|
+
/**
|
|
5
|
+
* Browse structure rather than search it. The point of this op is that an agent
|
|
6
|
+
* that knows what folders exist stops guessing slugs: choosing one and avoiding a duplicate
|
|
7
|
+
* page is much easier when the structure is legible.
|
|
8
|
+
*/
|
|
9
|
+
export async function list(ctx, rawInput) {
|
|
10
|
+
const input = ListInput.parse(rawInput);
|
|
11
|
+
const kind = input.kind ?? (input.folder || input.type || input.tag || input.role ? 'pages' : 'folders');
|
|
12
|
+
if (kind === 'tree')
|
|
13
|
+
return listTree(ctx, input);
|
|
14
|
+
if (kind === 'folders')
|
|
15
|
+
return listFolders(ctx, input);
|
|
16
|
+
return listPages(ctx, input);
|
|
17
|
+
}
|
|
18
|
+
function listPages(ctx, input) {
|
|
19
|
+
const clauses = ["role != 'ignored'"];
|
|
20
|
+
const params = [];
|
|
21
|
+
if (input.folder) {
|
|
22
|
+
clauses.push('(slug = ? OR slug LIKE ?)');
|
|
23
|
+
params.push(input.folder, `${input.folder}/%`);
|
|
24
|
+
}
|
|
25
|
+
if (input.type) {
|
|
26
|
+
clauses.push('type = ?');
|
|
27
|
+
params.push(input.type);
|
|
28
|
+
}
|
|
29
|
+
if (input.role) {
|
|
30
|
+
clauses.push('role = ?');
|
|
31
|
+
params.push(input.role);
|
|
32
|
+
}
|
|
33
|
+
const order = input.order === 'slug' ? 'slug ASC' : input.order === 'size' ? 'bytes DESC' : 'updated_at DESC';
|
|
34
|
+
const limit = input.limit ?? 100;
|
|
35
|
+
const rows = ctx.store.db
|
|
36
|
+
.prepare(`SELECT slug, title, type, role, tags, summary, updated_at, bytes
|
|
37
|
+
FROM pages WHERE ${clauses.join(' AND ')} ORDER BY ${order}`)
|
|
38
|
+
.all(...params);
|
|
39
|
+
// Tag filtering happens here rather than in SQL: tags are a JSON array, and a
|
|
40
|
+
// LIKE on serialized JSON matches `finance` inside `finance-review`.
|
|
41
|
+
const wanted = input.tag?.toLowerCase();
|
|
42
|
+
const filtered = wanted
|
|
43
|
+
? rows.filter((row) => JSON.parse(row.tags).some((tag) => tag.toLowerCase() === wanted))
|
|
44
|
+
: rows;
|
|
45
|
+
return {
|
|
46
|
+
status: filtered.length === 0 ? 'empty' : 'ok',
|
|
47
|
+
pages: filtered.slice(0, limit).map((row) => ({
|
|
48
|
+
slug: row.slug,
|
|
49
|
+
title: row.title,
|
|
50
|
+
type: row.type,
|
|
51
|
+
role: row.role,
|
|
52
|
+
tags: JSON.parse(row.tags),
|
|
53
|
+
summary: row.summary,
|
|
54
|
+
...(row.updated_at ? { updated: row.updated_at.slice(0, 10) } : {}),
|
|
55
|
+
bytes: row.bytes,
|
|
56
|
+
})),
|
|
57
|
+
total: filtered.length,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function listFolders(ctx, input) {
|
|
61
|
+
const prefix = input.folder ? `${input.folder}/` : '';
|
|
62
|
+
const rows = ctx.store.db.prepare("SELECT slug FROM pages WHERE role != 'ignored' ORDER BY slug").all();
|
|
63
|
+
const direct = new Map();
|
|
64
|
+
const deep = new Map();
|
|
65
|
+
const subfolders = new Map();
|
|
66
|
+
for (const { slug } of rows) {
|
|
67
|
+
if (prefix && !slug.startsWith(prefix))
|
|
68
|
+
continue;
|
|
69
|
+
const remainder = slug.slice(prefix.length);
|
|
70
|
+
const segments = remainder.split('/');
|
|
71
|
+
if (segments.length === 1) {
|
|
72
|
+
// A page sitting directly in this folder, not a child folder.
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const child = segments[0];
|
|
76
|
+
const childPath = `${prefix}${child}`;
|
|
77
|
+
deep.set(childPath, (deep.get(childPath) ?? 0) + 1);
|
|
78
|
+
if (segments.length === 2)
|
|
79
|
+
direct.set(childPath, (direct.get(childPath) ?? 0) + 1);
|
|
80
|
+
else {
|
|
81
|
+
if (!subfolders.has(childPath))
|
|
82
|
+
subfolders.set(childPath, new Set());
|
|
83
|
+
subfolders.get(childPath).add(segments[1]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// A folder that has been declared but holds no page yet is still somewhere to file
|
|
87
|
+
// something — it is, in fact, the folder most likely to be the right answer, because
|
|
88
|
+
// somebody has just said what it is for. Deriving structure from pages alone made a freshly
|
|
89
|
+
// declared folder invisible to the very caller that had declared it.
|
|
90
|
+
const declared = new Set();
|
|
91
|
+
for (const folderPath of declaredFolders(ctx, prefix)) {
|
|
92
|
+
if (folderPath.includes('/') && !prefix)
|
|
93
|
+
continue;
|
|
94
|
+
if (!deep.has(folderPath))
|
|
95
|
+
declared.add(folderPath);
|
|
96
|
+
}
|
|
97
|
+
// Directories are structure even before the first page exists. The index has no row capable of
|
|
98
|
+
// representing an empty folder, so include the user's on-disk taxonomy explicitly.
|
|
99
|
+
const physical = new Set(physicalFolders(ctx.config, { under: input.folder, depth: 1 }));
|
|
100
|
+
const folders = [...new Set([...deep.keys(), ...declared, ...physical])]
|
|
101
|
+
.sort()
|
|
102
|
+
.slice(0, input.limit ?? 200)
|
|
103
|
+
.map((folderPath) => {
|
|
104
|
+
// Reporting which rule governs a folder is what makes "default to visible" true for
|
|
105
|
+
// structure: a rule that quietly excludes half a knowledge base is worse than no rule.
|
|
106
|
+
// The fields come from `effectiveRule` and the attribution from the most specific match,
|
|
107
|
+
// so a `description` on `research/**` and a `rank` on `**` both show rather than one
|
|
108
|
+
// erasing the other.
|
|
109
|
+
const match = matchRules(`${folderPath}/x`, ctx.config.rules);
|
|
110
|
+
const effective = effectiveRule(`${folderPath}/x`, ctx.config.rules);
|
|
111
|
+
return {
|
|
112
|
+
path: folderPath,
|
|
113
|
+
pages: direct.get(folderPath) ?? 0,
|
|
114
|
+
pages_deep: deep.get(folderPath) ?? 0,
|
|
115
|
+
folders: subfolders.get(folderPath)?.size ?? 0,
|
|
116
|
+
...(declared.has(folderPath) ? { declared: true } : {}),
|
|
117
|
+
...(match.rule
|
|
118
|
+
? {
|
|
119
|
+
rule: {
|
|
120
|
+
...(effective.role ? { role: effective.role } : {}),
|
|
121
|
+
...(effective.remember ? { remember: effective.remember } : {}),
|
|
122
|
+
...(effective.description ? { description: effective.description } : {}),
|
|
123
|
+
source: `${match.rule.glob} (${match.rule.source})`,
|
|
124
|
+
},
|
|
125
|
+
}
|
|
126
|
+
: {}),
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
return { status: folders.length === 0 ? 'empty' : 'ok', folders, total: folders.length };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* An indented outline, for the structure section of a `context` bundle. Cheap to
|
|
133
|
+
* produce and worth a lot: it is the difference between an agent that knows
|
|
134
|
+
* `documents/` exists and one that invents `docs/`.
|
|
135
|
+
*/
|
|
136
|
+
function listTree(ctx, input) {
|
|
137
|
+
const maxDepth = input.depth ?? 2;
|
|
138
|
+
const prefix = input.folder ? `${input.folder}/` : '';
|
|
139
|
+
const rows = ctx.store.db.prepare("SELECT slug FROM pages WHERE role != 'ignored' ORDER BY slug").all();
|
|
140
|
+
const counts = new Map();
|
|
141
|
+
for (const { slug } of rows) {
|
|
142
|
+
if (prefix && !slug.startsWith(prefix))
|
|
143
|
+
continue;
|
|
144
|
+
const segments = slug.slice(prefix.length).split('/');
|
|
145
|
+
for (let depth = 1; depth <= Math.min(maxDepth, segments.length - 1); depth++) {
|
|
146
|
+
const key = segments.slice(0, depth).join('/');
|
|
147
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Declared folders with nothing in them yet belong in the outline too — an agent choosing a
|
|
151
|
+
// destination should see the folder somebody just created for this, not conclude it has to
|
|
152
|
+
// invent one.
|
|
153
|
+
for (const folderPath of declaredFolders(ctx, prefix)) {
|
|
154
|
+
const key = folderPath.slice(prefix.length);
|
|
155
|
+
if (key.length === 0 || key.split('/').length > maxDepth)
|
|
156
|
+
continue;
|
|
157
|
+
if (!counts.has(key))
|
|
158
|
+
counts.set(key, 0);
|
|
159
|
+
}
|
|
160
|
+
for (const folderPath of physicalFolders(ctx.config, { under: input.folder, depth: maxDepth })) {
|
|
161
|
+
const key = prefix ? folderPath.slice(prefix.length) : folderPath;
|
|
162
|
+
if (key.length === 0 || key.split('/').length > maxDepth)
|
|
163
|
+
continue;
|
|
164
|
+
if (!counts.has(key))
|
|
165
|
+
counts.set(key, 0);
|
|
166
|
+
}
|
|
167
|
+
const lines = [...counts.keys()].sort().map((key) => {
|
|
168
|
+
const depth = key.split('/').length - 1;
|
|
169
|
+
const label = key.split('/').at(-1);
|
|
170
|
+
// The description, only at the top level and only in a clause. This outline is the whole
|
|
171
|
+
// of what a turn is told about structure, and `research/ (12)` does not say that research
|
|
172
|
+
// holds findings about the world while `household/` holds claims about this household —
|
|
173
|
+
// which is the distinction a caller gets wrong when nothing tells it.
|
|
174
|
+
const described = depth === 0 ? effectiveRule(`${prefix}${key}/x`, ctx.config.rules).description : undefined;
|
|
175
|
+
const note = described ? ` — ${truncate(described, 90)}` : '';
|
|
176
|
+
return `${' '.repeat(depth)}${label}/ (${counts.get(key)})${note}`;
|
|
177
|
+
});
|
|
178
|
+
const rootPages = rows.filter((row) => !row.slug.slice(prefix.length).includes('/')).length;
|
|
179
|
+
if (rootPages > 0)
|
|
180
|
+
lines.unshift(`${input.folder ?? '.'}: ${rootPages} pages`);
|
|
181
|
+
return { status: 'ok', tree: lines.join('\n'), total: counts.size };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Folders named by a rule, under `prefix`, that a caller is allowed to see.
|
|
185
|
+
*
|
|
186
|
+
* A folder with a rule but no pages is still somewhere to file something — it is, in fact,
|
|
187
|
+
* the folder most likely to be right, because somebody has just said what it is for. Deriving
|
|
188
|
+
* structure from pages alone made a freshly declared folder invisible to the very caller that
|
|
189
|
+
* declared it.
|
|
190
|
+
*
|
|
191
|
+
* `ignored` is the exception, and not a small one: ignoring a folder is a statement that it
|
|
192
|
+
* should not be in the index at all, and listing it because it happens to have a rule would
|
|
193
|
+
* make the one role that means "do not look here" the one role that always appears.
|
|
194
|
+
*/
|
|
195
|
+
function declaredFolders(ctx, prefix) {
|
|
196
|
+
const out = [];
|
|
197
|
+
for (const rule of ctx.config.rules) {
|
|
198
|
+
const folderPath = rule.glob.replace(/\/\*+$/, '');
|
|
199
|
+
if (folderPath.length === 0 || folderPath.includes('*'))
|
|
200
|
+
continue;
|
|
201
|
+
if (!folderPath.startsWith(prefix))
|
|
202
|
+
continue;
|
|
203
|
+
if (effectiveRule(`${folderPath}/x`, ctx.config.rules).role === 'ignored')
|
|
204
|
+
continue;
|
|
205
|
+
out.push(folderPath);
|
|
206
|
+
}
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
/** Cut at a word boundary — half a word reads as a typo rather than as an elision. */
|
|
210
|
+
function truncate(text, max) {
|
|
211
|
+
if (text.length <= max)
|
|
212
|
+
return text;
|
|
213
|
+
const cut = text.slice(0, max);
|
|
214
|
+
const space = cut.lastIndexOf(' ');
|
|
215
|
+
return `${(space > max * 0.6 ? cut.slice(0, space) : cut).replace(/[.,;:]$/, '')}…`;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/ops/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type MoveOutput } from '@tenphi/akno-protocol';
|
|
2
|
+
import type { AknoContext } from '../context.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Relocate a page with its documents, rewriting embeds and **reporting**
|
|
5
|
+
* inbound links.
|
|
6
|
+
*
|
|
7
|
+
* The asymmetry between rewriting and reporting is deliberate:
|
|
8
|
+
*
|
|
9
|
+
* - The moved page's own links to its attachments are rewritten, because the move
|
|
10
|
+
* renamed those files and leaving them would break the page Akno just moved.
|
|
11
|
+
* - Links *into* the page from elsewhere are reported, never rewritten. Editing
|
|
12
|
+
* half a dozen other people's pages as a side effect of moving one is a much
|
|
13
|
+
* bigger action than the caller asked for, and inbound links are already treated
|
|
14
|
+
* that now point nowhere as something to report.
|
|
15
|
+
*
|
|
16
|
+
* Identity survives regardless: the page keeps its `id`, so facts, events and
|
|
17
|
+
* journal history stay attached.
|
|
18
|
+
*/
|
|
19
|
+
export declare function move(ctx: AknoContext, rawInput: unknown): Promise<MoveOutput>;
|
|
20
|
+
//# sourceMappingURL=move.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../../src/ops/move.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMjD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAuInF"}
|
package/dist/ops/move.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import fsp from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { AknoError, MoveInput } from '@tenphi/akno-protocol';
|
|
4
|
+
import { ATTACHMENT_NAME } from "../kb/page.js";
|
|
5
|
+
import { recordOwnWrite, writeFileAtomic } from "../write/atomic.js";
|
|
6
|
+
import { normalizeSlug } from "./write.js";
|
|
7
|
+
/**
|
|
8
|
+
* Relocate a page with its documents, rewriting embeds and **reporting**
|
|
9
|
+
* inbound links.
|
|
10
|
+
*
|
|
11
|
+
* The asymmetry between rewriting and reporting is deliberate:
|
|
12
|
+
*
|
|
13
|
+
* - The moved page's own links to its attachments are rewritten, because the move
|
|
14
|
+
* renamed those files and leaving them would break the page Akno just moved.
|
|
15
|
+
* - Links *into* the page from elsewhere are reported, never rewritten. Editing
|
|
16
|
+
* half a dozen other people's pages as a side effect of moving one is a much
|
|
17
|
+
* bigger action than the caller asked for, and inbound links are already treated
|
|
18
|
+
* that now point nowhere as something to report.
|
|
19
|
+
*
|
|
20
|
+
* Identity survives regardless: the page keeps its `id`, so facts, events and
|
|
21
|
+
* journal history stay attached.
|
|
22
|
+
*/
|
|
23
|
+
export async function move(ctx, rawInput) {
|
|
24
|
+
const input = MoveInput.parse(rawInput);
|
|
25
|
+
const from = normalizeSlug(input.from);
|
|
26
|
+
const to = normalizeSlug(input.to);
|
|
27
|
+
if (from === to)
|
|
28
|
+
return { status: 'ok', outcome: 'ok', note: 'source and destination are the same' };
|
|
29
|
+
const page = ctx.store.db.prepare('SELECT id, rel_path FROM pages WHERE slug = ?').get(from);
|
|
30
|
+
if (!page)
|
|
31
|
+
throw new AknoError('not_found', `no page at ${from}`);
|
|
32
|
+
if (ctx.store.db.prepare('SELECT 1 FROM pages WHERE slug = ?').get(to)) {
|
|
33
|
+
throw new AknoError('invalid', `${to} already exists — move it or pick another slug`);
|
|
34
|
+
}
|
|
35
|
+
// The destination folder is checked exactly as a new page's would be: moving a
|
|
36
|
+
// page into `medical/` creates `medical/` just as surely as writing one there.
|
|
37
|
+
const decision = ctx.gate.check(to, ctx.actor);
|
|
38
|
+
if (!decision.allowed) {
|
|
39
|
+
return {
|
|
40
|
+
status: 'ok',
|
|
41
|
+
outcome: 'requires_folder',
|
|
42
|
+
requires_folder: decision.requiresFolder,
|
|
43
|
+
note: `'${decision.requiresFolder.folder}' has not been declared. Call \`folder\` with a ` +
|
|
44
|
+
'description of what belongs there, then repeat the move.',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const files = [];
|
|
48
|
+
const moved = [];
|
|
49
|
+
const toRelPath = `${to}.md`;
|
|
50
|
+
// ── Attachments first ───────────────────────────────────────────────────
|
|
51
|
+
// Content-addressed names are derived from the page basename, so a move
|
|
52
|
+
// renames them too. Doing these before the page means a crash leaves the page
|
|
53
|
+
// still pointing at files that exist.
|
|
54
|
+
const documents = ctx.store.db
|
|
55
|
+
.prepare('SELECT id, rel_path, renders FROM documents WHERE page_id = ?')
|
|
56
|
+
.all(page.id);
|
|
57
|
+
const destinations = new Map();
|
|
58
|
+
for (const document of documents)
|
|
59
|
+
destinations.set(document.rel_path, movedAttachmentPath(document.rel_path, from, to));
|
|
60
|
+
// A rendition is named after the file it renders, so it goes wherever that file goes.
|
|
61
|
+
// Deriving it from the page name instead would mean teaching the content-addressing rule
|
|
62
|
+
// about double extensions and then keeping two derivations agreeing with each other.
|
|
63
|
+
for (const document of documents) {
|
|
64
|
+
if (!document.renders)
|
|
65
|
+
continue;
|
|
66
|
+
destinations.set(document.rel_path, movedRenditionPath(document.rel_path, document.renders, destinations));
|
|
67
|
+
}
|
|
68
|
+
const rewrites = [];
|
|
69
|
+
for (const document of documents) {
|
|
70
|
+
const next = destinations.get(document.rel_path);
|
|
71
|
+
if (next === document.rel_path)
|
|
72
|
+
continue;
|
|
73
|
+
await fsp.mkdir(path.dirname(path.join(ctx.config.aknoPath, next)), { recursive: true });
|
|
74
|
+
await fsp.rename(path.join(ctx.config.aknoPath, document.rel_path), path.join(ctx.config.aknoPath, next));
|
|
75
|
+
// One entry naming the destination, not a `moved`/`created` pair. Reversing that pair
|
|
76
|
+
// deleted the new file and then tried to restore a path holding nothing — an attachment
|
|
77
|
+
// has no text in `before` to put back — so undoing a move used to eat the binary.
|
|
78
|
+
files.push({ relPath: document.rel_path, action: 'moved', before: null, after: null, movedTo: next });
|
|
79
|
+
moved.push(next);
|
|
80
|
+
rewrites.push([path.basename(document.rel_path), path.basename(next)]);
|
|
81
|
+
}
|
|
82
|
+
// ── The page ────────────────────────────────────────────────────────────
|
|
83
|
+
const original = await fsp.readFile(path.join(ctx.config.aknoPath, page.rel_path), 'utf8');
|
|
84
|
+
let content = original;
|
|
85
|
+
for (const [oldName, newName] of rewrites) {
|
|
86
|
+
content = content.split(oldName).join(newName);
|
|
87
|
+
}
|
|
88
|
+
await fsp.mkdir(path.dirname(path.join(ctx.config.aknoPath, toRelPath)), { recursive: true });
|
|
89
|
+
const written = await writeFileAtomic(ctx.config.aknoPath, toRelPath, content);
|
|
90
|
+
await fsp.rm(path.join(ctx.config.aknoPath, page.rel_path), { force: true });
|
|
91
|
+
files.push({ relPath: page.rel_path, action: 'moved', before: original, after: null });
|
|
92
|
+
files.push({ relPath: toRelPath, action: 'created', before: null, after: written.after });
|
|
93
|
+
moved.push(toRelPath);
|
|
94
|
+
// ── Inbound links ───────────────────────────────────────────────────────
|
|
95
|
+
const inbound = ctx.store.db
|
|
96
|
+
.prepare(`SELECT DISTINCT p.slug FROM links l JOIN pages p ON p.id = l.from_page
|
|
97
|
+
WHERE l.to_slug = ? AND p.id != ?`)
|
|
98
|
+
.all(from, page.id);
|
|
99
|
+
const changeId = ctx.journal.record({
|
|
100
|
+
actor: ctx.actor,
|
|
101
|
+
op: 'move',
|
|
102
|
+
summary: `${from} -> ${to}${documents.length > 0 ? ` with ${documents.length} attachment(s)` : ''}`,
|
|
103
|
+
files,
|
|
104
|
+
});
|
|
105
|
+
ctx.store.transaction(() => {
|
|
106
|
+
// Follow the id rather than retiring it — the same rule the watcher uses for a
|
|
107
|
+
// hand rename.
|
|
108
|
+
ctx.store.db.prepare('UPDATE pages SET slug = ?, rel_path = ? WHERE id = ?').run(to, toRelPath, page.id);
|
|
109
|
+
ctx.store.db.prepare('DELETE FROM files WHERE rel_path = ?').run(page.rel_path);
|
|
110
|
+
for (const document of documents) {
|
|
111
|
+
const next = destinations.get(document.rel_path);
|
|
112
|
+
// `renders` is a path, so it follows the file it points at — a rendition still naming
|
|
113
|
+
// the old folder is a rendition of nothing.
|
|
114
|
+
const renders = document.renders ? (destinations.get(document.renders) ?? null) : null;
|
|
115
|
+
ctx.store.db
|
|
116
|
+
.prepare('UPDATE documents SET rel_path = ?, renders = ? WHERE id = ?')
|
|
117
|
+
.run(next, renders, document.id);
|
|
118
|
+
ctx.store.db.prepare('DELETE FROM files WHERE rel_path = ?').run(document.rel_path);
|
|
119
|
+
}
|
|
120
|
+
recordOwnWrite(ctx.store, ctx.config.aknoPath, toRelPath, content, page.id);
|
|
121
|
+
});
|
|
122
|
+
// The page kept its id and its body, so nothing needs re-deriving — only the
|
|
123
|
+
// structural walk to notice the paths moved.
|
|
124
|
+
await ctx.indexer.runForeground({ modelPaths: [] });
|
|
125
|
+
return {
|
|
126
|
+
status: 'ok',
|
|
127
|
+
outcome: 'ok',
|
|
128
|
+
change_id: changeId,
|
|
129
|
+
moved,
|
|
130
|
+
...(inbound.length > 0
|
|
131
|
+
? {
|
|
132
|
+
broken_inbound: inbound.map((row) => row.slug),
|
|
133
|
+
note: `${inbound.length} page(s) still link to '${from}'. They are reported rather than rewritten — ` +
|
|
134
|
+
'editing them is a bigger change than the one you asked for.',
|
|
135
|
+
}
|
|
136
|
+
: {}),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* `documents/passport-ada-3f8c1a2b.jpg` moving with `documents/passport-ada`
|
|
141
|
+
* becomes `archive/id/passport-ada-3f8c1a2b.jpg` — the hash is content-addressing
|
|
142
|
+
* and must not change, since the bytes did not.
|
|
143
|
+
*/
|
|
144
|
+
function movedAttachmentPath(relPath, from, to) {
|
|
145
|
+
const base = path.posix.basename(relPath.replace(/\\/g, '/'));
|
|
146
|
+
const fromBase = from.split('/').pop();
|
|
147
|
+
const toBase = to.split('/').pop();
|
|
148
|
+
const toDir = to.includes('/') ? to.slice(0, to.lastIndexOf('/')) : '';
|
|
149
|
+
const addressed = ATTACHMENT_NAME.exec(base);
|
|
150
|
+
const nextBase = addressed && addressed[1] === fromBase
|
|
151
|
+
? `${toBase}-${addressed[2]}.${addressed[3]}`
|
|
152
|
+
: base.startsWith(`${fromBase}.`)
|
|
153
|
+
? `${toBase}${base.slice(fromBase.length)}`
|
|
154
|
+
: base;
|
|
155
|
+
return toDir ? `${toDir}/${nextBase}` : nextBase;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Where the text beside a document goes when that document moves.
|
|
159
|
+
*
|
|
160
|
+
* Both spellings follow the same principle — the rendition is named after what it renders,
|
|
161
|
+
* not after the page — so both are answered from the source's destination rather than from
|
|
162
|
+
* a second reading of the page name.
|
|
163
|
+
*/
|
|
164
|
+
function movedRenditionPath(relPath, renders, destinations) {
|
|
165
|
+
const source = destinations.get(renders);
|
|
166
|
+
if (!source)
|
|
167
|
+
return relPath;
|
|
168
|
+
// `contract.pdf.txt` keeps its suffix; `contract.txt` swaps the source's extension for it.
|
|
169
|
+
if (relPath === `${renders}.txt`)
|
|
170
|
+
return `${source}.txt`;
|
|
171
|
+
return `${source.slice(0, -path.posix.extname(source).length)}.txt`;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=move.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.js","sourceRoot":"","sources":["../../src/ops/move.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReadOutput } from '@tenphi/akno-protocol';
|
|
2
|
+
import type { AknoContext } from '../context.ts';
|
|
3
|
+
/**
|
|
4
|
+
* `read({slug})` returns the full body of a `source` page every time.
|
|
5
|
+
* The role governs only what recall pulls in unprompted — **this is a relevance
|
|
6
|
+
* policy, not access control.**
|
|
7
|
+
*/
|
|
8
|
+
export declare function read(ctx: AknoContext, rawInput: unknown): Promise<ReadOutput>;
|
|
9
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/ops/read.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAInF"}
|