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
|
@@ -612,8 +612,9 @@ export async function writeMarkdownAsset(options) {
|
|
|
612
612
|
// no longer trigger reindexes, so keeping the index current is the writer's
|
|
613
613
|
// job. Demoted files reindex under their own containing root (usually the
|
|
614
614
|
// write target itself; the working stash when writing to a --target) so
|
|
615
|
-
// `--belief current` filtering
|
|
616
|
-
//
|
|
615
|
+
// `--belief current` filtering takes effect without waiting for the next
|
|
616
|
+
// full index. (alpha.4 removed belief weights from ranking; `--belief` is
|
|
617
|
+
// the only reader of `beliefState` today.)
|
|
617
618
|
const demotedInTargetRoot = demotedByRoot.get(source.path) ?? [];
|
|
618
619
|
demotedByRoot.delete(source.path);
|
|
619
620
|
await indexWrittenAssets(source.path, [result.path, ...demotedInTargetRoot], { bundleId: resolved.ref.origin });
|
|
@@ -76,36 +76,24 @@ export const searchCommand = defineJsonCommand({
|
|
|
76
76
|
description: "Memory belief filter: all|current|historical. current keeps active memory beliefs; historical keeps contradicted/superseded/archived memory beliefs.",
|
|
77
77
|
default: "all",
|
|
78
78
|
},
|
|
79
|
-
// Declared as the POSITIVE name with `default: true` so citty's native
|
|
80
|
-
// `--no-<name>` negation (it strips a leading `--no-` from ANY token and
|
|
81
|
-
// negates the remainder BEFORE consulting the declared-args table — see
|
|
82
|
-
// node_modules/citty/dist/index.mjs) does the work, the same pattern
|
|
83
|
-
// `sync --push/--no-push` uses. A flag DECLARED as `no-project-context`
|
|
84
|
-
// can never be negated: `--no-project-context` parses as "negate
|
|
85
|
-
// `project-context`", a name nothing declared, leaving the real key at
|
|
86
|
-
// its default `false` forever (F1/A1).
|
|
87
|
-
"project-context": {
|
|
88
|
-
type: "boolean",
|
|
89
|
-
default: true,
|
|
90
|
-
description: "Automatic project-context ranking boost: assets whose name/tags/aliases match the current working " +
|
|
91
|
-
"directory's project get a small score boost, and this search's usage also feeds the scoped-utility " +
|
|
92
|
-
"ranking signal. Default: on. Use --no-project-context to disable BOTH the project-context boost and " +
|
|
93
|
-
"the scoped-utility signal for this search only.",
|
|
94
|
-
},
|
|
95
79
|
"include-sessions": {
|
|
96
80
|
type: "boolean",
|
|
97
81
|
description: "Include session assets (excluded from default search results via config.search.defaultExcludeTypes).",
|
|
98
82
|
default: false,
|
|
99
83
|
},
|
|
100
|
-
// Declared as the POSITIVE name with `default: true`
|
|
101
|
-
//
|
|
102
|
-
//
|
|
84
|
+
// Declared as the POSITIVE name with `default: true` so citty's native
|
|
85
|
+
// `--no-<name>` negation (it strips a leading `--no-` from ANY token and
|
|
86
|
+
// negates the remainder BEFORE consulting the declared-args table — see
|
|
87
|
+
// node_modules/citty/dist/index.mjs) does the work, the same pattern
|
|
88
|
+
// `sync --push/--no-push` uses. A flag DECLARED as `no-track-usage` could
|
|
89
|
+
// never be negated: `--no-track-usage` parses as "negate `track-usage`",
|
|
90
|
+
// a name nothing declared, leaving the real key at its default forever
|
|
91
|
+
// (F1/A1).
|
|
103
92
|
"track-usage": {
|
|
104
93
|
type: "boolean",
|
|
105
94
|
default: true,
|
|
106
|
-
description: "A successful search
|
|
107
|
-
"
|
|
108
|
-
"does not influence future ranking.",
|
|
95
|
+
description: "A successful search records usage-events telemetry. Default: on. Use --no-track-usage to run a " +
|
|
96
|
+
"search that records nothing.",
|
|
109
97
|
},
|
|
110
98
|
},
|
|
111
99
|
async run({ args }) {
|
|
@@ -120,7 +108,6 @@ export const searchCommand = defineJsonCommand({
|
|
|
120
108
|
const filters = parseScopeFilterFlags(filterTokens, "--filter");
|
|
121
109
|
const includeProposed = args["include-proposed"] === true;
|
|
122
110
|
const belief = parseBeliefFilterMode(typeof args.belief === "string" ? args.belief : undefined);
|
|
123
|
-
const disableProjectContext = args["project-context"] === false;
|
|
124
111
|
const skipLogging = args["track-usage"] === false;
|
|
125
112
|
const includeSessions = args["include-sessions"];
|
|
126
113
|
const assets = args.assets === true;
|
|
@@ -134,8 +121,6 @@ export const searchCommand = defineJsonCommand({
|
|
|
134
121
|
includeProposed,
|
|
135
122
|
belief,
|
|
136
123
|
includeSessions,
|
|
137
|
-
disableProjectContext,
|
|
138
|
-
disableScopedUtility: disableProjectContext,
|
|
139
124
|
skipLogging,
|
|
140
125
|
assets,
|
|
141
126
|
eventSource: resolveUsageEventSource(),
|
|
@@ -170,14 +155,13 @@ export const curateCommand = defineJsonCommand({
|
|
|
170
155
|
"one curate call.",
|
|
171
156
|
},
|
|
172
157
|
// Declared as the POSITIVE name with `default: true` — see the
|
|
173
|
-
// `
|
|
158
|
+
// `track-usage` comment on `searchCommand` above for why a flag NAME
|
|
174
159
|
// must never start with `no-`.
|
|
175
160
|
"track-usage": {
|
|
176
161
|
type: "boolean",
|
|
177
162
|
default: true,
|
|
178
|
-
description: "A successful curate
|
|
179
|
-
"
|
|
180
|
-
"influence future ranking.",
|
|
163
|
+
description: "A successful curate records usage-events telemetry for the curated items. Default: on. Use " +
|
|
164
|
+
"--no-track-usage to run a curate that records nothing.",
|
|
181
165
|
},
|
|
182
166
|
},
|
|
183
167
|
async run({ args }) {
|
|
@@ -302,14 +286,13 @@ export const showCommand = defineJsonCommand({
|
|
|
302
286
|
description: "Exact context budget in characters. Requires --context lead; mutually exclusive with --max-tokens.",
|
|
303
287
|
},
|
|
304
288
|
// Declared as the POSITIVE name with `default: true` — see the
|
|
305
|
-
// `
|
|
289
|
+
// `track-usage` comment on `searchCommand` above for why a flag NAME
|
|
306
290
|
// must never start with `no-`.
|
|
307
291
|
"track-usage": {
|
|
308
292
|
type: "boolean",
|
|
309
293
|
default: true,
|
|
310
|
-
description: "A successful show
|
|
311
|
-
"
|
|
312
|
-
"read-only show that does not influence future ranking.",
|
|
294
|
+
description: "A successful show records usage-events telemetry, including the search-selection linkage when this " +
|
|
295
|
+
"show follows a recent search. Default: on. Use --no-track-usage to run a show that records nothing.",
|
|
313
296
|
},
|
|
314
297
|
},
|
|
315
298
|
async run({ args }) {
|
|
@@ -14,22 +14,20 @@
|
|
|
14
14
|
import { getSources, loadConfig } from "../../core/config/config.js";
|
|
15
15
|
import { rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
|
|
16
16
|
import { appendEvent } from "../../core/events.js";
|
|
17
|
+
import { redactCredentialPatterns } from "../../core/redaction.js";
|
|
18
|
+
import { withStateDbTelemetry } from "../../core/state-db.js";
|
|
17
19
|
import { resolveReadSources } from "../../indexer/read-preflight.js";
|
|
18
20
|
import { searchLocal } from "../../indexer/search/db-search.js";
|
|
19
21
|
import { getSearchHitAttribution, usageEventAttributionMetadata, } from "../../indexer/search/search-attribution.js";
|
|
20
|
-
import { getEntryIdByFilePath, getItemRefById } from "../../storage/repositories/index-entries-repository.js";
|
|
21
|
-
// Eagerly import source providers to trigger self-registration before the
|
|
22
|
-
// indexer or path-resolution code runs.
|
|
23
|
-
import "../../sources/providers/index.js";
|
|
24
|
-
import { withStateDbTelemetry } from "../../core/state-db.js";
|
|
25
22
|
import { insertUsageEvent } from "../../indexer/usage/usage-events.js";
|
|
26
23
|
import { TELEMETRY_BUSY_TIMEOUT_MS, withIndexDb } from "../../storage/repositories/index-db.js";
|
|
24
|
+
import { getEntryIdByFilePath, getItemRefById } from "../../storage/repositories/index-entries-repository.js";
|
|
27
25
|
import { searchRegistry } from "./registry-search.js";
|
|
28
26
|
const DEFAULT_LIMIT = 20;
|
|
29
27
|
function duplicateConceptWarnings(hits, defaultBundle) {
|
|
30
28
|
const ownersByConcept = new Map();
|
|
31
29
|
for (const hit of hits) {
|
|
32
|
-
const displayRef =
|
|
30
|
+
const displayRef = hit.ref.split("#", 1)[0] ?? hit.ref;
|
|
33
31
|
const boundary = displayRef.indexOf("//");
|
|
34
32
|
const conceptId = boundary >= 0 ? displayRef.slice(boundary + 2) : displayRef;
|
|
35
33
|
const owner = hit.origin ?? defaultBundle ?? "working-bundle";
|
|
@@ -47,7 +45,6 @@ function duplicateConceptWarnings(hits, defaultBundle) {
|
|
|
47
45
|
export async function akmSearch(input) {
|
|
48
46
|
const t0 = Date.now();
|
|
49
47
|
const query = input.query.trim();
|
|
50
|
-
const normalizedQuery = query.toLowerCase();
|
|
51
48
|
const searchType = input.type ?? "any";
|
|
52
49
|
const limit = normalizeLimit(input.limit);
|
|
53
50
|
const parsedSource = parseSearchSource(input.source ?? "local");
|
|
@@ -110,7 +107,7 @@ export async function akmSearch(input) {
|
|
|
110
107
|
const localResult = source === "registry"
|
|
111
108
|
? undefined
|
|
112
109
|
: await searchLocal({
|
|
113
|
-
query
|
|
110
|
+
query,
|
|
114
111
|
searchType,
|
|
115
112
|
limit,
|
|
116
113
|
stashDir,
|
|
@@ -126,8 +123,6 @@ export async function akmSearch(input) {
|
|
|
126
123
|
// would leak hits from sources the caller did not request.
|
|
127
124
|
restrictToSources: namedSourceName !== undefined,
|
|
128
125
|
includeExcludedTypes: input.includeSessions === true,
|
|
129
|
-
disableProjectContext: input.disableProjectContext === true,
|
|
130
|
-
disableScopedUtility: input.disableScopedUtility === true,
|
|
131
126
|
});
|
|
132
127
|
const registryResult = source === "local"
|
|
133
128
|
? undefined
|
|
@@ -249,7 +244,13 @@ function resolveEntryIds(db, hits) {
|
|
|
249
244
|
* Per-entry events are recorded only for stash hits because registry hits
|
|
250
245
|
* have no local entry_id to reference.
|
|
251
246
|
*/
|
|
252
|
-
function logSearchEvent(
|
|
247
|
+
function logSearchEvent(rawQuery, response, mode = "keyword", eventSource = "user", attributionProjection = "full") {
|
|
248
|
+
// Credentials pasted into a query (e.g. by the Claude Code hook that
|
|
249
|
+
// curates every user prompt) must never reach state.db verbatim — see
|
|
250
|
+
// `redactCredentialPatterns`. Redacted once here so every persistence call
|
|
251
|
+
// below (events.metadata_json via appendEvent, usage_events.query via
|
|
252
|
+
// insertUsageEvent) gets the same scrubbed text.
|
|
253
|
+
const query = redactCredentialPatterns(rawQuery);
|
|
253
254
|
// Emit a structured event to events.jsonl so workflow-trace consumers
|
|
254
255
|
// detect akm search invocations without relying on stdout scraping.
|
|
255
256
|
const stashHits = response.hits.filter((h) => h.type !== "registry");
|
|
@@ -296,18 +297,11 @@ function logSearchEvent(query, response, mode = "keyword", eventSource = "user",
|
|
|
296
297
|
source: eventSource,
|
|
297
298
|
});
|
|
298
299
|
}, TELEMETRY_BUSY_TIMEOUT_MS);
|
|
299
|
-
// No live utility_scores
|
|
300
|
-
//
|
|
301
|
-
//
|
|
302
|
-
//
|
|
303
|
-
//
|
|
304
|
-
// on them. Retrieval counts are still recorded above via
|
|
305
|
-
// insertUsageEvent (search_count) and rolled into utility_scores by
|
|
306
|
-
// the offline `recomputeUtilityScores` pass (`akm index`), which uses
|
|
307
|
-
// the show/search *select rate* — a ratio that requires an actual
|
|
308
|
-
// `show`/select event, not raw impressions. Explicit signal comes
|
|
309
|
-
// from `akm feedback` (applyFeedbackToUtilityScore) and from
|
|
310
|
-
// selection (recordShowUsage / the `select` event derived from it).
|
|
300
|
+
// No live utility_scores write here (#862): a search result is an
|
|
301
|
+
// impression, not a signal that the asset was useful. Retrieval
|
|
302
|
+
// counts are recorded above via insertUsageEvent (search_count) and
|
|
303
|
+
// rolled into utility_scores by the offline `recomputeUtilityScores`
|
|
304
|
+
// pass (`akm index`).
|
|
311
305
|
}, { busyTimeoutMs: TELEMETRY_BUSY_TIMEOUT_MS });
|
|
312
306
|
}
|
|
313
307
|
catch (err) {
|
|
@@ -24,33 +24,25 @@ import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
|
|
|
24
24
|
import { parseFrontmatter } from "../../core/asset/frontmatter.js";
|
|
25
25
|
import { extractSection, markdownFragmentSlugs } from "../../core/asset/markdown.js";
|
|
26
26
|
import { buildMarkdownLeadContext, fragmentForSelector, MARKDOWN_FRAGMENT_CONTEXT_DEFAULT_MAX_CHARS, } from "../../core/asset/markdown-fragments.js";
|
|
27
|
-
import { displayRef, typeNameFromConceptId } from "../../core/asset/resolve-ref.js";
|
|
27
|
+
import { displayRef, displayRefForConceptId, typeNameFromConceptId } from "../../core/asset/resolve-ref.js";
|
|
28
28
|
import { META_DIR, parseMetaRef, readMetaFile } from "../../core/asset/stash-meta.js";
|
|
29
29
|
import { asNonEmptyString, isWithin } from "../../core/common.js";
|
|
30
|
-
import {
|
|
30
|
+
import { loadConfig } from "../../core/config/config.js";
|
|
31
31
|
import { NotFoundError, rethrowIfDataDirUnreadable, rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
|
|
32
32
|
import { appendEvent } from "../../core/events.js";
|
|
33
33
|
import { SCRIPT_EXTENSIONS } from "../../core/recognition-util.js";
|
|
34
34
|
import { presentationFor } from "../../core/type-presentation.js";
|
|
35
35
|
import { warn, warnOnce } from "../../core/warn.js";
|
|
36
|
-
import { hasGraphData } from "../../indexer/db/graph-db.js";
|
|
37
|
-
import { listRelatedPathsForFile } from "../../indexer/graph/graph-boost.js";
|
|
38
|
-
import { extractGraphForSingleFile } from "../../indexer/graph/graph-extraction.js";
|
|
39
36
|
import { lookupBundleRef, lookupBundleRefWithResolution } from "../../indexer/indexer.js";
|
|
40
37
|
import { projectMarkdownFragmentContent } from "../../indexer/passes/metadata.js";
|
|
41
38
|
import { ensurePrimaryIndexForRead, resolveReadSources } from "../../indexer/read-preflight.js";
|
|
42
39
|
import { buildEditHint, findSourceForPath, isEditable, resolveSourceEntries, } from "../../indexer/search/search-source.js";
|
|
43
40
|
import { recentShowCount, recordShowUsage } from "../../indexer/usage/show-usage.js";
|
|
44
41
|
import { buildFileContext, buildRenderContext, getRenderer, } from "../../indexer/walk/file-context.js";
|
|
45
|
-
import { resolveIndexPassExecution } from "../../llm/index-passes.js";
|
|
46
42
|
import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
|
|
47
|
-
import {
|
|
48
|
-
import { closeDatabase, openExistingDatabase } from "../../storage/repositories/index-connection.js";
|
|
49
|
-
import { TELEMETRY_BUSY_TIMEOUT_MS, withIndexDb } from "../../storage/repositories/index-db.js";
|
|
43
|
+
import { withIndexDb } from "../../storage/repositories/index-db.js";
|
|
50
44
|
import { getIndexedMarkdownFragment } from "../../storage/repositories/index-fts-repository.js";
|
|
51
|
-
import {
|
|
52
|
-
// Eagerly import source providers to trigger self-registration.
|
|
53
|
-
import "../../sources/providers/index.js";
|
|
45
|
+
import { readEntryLinks } from "../../storage/repositories/index-links-repository.js";
|
|
54
46
|
import { getCurrentWorkflowScopeKey } from "../../workflows/authoring/scope-key.js";
|
|
55
47
|
import { buildWorkflowAction } from "../../workflows/renderer.js";
|
|
56
48
|
import { getActiveWorkflowRun } from "../../workflows/runtime/runs.js";
|
|
@@ -326,12 +318,13 @@ export async function showLocal(input) {
|
|
|
326
318
|
response.type = indexedEntry.type;
|
|
327
319
|
response.name = indexedEntry.name;
|
|
328
320
|
const isPrimaryStash = source?.isDefault === true;
|
|
321
|
+
const displayDefaultBundle = config.defaultBundle ?? (isPrimaryStash ? indexedEntry.bundleId : undefined);
|
|
329
322
|
const canonicalRef = displayRef({
|
|
330
323
|
type: indexedEntry.type,
|
|
331
324
|
name: presentedName,
|
|
332
325
|
conceptId: indexedEntry.conceptId,
|
|
333
326
|
bundleId: indexedEntry.bundleId,
|
|
334
|
-
},
|
|
327
|
+
}, displayDefaultBundle);
|
|
335
328
|
if (parsed.fragment && indexedFragment) {
|
|
336
329
|
const selectedFragmentId = indexedFragment.fragments[indexedFragment.ordinal].fragmentId;
|
|
337
330
|
const selectedRef = `${canonicalRef}#${selectedFragmentId}`;
|
|
@@ -390,33 +383,12 @@ export async function showLocal(input) {
|
|
|
390
383
|
origin: source?.registryId ?? null,
|
|
391
384
|
editable,
|
|
392
385
|
...(!editable ? { editHint: buildEditHint(canonicalRef) } : {}),
|
|
393
|
-
|
|
394
|
-
try {
|
|
395
|
-
return withIndexDb((db) => {
|
|
396
|
-
const related = listRelatedPathsForFile(sourceStashDir, assetPath, 5, db);
|
|
397
|
-
return { total: related.length, hits: related };
|
|
398
|
-
});
|
|
399
|
-
}
|
|
400
|
-
catch (err) {
|
|
401
|
-
rethrowIfTestIsolationError(err);
|
|
402
|
-
rethrowIfDataDirUnreadable(err);
|
|
403
|
-
return { total: 0, hits: [] };
|
|
404
|
-
}
|
|
405
|
-
})(),
|
|
386
|
+
...showLinks(indexedEntry.itemRef, displayDefaultBundle),
|
|
406
387
|
};
|
|
407
388
|
const activeRun = await getActiveWorkflowRun(getCurrentWorkflowScopeKey());
|
|
408
389
|
if (activeRun) {
|
|
409
390
|
fullResponse.activeRun = activeRun;
|
|
410
391
|
}
|
|
411
|
-
// #624-P3: opt-in inline graph extraction. Default OFF — when the flag is
|
|
412
|
-
// unset this whole block is skipped (no hasGraphData check, no LLM call), so
|
|
413
|
-
// behavior is byte-identical to today. When ON, it extracts graph data for an
|
|
414
|
-
// ungraphed asset, but ONLY when a model is configured (model-available
|
|
415
|
-
// guard) and ALWAYS bounded by a 30s timeout so `show` can never hang. Any
|
|
416
|
-
// timeout/model-unavailable/error path returns the response unchanged.
|
|
417
|
-
if (getIndexPassConfig(config.index, "graph")?.lazyGraphExtraction === true) {
|
|
418
|
-
await maybeExtractGraphInline(config, sourceStashDir, assetPath);
|
|
419
|
-
}
|
|
420
392
|
if (input.detail === "brief") {
|
|
421
393
|
return buildBriefResponse(fullResponse, assetPath);
|
|
422
394
|
}
|
|
@@ -425,6 +397,56 @@ export async function showLocal(input) {
|
|
|
425
397
|
}
|
|
426
398
|
return fullResponse;
|
|
427
399
|
}
|
|
400
|
+
/** Refs listed per kind of declared link; `total` still counts them all (one memory is named by 1,437 others). */
|
|
401
|
+
const LINKS_PER_KIND = 10;
|
|
402
|
+
/**
|
|
403
|
+
* The declared links (#935) of an indexed asset, grouped by kind: outgoing in
|
|
404
|
+
* authored order, incoming by ref, and unresolved tokens as authored. Empty
|
|
405
|
+
* parts are omitted, and the field when nothing links either way.
|
|
406
|
+
*/
|
|
407
|
+
function showLinks(itemRef, defaultBundle) {
|
|
408
|
+
let rows;
|
|
409
|
+
try {
|
|
410
|
+
rows = withIndexDb((db) => readEntryLinks(db, itemRef));
|
|
411
|
+
}
|
|
412
|
+
catch (err) {
|
|
413
|
+
rethrowIfTestIsolationError(err);
|
|
414
|
+
rethrowIfDataDirUnreadable(err);
|
|
415
|
+
return {};
|
|
416
|
+
}
|
|
417
|
+
const outgoing = [];
|
|
418
|
+
const unresolved = [];
|
|
419
|
+
for (const row of rows.outgoing) {
|
|
420
|
+
if (row.conceptId === undefined)
|
|
421
|
+
unresolved.push({ kind: row.kind, ref: row.raw ?? "" });
|
|
422
|
+
else
|
|
423
|
+
outgoing.push({ kind: row.kind, ref: displayRefForConceptId(row.conceptId, row.bundleId, defaultBundle) });
|
|
424
|
+
}
|
|
425
|
+
const incoming = rows.incoming.map((row) => ({
|
|
426
|
+
kind: row.kind,
|
|
427
|
+
ref: displayRefForConceptId(row.conceptId ?? "", row.bundleId, defaultBundle),
|
|
428
|
+
}));
|
|
429
|
+
const links = {
|
|
430
|
+
...groupLinks("outgoing", outgoing),
|
|
431
|
+
...groupLinks("incoming", incoming),
|
|
432
|
+
...groupLinks("unresolved", unresolved),
|
|
433
|
+
};
|
|
434
|
+
return Object.keys(links).length > 0 ? { links } : {};
|
|
435
|
+
}
|
|
436
|
+
function groupLinks(part, rows) {
|
|
437
|
+
if (rows.length === 0)
|
|
438
|
+
return {};
|
|
439
|
+
const groups = {};
|
|
440
|
+
for (const kind of [...new Set(rows.map((row) => row.kind))].sort())
|
|
441
|
+
groups[kind] = { total: 0, refs: [] };
|
|
442
|
+
for (const { kind, ref } of rows) {
|
|
443
|
+
const group = groups[kind];
|
|
444
|
+
group.total++;
|
|
445
|
+
if (group.refs.length < LINKS_PER_KIND)
|
|
446
|
+
group.refs.push(ref);
|
|
447
|
+
}
|
|
448
|
+
return { [part]: groups };
|
|
449
|
+
}
|
|
428
450
|
/**
|
|
429
451
|
* Warn and ignore body fragments for namespaces whose authored bytes are
|
|
430
452
|
* sensitive. `warnOnce`-keyed on the exact ref: `akmShowUnified` calls this
|
|
@@ -473,79 +495,6 @@ function findUnrecognizedScriptSource(assetParts, sources) {
|
|
|
473
495
|
}
|
|
474
496
|
return undefined;
|
|
475
497
|
}
|
|
476
|
-
/**
|
|
477
|
-
* #624-P3 — opt-in inline graph extraction for `akm show`. Best-effort and
|
|
478
|
-
* timeout-bounded: never throws, never hangs, never mutates the response.
|
|
479
|
-
*
|
|
480
|
-
* Preconditions (caller already checked the flag): a model must be configured
|
|
481
|
-
* (model-available guard via {@link resolveIndexPassExecution}) and the asset
|
|
482
|
-
* must be ungraphed ({@link hasGraphData}). Extraction races a 30s timeout so
|
|
483
|
-
* `show` cannot block on a slow provider; any timeout/error/missing-model path
|
|
484
|
-
* is swallowed and `show` returns its already-assembled response unchanged.
|
|
485
|
-
*/
|
|
486
|
-
async function maybeExtractGraphInline(config, sourceStashDir, assetPath) {
|
|
487
|
-
try {
|
|
488
|
-
// Resolve readiness and the symbolic runner once. The inline dispatch must
|
|
489
|
-
// consume this same snapshot even if models.json changes while show runs.
|
|
490
|
-
const graphExecution = resolveIndexPassExecution("graph", config);
|
|
491
|
-
if (!graphExecution.runner)
|
|
492
|
-
return;
|
|
493
|
-
const emittedNoticeKeys = new Set();
|
|
494
|
-
const reportNotices = (notices) => {
|
|
495
|
-
for (const notice of notices) {
|
|
496
|
-
const key = JSON.stringify(notice);
|
|
497
|
-
if (emittedNoticeKeys.has(key))
|
|
498
|
-
continue;
|
|
499
|
-
emittedNoticeKeys.add(key);
|
|
500
|
-
const field = typeof notice.field === "string" ? ` field=${notice.field}` : "";
|
|
501
|
-
warn(`[akm] lazy graph extraction notice ${notice.code} adapter=${notice.adapter}${field}: ${notice.message}`);
|
|
502
|
-
}
|
|
503
|
-
};
|
|
504
|
-
reportNotices(graphExecution.notices);
|
|
505
|
-
let alreadyGraphed = false;
|
|
506
|
-
let bodyHash;
|
|
507
|
-
try {
|
|
508
|
-
const raw = fs.readFileSync(assetPath, "utf8");
|
|
509
|
-
bodyHash = computeBodyHash(parseFrontmatter(raw).content.trim());
|
|
510
|
-
}
|
|
511
|
-
catch {
|
|
512
|
-
return; // file gone/unreadable ⇒ nothing to extract
|
|
513
|
-
}
|
|
514
|
-
withIndexDb((db) => {
|
|
515
|
-
alreadyGraphed = hasGraphData(db, sourceStashDir, assetPath);
|
|
516
|
-
}, { busyTimeoutMs: TELEMETRY_BUSY_TIMEOUT_MS });
|
|
517
|
-
if (alreadyGraphed)
|
|
518
|
-
return;
|
|
519
|
-
// Open the db for the async extraction ourselves: `withIndexDb` is
|
|
520
|
-
// synchronous and would close the connection the instant the async fn
|
|
521
|
-
// returns its Promise (before extraction completes). Close it explicitly
|
|
522
|
-
// after the race settles instead.
|
|
523
|
-
const db = openExistingDatabase(resolveStorageLocations().indexDb);
|
|
524
|
-
let timer;
|
|
525
|
-
const timeout = new Promise((resolve) => {
|
|
526
|
-
timer = setTimeout(resolve, 30_000);
|
|
527
|
-
});
|
|
528
|
-
try {
|
|
529
|
-
await Promise.race([
|
|
530
|
-
extractGraphForSingleFile(db, sourceStashDir, assetPath, bodyHash, {
|
|
531
|
-
config,
|
|
532
|
-
llmRunner: graphExecution.runner,
|
|
533
|
-
onNotices: reportNotices,
|
|
534
|
-
}),
|
|
535
|
-
timeout,
|
|
536
|
-
]);
|
|
537
|
-
}
|
|
538
|
-
finally {
|
|
539
|
-
if (timer)
|
|
540
|
-
clearTimeout(timer);
|
|
541
|
-
closeDatabase(db);
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
catch (err) {
|
|
545
|
-
rethrowIfTestIsolationError(err);
|
|
546
|
-
// Any other failure: silently return the unchanged show response.
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
498
|
/**
|
|
550
499
|
* Minimal `show`: ref → indexer lookup → file contents. Used by callers that
|
|
551
500
|
* just need the raw file (e.g. clone, write-source) and don't want the full
|
|
@@ -24,9 +24,11 @@
|
|
|
24
24
|
* `proposal-new` shape). `show` is a new shape, `bundle-show`.
|
|
25
25
|
*/
|
|
26
26
|
import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
|
|
27
|
+
import { renameBundle } from "../../core/bundle-rename.js";
|
|
27
28
|
import { NotFoundError, TransientError, UsageError } from "../../core/errors.js";
|
|
28
29
|
import { appendEvent } from "../../core/events.js";
|
|
29
30
|
import { warn } from "../../core/warn.js";
|
|
31
|
+
import { akmTasksSync } from "../tasks/tasks.js";
|
|
30
32
|
import { addCommand } from "./add-cli.js";
|
|
31
33
|
import { akmInit } from "./init.js";
|
|
32
34
|
import { akmListSources, akmRemove, akmUpdate } from "./installed-stashes.js";
|
|
@@ -182,9 +184,29 @@ const updateCommand = defineJsonCommand({
|
|
|
182
184
|
output("update", result);
|
|
183
185
|
},
|
|
184
186
|
});
|
|
187
|
+
const renameCommand = defineJsonCommand({
|
|
188
|
+
meta: {
|
|
189
|
+
name: "rename",
|
|
190
|
+
description: "Rename a configured bundle's key everywhere akm persists it (config, lock, index, and its own proposals/task history). Content inside the bundle that still spells the old ref is reported, not rewritten.",
|
|
191
|
+
},
|
|
192
|
+
args: {
|
|
193
|
+
old: { type: "positional", description: "Current bundle name", required: true },
|
|
194
|
+
new: { type: "positional", description: "New bundle name (must be a legal, unused slug)", required: true },
|
|
195
|
+
"dry-run": {
|
|
196
|
+
type: "boolean",
|
|
197
|
+
description: "Show the rename plan without writing anything",
|
|
198
|
+
default: false,
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
async run({ args }) {
|
|
202
|
+
const result = await renameBundle(args.old, args.new, { dryRun: args["dry-run"] }, {
|
|
203
|
+
syncTasks: (newId, backend) => akmTasksSync({ backend }, newId),
|
|
204
|
+
});
|
|
205
|
+
output("bundle-rename", result);
|
|
206
|
+
},
|
|
207
|
+
});
|
|
185
208
|
export function isSkippableBundleUpdateLock(error) {
|
|
186
|
-
return
|
|
187
|
-
["INDEX_DB_CONTENDED", "STATE_DB_CONTENDED", "MAINTENANCE_BARRIER_BUSY"].includes(error.code));
|
|
209
|
+
return error instanceof TransientError && ["INDEX_DB_CONTENDED", "STATE_DB_CONTENDED"].includes(error.code);
|
|
188
210
|
}
|
|
189
211
|
export const bundleCommand = defineGroupCommand({
|
|
190
212
|
meta: {
|
|
@@ -198,5 +220,6 @@ export const bundleCommand = defineGroupCommand({
|
|
|
198
220
|
show: showCommand,
|
|
199
221
|
remove: removeCommand,
|
|
200
222
|
update: updateCommand,
|
|
223
|
+
rename: renameCommand,
|
|
201
224
|
},
|
|
202
225
|
});
|
|
@@ -92,6 +92,10 @@ export function bundleKeyForUrl(config, url) {
|
|
|
92
92
|
* caller's `preferredName` when it is a legal slug, else slug the seed locator
|
|
93
93
|
* (path/url) — the shared {@link deriveBundleId} rule (D-R5), made unique against
|
|
94
94
|
* the currently-configured bundle keys.
|
|
95
|
+
*
|
|
96
|
+
* Every add path validates an explicit `--name` with
|
|
97
|
+
* {@link validateExplicitBundleName} before calling in (an illegal or taken
|
|
98
|
+
* name fails loudly), so a `preferredName` that reaches here is returned as is.
|
|
95
99
|
*/
|
|
96
100
|
export function nextBundleKey(bundles, preferredName, seedLocator) {
|
|
97
101
|
return deriveBundleId(preferredName, seedLocator, new Set(Object.keys(bundles)));
|
|
@@ -66,8 +66,7 @@ function collectDangerousKeyFindings(installedStashRoot, checkEnvForDangerousKey
|
|
|
66
66
|
}
|
|
67
67
|
return allFindings;
|
|
68
68
|
}
|
|
69
|
-
|
|
70
|
-
export function scanStashForDangerousKeys(installedStashRoot) {
|
|
69
|
+
function scanStashForDangerousKeys(installedStashRoot) {
|
|
71
70
|
const scanner = scannerOverride ??
|
|
72
71
|
((envPath, relPath) => scanEnvKeyNames(fs.readFileSync(envPath, "utf8"))
|
|
73
72
|
.filter(isDangerousEnvKey)
|