akm-cli 0.9.17-alpha.2 → 0.9.17-alpha.4
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 +756 -0
- package/dist/akm +94 -196
- package/dist/cli/shared.js +6 -2
- package/dist/cli.js +22 -9
- 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 +2 -2
- package/dist/commands/health/checks.js +30 -75
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +0 -38
- package/dist/commands/health/improve-metrics.js +123 -562
- 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 +11 -106
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -73
- package/dist/commands/health.js +122 -143
- package/dist/commands/improve/consolidate/chunking.js +25 -100
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +538 -1075
- 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 -1075
- package/dist/commands/improve/eligibility.js +126 -400
- package/dist/commands/improve/execution.js +3 -5
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +29 -166
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +12 -7
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +443 -1063
- package/dist/commands/improve/ledger.js +114 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +459 -1172
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +14 -118
- package/dist/commands/improve/memory/memory-improve.js +4 -3
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -10
- package/dist/commands/improve/preparation.js +851 -2339
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +621 -1367
- package/dist/commands/improve/salience.js +46 -232
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +323 -0
- package/dist/commands/proposal/drain.js +251 -644
- package/dist/commands/proposal/proposal-cli.js +3 -18
- package/dist/commands/proposal/proposal-types.js +20 -41
- package/dist/commands/proposal/proposal.js +1 -2
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +502 -1487
- 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 +13 -89
- package/dist/commands/read/curate.js +63 -413
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +2 -13
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +7 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +2 -11
- 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/stash-cli.js +1 -1
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +9 -8
- package/dist/commands/tasks/tasks.js +326 -930
- package/dist/commands/tasks/validate.js +42 -21
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +0 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +11 -12
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +291 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +1 -33
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +163 -68
- 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 +21 -95
- package/dist/core/config/schema/improve.js +4 -42
- 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-lock.js +76 -173
- package/dist/core/logs-db.js +2 -2
- package/dist/core/paths.js +0 -27
- 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 +108 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +293 -1012
- 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/graph-db.js +106 -46
- package/dist/indexer/ensure-index.js +44 -85
- package/dist/indexer/graph/graph-extraction.js +340 -562
- package/dist/indexer/graph/graph-related.js +130 -0
- 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 +139 -151
- package/dist/indexer/indexer.js +524 -846
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +81 -90
- package/dist/indexer/passes/metadata.js +132 -200
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +1 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +181 -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 +2 -7
- 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/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +10 -15
- package/dist/llm/graph-extract.js +3 -12
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/metadata-enhance.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 +2 -34
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/search/ranking-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +60 -23
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +1 -2
- 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 +43937 -93313
- package/dist/scripts/akm-migrate.js +43697 -93071
- 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/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 +0 -17
- 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 +168 -0
- package/dist/storage/repositories/index-connection.js +34 -70
- package/dist/storage/repositories/index-entries-repository.js +69 -111
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +83 -269
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-llm-cache-repository.js +17 -0
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +192 -220
- 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 +35 -0
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- 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 +34 -27
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +129 -277
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +125 -745
- package/dist/tasks/backends/schtasks.js +101 -620
- 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/scheduler-binding.js +18 -238
- package/dist/tasks/scheduler-invocation.js +52 -52
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +363 -679
- package/dist/tasks/source/parse-task-source.js +160 -10
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +2 -2
- 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 +41 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +19 -7
- package/docs/reference/cli.md +182 -125
- package/docs/reference/configuration.md +49 -56
- package/docs/reference/data-and-telemetry.md +19 -20
- package/docs/reference/tasks.md +86 -38
- 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 +87 -406
- 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 -146
- package/dist/commands/improve/distill/promote-memory.js +0 -329
- package/dist/commands/improve/distill/quality-gate.js +0 -500
- 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 -21
- 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/config/retired-experimental-keys-shim.js +0 -62
- 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/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- 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/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/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 -78
- 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
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* `akm bundle rename <old> <new>` (D6) — the one command allowed to change a
|
|
6
|
+
* bundle's key. A bundle id is a mass identity prefix: every durable ref this
|
|
7
|
+
* tool minted (`entries.item_ref`/`bundle_id`, `proposals.ref`, a pending
|
|
8
|
+
* proposal's `proposedTarget.source`, a workflow task_history row's
|
|
9
|
+
* `target_ref`, `scheduler.enabled[].ref`) carries it, and a hand-edited
|
|
10
|
+
* `bundles` key strands all of it (see `src/indexer/bundle-identity-guard.ts`
|
|
11
|
+
* §11.5). This module is the rekey transaction that guard's docstring points
|
|
12
|
+
* to.
|
|
13
|
+
*
|
|
14
|
+
* Rewritten: the config `bundles` key, `defaultBundle`/`defaultWriteTarget`
|
|
15
|
+
* when they name the old id, every `scheduler.enabled[].ref` with the old
|
|
16
|
+
* `//` prefix, the lockfile entry id, and the index/state rows above.
|
|
17
|
+
*
|
|
18
|
+
* Reported, never rewritten: refs inside bundle CONTENT (xrefs,
|
|
19
|
+
* `supersededBy`, task `uses:`) — rewriting a bundle's own files is
|
|
20
|
+
* `akm mv`/editing territory, not a config-identity rename. `--dry-run`
|
|
21
|
+
* (and every real run) lists the indexed files that still spell the old
|
|
22
|
+
* `<old>//` prefix so the operator can follow up.
|
|
23
|
+
*
|
|
24
|
+
* Left behind on purpose: `usage_events`/`asset_salience`/`asset_outcome`
|
|
25
|
+
* keyed by the old bundle prefix (learned utility/outcome history) — outside
|
|
26
|
+
* this item's scope; `warnOnBundleRenameDrift` already documents this class
|
|
27
|
+
* of gap and `akm index --full` re-mints under the new id.
|
|
28
|
+
*/
|
|
29
|
+
import fs from "node:fs";
|
|
30
|
+
import { readLockfile, renameLockEntry } from "../integrations/lockfile.js";
|
|
31
|
+
import { closeDatabase, openIndexDatabase, openReadonlyExistingDatabase, } from "../storage/repositories/index-connection.js";
|
|
32
|
+
import { getFilePathsByBundle, renameEntriesBundleId } from "../storage/repositories/index-entries-repository.js";
|
|
33
|
+
import { renameLlmCacheAssetRefs } from "../storage/repositories/index-llm-cache-repository.js";
|
|
34
|
+
import { countProposalsForBundleRename, renameProposalsBundleRef } from "../storage/repositories/proposals-repository.js";
|
|
35
|
+
import { countTaskHistoryTargetRefs, renameTaskHistoryTargetRefs, } from "../storage/repositories/task-history-repository.js";
|
|
36
|
+
import { selectBackend } from "../tasks/backends/index.js";
|
|
37
|
+
import { bundleRefToString, parseBundleRef } from "./asset/asset-ref.js";
|
|
38
|
+
import { validateExplicitBundleName } from "./bundle-id.js";
|
|
39
|
+
import { loadConfig, mutateConfig } from "./config/config.js";
|
|
40
|
+
import { NotFoundError, UsageError } from "./errors.js";
|
|
41
|
+
import { getDbPath } from "./paths.js";
|
|
42
|
+
import { getStateDbPath, withStateDb } from "./state-db.js";
|
|
43
|
+
/** Throws if `newId` cannot become `oldId`'s new key. Re-run under the config lock at apply time. */
|
|
44
|
+
function validateRename(config, oldId, newId) {
|
|
45
|
+
if (!config.bundles?.[oldId]) {
|
|
46
|
+
throw new NotFoundError(`No configured bundle named "${oldId}".`, "SOURCE_NOT_FOUND");
|
|
47
|
+
}
|
|
48
|
+
if (oldId === newId) {
|
|
49
|
+
throw new UsageError(`"${oldId}" and "${newId}" are the same bundle name.`, "INVALID_FLAG_VALUE");
|
|
50
|
+
}
|
|
51
|
+
const withoutOld = { ...(config.bundles ?? {}) };
|
|
52
|
+
delete withoutOld[oldId];
|
|
53
|
+
validateExplicitBundleName(withoutOld, newId);
|
|
54
|
+
}
|
|
55
|
+
function bundleOfRef(ref) {
|
|
56
|
+
try {
|
|
57
|
+
return parseBundleRef(ref).bundle;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function schedulerRefsToRewrite(config, oldId) {
|
|
64
|
+
return (config.scheduler?.enabled ?? []).filter((ref) => bundleOfRef(ref) === oldId);
|
|
65
|
+
}
|
|
66
|
+
function renameBundleInConfig(config, oldId, newId) {
|
|
67
|
+
validateRename(config, oldId, newId);
|
|
68
|
+
const bundles = {};
|
|
69
|
+
for (const [key, entry] of Object.entries(config.bundles ?? {})) {
|
|
70
|
+
bundles[key === oldId ? newId : key] = entry;
|
|
71
|
+
}
|
|
72
|
+
const enabled = config.scheduler?.enabled;
|
|
73
|
+
const scheduler = enabled === undefined
|
|
74
|
+
? config.scheduler
|
|
75
|
+
: {
|
|
76
|
+
...config.scheduler,
|
|
77
|
+
enabled: enabled.map((ref) => bundleOfRef(ref) === oldId ? bundleRefToString({ ...parseBundleRef(ref), bundle: newId }) : ref),
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
...config,
|
|
81
|
+
bundles,
|
|
82
|
+
...(config.defaultBundle === oldId ? { defaultBundle: newId } : {}),
|
|
83
|
+
...(config.defaultWriteTarget === oldId ? { defaultWriteTarget: newId } : {}),
|
|
84
|
+
...(scheduler ? { scheduler } : {}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** Indexed files (already read into `filePaths`) whose content still spells `<oldId>//`, best-effort. */
|
|
88
|
+
function filesStillMentioning(filePaths, oldId) {
|
|
89
|
+
const needle = `${oldId}//`;
|
|
90
|
+
const hits = [];
|
|
91
|
+
for (const filePath of filePaths) {
|
|
92
|
+
try {
|
|
93
|
+
if (fs.readFileSync(filePath, "utf8").includes(needle))
|
|
94
|
+
hits.push(filePath);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Best-effort: a since-removed or unreadable file is skipped, not fatal —
|
|
98
|
+
// this scan is a report, not a correctness requirement.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return hits;
|
|
102
|
+
}
|
|
103
|
+
/** True when an installed binding's invocation names `bundleId` — either as a `task run` entry's `--bundle <id>` argument, or as a `workflow run <id>//…` ref. */
|
|
104
|
+
function invocationNamesBundle(invocation, bundleId) {
|
|
105
|
+
if (!invocation)
|
|
106
|
+
return false;
|
|
107
|
+
for (let i = 0; i < invocation.length; i++) {
|
|
108
|
+
const token = invocation[i];
|
|
109
|
+
if (token === bundleId && invocation[i - 1] === "--bundle")
|
|
110
|
+
return true;
|
|
111
|
+
if (token?.startsWith(`${bundleId}//`))
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Installed native scheduler rows whose invocation names `oldId`, best-effort
|
|
118
|
+
* (a backend whose listing throws reports none — this is a preview, not a
|
|
119
|
+
* correctness requirement).
|
|
120
|
+
*/
|
|
121
|
+
async function nativeSchedulerRowsNamingBundle(sched, oldId) {
|
|
122
|
+
try {
|
|
123
|
+
return (await sched.list())
|
|
124
|
+
.filter((entry) => invocationNamesBundle(entry.invocation, oldId))
|
|
125
|
+
.map((entry) => entry.invocation?.join(" ") ?? entry.id);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Build the rename plan — every count and ref this rename would touch — by
|
|
133
|
+
* reading, never writing. Shared by `--dry-run` and a real run so the two
|
|
134
|
+
* can never disagree about what was reported vs. what happened.
|
|
135
|
+
*/
|
|
136
|
+
async function buildPlan(config, oldId, newId, sched) {
|
|
137
|
+
const schedulerRefs = schedulerRefsToRewrite(config, oldId);
|
|
138
|
+
const lockPresent = readLockfile().some((entry) => entry.id === oldId);
|
|
139
|
+
const nativeSchedulerRows = await nativeSchedulerRowsNamingBundle(sched, oldId);
|
|
140
|
+
let indexEntries = 0;
|
|
141
|
+
let contentRefs = [];
|
|
142
|
+
const readIndexDb = openReadonlyExistingDatabase(getDbPath());
|
|
143
|
+
if (readIndexDb) {
|
|
144
|
+
try {
|
|
145
|
+
const filePaths = getFilePathsByBundle(readIndexDb, oldId);
|
|
146
|
+
indexEntries = filePaths.length;
|
|
147
|
+
contentRefs = filesStillMentioning(filePaths, oldId);
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
closeDatabase(readIndexDb);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
let proposalRefs = 0;
|
|
154
|
+
let proposalTargets = 0;
|
|
155
|
+
let taskHistoryRefs = 0;
|
|
156
|
+
if (fs.existsSync(getStateDbPath())) {
|
|
157
|
+
withStateDb((db) => {
|
|
158
|
+
const counts = countProposalsForBundleRename(db, oldId);
|
|
159
|
+
proposalRefs = counts.refs;
|
|
160
|
+
proposalTargets = counts.targets;
|
|
161
|
+
taskHistoryRefs = countTaskHistoryTargetRefs(db, oldId);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
oldId,
|
|
166
|
+
newId,
|
|
167
|
+
config: {
|
|
168
|
+
defaultBundleChanges: config.defaultBundle === oldId,
|
|
169
|
+
defaultWriteTargetChanges: config.defaultWriteTarget === oldId,
|
|
170
|
+
schedulerRefs,
|
|
171
|
+
},
|
|
172
|
+
lock: { present: lockPresent },
|
|
173
|
+
index: { entries: indexEntries },
|
|
174
|
+
state: { proposalRefs, proposalTargets, taskHistoryRefs },
|
|
175
|
+
contentRefs,
|
|
176
|
+
nativeSchedulerRows,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function taskSyncErrorMessage(cause) {
|
|
180
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Remove every installed native row still naming `oldId`, best-effort,
|
|
184
|
+
* before the sync below installs the new-named ones. Without this, a plain
|
|
185
|
+
* `akmTasksSync(deps, newId)` alone cannot clean the old rows up: a task
|
|
186
|
+
* binding's native id depends only on the task id, so the OLD row and the
|
|
187
|
+
* new one it should become collide on that id, and `installedRowScope`
|
|
188
|
+
* (scheduler-sync.ts) attributes a row by the bundle NAME it was installed
|
|
189
|
+
* under — the physical-path check only confirms a name match, it never
|
|
190
|
+
* substitutes for one — so the sync reports the old row as another bundle's
|
|
191
|
+
* and leaves the new binding out instead of replacing it. A workflow binding's native id
|
|
192
|
+
* depends on its fully-qualified ref instead, so old and new never collide
|
|
193
|
+
* at all and the old row would otherwise be left installed forever. Both
|
|
194
|
+
* fail the same way this function fixes: uninstall the exact native rows
|
|
195
|
+
* `nativeSchedulerRowsNamingBundle` already found, by their native id, so
|
|
196
|
+
* the sync that follows starts from a clean slate.
|
|
197
|
+
*/
|
|
198
|
+
async function removeStaleNativeSchedulerRows(sched, oldId) {
|
|
199
|
+
let installed;
|
|
200
|
+
try {
|
|
201
|
+
installed = await sched.list();
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
for (const entry of installed) {
|
|
207
|
+
if (!invocationNamesBundle(entry.invocation, oldId))
|
|
208
|
+
continue;
|
|
209
|
+
try {
|
|
210
|
+
await sched.uninstall(entry.nativeId ?? entry.id);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Best-effort: a row this process can't remove is left for the
|
|
214
|
+
// operator's own `akm task sync` to reconcile, same as every other
|
|
215
|
+
// per-item failure the sync itself reports rather than throws.
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Rename a configured bundle's key everywhere akm itself persists it. With
|
|
221
|
+
* `dryRun: true`, only {@link buildPlan} runs — nothing is written, matching
|
|
222
|
+
* a `applied: false` result the caller renders as the plan. `deps.backend`
|
|
223
|
+
* lets a caller (tests) inject a fake scheduler backend instead of the real
|
|
224
|
+
* OS one `selectBackend()` would otherwise pick. `deps.syncTasks` is how the
|
|
225
|
+
* caller runs the post-rename `akmTasksSync` — `src/core` sits below
|
|
226
|
+
* `src/commands` (see `src/core/improve-types.ts`'s note on the same
|
|
227
|
+
* direction), so this module never imports `akmTasksSync` itself; the real
|
|
228
|
+
* caller (`akm bundle rename`'s command handler) always supplies it, and is
|
|
229
|
+
* required so a missing wire-up is a type error, not a silently skipped sync.
|
|
230
|
+
*/
|
|
231
|
+
export async function renameBundle(oldId, newId, options = {}, deps) {
|
|
232
|
+
const config = loadConfig();
|
|
233
|
+
validateRename(config, oldId, newId);
|
|
234
|
+
const sched = deps.backend ?? selectBackend();
|
|
235
|
+
const plan = await buildPlan(config, oldId, newId, sched);
|
|
236
|
+
if (options.dryRun)
|
|
237
|
+
return { ...plan, applied: false };
|
|
238
|
+
// Config: the bundles key, defaultBundle/defaultWriteTarget, and every
|
|
239
|
+
// scheduler.enabled[].ref with the old `//` prefix — all under one write
|
|
240
|
+
// (validated again inside the config lock).
|
|
241
|
+
mutateConfig((current) => renameBundleInConfig(current, oldId, newId));
|
|
242
|
+
// Lockfile: the resolved-install entry id (no-op for a bundle with none,
|
|
243
|
+
// e.g. a plain filesystem bundle).
|
|
244
|
+
await renameLockEntry(oldId, newId);
|
|
245
|
+
// Index: bundle_id/item_ref on every entry row (see index-entries-repository's
|
|
246
|
+
// renameEntriesBundleId docstring for why no FTS/vector rebuild is needed),
|
|
247
|
+
// and the metadata-enrichment LLM cache keyed by the same canonical
|
|
248
|
+
// item_ref — in the SAME write, so a rename can never land between the two
|
|
249
|
+
// and leave the cache stranded under the old prefix (the next `akm index`'s
|
|
250
|
+
// clearStaleCacheEntries would then delete it, forcing a full re-enrich).
|
|
251
|
+
const readIndexDb = openReadonlyExistingDatabase(getDbPath());
|
|
252
|
+
if (readIndexDb) {
|
|
253
|
+
closeDatabase(readIndexDb);
|
|
254
|
+
const writeIndexDb = openIndexDatabase(getDbPath());
|
|
255
|
+
try {
|
|
256
|
+
renameEntriesBundleId(writeIndexDb, oldId, newId);
|
|
257
|
+
renameLlmCacheAssetRefs(writeIndexDb, oldId, newId);
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
closeDatabase(writeIndexDb);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// State: proposals.ref, a pending proposal's proposedTarget.source, and
|
|
264
|
+
// workflow task_history.target_ref.
|
|
265
|
+
if (fs.existsSync(getStateDbPath())) {
|
|
266
|
+
withStateDb((db) => {
|
|
267
|
+
renameProposalsBundleRef(db, oldId, newId);
|
|
268
|
+
renameTaskHistoryTargetRefs(db, oldId, newId);
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// Scheduler: remove native rows still naming `<old>//` (see
|
|
272
|
+
// removeStaleNativeSchedulerRows for why a plain sync alone can't do
|
|
273
|
+
// this), then re-sync so a scheduled run's invocation stops naming the
|
|
274
|
+
// old bundle the moment the rename applies, instead of waiting on the
|
|
275
|
+
// operator to run `akm task sync` by hand. Reported, never thrown:
|
|
276
|
+
// config/index/state above are already renamed by this point, so a sync
|
|
277
|
+
// problem must not make the rename itself look like it failed. `ok` is
|
|
278
|
+
// false both when the sync call throws and when it comes back with
|
|
279
|
+
// `result.failures` — a binding that failed to prepare has already lost
|
|
280
|
+
// its old native row above and is not scheduled until a retry.
|
|
281
|
+
let taskSync;
|
|
282
|
+
try {
|
|
283
|
+
await removeStaleNativeSchedulerRows(sched, oldId);
|
|
284
|
+
const result = await deps.syncTasks(newId, sched);
|
|
285
|
+
taskSync = { ok: result.failures.length === 0, result };
|
|
286
|
+
}
|
|
287
|
+
catch (cause) {
|
|
288
|
+
taskSync = { ok: false, error: taskSyncErrorMessage(cause) };
|
|
289
|
+
}
|
|
290
|
+
return { ...plan, applied: true, taskSync };
|
|
291
|
+
}
|
|
@@ -124,8 +124,7 @@ function isTimestampedConfigBackup(name) {
|
|
|
124
124
|
* Keep the `keep` most-recently-modified entries of `dir` that `select`
|
|
125
125
|
* admits and remove the rest. Best-effort: an unreadable dir is a no-op, an
|
|
126
126
|
* unreadable entry sorts oldest (pruned first), and a failed removal is
|
|
127
|
-
* retried by the next call.
|
|
128
|
-
* migration snapshots (#897).
|
|
127
|
+
* retried by the next call.
|
|
129
128
|
*/
|
|
130
129
|
export function pruneToNewest(dir, keep, select) {
|
|
131
130
|
let entries;
|
|
@@ -39,8 +39,6 @@
|
|
|
39
39
|
* enforced at save time via `superRefine` on the top-level schema.
|
|
40
40
|
*/
|
|
41
41
|
import { z } from "zod";
|
|
42
|
-
import { bundleRefToString, parseBundleRef } from "../asset/asset-ref.js";
|
|
43
|
-
import { warnOnce } from "../warn.js";
|
|
44
42
|
import { BUILTIN_IMPROVE_STRATEGY_NAMES, IMPROVE_PROCESS_ENGINE_CAPABILITIES } from "./engine-semantics.js";
|
|
45
43
|
import { EmbeddingConnectionConfigSchema } from "./schema/embedding.js";
|
|
46
44
|
import { EnginesSchema } from "./schema/engines.js";
|
|
@@ -66,7 +64,7 @@ export { ConsolidateProcessConfigSchema, DistillProcessConfigSchema, ExtractProc
|
|
|
66
64
|
export { IndexConfigSchema, IndexPassConfigSchema } from "./schema/index-config.js";
|
|
67
65
|
export { OutputConfigSchema } from "./schema/output.js";
|
|
68
66
|
export { CURRENT_CONFIG_VERSION, LlmInvocationOverridesSchema } from "./schema/primitives.js";
|
|
69
|
-
export {
|
|
67
|
+
export { SchedulerConfigSchema } from "./schema/scheduler.js";
|
|
70
68
|
export { SearchConfigSchema } from "./schema/search.js";
|
|
71
69
|
export { SetupConfigSchema } from "./schema/setup.js";
|
|
72
70
|
export { BundleConfigEntrySchema, BundlesConfigSchema, RegistryConfigEntrySchema, SourceConfigEntrySchema, } from "./schema/sources-bundles.js";
|
|
@@ -143,11 +141,6 @@ const RETIRED_SOURCE_SHAPE_KEY_MESSAGES = {
|
|
|
143
141
|
};
|
|
144
142
|
export const AkmConfigSchema = AkmConfigBaseSchema.superRefine((config, ctx) => {
|
|
145
143
|
const raw = config;
|
|
146
|
-
for (const key of ["profiles", "llm", "agent", "features", "stashes", "modelAliases", "bindings", "writable"]) {
|
|
147
|
-
if (key in raw) {
|
|
148
|
-
warnOnce(`config:retired-key:${key}`, `Config key "${key}" is retired in 0.9 and is ignored; configure engines/improve.strategies/bundles.<id> instead.`);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
144
|
// Only the current source shape enters the runtime. There is no config
|
|
152
145
|
// compatibility path; `bundles` + `defaultBundle` fully supersede these keys.
|
|
153
146
|
for (const key of ["stashDir", "sources", "installed"]) {
|
|
@@ -200,31 +193,6 @@ export const AkmConfigSchema = AkmConfigBaseSchema.superRefine((config, ctx) =>
|
|
|
200
193
|
});
|
|
201
194
|
}
|
|
202
195
|
}
|
|
203
|
-
const activationKeys = new Set();
|
|
204
|
-
for (const [index, activation] of (config.scheduler?.enabled ?? []).entries()) {
|
|
205
|
-
try {
|
|
206
|
-
const parsed = parseBundleRef(activation.ref);
|
|
207
|
-
if (!parsed.bundle || parsed.fragment !== undefined || bundleRefToString(parsed) !== activation.ref) {
|
|
208
|
-
throw new Error("not canonical");
|
|
209
|
-
}
|
|
210
|
-
const key = `${activation.kind}\0${activation.ref}`;
|
|
211
|
-
if (activationKeys.has(key)) {
|
|
212
|
-
ctx.addIssue({
|
|
213
|
-
code: z.ZodIssueCode.custom,
|
|
214
|
-
path: ["scheduler", "enabled", index],
|
|
215
|
-
message: "duplicates an earlier scheduler activation",
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
activationKeys.add(key);
|
|
219
|
-
}
|
|
220
|
-
catch {
|
|
221
|
-
ctx.addIssue({
|
|
222
|
-
code: z.ZodIssueCode.custom,
|
|
223
|
-
path: ["scheduler", "enabled", index, "ref"],
|
|
224
|
-
message: "must be one canonical fully-qualified ref without a fragment",
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
196
|
for (const key of ["llm", "agent", "improve"]) {
|
|
229
197
|
if (config.defaults && key in config.defaults) {
|
|
230
198
|
ctx.addIssue({
|
|
@@ -78,7 +78,7 @@ function unwrap(schema) {
|
|
|
78
78
|
* AkmConfig schema. Returns `undefined` if any path segment doesn't match a
|
|
79
79
|
* known schema field.
|
|
80
80
|
*/
|
|
81
|
-
function resolveSchemaAt(path, config, raw) {
|
|
81
|
+
export function resolveSchemaAt(path, config, raw) {
|
|
82
82
|
let schema = AkmConfigBaseSchema;
|
|
83
83
|
let existing = config;
|
|
84
84
|
for (const [index, segment] of path.entries()) {
|