@tenphi/akno-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +83 -0
- package/README.md +26 -0
- package/config/default.jsonc +548 -0
- package/dist/bench/answer-corpus.d.ts +48 -0
- package/dist/bench/answer-corpus.d.ts.map +1 -0
- package/dist/bench/answer-corpus.js +491 -0
- package/dist/bench/answer-corpus.js.map +1 -0
- package/dist/bench/answer.d.ts +156 -0
- package/dist/bench/answer.d.ts.map +1 -0
- package/dist/bench/answer.js +608 -0
- package/dist/bench/answer.js.map +1 -0
- package/dist/bench/auto-recall-answer-corpus.d.ts +21 -0
- package/dist/bench/auto-recall-answer-corpus.d.ts.map +1 -0
- package/dist/bench/auto-recall-answer-corpus.js +245 -0
- package/dist/bench/auto-recall-answer-corpus.js.map +1 -0
- package/dist/bench/auto-recall-answer.d.ts +198 -0
- package/dist/bench/auto-recall-answer.d.ts.map +1 -0
- package/dist/bench/auto-recall-answer.js +720 -0
- package/dist/bench/auto-recall-answer.js.map +1 -0
- package/dist/bench/auto-recall-corpus.d.ts +45 -0
- package/dist/bench/auto-recall-corpus.d.ts.map +1 -0
- package/dist/bench/auto-recall-corpus.js +221 -0
- package/dist/bench/auto-recall-corpus.js.map +1 -0
- package/dist/bench/auto-recall.d.ts +171 -0
- package/dist/bench/auto-recall.d.ts.map +1 -0
- package/dist/bench/auto-recall.js +651 -0
- package/dist/bench/auto-recall.js.map +1 -0
- package/dist/bench/entity-resolution.d.ts +37 -0
- package/dist/bench/entity-resolution.d.ts.map +1 -0
- package/dist/bench/entity-resolution.js +121 -0
- package/dist/bench/entity-resolution.js.map +1 -0
- package/dist/bench/graph.d.ts +57 -0
- package/dist/bench/graph.d.ts.map +1 -0
- package/dist/bench/graph.js +573 -0
- package/dist/bench/graph.js.map +1 -0
- package/dist/bench/llm-ranking-probe.d.ts +27 -0
- package/dist/bench/llm-ranking-probe.d.ts.map +1 -0
- package/dist/bench/llm-ranking-probe.js +105 -0
- package/dist/bench/llm-ranking-probe.js.map +1 -0
- package/dist/bench/merge-discovery-corpus.d.ts +26 -0
- package/dist/bench/merge-discovery-corpus.d.ts.map +1 -0
- package/dist/bench/merge-discovery-corpus.js +114 -0
- package/dist/bench/merge-discovery-corpus.js.map +1 -0
- package/dist/bench/merge-discovery-review.d.ts +81 -0
- package/dist/bench/merge-discovery-review.d.ts.map +1 -0
- package/dist/bench/merge-discovery-review.js +149 -0
- package/dist/bench/merge-discovery-review.js.map +1 -0
- package/dist/bench/merge-discovery.d.ts +122 -0
- package/dist/bench/merge-discovery.d.ts.map +1 -0
- package/dist/bench/merge-discovery.js +390 -0
- package/dist/bench/merge-discovery.js.map +1 -0
- package/dist/bench/mixed-retrieval.d.ts +35 -0
- package/dist/bench/mixed-retrieval.d.ts.map +1 -0
- package/dist/bench/mixed-retrieval.js +355 -0
- package/dist/bench/mixed-retrieval.js.map +1 -0
- package/dist/bench/ranking-corpus.d.ts +29 -0
- package/dist/bench/ranking-corpus.d.ts.map +1 -0
- package/dist/bench/ranking-corpus.js +514 -0
- package/dist/bench/ranking-corpus.js.map +1 -0
- package/dist/bench/ranking-end-to-end.d.ts +112 -0
- package/dist/bench/ranking-end-to-end.d.ts.map +1 -0
- package/dist/bench/ranking-end-to-end.js +479 -0
- package/dist/bench/ranking-end-to-end.js.map +1 -0
- package/dist/bench/ranking-latency.d.ts +71 -0
- package/dist/bench/ranking-latency.d.ts.map +1 -0
- package/dist/bench/ranking-latency.js +130 -0
- package/dist/bench/ranking-latency.js.map +1 -0
- package/dist/bench/ranking-matrix.d.ts +141 -0
- package/dist/bench/ranking-matrix.d.ts.map +1 -0
- package/dist/bench/ranking-matrix.js +526 -0
- package/dist/bench/ranking-matrix.js.map +1 -0
- package/dist/bench/ranking-review.d.ts +93 -0
- package/dist/bench/ranking-review.d.ts.map +1 -0
- package/dist/bench/ranking-review.js +249 -0
- package/dist/bench/ranking-review.js.map +1 -0
- package/dist/bench/ranking.d.ts +122 -0
- package/dist/bench/ranking.d.ts.map +1 -0
- package/dist/bench/ranking.js +547 -0
- package/dist/bench/ranking.js.map +1 -0
- package/dist/bench.d.ts +60 -0
- package/dist/bench.d.ts.map +1 -0
- package/dist/bench.js +167 -0
- package/dist/bench.js.map +1 -0
- package/dist/config/jsonc.d.ts +8 -0
- package/dist/config/jsonc.d.ts.map +1 -0
- package/dist/config/jsonc.js +85 -0
- package/dist/config/jsonc.js.map +1 -0
- package/dist/config/load.d.ts +43 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +608 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/paths.d.ts +10 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +38 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +698 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +394 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/write-rules.d.ts +41 -0
- package/dist/config/write-rules.d.ts.map +1 -0
- package/dist/config/write-rules.js +225 -0
- package/dist/config/write-rules.js.map +1 -0
- package/dist/config/write-setup.d.ts +42 -0
- package/dist/config/write-setup.d.ts.map +1 -0
- package/dist/config/write-setup.js +358 -0
- package/dist/config/write-setup.js.map +1 -0
- package/dist/context.d.ts +64 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +14 -0
- package/dist/context.js.map +1 -0
- package/dist/doctor.d.ts +115 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +388 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index/chunk.d.ts +62 -0
- package/dist/index/chunk.d.ts.map +1 -0
- package/dist/index/chunk.js +307 -0
- package/dist/index/chunk.js.map +1 -0
- package/dist/index/defer.d.ts +32 -0
- package/dist/index/defer.d.ts.map +1 -0
- package/dist/index/defer.js +66 -0
- package/dist/index/defer.js.map +1 -0
- package/dist/index/derive.d.ts +99 -0
- package/dist/index/derive.d.ts.map +1 -0
- package/dist/index/derive.js +378 -0
- package/dist/index/derive.js.map +1 -0
- package/dist/index/entity-resolution.d.ts +68 -0
- package/dist/index/entity-resolution.d.ts.map +1 -0
- package/dist/index/entity-resolution.js +305 -0
- package/dist/index/entity-resolution.js.map +1 -0
- package/dist/index/graph.d.ts +46 -0
- package/dist/index/graph.d.ts.map +1 -0
- package/dist/index/graph.js +618 -0
- package/dist/index/graph.js.map +1 -0
- package/dist/index/indexer.d.ts +301 -0
- package/dist/index/indexer.d.ts.map +1 -0
- package/dist/index/indexer.js +1398 -0
- package/dist/index/indexer.js.map +1 -0
- package/dist/index/revision-barrier.d.ts +30 -0
- package/dist/index/revision-barrier.d.ts.map +1 -0
- package/dist/index/revision-barrier.js +140 -0
- package/dist/index/revision-barrier.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/adoption-eligibility.d.ts +4 -0
- package/dist/ingest/adoption-eligibility.d.ts.map +1 -0
- package/dist/ingest/adoption-eligibility.js +18 -0
- package/dist/ingest/adoption-eligibility.js.map +1 -0
- package/dist/ingest/availability.d.ts +15 -0
- package/dist/ingest/availability.d.ts.map +1 -0
- package/dist/ingest/availability.js +37 -0
- package/dist/ingest/availability.js.map +1 -0
- package/dist/ingest/extract.d.ts +58 -0
- package/dist/ingest/extract.d.ts.map +1 -0
- package/dist/ingest/extract.js +255 -0
- package/dist/ingest/extract.js.map +1 -0
- package/dist/ingest/fetch.d.ts +35 -0
- package/dist/ingest/fetch.d.ts.map +1 -0
- package/dist/ingest/fetch.js +142 -0
- package/dist/ingest/fetch.js.map +1 -0
- package/dist/ingest/inbox.d.ts +53 -0
- package/dist/ingest/inbox.d.ts.map +1 -0
- package/dist/ingest/inbox.js +110 -0
- package/dist/ingest/inbox.js.map +1 -0
- package/dist/ingest/name.d.ts +72 -0
- package/dist/ingest/name.d.ts.map +1 -0
- package/dist/ingest/name.js +208 -0
- package/dist/ingest/name.js.map +1 -0
- package/dist/ingest/parts.d.ts +78 -0
- package/dist/ingest/parts.d.ts.map +1 -0
- package/dist/ingest/parts.js +52 -0
- package/dist/ingest/parts.js.map +1 -0
- package/dist/ingest/rendition.d.ts +75 -0
- package/dist/ingest/rendition.d.ts.map +1 -0
- package/dist/ingest/rendition.js +92 -0
- package/dist/ingest/rendition.js.map +1 -0
- package/dist/ingest/store.d.ts +66 -0
- package/dist/ingest/store.d.ts.map +1 -0
- package/dist/ingest/store.js +92 -0
- package/dist/ingest/store.js.map +1 -0
- package/dist/kb/folders.d.ts +37 -0
- package/dist/kb/folders.d.ts.map +1 -0
- package/dist/kb/folders.js +133 -0
- package/dist/kb/folders.js.map +1 -0
- package/dist/kb/frontmatter.d.ts +91 -0
- package/dist/kb/frontmatter.d.ts.map +1 -0
- package/dist/kb/frontmatter.js +274 -0
- package/dist/kb/frontmatter.js.map +1 -0
- package/dist/kb/line-facts.d.ts +29 -0
- package/dist/kb/line-facts.d.ts.map +1 -0
- package/dist/kb/line-facts.js +23 -0
- package/dist/kb/line-facts.js.map +1 -0
- package/dist/kb/page.d.ts +92 -0
- package/dist/kb/page.d.ts.map +1 -0
- package/dist/kb/page.js +243 -0
- package/dist/kb/page.js.map +1 -0
- package/dist/kb/scan.d.ts +38 -0
- package/dist/kb/scan.d.ts.map +1 -0
- package/dist/kb/scan.js +109 -0
- package/dist/kb/scan.js.map +1 -0
- package/dist/kb/words.d.ts +30 -0
- package/dist/kb/words.d.ts.map +1 -0
- package/dist/kb/words.js +107 -0
- package/dist/kb/words.js.map +1 -0
- package/dist/maintenance/adopt.d.ts +65 -0
- package/dist/maintenance/adopt.d.ts.map +1 -0
- package/dist/maintenance/adopt.js +238 -0
- package/dist/maintenance/adopt.js.map +1 -0
- package/dist/maintenance/budget.d.ts +55 -0
- package/dist/maintenance/budget.d.ts.map +1 -0
- package/dist/maintenance/budget.js +61 -0
- package/dist/maintenance/budget.js.map +1 -0
- package/dist/maintenance/conflicts.d.ts +105 -0
- package/dist/maintenance/conflicts.d.ts.map +1 -0
- package/dist/maintenance/conflicts.js +368 -0
- package/dist/maintenance/conflicts.js.map +1 -0
- package/dist/maintenance/contradictions.d.ts +34 -0
- package/dist/maintenance/contradictions.d.ts.map +1 -0
- package/dist/maintenance/contradictions.js +199 -0
- package/dist/maintenance/contradictions.js.map +1 -0
- package/dist/maintenance/curate.d.ts +156 -0
- package/dist/maintenance/curate.d.ts.map +1 -0
- package/dist/maintenance/curate.js +2070 -0
- package/dist/maintenance/curate.js.map +1 -0
- package/dist/maintenance/dream.d.ts +139 -0
- package/dist/maintenance/dream.d.ts.map +1 -0
- package/dist/maintenance/dream.js +1632 -0
- package/dist/maintenance/dream.js.map +1 -0
- package/dist/maintenance/graph-candidates.d.ts +19 -0
- package/dist/maintenance/graph-candidates.d.ts.map +1 -0
- package/dist/maintenance/graph-candidates.js +120 -0
- package/dist/maintenance/graph-candidates.js.map +1 -0
- package/dist/maintenance/housekeeping.d.ts +81 -0
- package/dist/maintenance/housekeeping.d.ts.map +1 -0
- package/dist/maintenance/housekeeping.js +281 -0
- package/dist/maintenance/housekeeping.js.map +1 -0
- package/dist/maintenance/link-repairs.d.ts +58 -0
- package/dist/maintenance/link-repairs.d.ts.map +1 -0
- package/dist/maintenance/link-repairs.js +281 -0
- package/dist/maintenance/link-repairs.js.map +1 -0
- package/dist/maintenance/log.d.ts +41 -0
- package/dist/maintenance/log.d.ts.map +1 -0
- package/dist/maintenance/log.js +72 -0
- package/dist/maintenance/log.js.map +1 -0
- package/dist/maintenance/managed-item-routing.d.ts +48 -0
- package/dist/maintenance/managed-item-routing.d.ts.map +1 -0
- package/dist/maintenance/managed-item-routing.js +281 -0
- package/dist/maintenance/managed-item-routing.js.map +1 -0
- package/dist/maintenance/managed-item-sources.d.ts +38 -0
- package/dist/maintenance/managed-item-sources.d.ts.map +1 -0
- package/dist/maintenance/managed-item-sources.js +324 -0
- package/dist/maintenance/managed-item-sources.js.map +1 -0
- package/dist/maintenance/managed-items.d.ts +162 -0
- package/dist/maintenance/managed-items.d.ts.map +1 -0
- package/dist/maintenance/managed-items.js +1329 -0
- package/dist/maintenance/managed-items.js.map +1 -0
- package/dist/maintenance/merge-classifier.d.ts +19 -0
- package/dist/maintenance/merge-classifier.d.ts.map +1 -0
- package/dist/maintenance/merge-classifier.js +49 -0
- package/dist/maintenance/merge-classifier.js.map +1 -0
- package/dist/maintenance/model-telemetry.d.ts +45 -0
- package/dist/maintenance/model-telemetry.d.ts.map +1 -0
- package/dist/maintenance/model-telemetry.js +107 -0
- package/dist/maintenance/model-telemetry.js.map +1 -0
- package/dist/maintenance/observe.d.ts +72 -0
- package/dist/maintenance/observe.d.ts.map +1 -0
- package/dist/maintenance/observe.js +265 -0
- package/dist/maintenance/observe.js.map +1 -0
- package/dist/maintenance/path-policy.d.ts +83 -0
- package/dist/maintenance/path-policy.d.ts.map +1 -0
- package/dist/maintenance/path-policy.js +360 -0
- package/dist/maintenance/path-policy.js.map +1 -0
- package/dist/maintenance/plans.d.ts +366 -0
- package/dist/maintenance/plans.d.ts.map +1 -0
- package/dist/maintenance/plans.js +4060 -0
- package/dist/maintenance/plans.js.map +1 -0
- package/dist/maintenance/profile.d.ts +33 -0
- package/dist/maintenance/profile.d.ts.map +1 -0
- package/dist/maintenance/profile.js +99 -0
- package/dist/maintenance/profile.js.map +1 -0
- package/dist/maintenance/recovery.d.ts +38 -0
- package/dist/maintenance/recovery.d.ts.map +1 -0
- package/dist/maintenance/recovery.js +217 -0
- package/dist/maintenance/recovery.js.map +1 -0
- package/dist/maintenance/repair.d.ts +37 -0
- package/dist/maintenance/repair.d.ts.map +1 -0
- package/dist/maintenance/repair.js +183 -0
- package/dist/maintenance/repair.js.map +1 -0
- package/dist/maintenance/rule-drift.d.ts +104 -0
- package/dist/maintenance/rule-drift.d.ts.map +1 -0
- package/dist/maintenance/rule-drift.js +507 -0
- package/dist/maintenance/rule-drift.js.map +1 -0
- package/dist/maintenance/run-verification.d.ts +44 -0
- package/dist/maintenance/run-verification.d.ts.map +1 -0
- package/dist/maintenance/run-verification.js +253 -0
- package/dist/maintenance/run-verification.js.map +1 -0
- package/dist/maintenance/runs.d.ts +142 -0
- package/dist/maintenance/runs.d.ts.map +1 -0
- package/dist/maintenance/runs.js +439 -0
- package/dist/maintenance/runs.js.map +1 -0
- package/dist/maintenance/semantic-merge-discovery.d.ts +54 -0
- package/dist/maintenance/semantic-merge-discovery.d.ts.map +1 -0
- package/dist/maintenance/semantic-merge-discovery.js +308 -0
- package/dist/maintenance/semantic-merge-discovery.js.map +1 -0
- package/dist/maintenance/temporal.d.ts +44 -0
- package/dist/maintenance/temporal.d.ts.map +1 -0
- package/dist/maintenance/temporal.js +295 -0
- package/dist/maintenance/temporal.js.map +1 -0
- package/dist/models/client.d.ts +214 -0
- package/dist/models/client.d.ts.map +1 -0
- package/dist/models/client.js +904 -0
- package/dist/models/client.js.map +1 -0
- package/dist/models/provider-api.d.ts +28 -0
- package/dist/models/provider-api.d.ts.map +1 -0
- package/dist/models/provider-api.js +320 -0
- package/dist/models/provider-api.js.map +1 -0
- package/dist/open.d.ts +163 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +382 -0
- package/dist/open.js.map +1 -0
- package/dist/ops/adopt.d.ts +12 -0
- package/dist/ops/adopt.d.ts.map +1 -0
- package/dist/ops/adopt.js +138 -0
- package/dist/ops/adopt.js.map +1 -0
- package/dist/ops/answer.d.ts +29 -0
- package/dist/ops/answer.d.ts.map +1 -0
- package/dist/ops/answer.js +557 -0
- package/dist/ops/answer.js.map +1 -0
- package/dist/ops/context.d.ts +18 -0
- package/dist/ops/context.d.ts.map +1 -0
- package/dist/ops/context.js +713 -0
- package/dist/ops/context.js.map +1 -0
- package/dist/ops/folder.d.ts +23 -0
- package/dist/ops/folder.d.ts.map +1 -0
- package/dist/ops/folder.js +130 -0
- package/dist/ops/folder.js.map +1 -0
- package/dist/ops/forget.d.ts +14 -0
- package/dist/ops/forget.d.ts.map +1 -0
- package/dist/ops/forget.js +212 -0
- package/dist/ops/forget.js.map +1 -0
- package/dist/ops/graph.d.ts +10 -0
- package/dist/ops/graph.d.ts.map +1 -0
- package/dist/ops/graph.js +480 -0
- package/dist/ops/graph.js.map +1 -0
- package/dist/ops/ingest.d.ts +40 -0
- package/dist/ops/ingest.d.ts.map +1 -0
- package/dist/ops/ingest.js +434 -0
- package/dist/ops/ingest.js.map +1 -0
- package/dist/ops/list.d.ts +9 -0
- package/dist/ops/list.d.ts.map +1 -0
- package/dist/ops/list.js +217 -0
- package/dist/ops/list.js.map +1 -0
- package/dist/ops/move.d.ts +20 -0
- package/dist/ops/move.d.ts.map +1 -0
- package/dist/ops/move.js +173 -0
- package/dist/ops/move.js.map +1 -0
- package/dist/ops/read.d.ts +9 -0
- package/dist/ops/read.d.ts.map +1 -0
- package/dist/ops/read.js +271 -0
- package/dist/ops/read.js.map +1 -0
- package/dist/ops/recall.d.ts +13 -0
- package/dist/ops/recall.d.ts.map +1 -0
- package/dist/ops/recall.js +297 -0
- package/dist/ops/recall.js.map +1 -0
- package/dist/ops/remember.d.ts +34 -0
- package/dist/ops/remember.d.ts.map +1 -0
- package/dist/ops/remember.js +660 -0
- package/dist/ops/remember.js.map +1 -0
- package/dist/ops/timeline.d.ts +11 -0
- package/dist/ops/timeline.d.ts.map +1 -0
- package/dist/ops/timeline.js +111 -0
- package/dist/ops/timeline.js.map +1 -0
- package/dist/ops/undo.d.ts +9 -0
- package/dist/ops/undo.d.ts.map +1 -0
- package/dist/ops/undo.js +38 -0
- package/dist/ops/undo.js.map +1 -0
- package/dist/ops/write.d.ts +55 -0
- package/dist/ops/write.d.ts.map +1 -0
- package/dist/ops/write.js +463 -0
- package/dist/ops/write.js.map +1 -0
- package/dist/recall/assemble.d.ts +81 -0
- package/dist/recall/assemble.d.ts.map +1 -0
- package/dist/recall/assemble.js +603 -0
- package/dist/recall/assemble.js.map +1 -0
- package/dist/recall/expand.d.ts +55 -0
- package/dist/recall/expand.d.ts.map +1 -0
- package/dist/recall/expand.js +282 -0
- package/dist/recall/expand.js.map +1 -0
- package/dist/recall/graph-arm.d.ts +17 -0
- package/dist/recall/graph-arm.d.ts.map +1 -0
- package/dist/recall/graph-arm.js +227 -0
- package/dist/recall/graph-arm.js.map +1 -0
- package/dist/recall/llm-rerank.d.ts +55 -0
- package/dist/recall/llm-rerank.d.ts.map +1 -0
- package/dist/recall/llm-rerank.js +213 -0
- package/dist/recall/llm-rerank.js.map +1 -0
- package/dist/recall/reranker-calibration.d.ts +23 -0
- package/dist/recall/reranker-calibration.d.ts.map +1 -0
- package/dist/recall/reranker-calibration.js +161 -0
- package/dist/recall/reranker-calibration.js.map +1 -0
- package/dist/recall/search.d.ts +107 -0
- package/dist/recall/search.d.ts.map +1 -0
- package/dist/recall/search.js +530 -0
- package/dist/recall/search.js.map +1 -0
- package/dist/reserved.d.ts +39 -0
- package/dist/reserved.d.ts.map +1 -0
- package/dist/reserved.js +63 -0
- package/dist/reserved.js.map +1 -0
- package/dist/rules/compile.d.ts +27 -0
- package/dist/rules/compile.d.ts.map +1 -0
- package/dist/rules/compile.js +105 -0
- package/dist/rules/compile.js.map +1 -0
- package/dist/setup/model-free.d.ts +15 -0
- package/dist/setup/model-free.d.ts.map +1 -0
- package/dist/setup/model-free.js +26 -0
- package/dist/setup/model-free.js.map +1 -0
- package/dist/setup/openai.d.ts +46 -0
- package/dist/setup/openai.d.ts.map +1 -0
- package/dist/setup/openai.js +165 -0
- package/dist/setup/openai.js.map +1 -0
- package/dist/store/db.d.ts +61 -0
- package/dist/store/db.d.ts.map +1 -0
- package/dist/store/db.js +265 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/ids.d.ts +29 -0
- package/dist/store/ids.d.ts.map +1 -0
- package/dist/store/ids.js +0 -0
- package/dist/store/ids.js.map +1 -0
- package/dist/store/migrations.d.ts +54 -0
- package/dist/store/migrations.d.ts.map +1 -0
- package/dist/store/migrations.js +923 -0
- package/dist/store/migrations.js.map +1 -0
- package/dist/store/vectors.d.ts +34 -0
- package/dist/store/vectors.d.ts.map +1 -0
- package/dist/store/vectors.js +158 -0
- package/dist/store/vectors.js.map +1 -0
- package/dist/timeline/documents.d.ts +23 -0
- package/dist/timeline/documents.d.ts.map +1 -0
- package/dist/timeline/documents.js +262 -0
- package/dist/timeline/documents.js.map +1 -0
- package/dist/watch/watcher.d.ts +43 -0
- package/dist/watch/watcher.d.ts.map +1 -0
- package/dist/watch/watcher.js +143 -0
- package/dist/watch/watcher.js.map +1 -0
- package/dist/write/atomic.d.ts +34 -0
- package/dist/write/atomic.d.ts.map +1 -0
- package/dist/write/atomic.js +58 -0
- package/dist/write/atomic.js.map +1 -0
- package/dist/write/conflict.d.ts +43 -0
- package/dist/write/conflict.d.ts.map +1 -0
- package/dist/write/conflict.js +149 -0
- package/dist/write/conflict.js.map +1 -0
- package/dist/write/edit.d.ts +59 -0
- package/dist/write/edit.d.ts.map +1 -0
- package/dist/write/edit.js +231 -0
- package/dist/write/edit.js.map +1 -0
- package/dist/write/gate.d.ts +59 -0
- package/dist/write/gate.d.ts.map +1 -0
- package/dist/write/gate.js +99 -0
- package/dist/write/gate.js.map +1 -0
- package/dist/write/journal.d.ts +90 -0
- package/dist/write/journal.d.ts.map +1 -0
- package/dist/write/journal.js +187 -0
- package/dist/write/journal.js.map +1 -0
- package/dist/write/ledger.d.ts +28 -0
- package/dist/write/ledger.d.ts.map +1 -0
- package/dist/write/ledger.js +141 -0
- package/dist/write/ledger.js.map +1 -0
- package/dist/write/placement.d.ts +29 -0
- package/dist/write/placement.d.ts.map +1 -0
- package/dist/write/placement.js +140 -0
- package/dist/write/placement.js.map +1 -0
- package/dist/write/remember-fallback.d.ts +18 -0
- package/dist/write/remember-fallback.d.ts.map +1 -0
- package/dist/write/remember-fallback.js +48 -0
- package/dist/write/remember-fallback.js.map +1 -0
- package/dist/write/retain.d.ts +61 -0
- package/dist/write/retain.d.ts.map +1 -0
- package/dist/write/retain.js +272 -0
- package/dist/write/retain.js.map +1 -0
- package/package.json +50 -0
- package/swift/extract.swift +232 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
const HEADER = `{
|
|
2
|
+
// Rules for this knowledge base. Akno reads this file from the root of the notes,
|
|
3
|
+
// so the taxonomy travels with the folder rather than living in a machine's config.
|
|
4
|
+
//
|
|
5
|
+
// Roles say what a page contributes; management says what automation may do:
|
|
6
|
+
// knowledge canonical claims, eligible for fact derivation
|
|
7
|
+
// source searchable evidence, never mined for facts
|
|
8
|
+
// inference derived interpretation, ranked below authored knowledge
|
|
9
|
+
// ignored not indexed at all
|
|
10
|
+
//
|
|
11
|
+
// \`description\` says what belongs in the folder. It is the field a caller reads before
|
|
12
|
+
// filing a page, so it is worth writing for a reader who has never seen this base.
|
|
13
|
+
"folders": {
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
`;
|
|
17
|
+
/**
|
|
18
|
+
* Returns the file's new text with `entry` added to its `folders` block.
|
|
19
|
+
*
|
|
20
|
+
* `source` is null when the file does not exist yet, in which case a commented skeleton is
|
|
21
|
+
* created around the entry — the same explanation a person would otherwise have to go and
|
|
22
|
+
* find in the docs.
|
|
23
|
+
*
|
|
24
|
+
* Throws when the file exists but has no `folders` block to add to, rather than inventing
|
|
25
|
+
* one at a guess: a file shaped differently than expected is a file somebody meant something
|
|
26
|
+
* by.
|
|
27
|
+
*/
|
|
28
|
+
export function addFolderRule(source, entry) {
|
|
29
|
+
const text = source ?? HEADER;
|
|
30
|
+
const block = findObjectValue(text, 'folders');
|
|
31
|
+
if (!block) {
|
|
32
|
+
throw new Error('akno.jsonc has no `folders` block to add a rule to');
|
|
33
|
+
}
|
|
34
|
+
const indent = `${indentOfLineAt(text, block.close)} `;
|
|
35
|
+
const lines = renderEntry(entry, indent);
|
|
36
|
+
// The end of the previous rule, or the opening brace when there is none. `{` means the
|
|
37
|
+
// block is empty and `,` means the previous entry already ends in one; anything else is the
|
|
38
|
+
// end of a rule and needs a comma before another can follow it.
|
|
39
|
+
const lastMeaningful = lastMeaningfulOffset(text, block.open + 1, block.close);
|
|
40
|
+
const needsComma = text[lastMeaningful] !== '{' && text[lastMeaningful] !== ',';
|
|
41
|
+
const comma = needsComma ? ',' : '';
|
|
42
|
+
const head = text.slice(0, lastMeaningful + 1);
|
|
43
|
+
// A closing brace sharing its line with content (`"folders": {}`) has no line of its own to
|
|
44
|
+
// insert before, so the entry is opened onto one.
|
|
45
|
+
if (!isFirstOnItsLine(text, block.close)) {
|
|
46
|
+
return `${head}${comma}\n${lines}\n${indent.slice(2)}${text.slice(block.close)}`;
|
|
47
|
+
}
|
|
48
|
+
// Everything between the last rule and the closing brace's line is carried across verbatim:
|
|
49
|
+
// it is usually a comment about the rule above it, and moving it would silently reattach it
|
|
50
|
+
// to ours.
|
|
51
|
+
const between = text.slice(lastMeaningful + 1, startOfLineAt(text, block.close));
|
|
52
|
+
const rest = text.slice(startOfLineAt(text, block.close));
|
|
53
|
+
return `${head}${comma}${between}${lines}\n${rest}`;
|
|
54
|
+
}
|
|
55
|
+
/** True when `folders` already has a rule under exactly this glob. */
|
|
56
|
+
export function hasFolderRule(folders, glob) {
|
|
57
|
+
return folders !== undefined && Object.prototype.hasOwnProperty.call(folders, glob);
|
|
58
|
+
}
|
|
59
|
+
// ─── Rendering ──────────────────────────────────────────────────────────────
|
|
60
|
+
function renderEntry(entry, indent) {
|
|
61
|
+
const fields = Object.entries(entry.rule)
|
|
62
|
+
.filter(([, value]) => value !== undefined)
|
|
63
|
+
.map(([key, value]) => `${indent} ${JSON.stringify(key)}: ${JSON.stringify(value)}`);
|
|
64
|
+
// A one-line rule reads fine, but `description` is a sentence — every real entry is
|
|
65
|
+
// multi-line, so they all are, and the file stays uniform.
|
|
66
|
+
return [`${indent}${JSON.stringify(entry.glob)}: {`, fields.join(',\n'), `${indent}}`].join('\n');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Finds a key at the root object's own depth and the object it maps to.
|
|
70
|
+
*
|
|
71
|
+
* Depth-aware on purpose: a nested `"folders"` under some other key is not the one being
|
|
72
|
+
* asked for, and a match inside a string or a comment is not a key at all.
|
|
73
|
+
*/
|
|
74
|
+
function findObjectValue(text, key) {
|
|
75
|
+
const wanted = JSON.stringify(key);
|
|
76
|
+
let depth = 0;
|
|
77
|
+
for (let i = 0; i < text.length; i++) {
|
|
78
|
+
const skipped = skipNonCode(text, i);
|
|
79
|
+
if (skipped !== i) {
|
|
80
|
+
i = skipped - 1;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const ch = text[i];
|
|
84
|
+
if (ch === '{' || ch === '[') {
|
|
85
|
+
depth++;
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (ch === '}' || ch === ']') {
|
|
89
|
+
depth--;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (ch !== '"')
|
|
93
|
+
continue;
|
|
94
|
+
// Every string is stepped over, at every depth. A `slug_pattern` of `"^{a}$"` read
|
|
95
|
+
// character by character would take the depth counter with it.
|
|
96
|
+
const end = endOfString(text, i);
|
|
97
|
+
if (depth !== 1 || text.slice(i, end) !== wanted) {
|
|
98
|
+
i = end - 1;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const colon = nextCode(text, end);
|
|
102
|
+
if (colon === null || text[colon] !== ':') {
|
|
103
|
+
i = end - 1;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const open = nextCode(text, colon + 1);
|
|
107
|
+
if (open === null || text[open] !== '{')
|
|
108
|
+
return null;
|
|
109
|
+
const close = matchingBrace(text, open);
|
|
110
|
+
return close === null ? null : { open, close };
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
/** The offset after any comment or whitespace starting at `i`; `i` itself when there is none. */
|
|
115
|
+
function skipNonCode(text, i) {
|
|
116
|
+
if (text[i] === '/' && text[i + 1] === '/') {
|
|
117
|
+
let j = i + 2;
|
|
118
|
+
while (j < text.length && text[j] !== '\n')
|
|
119
|
+
j++;
|
|
120
|
+
return j;
|
|
121
|
+
}
|
|
122
|
+
if (text[i] === '/' && text[i + 1] === '*') {
|
|
123
|
+
let j = i + 2;
|
|
124
|
+
while (j < text.length - 1 && !(text[j] === '*' && text[j + 1] === '/'))
|
|
125
|
+
j++;
|
|
126
|
+
return Math.min(j + 2, text.length);
|
|
127
|
+
}
|
|
128
|
+
return i;
|
|
129
|
+
}
|
|
130
|
+
function endOfString(text, quote) {
|
|
131
|
+
let i = quote + 1;
|
|
132
|
+
while (i < text.length) {
|
|
133
|
+
if (text[i] === '\\') {
|
|
134
|
+
i += 2;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (text[i] === '"')
|
|
138
|
+
return i + 1;
|
|
139
|
+
i++;
|
|
140
|
+
}
|
|
141
|
+
return text.length;
|
|
142
|
+
}
|
|
143
|
+
/** The next offset holding something that is not whitespace and not a comment. */
|
|
144
|
+
function nextCode(text, from) {
|
|
145
|
+
let i = from;
|
|
146
|
+
while (i < text.length) {
|
|
147
|
+
if (/\s/.test(text[i])) {
|
|
148
|
+
i++;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const skipped = skipNonCode(text, i);
|
|
152
|
+
if (skipped !== i) {
|
|
153
|
+
i = skipped;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
return i;
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
function matchingBrace(text, open) {
|
|
161
|
+
let depth = 0;
|
|
162
|
+
for (let i = open; i < text.length; i++) {
|
|
163
|
+
const skipped = skipNonCode(text, i);
|
|
164
|
+
if (skipped !== i) {
|
|
165
|
+
i = skipped - 1;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const ch = text[i];
|
|
169
|
+
if (ch === '"') {
|
|
170
|
+
i = endOfString(text, i) - 1;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (ch === '{')
|
|
174
|
+
depth++;
|
|
175
|
+
else if (ch === '}') {
|
|
176
|
+
depth--;
|
|
177
|
+
if (depth === 0)
|
|
178
|
+
return i;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The last offset inside the block that is neither whitespace nor comment — the end of the
|
|
185
|
+
* previous rule, or the opening brace when there is no previous rule.
|
|
186
|
+
*
|
|
187
|
+
* Scanned forwards rather than backwards: a `//` comment can only be recognised from its
|
|
188
|
+
* start, so reading the file in reverse would mistake the contents of a trailing comment for
|
|
189
|
+
* code — which is exactly the case that needs handling, a note written under the last rule.
|
|
190
|
+
*/
|
|
191
|
+
function lastMeaningfulOffset(text, from, until) {
|
|
192
|
+
let last = null;
|
|
193
|
+
let i = from;
|
|
194
|
+
while (i < until) {
|
|
195
|
+
if (/\s/.test(text[i])) {
|
|
196
|
+
i++;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const skipped = skipNonCode(text, i);
|
|
200
|
+
if (skipped !== i) {
|
|
201
|
+
i = skipped;
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (text[i] === '"') {
|
|
205
|
+
const end = endOfString(text, i);
|
|
206
|
+
last = end - 1;
|
|
207
|
+
i = end;
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
last = i;
|
|
211
|
+
i++;
|
|
212
|
+
}
|
|
213
|
+
return last ?? from - 1;
|
|
214
|
+
}
|
|
215
|
+
function startOfLineAt(text, offset) {
|
|
216
|
+
return text.lastIndexOf('\n', offset - 1) + 1;
|
|
217
|
+
}
|
|
218
|
+
function isFirstOnItsLine(text, offset) {
|
|
219
|
+
return text.slice(startOfLineAt(text, offset), offset).trim().length === 0;
|
|
220
|
+
}
|
|
221
|
+
function indentOfLineAt(text, offset) {
|
|
222
|
+
const line = text.slice(startOfLineAt(text, offset), offset);
|
|
223
|
+
return /^[ \t]*/.exec(line)[0];
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=write-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-rules.js","sourceRoot":"","sources":["../../src/config/write-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ConfigDoc } from './schema.ts';
|
|
2
|
+
export interface SetupConfigTargetOptions {
|
|
3
|
+
stateDir?: string;
|
|
4
|
+
env?: NodeJS.ProcessEnv;
|
|
5
|
+
/** Test seam; undefined discovers the checkout, while null models an installed package. */
|
|
6
|
+
repoRoot?: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface SetupConfigChange {
|
|
9
|
+
path: string;
|
|
10
|
+
action: 'add' | 'replace';
|
|
11
|
+
}
|
|
12
|
+
export interface SetupConfigWriteOptions {
|
|
13
|
+
/** Object paths owned as a unit by a preset instead of recursively merged. */
|
|
14
|
+
replacePaths?: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The write plan deliberately keeps document bytes internal to the config layer. CLI output receives
|
|
18
|
+
* only changed paths, so an existing provider header can never become part of a setup diff.
|
|
19
|
+
*/
|
|
20
|
+
export interface SetupConfigWritePlan {
|
|
21
|
+
targetPath: string;
|
|
22
|
+
existed: boolean;
|
|
23
|
+
changed: boolean;
|
|
24
|
+
changes: SetupConfigChange[];
|
|
25
|
+
document: ConfigDoc;
|
|
26
|
+
beforeFingerprint: string | null;
|
|
27
|
+
after: string;
|
|
28
|
+
}
|
|
29
|
+
export interface SetupConfigWriteResult {
|
|
30
|
+
targetPath: string;
|
|
31
|
+
created: boolean;
|
|
32
|
+
changed: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Resolve the same writable layer that normal commands will read. */
|
|
35
|
+
export declare function setupConfigTarget(options?: SetupConfigTargetOptions): string;
|
|
36
|
+
export declare function planSetupConfigWrite(targetPath: string, overlay: ConfigDoc, options?: SetupConfigWriteOptions): SetupConfigWritePlan;
|
|
37
|
+
/**
|
|
38
|
+
* Fsync a sibling temporary file and rename it over the target. The fingerprint check turns an
|
|
39
|
+
* editor save between preview and apply into a visible conflict instead of a lost update.
|
|
40
|
+
*/
|
|
41
|
+
export declare function applySetupConfigWrite(plan: SetupConfigWritePlan): Promise<SetupConfigWriteResult>;
|
|
42
|
+
//# sourceMappingURL=write-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-setup.d.ts","sourceRoot":"","sources":["../../src/config/write-setup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM,CAYhF;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,SAAS,EAClB,OAAO,GAAE,uBAA4B,GACpC,oBAAoB,CA0BtB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA8BvG"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import fsp from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { parseJsonc, readJsoncFile } from "./jsonc.js";
|
|
5
|
+
import { findRepoRoot, resolveUserPath } from "./paths.js";
|
|
6
|
+
import { sha256 } from "../store/ids.js";
|
|
7
|
+
/** Resolve the same writable layer that normal commands will read. */
|
|
8
|
+
export function setupConfigTarget(options = {}) {
|
|
9
|
+
const env = options.env ?? process.env;
|
|
10
|
+
if (env.AKNO_CONFIG)
|
|
11
|
+
return resolveUserPath(env.AKNO_CONFIG);
|
|
12
|
+
const repoRoot = options.repoRoot === undefined ? findRepoRoot() : options.repoRoot;
|
|
13
|
+
if (repoRoot)
|
|
14
|
+
return path.join(repoRoot, 'config', 'local.jsonc');
|
|
15
|
+
const stateDir = resolveUserPath(options.stateDir ?? env.AKNO_STATE_DIR ?? '~/.akno');
|
|
16
|
+
const json = path.join(stateDir, 'config.json');
|
|
17
|
+
const jsonc = path.join(stateDir, 'config.jsonc');
|
|
18
|
+
if (fs.existsSync(json))
|
|
19
|
+
return json;
|
|
20
|
+
return fs.existsSync(jsonc) ? jsonc : json;
|
|
21
|
+
}
|
|
22
|
+
export function planSetupConfigWrite(targetPath, overlay, options = {}) {
|
|
23
|
+
const before = readFileIfPresent(targetPath);
|
|
24
|
+
const raw = before === null ? {} : readJsoncFile(targetPath);
|
|
25
|
+
if (!isPlainObject(raw)) {
|
|
26
|
+
throw new Error(`${targetPath} must contain one JSON object`);
|
|
27
|
+
}
|
|
28
|
+
const overlayRecord = overlay;
|
|
29
|
+
const replacePaths = new Set(options.replacePaths ?? []);
|
|
30
|
+
const document = mergeObjects(raw, overlayRecord, replacePaths);
|
|
31
|
+
const changes = collectChanges(raw, overlayRecord, replacePaths);
|
|
32
|
+
const after = renderMergedConfig(before, overlayRecord, replacePaths, document);
|
|
33
|
+
const plan = {
|
|
34
|
+
targetPath,
|
|
35
|
+
existed: before !== null,
|
|
36
|
+
changed: changes.length > 0,
|
|
37
|
+
changes,
|
|
38
|
+
};
|
|
39
|
+
// These are intentionally non-enumerable. A plan is useful in CLI and plugin code, and an
|
|
40
|
+
// accidental JSON.stringify must expose only the path-only diff, never an existing header.
|
|
41
|
+
Object.defineProperties(plan, {
|
|
42
|
+
document: { value: document, enumerable: false },
|
|
43
|
+
beforeFingerprint: { value: before === null ? null : sha256(before), enumerable: false },
|
|
44
|
+
after: { value: after, enumerable: false },
|
|
45
|
+
});
|
|
46
|
+
return plan;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Fsync a sibling temporary file and rename it over the target. The fingerprint check turns an
|
|
50
|
+
* editor save between preview and apply into a visible conflict instead of a lost update.
|
|
51
|
+
*/
|
|
52
|
+
export async function applySetupConfigWrite(plan) {
|
|
53
|
+
const current = readFileIfPresent(plan.targetPath);
|
|
54
|
+
const currentFingerprint = current === null ? null : sha256(current);
|
|
55
|
+
if (currentFingerprint !== plan.beforeFingerprint) {
|
|
56
|
+
throw new Error(`configuration changed while setup was preparing its write: ${plan.targetPath}`);
|
|
57
|
+
}
|
|
58
|
+
if (!plan.changed) {
|
|
59
|
+
return { targetPath: plan.targetPath, created: false, changed: false };
|
|
60
|
+
}
|
|
61
|
+
await fsp.mkdir(path.dirname(plan.targetPath), { recursive: true });
|
|
62
|
+
const existingMode = await fileMode(plan.targetPath);
|
|
63
|
+
const temporary = `${plan.targetPath}.${process.pid}.${Math.random().toString(16).slice(2)}.akno.tmp`;
|
|
64
|
+
const handle = await fsp.open(temporary, 'wx', existingMode ?? 0o600);
|
|
65
|
+
try {
|
|
66
|
+
await handle.writeFile(plan.after, 'utf8');
|
|
67
|
+
await handle.sync();
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
await handle.close();
|
|
71
|
+
await fsp.rm(temporary, { force: true });
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
await handle.close();
|
|
75
|
+
try {
|
|
76
|
+
await fsp.rename(temporary, plan.targetPath);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
await fsp.rm(temporary, { force: true });
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
return { targetPath: plan.targetPath, created: !plan.existed, changed: true };
|
|
83
|
+
}
|
|
84
|
+
function readFileIfPresent(targetPath) {
|
|
85
|
+
try {
|
|
86
|
+
return fs.readFileSync(targetPath, 'utf8');
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (error.code === 'ENOENT')
|
|
90
|
+
return null;
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function fileMode(targetPath) {
|
|
95
|
+
try {
|
|
96
|
+
return (await fsp.stat(targetPath)).mode & 0o777;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (error.code === 'ENOENT')
|
|
100
|
+
return null;
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function isPlainObject(value) {
|
|
105
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
106
|
+
}
|
|
107
|
+
function mergeObjects(base, overlay, replacePaths, prefix = '') {
|
|
108
|
+
const result = { ...base };
|
|
109
|
+
for (const [key, value] of Object.entries(overlay)) {
|
|
110
|
+
if (value === undefined)
|
|
111
|
+
continue;
|
|
112
|
+
const target = prefix ? `${prefix}.${key}` : key;
|
|
113
|
+
const existing = result[key];
|
|
114
|
+
result[key] =
|
|
115
|
+
!replacePaths.has(target) && isPlainObject(existing) && isPlainObject(value)
|
|
116
|
+
? mergeObjects(existing, value, replacePaths, target)
|
|
117
|
+
: value;
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
function collectChanges(base, overlay, replacePaths, prefix = '') {
|
|
122
|
+
const changes = [];
|
|
123
|
+
for (const [key, value] of Object.entries(overlay)) {
|
|
124
|
+
if (value === undefined)
|
|
125
|
+
continue;
|
|
126
|
+
const target = prefix ? `${prefix}.${key}` : key;
|
|
127
|
+
const exists = Object.hasOwn(base, key);
|
|
128
|
+
const existing = base[key];
|
|
129
|
+
if (!replacePaths.has(target) && isPlainObject(existing) && isPlainObject(value)) {
|
|
130
|
+
changes.push(...collectChanges(existing, value, replacePaths, target));
|
|
131
|
+
}
|
|
132
|
+
else if (!exists || !sameDocument(existing, value)) {
|
|
133
|
+
changes.push({ path: target, action: exists ? 'replace' : 'add' });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return changes;
|
|
137
|
+
}
|
|
138
|
+
function sameValue(left, right) {
|
|
139
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
140
|
+
}
|
|
141
|
+
/** Preserve comments and unrelated formatting while changing only overlay-owned values. */
|
|
142
|
+
function renderMergedConfig(before, overlay, replacePaths, document) {
|
|
143
|
+
if (before === null)
|
|
144
|
+
return `${JSON.stringify(document, null, 2)}\n`;
|
|
145
|
+
const patched = patchJsoncObject(before, overlay, replacePaths);
|
|
146
|
+
const parsed = parseJsonc(patched, '<planned setup config>');
|
|
147
|
+
if (!sameDocument(parsed, document)) {
|
|
148
|
+
throw new Error('planned setup config did not preserve the merged document');
|
|
149
|
+
}
|
|
150
|
+
return patched.endsWith('\n') ? patched : `${patched}\n`;
|
|
151
|
+
}
|
|
152
|
+
function patchJsoncObject(input, overlay, replacePaths, prefix = '') {
|
|
153
|
+
const object = scanJsoncObject(input);
|
|
154
|
+
const byKey = new Map(object.properties.map((property) => [property.key, property]));
|
|
155
|
+
const edits = [];
|
|
156
|
+
const missing = [];
|
|
157
|
+
for (const [key, value] of Object.entries(overlay)) {
|
|
158
|
+
if (value === undefined)
|
|
159
|
+
continue;
|
|
160
|
+
const target = prefix ? `${prefix}.${key}` : key;
|
|
161
|
+
const property = byKey.get(key);
|
|
162
|
+
if (!property) {
|
|
163
|
+
missing.push([key, value]);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const current = parseJsonc(input.slice(property.valueStart, property.valueEnd));
|
|
167
|
+
if (sameDocument(current, value))
|
|
168
|
+
continue;
|
|
169
|
+
const replacement = !replacePaths.has(target) && isPlainObject(current) && isPlainObject(value)
|
|
170
|
+
? patchJsoncObject(input.slice(property.valueStart, property.valueEnd), value, replacePaths, target)
|
|
171
|
+
: formatJsonValue(value, propertyIndent(input, property.keyStart));
|
|
172
|
+
edits.push({ start: property.valueStart, end: property.valueEnd, text: replacement });
|
|
173
|
+
}
|
|
174
|
+
if (missing.length > 0) {
|
|
175
|
+
const objectIndent = propertyIndent(input, object.openBrace);
|
|
176
|
+
const keyIndent = object.properties[0]
|
|
177
|
+
? propertyIndent(input, object.properties[0].keyStart)
|
|
178
|
+
: `${objectIndent} `;
|
|
179
|
+
const additions = missing
|
|
180
|
+
.map(([key, value]) => `${keyIndent}${JSON.stringify(key)}: ${formatJsonValue(value, keyIndent)}`)
|
|
181
|
+
.join(',\n');
|
|
182
|
+
const beforeClose = input.slice(0, object.closeBrace);
|
|
183
|
+
const leadingNewline = beforeClose.endsWith('\n') ? '' : '\n';
|
|
184
|
+
edits.push({
|
|
185
|
+
start: object.closeBrace,
|
|
186
|
+
end: object.closeBrace,
|
|
187
|
+
text: `${leadingNewline}${additions}\n${objectIndent}`,
|
|
188
|
+
});
|
|
189
|
+
const last = object.properties.at(-1);
|
|
190
|
+
if (last && !hasCommaAfter(input, last.valueEnd, object.closeBrace)) {
|
|
191
|
+
edits.push({ start: last.valueEnd, end: last.valueEnd, text: ',' });
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return applyTextEdits(input, edits);
|
|
195
|
+
}
|
|
196
|
+
function scanJsoncObject(input) {
|
|
197
|
+
let cursor = skipTrivia(input, 0);
|
|
198
|
+
if (input[cursor] !== '{')
|
|
199
|
+
throw new Error('setup can merge only JSON objects');
|
|
200
|
+
const openBrace = cursor++;
|
|
201
|
+
const properties = [];
|
|
202
|
+
while (cursor < input.length) {
|
|
203
|
+
cursor = skipTrivia(input, cursor);
|
|
204
|
+
if (input[cursor] === '}')
|
|
205
|
+
return { openBrace, closeBrace: cursor, properties };
|
|
206
|
+
if (input[cursor] !== '"')
|
|
207
|
+
throw new Error('setup config contains an invalid object key');
|
|
208
|
+
const keyStart = cursor;
|
|
209
|
+
const keyEnd = scanString(input, cursor);
|
|
210
|
+
const key = JSON.parse(input.slice(keyStart, keyEnd));
|
|
211
|
+
cursor = skipTrivia(input, keyEnd);
|
|
212
|
+
if (input[cursor] !== ':')
|
|
213
|
+
throw new Error(`setup config key ${key} has no value`);
|
|
214
|
+
cursor = skipTrivia(input, cursor + 1);
|
|
215
|
+
const valueStart = cursor;
|
|
216
|
+
const valueEnd = scanValue(input, cursor);
|
|
217
|
+
properties.push({ key, keyStart, valueStart, valueEnd });
|
|
218
|
+
cursor = skipTrivia(input, valueEnd);
|
|
219
|
+
if (input[cursor] === ',') {
|
|
220
|
+
cursor++;
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (input[cursor] === '}')
|
|
224
|
+
return { openBrace, closeBrace: cursor, properties };
|
|
225
|
+
throw new Error(`setup config property ${key} is not followed by a comma or closing brace`);
|
|
226
|
+
}
|
|
227
|
+
throw new Error('setup config object is not closed');
|
|
228
|
+
}
|
|
229
|
+
function scanValue(input, start) {
|
|
230
|
+
const first = input[start];
|
|
231
|
+
if (first === '"')
|
|
232
|
+
return scanString(input, start);
|
|
233
|
+
if (first === '{' || first === '[')
|
|
234
|
+
return scanContainer(input, start);
|
|
235
|
+
let cursor = start;
|
|
236
|
+
while (cursor < input.length) {
|
|
237
|
+
const char = input[cursor];
|
|
238
|
+
if (char === ',' || char === '}' || char === ']' || /\s/.test(char ?? ''))
|
|
239
|
+
break;
|
|
240
|
+
if (char === '/' && (input[cursor + 1] === '/' || input[cursor + 1] === '*'))
|
|
241
|
+
break;
|
|
242
|
+
cursor++;
|
|
243
|
+
}
|
|
244
|
+
if (cursor === start)
|
|
245
|
+
throw new Error('setup config contains an empty value');
|
|
246
|
+
return cursor;
|
|
247
|
+
}
|
|
248
|
+
function scanContainer(input, start) {
|
|
249
|
+
const stack = [input[start]];
|
|
250
|
+
let cursor = start + 1;
|
|
251
|
+
while (cursor < input.length && stack.length > 0) {
|
|
252
|
+
const char = input[cursor];
|
|
253
|
+
const next = input[cursor + 1];
|
|
254
|
+
if (char === '"') {
|
|
255
|
+
cursor = scanString(input, cursor);
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (char === '/' && next === '/') {
|
|
259
|
+
cursor = skipLineComment(input, cursor + 2);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (char === '/' && next === '*') {
|
|
263
|
+
cursor = skipBlockComment(input, cursor + 2);
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
if (char === '{' || char === '[')
|
|
267
|
+
stack.push(char);
|
|
268
|
+
else if (char === '}' || char === ']') {
|
|
269
|
+
const expected = char === '}' ? '{' : '[';
|
|
270
|
+
if (stack.pop() !== expected)
|
|
271
|
+
throw new Error('setup config contains mismatched brackets');
|
|
272
|
+
}
|
|
273
|
+
cursor++;
|
|
274
|
+
}
|
|
275
|
+
if (stack.length > 0)
|
|
276
|
+
throw new Error('setup config contains an unclosed value');
|
|
277
|
+
return cursor;
|
|
278
|
+
}
|
|
279
|
+
function scanString(input, start) {
|
|
280
|
+
let cursor = start + 1;
|
|
281
|
+
while (cursor < input.length) {
|
|
282
|
+
if (input[cursor] === '\\') {
|
|
283
|
+
cursor += 2;
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
if (input[cursor] === '"')
|
|
287
|
+
return cursor + 1;
|
|
288
|
+
cursor++;
|
|
289
|
+
}
|
|
290
|
+
throw new Error('setup config contains an unclosed string');
|
|
291
|
+
}
|
|
292
|
+
function skipTrivia(input, start) {
|
|
293
|
+
let cursor = start;
|
|
294
|
+
while (cursor < input.length) {
|
|
295
|
+
if (/\s/.test(input[cursor] ?? '')) {
|
|
296
|
+
cursor++;
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (input[cursor] === '/' && input[cursor + 1] === '/') {
|
|
300
|
+
cursor = skipLineComment(input, cursor + 2);
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (input[cursor] === '/' && input[cursor + 1] === '*') {
|
|
304
|
+
cursor = skipBlockComment(input, cursor + 2);
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
return cursor;
|
|
310
|
+
}
|
|
311
|
+
function skipLineComment(input, start) {
|
|
312
|
+
let cursor = start;
|
|
313
|
+
while (cursor < input.length && input[cursor] !== '\n')
|
|
314
|
+
cursor++;
|
|
315
|
+
return cursor;
|
|
316
|
+
}
|
|
317
|
+
function skipBlockComment(input, start) {
|
|
318
|
+
const end = input.indexOf('*/', start);
|
|
319
|
+
if (end === -1)
|
|
320
|
+
throw new Error('setup config contains an unclosed block comment');
|
|
321
|
+
return end + 2;
|
|
322
|
+
}
|
|
323
|
+
function propertyIndent(input, position) {
|
|
324
|
+
const lineStart = input.lastIndexOf('\n', position - 1) + 1;
|
|
325
|
+
const prefix = input.slice(lineStart, position);
|
|
326
|
+
return /^\s*$/.test(prefix) ? prefix : ' ';
|
|
327
|
+
}
|
|
328
|
+
function formatJsonValue(value, indent) {
|
|
329
|
+
return JSON.stringify(value, null, 2).replace(/\n/g, `\n${indent}`);
|
|
330
|
+
}
|
|
331
|
+
function hasCommaAfter(input, valueEnd, closeBrace) {
|
|
332
|
+
const cursor = skipTrivia(input, valueEnd);
|
|
333
|
+
return cursor < closeBrace && input[cursor] === ',';
|
|
334
|
+
}
|
|
335
|
+
function applyTextEdits(input, edits) {
|
|
336
|
+
let result = input;
|
|
337
|
+
for (const edit of edits.sort((left, right) => right.start - left.start)) {
|
|
338
|
+
result = `${result.slice(0, edit.start)}${edit.text}${result.slice(edit.end)}`;
|
|
339
|
+
}
|
|
340
|
+
return result;
|
|
341
|
+
}
|
|
342
|
+
function sameDocument(left, right) {
|
|
343
|
+
if (Array.isArray(left) || Array.isArray(right)) {
|
|
344
|
+
return (Array.isArray(left) &&
|
|
345
|
+
Array.isArray(right) &&
|
|
346
|
+
left.length === right.length &&
|
|
347
|
+
left.every((value, index) => sameDocument(value, right[index])));
|
|
348
|
+
}
|
|
349
|
+
if (isPlainObject(left) || isPlainObject(right)) {
|
|
350
|
+
if (!isPlainObject(left) || !isPlainObject(right))
|
|
351
|
+
return false;
|
|
352
|
+
const leftKeys = Object.keys(left).sort();
|
|
353
|
+
const rightKeys = Object.keys(right).sort();
|
|
354
|
+
return sameValue(leftKeys, rightKeys) && leftKeys.every((key) => sameDocument(left[key], right[key]));
|
|
355
|
+
}
|
|
356
|
+
return Object.is(left, right);
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=write-setup.js.map
|