akm-cli 0.9.16 → 0.9.17-alpha.10
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/CHANGELOG.md +2101 -0
- package/STABILITY.md +11 -10
- package/dist/akm +124 -193
- package/dist/akm-migrate +38 -19
- package/dist/assets/hints/cli-hints-full.md +6 -7
- package/dist/assets/improve-strategies/catchup.json +0 -3
- package/dist/assets/improve-strategies/consolidate.json +0 -1
- package/dist/assets/improve-strategies/default.json +1 -2
- package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
- package/dist/assets/improve-strategies/quick.json +1 -2
- package/dist/assets/improve-strategies/reflect-distill.json +1 -2
- package/dist/assets/improve-strategies/thorough.json +0 -3
- package/dist/assets/prompts/consolidate-pair.md +20 -0
- package/dist/assets/prompts/consolidate-system.md +4 -11
- package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
- package/dist/assets/templates/html/health.html +3 -5
- package/dist/cli/retired-commands.js +1 -1
- package/dist/cli/shared.js +6 -2
- package/dist/cli/unknown-flags.js +24 -1
- package/dist/cli.js +68 -10
- package/dist/commands/agent/agent-dispatch.js +1 -1
- package/dist/commands/command/command-execution.js +24 -62
- package/dist/commands/feedback-cli.js +0 -1
- package/dist/commands/health/accept-rate.js +6 -0
- package/dist/commands/health/archive-usage.js +92 -0
- package/dist/commands/health/checks.js +83 -74
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/data-dir-usage.js +25 -13
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +1 -42
- package/dist/commands/health/improve-metrics.js +136 -591
- package/dist/commands/health/md-report.js +1 -6
- package/dist/commands/health/plugin-staleness.js +53 -3
- package/dist/commands/health/renderers.js +12 -4
- package/dist/commands/health/report-view-model.js +14 -120
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -74
- package/dist/commands/health.js +145 -143
- package/dist/commands/improve/consolidate/chunking.js +26 -117
- package/dist/commands/improve/consolidate/continuity-check.js +137 -0
- package/dist/commands/improve/consolidate/pair-pass.js +791 -0
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +589 -1127
- package/dist/commands/improve/content-hash.js +16 -24
- package/dist/commands/improve/distill/content-repair.js +18 -100
- package/dist/commands/improve/distill-guards.js +20 -81
- package/dist/commands/improve/distill-promotion-policy.js +23 -243
- package/dist/commands/improve/distill.js +608 -1041
- package/dist/commands/improve/eligibility.js +126 -390
- package/dist/commands/improve/execution.js +8 -10
- package/dist/commands/improve/extract-prompt.js +1 -2
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +75 -169
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +52 -4
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +480 -1074
- package/dist/commands/improve/ledger.js +119 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +415 -1073
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +16 -118
- package/dist/commands/improve/memory/memory-improve.js +266 -14
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -15
- package/dist/commands/improve/preparation.js +779 -2319
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +642 -1353
- package/dist/commands/improve/retrieval-gate.js +127 -0
- package/dist/commands/improve/retrieval-scope.js +92 -0
- package/dist/commands/improve/salience.js +41 -240
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +322 -0
- package/dist/commands/lint/base-linter.js +37 -15
- package/dist/commands/proposal/drain.js +261 -578
- package/dist/commands/proposal/proposal-cli.js +19 -20
- package/dist/commands/proposal/proposal-types.js +31 -24
- package/dist/commands/proposal/proposal.js +38 -8
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +1097 -1394
- package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
- package/dist/commands/proposal/validators/proposal-validators.js +1 -1
- package/dist/commands/proposal/validators/proposals.js +22 -89
- package/dist/commands/read/curate.js +105 -462
- package/dist/commands/read/knowledge.js +3 -2
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +57 -108
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +4 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +127 -29
- package/dist/commands/sources/installed-stashes.js +197 -746
- package/dist/commands/sources/schema-repair.js +98 -129
- package/dist/commands/sources/source-add.js +62 -12
- package/dist/commands/sources/source-manage.js +9 -2
- package/dist/commands/sources/stash-cli.js +24 -4
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +12 -13
- package/dist/commands/tasks/tasks.js +350 -936
- package/dist/commands/tasks/validate.js +26 -24
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +2 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +42 -12
- package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/asset-placement.js +4 -13
- package/dist/core/asset/frontmatter.js +106 -1
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +285 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +9 -34
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +184 -111
- package/dist/core/config/engine-semantics.js +0 -2
- package/dist/core/config/legacy-source-shape-shim.js +38 -9
- package/dist/core/config/schema/embedding.js +20 -5
- package/dist/core/config/schema/engines.js +5 -0
- package/dist/core/config/schema/execution.js +1 -1
- package/dist/core/config/schema/experimental.js +1 -1
- package/dist/core/config/schema/improve-processes.js +54 -125
- package/dist/core/config/schema/improve.js +4 -42
- package/dist/core/config/schema/index-config.js +9 -48
- package/dist/core/config/schema/scheduler.js +12 -12
- package/dist/core/config/schema/search.js +6 -22
- package/dist/core/env-secret-ref.js +0 -1
- package/dist/core/errors.js +8 -9
- package/dist/core/file-change.js +13 -5
- package/dist/core/file-lock.js +76 -173
- package/dist/core/improve-result.js +35 -7
- package/dist/core/improve-types.js +0 -1
- package/dist/core/logs-db.js +2 -2
- package/dist/core/loopback.js +7 -12
- package/dist/core/non-task-input.js +20 -0
- package/dist/core/parse.js +13 -16
- package/dist/core/paths.js +0 -24
- package/dist/core/redaction.js +109 -2
- package/dist/core/run-lock.js +2 -5
- package/dist/core/spawn-env.js +1 -1
- package/dist/core/state/migrations.js +123 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/time.js +0 -20
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +294 -1005
- package/dist/execution/input-contract.js +1 -1
- package/dist/execution/resolved-request.js +135 -689
- package/dist/execution/source.js +63 -257
- package/dist/execution/target-ref.js +1 -1
- package/dist/indexer/bundle-identity-guard.js +2 -2
- package/dist/indexer/db/llm-cache.js +2 -2
- package/dist/indexer/ensure-index.js +77 -73
- package/dist/indexer/index-rebuild-lock.js +3 -11
- package/dist/indexer/index-writer-lock.js +8 -17
- package/dist/indexer/index-written-assets.js +141 -154
- package/dist/indexer/indexer.js +400 -1124
- package/dist/indexer/links/declared-links.js +90 -0
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +96 -90
- package/dist/indexer/passes/metadata.js +132 -219
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +2 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +190 -590
- package/dist/indexer/search/fts-query.js +30 -41
- package/dist/indexer/search/ranking.js +28 -154
- package/dist/indexer/search/search-attribution.js +12 -32
- package/dist/indexer/search/search-fields.js +11 -15
- package/dist/indexer/search/search-hit-enrichers.js +54 -85
- package/dist/indexer/search/search-source.js +1 -4
- package/dist/indexer/usage/usage-events.js +36 -7
- package/dist/indexer/walk/walker.js +3 -4
- package/dist/integrations/agent/engine-fallback.js +23 -40
- package/dist/integrations/agent/engine-resolution.js +93 -183
- package/dist/integrations/agent/execution.js +507 -0
- package/dist/integrations/agent/model-map.js +28 -156
- package/dist/integrations/agent/request-lowering.js +66 -141
- package/dist/integrations/agent/runner-dispatch.js +143 -321
- package/dist/integrations/agent/runner.js +54 -14
- package/dist/integrations/lockfile.js +53 -101
- package/dist/llm/client.js +18 -6
- package/dist/llm/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +11 -17
- package/dist/llm/feature-gate.js +0 -8
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/structured-call.js +5 -24
- package/dist/output/generic-render.js +23 -11
- package/dist/output/html-render.js +13 -10
- package/dist/output/render-registry.js +3 -32
- package/dist/output/shapes/helpers.js +25 -38
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +69 -31
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +48 -3
- package/dist/output/text/show-format.js +13 -17
- package/dist/output/text/workflow-format.js +0 -32
- package/dist/output/text.js +2 -0
- package/dist/registry/factory.js +4 -19
- package/dist/registry/network.js +66 -220
- package/dist/registry/providers/index.js +0 -2
- package/dist/registry/providers/skills-sh.js +3 -14
- package/dist/registry/providers/static-index.js +24 -26
- package/dist/registry/resolve.js +55 -131
- package/dist/scripts/akm-migrate-node.js +42948 -92369
- package/dist/scripts/akm-migrate.js +42935 -92354
- package/dist/setup/registry-stash-loader.js +4 -13
- package/dist/setup/semantic-assets.js +3 -44
- package/dist/setup/setup.js +1 -1
- package/dist/setup/steps/connection.js +5 -6
- package/dist/setup/steps/platforms.js +2 -2
- package/dist/setup/steps/tasks.js +25 -15
- package/dist/sources/provider-factory.js +17 -18
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +7 -1
- package/dist/sources/providers/git-provider.js +0 -3
- package/dist/sources/providers/git-stash.js +83 -21
- package/dist/sources/providers/npm.js +2 -4
- package/dist/sources/providers/provider-utils.js +5 -10
- package/dist/sources/providers/website.js +0 -2
- package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
- package/dist/sources/website-url.js +2 -2
- package/dist/storage/database.js +9 -35
- package/dist/storage/repositories/improve-ledger-repository.js +209 -0
- package/dist/storage/repositories/index-connection.js +39 -72
- package/dist/storage/repositories/index-entries-repository.js +131 -129
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +101 -268
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-links-repository.js +143 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +257 -325
- package/dist/storage/repositories/index-utility-repository.js +8 -29
- package/dist/storage/repositories/index-vec-repository.js +133 -414
- package/dist/storage/repositories/outcome-repository.js +2 -1
- package/dist/storage/repositories/proposals-repository.js +104 -1
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- package/dist/storage/repositories/salience-repository.js +1 -19
- package/dist/storage/repositories/task-history-repository.js +26 -4
- package/dist/storage/repositories/workflow-runs-repository.js +53 -244
- package/dist/storage/sqlite-migrations.js +136 -0
- package/dist/storage/sqlite-pragmas.js +11 -9
- package/dist/storage/sqlite-transaction.js +170 -0
- package/dist/storage/state-db-integrity.js +130 -0
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +191 -302
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +141 -748
- package/dist/tasks/backends/schtasks.js +119 -623
- package/dist/tasks/prepare/prepare-support.js +5 -15
- package/dist/tasks/prepare/prepare.js +0 -2
- package/dist/tasks/resolve-akm-bin.js +20 -79
- package/dist/tasks/run/attempt-lifecycle.js +0 -1
- package/dist/tasks/run/load-task.js +1 -1
- package/dist/tasks/scheduler-binding.js +20 -238
- package/dist/tasks/scheduler-invocation.js +136 -244
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +368 -679
- package/dist/tasks/source/parse-task-source.js +55 -9
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +464 -88
- package/dist/workflows/authoring/authoring.js +3 -12
- package/dist/workflows/compile.js +211 -0
- package/dist/workflows/concurrency-policy.js +13 -74
- package/dist/workflows/exec/child-invocation.js +3 -17
- package/dist/workflows/exec/child-workflow.js +32 -141
- package/dist/workflows/exec/dispatch-redaction.js +13 -53
- package/dist/workflows/exec/environment.js +98 -0
- package/dist/workflows/exec/exec-unit.js +33 -140
- package/dist/workflows/exec/frozen-judge.js +7 -59
- package/dist/workflows/exec/native-executor.js +82 -341
- package/dist/workflows/exec/param-secrets.js +29 -47
- package/dist/workflows/exec/run-workflow.js +154 -387
- package/dist/workflows/exec/scheduler.js +9 -36
- package/dist/workflows/exec/step-work.js +127 -430
- package/dist/workflows/exec/unit-dispatch.js +11 -63
- package/dist/workflows/exec/unit-writer.js +8 -52
- package/dist/workflows/exec/worktree.js +39 -273
- package/dist/workflows/freeze/child-output-references.js +4 -15
- package/dist/workflows/freeze/environment.js +99 -92
- package/dist/workflows/freeze/freeze.js +172 -0
- package/dist/workflows/freeze/step-values.js +19 -21
- package/dist/workflows/freeze/targets/child-workflow.js +23 -92
- package/dist/workflows/freeze/targets/command.js +10 -33
- package/dist/workflows/freeze/targets/script.js +5 -12
- package/dist/workflows/freeze/targets/shell.js +3 -6
- package/dist/workflows/freeze/targets/task.js +25 -80
- package/dist/workflows/freeze/task-bindings.js +20 -67
- package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
- package/dist/workflows/ir/params.js +6 -51
- package/dist/workflows/ir/plan-hash.js +2 -34
- package/dist/workflows/parser.js +140 -43
- package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
- package/dist/workflows/renderer.js +36 -69
- package/dist/workflows/resource-limits.js +12 -120
- package/dist/workflows/runtime/agent-identity.js +8 -40
- package/dist/workflows/runtime/run-outputs.js +3 -6
- package/dist/workflows/runtime/run-plan.js +316 -0
- package/dist/workflows/runtime/runs.js +48 -200
- package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
- package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
- package/dist/workflows/validate-summary.js +2 -7
- package/docs/integration/bundling-akm.md +49 -42
- package/docs/migration/README.md +1 -0
- package/docs/migration/release-notes/0.9.17.md +43 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
- package/docs/reference/cli.md +232 -135
- package/docs/reference/configuration.md +71 -57
- package/docs/reference/data-and-telemetry.md +20 -21
- package/docs/reference/tasks.md +105 -39
- package/docs/reference/workflow-schema.md +14 -18
- package/docs/reference/workflows.md +6 -9
- package/package.json +1 -1
- package/schemas/akm-config.json +115 -738
- package/schemas/akm-workflow.json +1 -0
- package/dist/assets/improve-strategies/graph-refresh.json +0 -15
- package/dist/assets/prompts/contradiction-judge.md +0 -33
- package/dist/assets/prompts/graph-extract-system.md +0 -1
- package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
- package/dist/assets/prompts/metadata-enhance-system.md +0 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
- package/dist/commands/health/advisories.js +0 -150
- package/dist/commands/health/metrics.js +0 -329
- package/dist/commands/health/surfaces.js +0 -102
- package/dist/commands/improve/anti-collapse.js +0 -83
- package/dist/commands/improve/collapse-detector.js +0 -432
- package/dist/commands/improve/consolidate/eligibility.js +0 -48
- package/dist/commands/improve/consolidate/merge.js +0 -149
- package/dist/commands/improve/distill/promote-memory.js +0 -291
- package/dist/commands/improve/distill/quality-gate.js +0 -337
- package/dist/commands/improve/eval-cases.js +0 -52
- package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
- package/dist/commands/improve/proposal-envelope.js +0 -31
- package/dist/commands/improve/run-context.js +0 -123
- package/dist/commands/improve/shared.js +0 -31
- package/dist/commands/improve/source-identity.js +0 -28
- package/dist/commands/improve/triage.js +0 -96
- package/dist/commands/proposal/drain-policies.js +0 -151
- package/dist/commands/sources/update-transaction.js +0 -220
- package/dist/core/action-contributors.js +0 -28
- package/dist/core/config/config-version-shim.js +0 -101
- package/dist/core/fs-txn.js +0 -405
- package/dist/core/lexical-score.js +0 -25
- package/dist/core/maintenance-barrier.js +0 -167
- package/dist/execution/executable-identity.js +0 -105
- package/dist/execution/guarded-source.js +0 -427
- package/dist/indexer/db/graph-db.js +0 -444
- package/dist/indexer/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/graph/graph-extraction.js +0 -1108
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- package/dist/indexer/search/ranking-types.js +0 -4
- package/dist/indexer/walk/project-context.js +0 -192
- package/dist/integrations/agent/execution-cascade.js +0 -566
- package/dist/integrations/agent/execution-definitions.js +0 -202
- package/dist/integrations/agent/execution-lowering.js +0 -841
- package/dist/integrations/agent/execution-preparation.js +0 -98
- package/dist/integrations/agent/inline-execution.js +0 -74
- package/dist/llm/graph-extract.js +0 -728
- package/dist/llm/metadata-enhance.js +0 -96
- package/dist/registry/create-provider-registry.js +0 -29
- package/dist/registry/pinned-request-helper.js +0 -247
- package/dist/registry/pinned-transport.js +0 -717
- package/dist/sources/providers/index.js +0 -14
- package/dist/storage/engines/sqlite-migrations.js +0 -271
- package/dist/storage/repositories/canaries-repository.js +0 -107
- package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
- package/dist/storage/repositories/registry-cache.js +0 -113
- package/dist/tasks/scheduler-sync-preview.js +0 -52
- package/dist/tasks/source/task-to-v3.js +0 -507
- package/dist/workflows/freeze/resolve-steps.js +0 -86
- package/dist/workflows/freeze/source-freeze.js +0 -64
- package/dist/workflows/ir/compile.js +0 -321
- package/dist/workflows/ir/environment-v4.js +0 -330
- package/dist/workflows/ir/freeze-v4.js +0 -153
- package/dist/workflows/ir/schema-v4.js +0 -745
- package/dist/workflows/ir/schema.js +0 -354
- package/dist/workflows/program/schema.js +0 -77
- package/dist/workflows/runtime/checkin.js +0 -57
- package/dist/workflows/runtime/plan-classifier.js +0 -196
- package/dist/workflows/runtime/unit-checkin.js +0 -45
- package/dist/workflows/runtime/unit-phases.js +0 -20
- package/dist/workflows/schema.js +0 -4
- package/dist/workflows/source-ir/compile.js +0 -200
- package/dist/workflows/source-ir/program.js +0 -50
- package/dist/workflows/source-ir/result.js +0 -26
- package/dist/workflows/source-ir/schema.js +0 -786
- package/dist/workflows/source-ir/triggers.js +0 -79
- package/dist/workflows/source-ir/uses.js +0 -40
- package/dist/workflows/validator.js +0 -60
|
@@ -1,30 +1,87 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
import path from "node:path";
|
|
4
5
|
import { placementTypes } from "../../core/asset/asset-placement.js";
|
|
5
6
|
import { resolveStashDir } from "../../core/common.js";
|
|
6
|
-
import { getSources, loadConfig } from "../../core/config/config.js";
|
|
7
|
+
import { DEFAULT_CONFIG, getSources, loadConfig } from "../../core/config/config.js";
|
|
8
|
+
import { ConfigError } from "../../core/errors.js";
|
|
7
9
|
import { classifyPathAccess, describeInaccessiblePath } from "../../core/path-access.js";
|
|
8
|
-
import { getCacheDir, getConfigDir, getDataDir,
|
|
10
|
+
import { getCacheDir, getConfigDir, getDataDir, getDefaultStashDir, getStateDir } from "../../core/paths.js";
|
|
9
11
|
import { formatRegistryUrl } from "../../core/registry-url.js";
|
|
10
12
|
import { error } from "../../core/warn.js";
|
|
11
|
-
import { closeDatabase,
|
|
13
|
+
import { closeDatabase, openReadonlyExistingDatabase } from "../../storage/repositories/index-connection.js";
|
|
12
14
|
import { getEntryCount, getEntryCountByType } from "../../storage/repositories/index-entries-repository.js";
|
|
15
|
+
import { countLinksByKind } from "../../storage/repositories/index-links-repository.js";
|
|
13
16
|
import { getMeta } from "../../storage/repositories/index-meta-repository.js";
|
|
14
|
-
import {
|
|
17
|
+
import { isSqliteContentionError } from "../../storage/sqlite-transaction.js";
|
|
15
18
|
import { pkgVersion } from "../../version.js";
|
|
19
|
+
/**
|
|
20
|
+
* Bound for `akm info`'s diagnostic index.db read — short enough that a
|
|
21
|
+
* locked database never stalls the command, unlike the shared 30s
|
|
22
|
+
* `SQLITE_BUSY_TIMEOUT_MS` every write-capable opener uses. The opener's own
|
|
23
|
+
* layout check (`checkIndexLayout`) swallows a busy error on its one SELECT
|
|
24
|
+
* rather than surfacing it, so a genuinely locked database costs this
|
|
25
|
+
* timeout TWICE before the first real query here (`countLinksByKind`)
|
|
26
|
+
* throws for real — 750ms keeps that ~1.5s worst case well clear of the 3s
|
|
27
|
+
* bound integration tests hold this to, on a loaded CI box.
|
|
28
|
+
*/
|
|
29
|
+
const INFO_INDEX_BUSY_TIMEOUT_MS = 750;
|
|
16
30
|
/**
|
|
17
31
|
* Assemble system info describing the current capabilities, configuration,
|
|
18
|
-
* and index state. Used by `akm info
|
|
32
|
+
* and index state. Used by `akm info`, which must behave like a help
|
|
33
|
+
* command (owner ruling): always print a report and exit 0, whatever else
|
|
34
|
+
* is happening. Every section below is read best-effort, so one failing
|
|
35
|
+
* lookup degrades only its own field(s) instead of the whole report;
|
|
36
|
+
* `infoCommand` itself (stash-cli.ts) wraps this whole call as the final
|
|
37
|
+
* backstop for anything left over — e.g. a path resolver that needs an
|
|
38
|
+
* environment variable nothing here sets, such as `HOME`.
|
|
19
39
|
*
|
|
20
40
|
* @param options.dbPath - Override the database path (useful for testing)
|
|
21
41
|
*/
|
|
22
42
|
export function assembleInfo(options) {
|
|
23
|
-
|
|
43
|
+
let config;
|
|
44
|
+
let configError;
|
|
45
|
+
try {
|
|
46
|
+
config = loadConfig();
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
config = DEFAULT_CONFIG;
|
|
50
|
+
configError = err instanceof Error ? err.message : String(err);
|
|
51
|
+
}
|
|
24
52
|
// Primary stash directory + default bundle name — same resolution
|
|
25
53
|
// `akm sources list` uses (R-057), so `akm info` and `akm sources list`
|
|
26
|
-
// agree on which stash is primary.
|
|
27
|
-
|
|
54
|
+
// agree on which stash is primary. No bundle created yet
|
|
55
|
+
// (STASH_DIR_NOT_FOUND, the ordinary fresh-install state) reports where a
|
|
56
|
+
// fresh `akm setup`/`akm bundle create` would put it, same as "report the
|
|
57
|
+
// defaults" for a missing config — no error needed, nothing is actually
|
|
58
|
+
// wrong. A bundle that WAS configured (an env override or `bundles.*` in
|
|
59
|
+
// config) but doesn't resolve (STASH_DIR_UNREADABLE/STASH_DIR_NOT_A_DIRECTORY)
|
|
60
|
+
// is different: the fallback path is a courtesy, not a way to hide a
|
|
61
|
+
// genuine misconfiguration, so that reason is kept in `bundleDirError`.
|
|
62
|
+
let stashDir;
|
|
63
|
+
let bundleDirError;
|
|
64
|
+
try {
|
|
65
|
+
stashDir = resolveStashDir();
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (!(err instanceof ConfigError) || err.code !== "STASH_DIR_NOT_FOUND") {
|
|
69
|
+
bundleDirError = err instanceof Error ? err.message : String(err);
|
|
70
|
+
}
|
|
71
|
+
// The fallback itself resolves purely from `HOME` (or its platform
|
|
72
|
+
// equivalent) and can throw the exact same way `resolveStashDir()` can
|
|
73
|
+
// (e.g. HOME entirely unset) — guarded so a blank `bundleDir` (never a
|
|
74
|
+
// throw) still always carries a reason, reusing the one above when the
|
|
75
|
+
// outer catch already set it (a configured-but-broken path takes
|
|
76
|
+
// precedence over restating "and the default isn't resolvable either").
|
|
77
|
+
try {
|
|
78
|
+
stashDir = getDefaultStashDir();
|
|
79
|
+
}
|
|
80
|
+
catch (fallbackErr) {
|
|
81
|
+
stashDir = "";
|
|
82
|
+
bundleDirError ??= fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
28
85
|
const defaultBundle = config.defaultBundle ?? null;
|
|
29
86
|
// Asset types (copy into a mutable array — `placementTypes()` returns readonly)
|
|
30
87
|
const assetTypes = [...placementTypes()];
|
|
@@ -45,23 +102,35 @@ export function assembleInfo(options) {
|
|
|
45
102
|
...(s.url ? { url: s.url } : {}),
|
|
46
103
|
...(s.enabled !== undefined ? { enabled: s.enabled } : {}),
|
|
47
104
|
}));
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
|
|
105
|
+
// Data directory. `getDataDir()` can itself throw (e.g. TEST_ISOLATION_MISSING
|
|
106
|
+
// when NODE_ENV=test leaks into a real invocation — a JS test runner's
|
|
107
|
+
// child process — with no XDG_DATA_HOME/AKM_DATA_DIR override), caught
|
|
108
|
+
// here so that failure degrades only `dataDir`/`indexStats` rather than
|
|
109
|
+
// the whole report. Always attempted, even when `options.dbPath` (a
|
|
110
|
+
// test-only override, see the param doc above) means it is not needed to
|
|
111
|
+
// resolve the index path below — `dataDir` is its own reported field.
|
|
112
|
+
let dataDir = "";
|
|
113
|
+
let dataDirError;
|
|
114
|
+
try {
|
|
115
|
+
dataDir = getDataDir();
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
dataDirError = err instanceof Error ? err.message : String(err);
|
|
119
|
+
}
|
|
120
|
+
// Index stats. `options.dbPath` overrides the resolved path outright;
|
|
121
|
+
// otherwise it is derived from `dataDir` above, so a data dir that failed
|
|
122
|
+
// to resolve degrades index stats the same way rather than retrying (and
|
|
123
|
+
// re-throwing) `getDataDir()` a second time.
|
|
124
|
+
const resolvedDbPath = options?.dbPath ?? (dataDir ? path.join(dataDir, "index.db") : undefined);
|
|
125
|
+
const indexStats = resolvedDbPath
|
|
126
|
+
? readIndexStats(resolvedDbPath)
|
|
127
|
+
: { entryCount: 0, byType: {}, lastBuiltAt: null, hasEmbeddings: false, unavailable: dataDirError };
|
|
53
128
|
// Semantic status is read live from the index's own state, not a cached
|
|
54
129
|
// verdict — a failed embed attempt at search time falls back to FTS and
|
|
55
130
|
// reports that in the search response, it never disables the mode here.
|
|
56
|
-
const semanticStatus = config.semanticSearchMode === "off"
|
|
57
|
-
? "disabled"
|
|
58
|
-
: !indexStats.hasEmbeddings
|
|
59
|
-
? "pending"
|
|
60
|
-
: indexStats.vecAvailable
|
|
61
|
-
? "ready-vec"
|
|
62
|
-
: "ready-js";
|
|
131
|
+
const semanticStatus = config.semanticSearchMode === "off" ? "disabled" : indexStats.hasEmbeddings ? "ready-js" : "pending";
|
|
63
132
|
const searchModes = ["fts"];
|
|
64
|
-
if (semanticStatus === "ready-js"
|
|
133
|
+
if (semanticStatus === "ready-js") {
|
|
65
134
|
searchModes.push("semantic", "hybrid");
|
|
66
135
|
}
|
|
67
136
|
return {
|
|
@@ -69,10 +138,12 @@ export function assembleInfo(options) {
|
|
|
69
138
|
version: pkgVersion,
|
|
70
139
|
bundleDir: stashDir,
|
|
71
140
|
defaultBundle,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
141
|
+
...(configError ? { configError } : {}),
|
|
142
|
+
...(bundleDirError ? { bundleDirError } : {}),
|
|
143
|
+
dataDir,
|
|
144
|
+
configDir: safePath(getConfigDir),
|
|
145
|
+
cacheDir: safePath(getCacheDir),
|
|
146
|
+
stateDir: safePath(getStateDir),
|
|
76
147
|
assetTypes,
|
|
77
148
|
searchModes,
|
|
78
149
|
semanticSearch: {
|
|
@@ -84,13 +155,21 @@ export function assembleInfo(options) {
|
|
|
84
155
|
indexStats,
|
|
85
156
|
};
|
|
86
157
|
}
|
|
158
|
+
/** Best-effort path resolution for a section that must degrade, not throw: an empty string in place of an exception. */
|
|
159
|
+
function safePath(fn) {
|
|
160
|
+
try {
|
|
161
|
+
return fn();
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return "";
|
|
165
|
+
}
|
|
166
|
+
}
|
|
87
167
|
function readIndexStats(resolvedPath) {
|
|
88
168
|
const EMPTY = {
|
|
89
169
|
entryCount: 0,
|
|
90
170
|
byType: {},
|
|
91
171
|
lastBuiltAt: null,
|
|
92
172
|
hasEmbeddings: false,
|
|
93
|
-
vecAvailable: false,
|
|
94
173
|
};
|
|
95
174
|
// "Absent" is the ordinary first-run state; "inaccessible" is a fault that
|
|
96
175
|
// must not present as an empty index (#791). `akm info` is the command an
|
|
@@ -106,13 +185,22 @@ function readIndexStats(resolvedPath) {
|
|
|
106
185
|
}
|
|
107
186
|
let db;
|
|
108
187
|
try {
|
|
109
|
-
|
|
188
|
+
// Never writes the index — no schema or journal-mode change — and
|
|
189
|
+
// bounded to INFO_INDEX_BUSY_TIMEOUT_MS rather than the shared 30s
|
|
190
|
+
// busy_timeout every write-capable opener uses. A newer index layout is
|
|
191
|
+
// reported below rather than refused (checkIndexLayout throws); an
|
|
192
|
+
// older layout just warns and is served as-is, never migrated — both
|
|
193
|
+
// already true of this opener.
|
|
194
|
+
db = openReadonlyExistingDatabase(resolvedPath, { busyTimeoutMs: INFO_INDEX_BUSY_TIMEOUT_MS });
|
|
195
|
+
if (!db)
|
|
196
|
+
return EMPTY; // raced away (deleted) between the access check above and here
|
|
197
|
+
const links = countLinksByKind(db);
|
|
110
198
|
return {
|
|
111
199
|
entryCount: getEntryCount(db),
|
|
112
200
|
byType: getEntryCountByType(db),
|
|
201
|
+
...(Object.keys(links).length > 0 ? { links } : {}),
|
|
113
202
|
lastBuiltAt: getMeta(db, "builtAt") ?? null,
|
|
114
203
|
hasEmbeddings: getMeta(db, "hasEmbeddings") === "1",
|
|
115
|
-
vecAvailable: isVecAvailable(db),
|
|
116
204
|
};
|
|
117
205
|
}
|
|
118
206
|
catch (err) {
|
|
@@ -121,7 +209,7 @@ function readIndexStats(resolvedPath) {
|
|
|
121
209
|
// Routed through core/warn's `error()` (not a raw process.stderr.write)
|
|
122
210
|
// so `--quiet`/`setQuiet()` actually gate this line (R-057).
|
|
123
211
|
error(`[akm info] failed to read index stats from ${resolvedPath}: ${String(err)}`);
|
|
124
|
-
return EMPTY;
|
|
212
|
+
return { ...EMPTY, unavailable: describeIndexReadFailure(err) };
|
|
125
213
|
}
|
|
126
214
|
finally {
|
|
127
215
|
if (db) {
|
|
@@ -134,3 +222,13 @@ function readIndexStats(resolvedPath) {
|
|
|
134
222
|
}
|
|
135
223
|
}
|
|
136
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* Reason for `indexStats.unavailable`. Contention gets its own clear
|
|
227
|
+
* wording; everything else (a too-new layout, on-disk corruption, ...) is
|
|
228
|
+
* already descriptive as the driver/opener's own message.
|
|
229
|
+
*/
|
|
230
|
+
function describeIndexReadFailure(err) {
|
|
231
|
+
if (isSqliteContentionError(err))
|
|
232
|
+
return "index.db is locked by another akm process";
|
|
233
|
+
return err instanceof Error ? err.message : String(err);
|
|
234
|
+
}
|