akm-cli 0.9.0-rc.0 → 0.9.0-rc.13
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 +1283 -22
- package/README.md +62 -37
- package/SECURITY.md +46 -31
- package/dist/akm +162 -38
- package/dist/akm-migrate +44 -0
- package/dist/assets/backends/schtasks-template.xml +2 -1
- package/dist/assets/hints/cli-hints-full.md +268 -118
- package/dist/assets/hints/cli-hints-short.md +87 -24
- package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
- package/dist/assets/improve-strategies/frequent.json +15 -0
- package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
- package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
- package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
- package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
- package/dist/assets/improve-strategies/reflect-distill.json +30 -0
- package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
- package/dist/assets/prompts/consolidate-system.md +5 -5
- package/dist/assets/prompts/extract-session.md +2 -6
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
- package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
- package/dist/assets/prompts/reflect-output-repair.md +3 -0
- package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
- package/dist/assets/stash-skeleton/README.md +38 -10
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
- package/dist/assets/tasks/core/extract.yml +3 -2
- package/dist/assets/tasks/core/improve.yml +2 -1
- package/dist/assets/tasks/core/index-refresh.yml +1 -0
- package/dist/assets/tasks/core/sync.yml +1 -0
- package/dist/assets/tasks/core/version-check.yml +2 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
- package/dist/assets/templates/html/health.html +5 -4
- package/dist/assets/workflows/workflow-template.md +31 -15
- package/dist/cli/invocation.js +279 -0
- package/dist/cli/parse-args.js +5 -90
- package/dist/cli/retired-commands.js +78 -0
- package/dist/cli/shared.js +158 -48
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +747 -293
- package/dist/commands/agent/agent-dispatch.js +19 -18
- package/dist/commands/agent/agent-support.js +0 -24
- package/dist/commands/agent/contribute-cli.js +43 -97
- package/dist/commands/completions.js +80 -23
- package/dist/commands/config-cli.js +44 -281
- package/dist/commands/env/env-binding.js +99 -0
- package/dist/commands/env/env-cli.js +84 -224
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +45 -61
- package/dist/commands/env/secret.js +32 -62
- package/dist/commands/feedback-cli.js +179 -85
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +7 -8
- package/dist/commands/health/checks.js +279 -94
- package/dist/commands/health/html-report.js +197 -578
- package/dist/commands/health/improve-metrics.js +277 -246
- package/dist/commands/health/llm-usage.js +19 -19
- package/dist/commands/health/md-report.js +16 -7
- package/dist/commands/health/metrics.js +67 -32
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +508 -0
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +16 -56
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
- package/dist/commands/health/types-improve.js +29 -0
- package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
- package/dist/commands/health/types-result.js +7 -0
- package/dist/commands/health/types-runs.js +4 -0
- package/dist/commands/health/types-session-log.js +4 -0
- package/dist/commands/health/types-windows.js +4 -0
- package/dist/commands/health/types.js +26 -21
- package/dist/commands/health/windows.js +2 -3
- package/dist/commands/health.js +296 -167
- package/dist/commands/improve/anti-collapse.js +5 -5
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +65 -52
- package/dist/commands/improve/consolidate/chunking.js +9 -7
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +454 -1354
- package/dist/commands/improve/content-hash.js +39 -0
- package/dist/commands/improve/distill/content-repair.js +4 -10
- package/dist/commands/improve/distill/promote-memory.js +89 -64
- package/dist/commands/improve/distill/quality-gate.js +118 -42
- package/dist/commands/improve/distill-guards.js +1 -1
- package/dist/commands/improve/distill-promotion-policy.js +33 -888
- package/dist/commands/improve/distill.js +607 -363
- package/dist/commands/improve/eligibility.js +165 -79
- package/dist/commands/improve/extract-cli.js +35 -126
- package/dist/commands/improve/extract-prompt.js +6 -35
- package/dist/commands/improve/extract.js +640 -391
- package/dist/commands/improve/feedback-valence.js +2 -12
- package/dist/commands/improve/improve-cli.js +134 -135
- package/dist/commands/improve/improve-result-file.js +30 -50
- package/dist/commands/improve/improve-run-types.js +4 -0
- package/dist/commands/improve/improve-strategies.js +135 -0
- package/dist/commands/improve/improve.js +904 -701
- package/dist/commands/improve/locks.js +64 -111
- package/dist/commands/improve/loop-stages.js +1110 -923
- package/dist/commands/improve/memory/derived-ref.js +124 -0
- package/dist/commands/improve/memory/memory-belief.js +79 -7
- package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
- package/dist/commands/improve/memory/memory-improve.js +25 -37
- package/dist/commands/improve/outcome-loop.js +25 -88
- package/dist/commands/improve/preparation.js +1034 -813
- package/dist/commands/improve/proactive-maintenance.js +34 -9
- package/dist/commands/improve/proposal-envelope.js +31 -0
- package/dist/commands/improve/reflect.js +983 -794
- package/dist/commands/improve/run-context.js +119 -0
- package/dist/commands/improve/salience.js +24 -127
- package/dist/commands/improve/session-asset.js +7 -3
- package/dist/commands/improve/shared.js +14 -34
- package/dist/commands/improve/source-identity.js +28 -0
- package/dist/commands/improve/triage.js +20 -17
- package/dist/commands/lint/base-linter.js +340 -313
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +185 -30
- package/dist/commands/{events.js → log.js} +28 -38
- package/dist/commands/migrate-cli.js +54 -0
- package/dist/commands/migration-tool.js +55 -0
- package/dist/commands/observability-cli.js +70 -208
- package/dist/commands/proposal/diff-format.js +50 -0
- package/dist/commands/proposal/drain-policies.js +0 -6
- package/dist/commands/proposal/drain.js +91 -40
- package/dist/commands/proposal/proposal-cli.js +134 -132
- package/dist/commands/proposal/proposal-types.js +56 -0
- package/dist/commands/proposal/proposal.js +83 -65
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +105 -88
- package/dist/commands/proposal/repository.js +1303 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
- package/dist/commands/proposal/validators/proposal-validators.js +61 -12
- package/dist/commands/proposal/validators/proposals.js +6 -8
- package/dist/commands/read/curate.js +78 -73
- package/dist/commands/read/knowledge.js +510 -13
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +84 -15
- package/dist/commands/read/search-cli.js +203 -96
- package/dist/commands/read/search.js +126 -94
- package/dist/commands/read/show.js +226 -250
- package/dist/commands/registry-cli.js +34 -60
- package/dist/commands/remember.js +18 -57
- package/dist/commands/sources/add-cli.js +104 -49
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +63 -0
- package/dist/commands/sources/info.js +27 -15
- package/dist/commands/sources/init.js +30 -40
- package/dist/commands/sources/installed-stashes.js +469 -172
- package/dist/commands/sources/migration-help.js +7 -4
- package/dist/commands/sources/schema-repair.js +10 -9
- package/dist/commands/sources/self-update.js +182 -121
- package/dist/commands/sources/source-add.js +169 -178
- package/dist/commands/sources/source-clone.js +144 -41
- package/dist/commands/sources/source-manage.js +94 -59
- package/dist/commands/sources/sources-cli.js +64 -205
- package/dist/commands/sources/stash-cli.js +91 -54
- package/dist/commands/sources/stash-skeleton.js +1 -1
- package/dist/commands/tasks/tasks-cli.js +106 -104
- package/dist/commands/tasks/tasks.js +445 -262
- package/dist/commands/workflow-cli.js +232 -121
- package/dist/core/action-contributors.js +1 -1
- package/dist/core/activation-policy.js +49 -0
- package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
- package/dist/core/adapter/adapters/akm-adapter.js +528 -0
- package/dist/core/adapter/adapters/akm-lint.js +392 -0
- package/dist/core/adapter/adapters/akm-metadata.js +387 -0
- package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
- package/dist/core/adapter/adapters/claude-adapter.js +61 -0
- package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
- package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
- package/dist/core/adapter/adapters/index.js +80 -0
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
- package/dist/core/adapter/adapters/okf-adapter.js +391 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
- package/dist/core/adapter/adapters/shared.js +286 -0
- package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
- package/dist/core/adapter/bundle-adapter.js +4 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +44 -0
- package/dist/core/adapter/registry.js +56 -0
- package/dist/core/adapter/types.js +4 -0
- package/dist/core/asset/akm-markdown.js +30 -0
- package/dist/core/asset/asset-placement.js +243 -0
- package/dist/core/asset/asset-ref.js +110 -79
- package/dist/core/asset/asset-serialize.js +20 -0
- package/dist/core/asset/frontmatter.js +28 -12
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +274 -0
- package/dist/core/asset/stash-meta.js +2 -2
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +281 -86
- package/dist/core/config/config-io.js +42 -128
- package/dist/core/config/config-schema.js +233 -834
- package/dist/core/config/config-sources.js +162 -39
- package/dist/core/config/config-types.js +16 -11
- package/dist/core/config/config-version.js +29 -0
- package/dist/core/config/config-walker.js +126 -37
- package/dist/core/config/config.js +154 -331
- package/dist/core/config/deep-merge.js +41 -0
- package/dist/core/config/engine-semantics.js +28 -0
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +38 -0
- package/dist/core/config/schema/engines.js +116 -0
- package/dist/core/config/schema/experimental.js +47 -0
- package/dist/core/config/schema/feedback.js +31 -0
- package/dist/core/config/schema/improve-processes.js +389 -0
- package/dist/core/config/schema/improve.js +94 -0
- package/dist/core/config/schema/index-config.js +176 -0
- package/dist/core/config/schema/output.js +18 -0
- package/dist/core/config/schema/primitives.js +94 -0
- package/dist/core/config/schema/search.js +30 -0
- package/dist/core/config/schema/setup.js +18 -0
- package/dist/core/config/schema/sources-bundles.js +169 -0
- package/dist/core/config/schema/workflow.js +29 -0
- package/dist/core/env-secret-ref.js +155 -20
- package/dist/core/errors.js +17 -15
- package/dist/core/events-types.js +4 -0
- package/dist/core/events.js +46 -128
- package/dist/core/extra-params.js +62 -0
- package/dist/core/file-change.js +17 -0
- package/dist/core/file-lock.js +202 -57
- package/dist/core/fs-txn.js +392 -0
- package/dist/core/git-message.js +59 -0
- package/dist/core/improve-result.js +167 -0
- package/dist/core/json-schema.js +142 -0
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +1 -1
- package/dist/core/maintenance-barrier.js +135 -0
- package/dist/core/migration-operation.js +44 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/paths.js +22 -25
- package/dist/core/platform.js +10 -0
- package/dist/core/recognition-util.js +128 -0
- package/dist/core/redaction.js +392 -0
- package/dist/core/standards/resolve-standards-context.js +36 -65
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +5 -5
- package/dist/core/state/migrations.js +242 -11
- package/dist/core/state-db.js +98 -10
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +303 -0
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/time.js +20 -0
- package/dist/core/type-presentation.js +130 -0
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +834 -118
- package/dist/indexer/bundle-identity-guard.js +92 -0
- package/dist/indexer/db/graph-db.js +1 -25
- package/dist/indexer/db/llm-cache.js +1 -1
- package/dist/indexer/ensure-index.js +30 -9
- package/dist/indexer/graph/graph-boost.js +9 -30
- package/dist/indexer/graph/graph-extraction.js +41 -27
- package/dist/indexer/graph/graph-types.js +4 -0
- package/dist/indexer/index-writer-lock.js +93 -49
- package/dist/indexer/index-written-assets.js +100 -53
- package/dist/indexer/indexer.js +746 -329
- package/dist/indexer/init.js +18 -25
- package/dist/indexer/installations.js +142 -0
- package/dist/indexer/passes/dir-staleness.js +18 -10
- package/dist/indexer/passes/memory-inference.js +25 -15
- package/dist/indexer/passes/metadata.js +412 -243
- package/dist/indexer/scan/doc-to-entry.js +160 -0
- package/dist/indexer/scan/drain-dir.js +134 -0
- package/dist/indexer/search/db-search.js +292 -108
- package/dist/indexer/search/fts-query.js +64 -0
- package/dist/indexer/search/ranking-contributors.js +145 -25
- package/dist/indexer/search/ranking-types.js +4 -0
- package/dist/indexer/search/ranking.js +28 -71
- package/dist/indexer/search/search-attribution.js +67 -0
- package/dist/indexer/search/search-fields.js +18 -3
- package/dist/indexer/search/search-hit-enrichers.js +30 -40
- package/dist/indexer/search/search-source.js +157 -111
- package/dist/indexer/search/semantic-status.js +4 -1
- package/dist/indexer/usage/usage-events.js +10 -30
- package/dist/indexer/walk/file-context.js +3 -45
- package/dist/indexer/walk/matchers.js +42 -34
- package/dist/indexer/walk/path-resolver.js +11 -5
- package/dist/indexer/walk/walker.js +42 -14
- package/dist/integrations/agent/builder-shared.js +7 -0
- package/dist/integrations/agent/builders.js +5 -56
- package/dist/integrations/agent/config.js +3 -143
- package/dist/integrations/agent/detect.js +17 -2
- package/dist/integrations/agent/engine-resolution.js +231 -0
- package/dist/integrations/agent/index.js +1 -2
- package/dist/integrations/agent/model-aliases.js +16 -2
- package/dist/integrations/agent/profiles.js +36 -62
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +93 -4
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +88 -196
- package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
- package/dist/integrations/harnesses/aider/index.js +48 -0
- package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
- package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
- package/dist/integrations/harnesses/amazonq/index.js +45 -0
- package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
- package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +24 -35
- package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
- package/dist/integrations/harnesses/codex/index.js +52 -0
- package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
- package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
- package/dist/integrations/harnesses/copilot/index.js +48 -0
- package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
- package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
- package/dist/integrations/harnesses/gemini/index.js +48 -0
- package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +54 -34
- package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
- package/dist/integrations/harnesses/opencode/config-import.js +1 -3
- package/dist/integrations/harnesses/opencode/index.js +14 -32
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
- package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
- package/dist/integrations/harnesses/openhands/index.js +48 -0
- package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
- package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
- package/dist/integrations/harnesses/pi/index.js +45 -0
- package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +43 -32
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +36 -39
- package/dist/integrations/session-logs/provider-base.js +113 -0
- package/dist/llm/client.js +182 -110
- package/dist/llm/embedders/deterministic.js +2 -2
- package/dist/llm/embedders/remote.js +21 -9
- package/dist/llm/feature-gate.js +17 -57
- package/dist/llm/graph-extract.js +12 -13
- package/dist/llm/index-passes.js +8 -42
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +45 -30
- package/dist/llm/structured-call.js +16 -8
- package/dist/llm/usage-persist.js +30 -5
- package/dist/llm/usage-telemetry.js +59 -6
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/command-registry.js +27 -0
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +251 -0
- package/dist/output/html-render.js +11 -16
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -279
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +58 -84
- package/dist/output/shapes/passthrough.js +11 -39
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes/registry.js +12 -6
- package/dist/output/shapes.js +0 -9
- package/dist/output/text/{init.js → bundle-create.js} +3 -1
- package/dist/output/text/bundle-show.js +7 -0
- package/dist/output/text/command-format.js +562 -0
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/helpers.js +15 -1164
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +202 -0
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/registry.js +12 -6
- package/dist/output/text/show-directives.js +117 -0
- package/dist/output/text/show-format.js +103 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +332 -0
- package/dist/output/text/workflow.js +3 -2
- package/dist/output/text.js +10 -19
- package/dist/registry/factory.js +4 -6
- package/dist/registry/origin-resolve.js +16 -27
- package/dist/registry/providers/skills-sh.js +3 -3
- package/dist/registry/providers/static-index.js +15 -25
- package/dist/registry/resolve.js +43 -94
- package/dist/registry/semver.js +43 -0
- package/dist/runtime.js +81 -12
- package/dist/scripts/akm-migrate.js +35529 -0
- package/dist/setup/detect.js +5 -7
- package/dist/setup/detected-engines.js +136 -0
- package/dist/setup/engine-config.js +100 -0
- package/dist/setup/registry-stash-loader.js +3 -3
- package/dist/setup/semantic-assets.js +12 -9
- package/dist/setup/setup.js +444 -208
- package/dist/setup/steps/connection-shared.js +120 -0
- package/dist/setup/steps/connection.js +108 -305
- package/dist/setup/steps/platforms.js +13 -12
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +21 -15
- package/dist/setup/steps/stashdir.js +6 -4
- package/dist/setup/steps/tasks.js +236 -119
- package/dist/setup/steps.js +3 -2
- package/dist/sources/freshness.js +39 -0
- package/dist/sources/provider-factory.js +11 -17
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +278 -34
- package/dist/sources/providers/git-provider.js +54 -56
- package/dist/sources/providers/git-stash.js +420 -91
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +47 -22
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +2 -2
- package/dist/sources/resolve.js +11 -10
- package/dist/sources/snapshot-fetchers/types.js +4 -0
- package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
- package/dist/storage/database.js +60 -4
- package/dist/storage/engines/sqlite-migrations.js +156 -5
- package/dist/storage/locations.js +1 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +51 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -32
- package/dist/storage/repositories/index-connection.js +79 -0
- package/dist/storage/repositories/index-db.js +4 -3
- package/dist/storage/repositories/index-entries-repository.js +863 -0
- package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
- package/dist/storage/repositories/index-entry-types.js +4 -0
- package/dist/storage/repositories/index-fts-repository.js +167 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
- package/dist/storage/repositories/index-meta-repository.js +49 -0
- package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
- package/dist/storage/repositories/index-sql.js +12 -0
- package/dist/storage/repositories/index-utility-repository.js +356 -0
- package/dist/storage/repositories/index-vec-repository.js +250 -0
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +317 -75
- package/dist/storage/repositories/registry-cache.js +1 -1
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +110 -3
- package/dist/storage/repositories/workflow-runs-repository.js +240 -19
- package/dist/tasks/backends/cron.js +169 -46
- package/dist/tasks/backends/exec-utils.js +76 -3
- package/dist/tasks/backends/index.js +6 -9
- package/dist/tasks/backends/launchd.js +292 -55
- package/dist/tasks/backends/schtasks.js +557 -70
- package/dist/tasks/backends/types.js +4 -0
- package/dist/tasks/command-executable.js +93 -0
- package/dist/tasks/embedded.js +56 -38
- package/dist/tasks/parser.js +156 -64
- package/dist/tasks/resolve-akm-bin.js +144 -51
- package/dist/tasks/runner.js +377 -209
- package/dist/tasks/schedule.js +108 -19
- package/dist/tasks/scheduler-invocation.js +296 -0
- package/dist/tasks/schema.js +1 -1
- package/dist/tasks/task-id.js +35 -0
- package/dist/tasks/validator.js +30 -16
- package/dist/text-import-hook.mjs +1 -1
- package/dist/workflows/authoring/authoring.js +104 -43
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -16
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +450 -0
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +1038 -0
- package/dist/workflows/exec/param-secrets.js +115 -0
- package/dist/workflows/exec/report.js +1460 -0
- package/dist/workflows/exec/run-workflow.js +602 -0
- package/dist/workflows/exec/scheduler.js +71 -0
- package/dist/workflows/exec/step-work.js +1190 -0
- package/dist/workflows/exec/unit-writer.js +23 -0
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/exec/worktree.js +171 -0
- package/dist/workflows/ir/compile.js +246 -0
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/params.js +54 -0
- package/dist/workflows/ir/plan-hash.js +68 -0
- package/dist/workflows/ir/schema.js +540 -0
- package/dist/workflows/parser.js +878 -304
- package/dist/workflows/program/expressions.js +181 -0
- package/dist/workflows/program/schema.js +51 -0
- package/dist/workflows/renderer.js +100 -45
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/agent-identity.js +59 -14
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +376 -119
- package/dist/workflows/runtime/unit-checkin.js +45 -0
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +2 -3
- package/dist/workflows/validator.js +52 -30
- package/docs/README.md +42 -78
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +9 -8
- package/docs/migration/release-notes/0.9.0.md +158 -14
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +844 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/data-and-telemetry.md +333 -0
- package/package.json +21 -17
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +4636 -0
- package/schemas/akm-task.json +87 -0
- package/schemas/akm-workflow.json +373 -0
- package/dist/akm-migrate-storage +0 -38
- package/dist/assets/help/help-accept.md +0 -12
- package/dist/assets/help/help-improve.md +0 -84
- package/dist/assets/help/help-proposals.md +0 -17
- package/dist/assets/help/help-propose.md +0 -17
- package/dist/assets/help/help-reject.md +0 -11
- package/dist/assets/profiles/frequent.json +0 -13
- package/dist/assets/profiles/recombine-only.json +0 -21
- package/dist/assets/profiles/reflect-distill.json +0 -30
- package/dist/assets/profiles/synthesize.json +0 -15
- package/dist/assets/prompts/procedural-system.md +0 -44
- package/dist/assets/prompts/recombine-system.md +0 -40
- package/dist/assets/prompts/staleness-detect-system.md +0 -6
- package/dist/assets/tasks/core/backup.yml +0 -4
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/assets/templates/html/default.html +0 -78
- package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
- package/dist/assets/wiki/index-template.md +0 -12
- package/dist/assets/wiki/ingest-workflow-template.md +0 -83
- package/dist/assets/wiki/log-template.md +0 -8
- package/dist/assets/wiki/schema-template.md +0 -61
- package/dist/cli/config-migrate.js +0 -150
- package/dist/cli/config-validate.js +0 -39
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -487
- package/dist/commands/improve/calibration.js +0 -161
- package/dist/commands/improve/dedup.js +0 -482
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/improve/hot-probation.js +0 -45
- package/dist/commands/improve/improve-auto-accept.js +0 -276
- package/dist/commands/improve/improve-profiles.js +0 -168
- package/dist/commands/improve/procedural.js +0 -398
- package/dist/commands/improve/recombine.js +0 -818
- package/dist/commands/improve/schema-similarity-gate.js +0 -168
- package/dist/commands/lint/agent-linter.js +0 -44
- package/dist/commands/lint/command-linter.js +0 -44
- package/dist/commands/lint/default-linter.js +0 -16
- package/dist/commands/lint/fact-linter.js +0 -39
- package/dist/commands/lint/knowledge-linter.js +0 -16
- package/dist/commands/lint/memory-linter.js +0 -61
- package/dist/commands/lint/registry.js +0 -41
- package/dist/commands/lint/skill-linter.js +0 -45
- package/dist/commands/lint/task-linter.js +0 -50
- package/dist/commands/lint/workflow-linter.js +0 -81
- package/dist/commands/proposal/legacy-import.js +0 -115
- package/dist/commands/sources/history.js +0 -196
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/commands/wiki-cli.js +0 -292
- package/dist/core/asset/asset-registry.js +0 -76
- package/dist/core/asset/asset-spec.js +0 -259
- package/dist/core/config/config-migration.js +0 -602
- package/dist/core/deep-merge.js +0 -38
- package/dist/core/eval/rank-metrics.js +0 -113
- package/dist/core/ripgrep/install.js +0 -163
- package/dist/core/ripgrep/resolve.js +0 -81
- package/dist/indexer/db/db.js +0 -1413
- package/dist/indexer/manifest.js +0 -170
- package/dist/indexer/passes/metadata-contributors.js +0 -31
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
- package/dist/llm/call-ai.js +0 -62
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/output/shapes/distill.js +0 -14
- package/dist/output/shapes/history.js +0 -11
- package/dist/output/text/distill.js +0 -6
- package/dist/output/text/enable-disable.js +0 -8
- package/dist/output/text/history.js +0 -6
- package/dist/output/text/wiki.js +0 -16
- package/dist/registry/build-index.js +0 -386
- package/dist/scripts/migrate-storage.js +0 -19108
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
- package/dist/scripts/migrations/v16-to-v17.js +0 -141
- package/dist/setup/legacy-config.js +0 -106
- package/dist/storage/repositories/consolidation-repository.js +0 -38
- package/dist/storage/repositories/recombine-repository.js +0 -213
- package/dist/wiki/wiki-templates.js +0 -15
- package/dist/wiki/wiki.js +0 -1012
- package/dist/workflows/db.js +0 -215
- package/docs/data-and-telemetry.md +0 -226
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
* Top-level `improve` config section (utility decay, salience, collapse
|
|
6
|
+
* detector, strategies). Extracted verbatim from the former `config-schema.ts`
|
|
7
|
+
* monolith — no behavior change.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { ImproveProfileConfigSchema } from "./improve-processes.js";
|
|
11
|
+
import { engineName, nonNegativeNumber } from "./primitives.js";
|
|
12
|
+
// ── Improve top-level (utility decay, event retention) ─────────────────────
|
|
13
|
+
const ImproveUtilityDecaySchema = z
|
|
14
|
+
.object({
|
|
15
|
+
halfLifeDays: z.number().finite().min(0.1).optional(),
|
|
16
|
+
feedbackStabilityBoost: z.number().finite().min(1).optional(),
|
|
17
|
+
})
|
|
18
|
+
.passthrough();
|
|
19
|
+
const ImproveSalienceSchema = z
|
|
20
|
+
.object({
|
|
21
|
+
/**
|
|
22
|
+
* WS-2 Part-V gate: enable the outcome-weight term in the salience projection.
|
|
23
|
+
* Default TRUE/absent (DEFAULT ON since the G2 saturation cap landed — see
|
|
24
|
+
* salience.ts): uses the WS-2 weights (w_e=0.25, w_o=0.15, w_r=0.60) so the
|
|
25
|
+
* prediction-error outcome signal shapes rankScore (the R1 loop-closure).
|
|
26
|
+
* Set to `false` to opt out and restore the WS-1 parity weights
|
|
27
|
+
* (w_e=0.30, w_r=0.70, w_o=0); the `outcome` sub-score is still computed
|
|
28
|
+
* and stored for observability in that mode.
|
|
29
|
+
*/
|
|
30
|
+
outcomeWeightEnabled: z.boolean().optional(),
|
|
31
|
+
/**
|
|
32
|
+
* Minimum encoding salience score [0, 1] for a zero-feedback asset to be
|
|
33
|
+
* admitted to the high-salience improve lane (#608).
|
|
34
|
+
* Default 0.75. Set to 1.0 to disable the lane entirely.
|
|
35
|
+
*/
|
|
36
|
+
salienceThreshold: z.number().min(0).max(1).optional(),
|
|
37
|
+
/**
|
|
38
|
+
* Per-run additive replay budget (#610). Up to this many top-salience refs are
|
|
39
|
+
* revisited even with no reactive signal and regardless of cooldown. Additive
|
|
40
|
+
* on top of --limit. Default 0 = no replay.
|
|
41
|
+
*/
|
|
42
|
+
replayBudget: z.number().int().min(0).optional(),
|
|
43
|
+
})
|
|
44
|
+
.passthrough();
|
|
45
|
+
// R5 — longitudinal collapse detector (observe-only; deterministic,
|
|
46
|
+
// fail-open, runs only on cycles where consolidate did work).
|
|
47
|
+
// Default ON; opt out via `improve.collapseDetector.enabled: false`.
|
|
48
|
+
// See docs/architecture/specs/improve-collapse-churn-detector-design.md.
|
|
49
|
+
// The design's CHURN alert class was removed (never fired in production —
|
|
50
|
+
// its accepted-change-volume input was always a hardcoded 0), so this schema
|
|
51
|
+
// no longer carries `churnMinAcceptedActions`.
|
|
52
|
+
const ImproveCollapseDetectorSchema = z
|
|
53
|
+
.object({
|
|
54
|
+
enabled: z.boolean().optional(),
|
|
55
|
+
// Canary set size minted on first run (owner-approved 30–50 range; default 40).
|
|
56
|
+
canaryCount: z.number().int().min(3).max(200).optional(),
|
|
57
|
+
// Top-K cutoff for canary recall/nDCG (default 10).
|
|
58
|
+
k: z.number().int().min(1).max(100).optional(),
|
|
59
|
+
// Trend window in qualifying cycles (default 5).
|
|
60
|
+
windowCycles: z.number().int().min(2).max(50).optional(),
|
|
61
|
+
// Absolute mean-recall drop vs window median that fires collapse (default 0.15).
|
|
62
|
+
recallDropThreshold: z.number().min(0).max(1).optional(),
|
|
63
|
+
// distinct-content-ratio decline over the window that fires collapse (default 0.05).
|
|
64
|
+
entropyDropThreshold: z.number().min(0).max(1).optional(),
|
|
65
|
+
// improve_cycle_metrics retention (default 365 days, owner-approved).
|
|
66
|
+
retentionDays: z.number().int().min(1).optional(),
|
|
67
|
+
})
|
|
68
|
+
.passthrough();
|
|
69
|
+
// #733 — orphan-GC pass (Workstream C, lean by design: one config gate).
|
|
70
|
+
// The pass ALWAYS runs and ALWAYS reports counts (via the `asset_state_gc`
|
|
71
|
+
// event); this gate controls ONLY whether it actually deletes rows whose
|
|
72
|
+
// `missing_since` has been past the grace window (`STATE_GC_GRACE_MS`, 7
|
|
73
|
+
// days — a named constant, not configurable) for longer than that window.
|
|
74
|
+
const ImproveStateGcSchema = z
|
|
75
|
+
.object({
|
|
76
|
+
/**
|
|
77
|
+
* Actually DELETE `asset_salience` / `asset_outcome` rows once they have
|
|
78
|
+
* been unresolvable for longer than the grace window. Default false for
|
|
79
|
+
* 0.9.0: live data (the event's `pending` counts) proves the report
|
|
80
|
+
* clean before deletion is turned on.
|
|
81
|
+
*/
|
|
82
|
+
collect: z.boolean().optional(),
|
|
83
|
+
})
|
|
84
|
+
.passthrough();
|
|
85
|
+
export const ImproveConfigSchema = z
|
|
86
|
+
.object({
|
|
87
|
+
strategies: z.record(engineName, ImproveProfileConfigSchema).optional(),
|
|
88
|
+
utilityDecay: ImproveUtilityDecaySchema.optional(),
|
|
89
|
+
eventRetentionDays: nonNegativeNumber.optional(),
|
|
90
|
+
salience: ImproveSalienceSchema.optional(),
|
|
91
|
+
collapseDetector: ImproveCollapseDetectorSchema.optional(),
|
|
92
|
+
stateGc: ImproveStateGcSchema.optional(),
|
|
93
|
+
})
|
|
94
|
+
.passthrough();
|
|
@@ -0,0 +1,176 @@
|
|
|
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
|
+
* `index` config: reserved feature sections + arbitrary per-pass entries.
|
|
6
|
+
* Extracted verbatim from the former `config-schema.ts` monolith — no behavior
|
|
7
|
+
* change.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { engineName, LlmInvocationOverridesSchema, nonEmptyString, positiveInt } from "./primitives.js";
|
|
11
|
+
// ── Index / per-pass ────────────────────────────────────────────────────────
|
|
12
|
+
//
|
|
13
|
+
// WI-9.6c: `graphExtractionIncludeTypes` is no longer validated against a
|
|
14
|
+
// hardcoded allowlist (the prior GRAPH_EXTRACTION_INCLUDE_TYPES_ALLOWED,
|
|
15
|
+
// which included a stale `wiki` entry and was already missing `fact` from the
|
|
16
|
+
// runtime consumer's own list — the schema-level allowlist had drifted from
|
|
17
|
+
// reality). Accept-any until Chunk 2 sources a real type list from adapter
|
|
18
|
+
// metadata: the field is now an array of arbitrary non-empty strings.
|
|
19
|
+
// Runtime consumers already handle unknown/unsupported type strings
|
|
20
|
+
// gracefully — src/indexer/graph/graph-extraction.ts's
|
|
21
|
+
// `SUPPORTED_GRAPH_EXTRACTION_INCLUDE_TYPES` set (and `collectEligibleFiles`)
|
|
22
|
+
// silently skips any type it doesn't recognize (no placement entry ⇒ zero
|
|
23
|
+
// eligible files for that type; no crash). This is a permissive-direction
|
|
24
|
+
// behavior change: configs with a previously-rejected type string now parse.
|
|
25
|
+
const INDEX_PASS_RETIRED_KEYS = new Set([
|
|
26
|
+
"endpoint",
|
|
27
|
+
"provider",
|
|
28
|
+
"apiKey",
|
|
29
|
+
"baseUrl",
|
|
30
|
+
"temperature",
|
|
31
|
+
"maxTokens",
|
|
32
|
+
"capabilities",
|
|
33
|
+
]);
|
|
34
|
+
const INDEX_PASS_KNOWN_KEYS = new Set([
|
|
35
|
+
"engine",
|
|
36
|
+
"model",
|
|
37
|
+
"timeoutMs",
|
|
38
|
+
"enabled",
|
|
39
|
+
"llm",
|
|
40
|
+
"graphExtractionBatchSize",
|
|
41
|
+
"graphExtractionIncludeTypes",
|
|
42
|
+
"lazyGraphExtraction",
|
|
43
|
+
]);
|
|
44
|
+
/**
|
|
45
|
+
* Per-pass `index.<pass>` entry. Uses preprocess + manual validation so we can
|
|
46
|
+
* emit targeted error messages ("Retired or misplaced engine setting",
|
|
47
|
+
* "Unknown key `index.<pass>.<key>`")
|
|
48
|
+
* instead of Zod's generic `Unrecognized key` / `Expected boolean, received
|
|
49
|
+
* string` strings — keeps `akm` startup errors actionable.
|
|
50
|
+
*/
|
|
51
|
+
export const IndexPassConfigSchema = z.preprocess((raw, ctx) => {
|
|
52
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
53
|
+
return raw; // let z.object below produce the type error
|
|
54
|
+
}
|
|
55
|
+
const obj = raw;
|
|
56
|
+
for (const key of Object.keys(obj)) {
|
|
57
|
+
if (INDEX_PASS_RETIRED_KEYS.has(key)) {
|
|
58
|
+
ctx.addIssue({
|
|
59
|
+
code: z.ZodIssueCode.custom,
|
|
60
|
+
message: `Retired or misplaced engine setting: \`${[...(ctx.path ?? []), key].join(".")}\` is not allowed. ` +
|
|
61
|
+
"Select a named engine and use typed invocation fields instead.",
|
|
62
|
+
});
|
|
63
|
+
return raw;
|
|
64
|
+
}
|
|
65
|
+
if (!INDEX_PASS_KNOWN_KEYS.has(key)) {
|
|
66
|
+
ctx.addIssue({
|
|
67
|
+
code: z.ZodIssueCode.custom,
|
|
68
|
+
message: `Unknown key \`${[...(ctx.path ?? []), key].join(".")}\`. Per-pass entries support ` +
|
|
69
|
+
"`engine`, `model`, `timeoutMs`, `enabled`, `llm`, `graphExtractionBatchSize`, " +
|
|
70
|
+
"`graphExtractionIncludeTypes`, and `lazyGraphExtraction`.",
|
|
71
|
+
});
|
|
72
|
+
return raw;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return raw;
|
|
76
|
+
}, z
|
|
77
|
+
.object({
|
|
78
|
+
engine: engineName.optional(),
|
|
79
|
+
model: nonEmptyString.optional(),
|
|
80
|
+
timeoutMs: z.union([positiveInt, z.null()]).optional(),
|
|
81
|
+
enabled: z.boolean().optional(),
|
|
82
|
+
llm: LlmInvocationOverridesSchema.optional(),
|
|
83
|
+
graphExtractionBatchSize: positiveInt.optional(),
|
|
84
|
+
// Accept-any until Chunk 2 (WI-9.6c) — no longer enum-restricted.
|
|
85
|
+
graphExtractionIncludeTypes: z.array(z.string().min(1)).nonempty().optional(),
|
|
86
|
+
lazyGraphExtraction: z.boolean().optional(),
|
|
87
|
+
})
|
|
88
|
+
.passthrough());
|
|
89
|
+
const MetadataEnhanceSchema = z.object({ enabled: z.boolean().optional() }).passthrough();
|
|
90
|
+
const IndexDefaultsSchema = z
|
|
91
|
+
.object({
|
|
92
|
+
engine: engineName.optional(),
|
|
93
|
+
model: nonEmptyString.optional(),
|
|
94
|
+
timeoutMs: z.union([positiveInt, z.null()]).optional(),
|
|
95
|
+
llm: LlmInvocationOverridesSchema.optional(),
|
|
96
|
+
})
|
|
97
|
+
.passthrough();
|
|
98
|
+
/**
|
|
99
|
+
* Index config is a union of reserved feature sections and per-pass entries.
|
|
100
|
+
* Passthrough so per-pass entries (keyed by arbitrary pass names like `graph`,
|
|
101
|
+
* `enrichment`) can live next to the reserved keys.
|
|
102
|
+
*
|
|
103
|
+
* Reserved scalar key `indexBodyOpening` (stash-conventions SPEC-8, default
|
|
104
|
+
* false): when true, the metadata pass captures the first prose paragraph of
|
|
105
|
+
* each markdown asset body into `entry.bodyOpening`, which folds into the
|
|
106
|
+
* lowest-weight `content` FTS column and the embedding text. It is a boolean,
|
|
107
|
+
* not a per-pass object — the preprocess below exempts it from the
|
|
108
|
+
* object-shape check so it never routes into the per-pass catchall.
|
|
109
|
+
*
|
|
110
|
+
* The outer preprocess emits the legacy parser's actionable error messages
|
|
111
|
+
* for the two most common type-shape mistakes:
|
|
112
|
+
* - An array at the `index` block.
|
|
113
|
+
* - A non-object at `index.<passName>`.
|
|
114
|
+
* Inner field validation (graphExtractionIncludeTypes shape, invocation
|
|
115
|
+
* overrides, provider-key rejection) is delegated to {@link IndexPassConfigSchema}.
|
|
116
|
+
* `graphExtractionIncludeTypes` accepts arbitrary non-empty strings
|
|
117
|
+
* (WI-9.6c — no hardcoded type allowlist; accept-any until Chunk 2).
|
|
118
|
+
*/
|
|
119
|
+
const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
|
|
120
|
+
if (raw === undefined || raw === null)
|
|
121
|
+
return raw;
|
|
122
|
+
if (Array.isArray(raw)) {
|
|
123
|
+
ctx.addIssue({
|
|
124
|
+
code: z.ZodIssueCode.custom,
|
|
125
|
+
message: 'Invalid `index` config: expected an object keyed by pass name (e.g. `{ "enrichment": { "enabled": false } }`).',
|
|
126
|
+
});
|
|
127
|
+
return raw;
|
|
128
|
+
}
|
|
129
|
+
if (typeof raw !== "object")
|
|
130
|
+
return raw;
|
|
131
|
+
for (const [passName, value] of Object.entries(raw)) {
|
|
132
|
+
if (passName === "stalenessDetection") {
|
|
133
|
+
ctx.addIssue({
|
|
134
|
+
code: z.ZodIssueCode.custom,
|
|
135
|
+
message: "Invalid `index.stalenessDetection`: the removed pass is not supported.",
|
|
136
|
+
});
|
|
137
|
+
return raw;
|
|
138
|
+
}
|
|
139
|
+
if (passName === "indexBodyOpening") {
|
|
140
|
+
if (typeof value !== "boolean") {
|
|
141
|
+
ctx.addIssue({
|
|
142
|
+
code: z.ZodIssueCode.custom,
|
|
143
|
+
message: "Invalid `index.indexBodyOpening`: expected a boolean (true to index the first body paragraph " +
|
|
144
|
+
`of markdown assets into search). Got ${Array.isArray(value) ? "array" : typeof value}.`,
|
|
145
|
+
});
|
|
146
|
+
return raw;
|
|
147
|
+
}
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
151
|
+
ctx.addIssue({
|
|
152
|
+
code: z.ZodIssueCode.custom,
|
|
153
|
+
message: `Invalid \`index.${passName}\` config: expected an object like \`{ "enabled": false }\`.`,
|
|
154
|
+
});
|
|
155
|
+
return raw;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return raw;
|
|
159
|
+
}, z
|
|
160
|
+
.object({
|
|
161
|
+
defaults: IndexDefaultsSchema.optional(),
|
|
162
|
+
metadataEnhance: MetadataEnhanceSchema.optional(),
|
|
163
|
+
indexBodyOpening: z
|
|
164
|
+
.boolean()
|
|
165
|
+
.optional()
|
|
166
|
+
.describe("Index the first prose paragraph of each markdown asset body (capped at 280 chars) into the " +
|
|
167
|
+
"lowest-weight `content` search column and the embedding text (default false). Secret/env files " +
|
|
168
|
+
"and session-kind memories are never captured. Toggling the flag changes indexed text: run " +
|
|
169
|
+
"`akm index --full` afterwards to re-extract every entry and regenerate embeddings, and re-mint " +
|
|
170
|
+
"collapse-detector canary baselines via `bun scripts/refresh-canary-set.ts --refresh`."),
|
|
171
|
+
})
|
|
172
|
+
.catchall(IndexPassConfigSchema));
|
|
173
|
+
// The runtime catchall correctly validates arbitrary pass objects, but its
|
|
174
|
+
// inferred string index signature also covers reserved scalar keys. Publish a
|
|
175
|
+
// precise output type while retaining the stricter runtime and JSON schemas.
|
|
176
|
+
export const IndexConfigSchema = IndexConfigRuntimeSchema;
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
* `output` config section. Extracted verbatim from the former `config-schema.ts`
|
|
6
|
+
* monolith — no behavior change.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
// ── Output ──────────────────────────────────────────────────────────────────
|
|
10
|
+
export const OutputConfigSchema = z
|
|
11
|
+
.object({
|
|
12
|
+
// D7 — every `--format` value is a valid default, not just the three that
|
|
13
|
+
// predated universal md/html rendering. Kept in step with OUTPUT_FORMATS
|
|
14
|
+
// (`src/output/context.ts`).
|
|
15
|
+
format: z.enum(["json", "yaml", "text", "jsonl", "md", "html"]).optional(),
|
|
16
|
+
detail: z.enum(["brief", "normal", "full"]).optional(),
|
|
17
|
+
})
|
|
18
|
+
.passthrough();
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
* Shared atomic Zod schemas and small helpers used across the config-schema
|
|
6
|
+
* modules. Extracted verbatim from the former `config-schema.ts` monolith — no
|
|
7
|
+
* behavior change (see `./index` re-export barrel at `../config-schema.ts`).
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { validateExtraParams } from "../../extra-params.js";
|
|
11
|
+
import { ENGINE_NAME_PATTERN_SOURCE } from "../engine-semantics.js";
|
|
12
|
+
/** Persisted config schema version. Package prerelease/patch versions do not change this value. */
|
|
13
|
+
export const CURRENT_CONFIG_VERSION = "0.9.0";
|
|
14
|
+
// ── Reusable atomic schemas ─────────────────────────────────────────────────
|
|
15
|
+
/** Positive integer (used for tokens, timeouts, batch sizes). */
|
|
16
|
+
export const positiveInt = z.number().int().positive();
|
|
17
|
+
/** Non-negative finite number (used for scores, weights, days). */
|
|
18
|
+
export const nonNegativeNumber = z.number().finite().min(0);
|
|
19
|
+
/** Non-empty string (rejects "" and whitespace-only). */
|
|
20
|
+
export const nonEmptyString = z
|
|
21
|
+
.string()
|
|
22
|
+
.min(1)
|
|
23
|
+
.refine((v) => v.trim().length > 0, { message: "expected a non-empty string" });
|
|
24
|
+
/** HTTP(S) URL string. */
|
|
25
|
+
export const httpUrl = z.string().refine((v) => v.startsWith("http://") || v.startsWith("https://"), {
|
|
26
|
+
message: "endpoint must start with http:// or https://",
|
|
27
|
+
});
|
|
28
|
+
const ENGINE_NAME_PATTERN = new RegExp(ENGINE_NAME_PATTERN_SOURCE);
|
|
29
|
+
export const ENV_REFERENCE_PATTERN = /^\$[A-Za-z_][A-Za-z0-9_]*$|^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/;
|
|
30
|
+
export const engineName = z
|
|
31
|
+
.string()
|
|
32
|
+
.max(63)
|
|
33
|
+
.regex(ENGINE_NAME_PATTERN, "names must be lowercase kebab-case and must not begin with reserved akm-");
|
|
34
|
+
export const chatCompletionsEndpoint = z.string().superRefine((value, ctx) => {
|
|
35
|
+
try {
|
|
36
|
+
const url = new URL(value);
|
|
37
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
38
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "endpoint must use http:// or https://" });
|
|
39
|
+
}
|
|
40
|
+
if (url.username || url.password || url.search || url.hash || !url.pathname.endsWith("/chat/completions")) {
|
|
41
|
+
ctx.addIssue({
|
|
42
|
+
code: z.ZodIssueCode.custom,
|
|
43
|
+
message: "endpoint must be a credential-free OpenAI chat-completions URL without query or fragment",
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "endpoint must be a complete URL" });
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
export const ExtraParamsSchema = z.record(z.unknown()).superRefine((value, ctx) => {
|
|
52
|
+
for (const issue of validateExtraParams(value)) {
|
|
53
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: issue.path, message: issue.message });
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
function normalizeAliasKeys(raw, ctx) {
|
|
57
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
58
|
+
return raw;
|
|
59
|
+
const normalized = {};
|
|
60
|
+
const originalByKey = new Map();
|
|
61
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
62
|
+
const lower = key.toLowerCase();
|
|
63
|
+
const previous = originalByKey.get(lower);
|
|
64
|
+
if (previous !== undefined) {
|
|
65
|
+
ctx.addIssue({
|
|
66
|
+
code: z.ZodIssueCode.custom,
|
|
67
|
+
path: [key],
|
|
68
|
+
message: `alias collides case-insensitively with ${previous}`,
|
|
69
|
+
});
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
originalByKey.set(lower, key);
|
|
73
|
+
normalized[lower] = value;
|
|
74
|
+
}
|
|
75
|
+
return normalized;
|
|
76
|
+
}
|
|
77
|
+
export const ModelAliasMapSchema = z.preprocess((raw, ctx) => normalizeAliasKeys(raw, ctx), z.record(z.string().min(1), z.string().min(1)));
|
|
78
|
+
export const GlobalModelAliasesSchema = z.preprocess((raw, ctx) => normalizeAliasKeys(raw, ctx), z.record(z.string().min(1), z.record(z.string().min(1), z.string().min(1))));
|
|
79
|
+
// ── Shared connection/invocation building blocks ────────────────────────────
|
|
80
|
+
export const LlmCapabilitiesSchema = z
|
|
81
|
+
.object({
|
|
82
|
+
structuredOutput: z.boolean().optional(),
|
|
83
|
+
})
|
|
84
|
+
.passthrough();
|
|
85
|
+
export const LlmInvocationOverridesSchema = z
|
|
86
|
+
.object({
|
|
87
|
+
temperature: z.number().finite().optional(),
|
|
88
|
+
maxTokens: positiveInt.optional(),
|
|
89
|
+
supportsJsonSchema: z.boolean().optional(),
|
|
90
|
+
extraParams: ExtraParamsSchema.optional(),
|
|
91
|
+
contextLength: positiveInt.optional(),
|
|
92
|
+
enableThinking: z.boolean().optional(),
|
|
93
|
+
})
|
|
94
|
+
.passthrough();
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
* `search` config section (graph-boost tuning). Extracted verbatim from the
|
|
6
|
+
* former `config-schema.ts` monolith — no behavior change.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { nonEmptyString, nonNegativeNumber, positiveInt } from "./primitives.js";
|
|
10
|
+
// ── Search ──────────────────────────────────────────────────────────────────
|
|
11
|
+
const SearchGraphBoostSchema = z
|
|
12
|
+
.object({
|
|
13
|
+
directBoostPerEntity: nonNegativeNumber.optional(),
|
|
14
|
+
directBoostCap: nonNegativeNumber.optional(),
|
|
15
|
+
hopBoostPerEntity: nonNegativeNumber.optional(),
|
|
16
|
+
hopBoostCap: nonNegativeNumber.optional(),
|
|
17
|
+
/** Hard-capped at 3; values > 3 hard-error so users see the typo. */
|
|
18
|
+
maxHops: positiveInt.max(3).optional(),
|
|
19
|
+
confidenceMode: z.enum(["off", "blend", "multiply"]).default("blend").optional(),
|
|
20
|
+
/** Range [0, 1]; values > 1 hard-error (no silent clamp). */
|
|
21
|
+
confidenceWeight: z.number().finite().min(0).max(1).default(0.2).optional(),
|
|
22
|
+
})
|
|
23
|
+
.passthrough();
|
|
24
|
+
export const SearchConfigSchema = z
|
|
25
|
+
.object({
|
|
26
|
+
minScore: nonNegativeNumber.optional(),
|
|
27
|
+
defaultExcludeTypes: z.array(nonEmptyString).optional(),
|
|
28
|
+
graphBoost: SearchGraphBoostSchema.optional(),
|
|
29
|
+
})
|
|
30
|
+
.passthrough();
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
* Setup-derived recommendations (`setup`). Extracted verbatim from the former
|
|
6
|
+
* `config-schema.ts` monolith — no behavior change.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
// ── Setup-derived recommendations ──────────────────────────────────────────
|
|
10
|
+
//
|
|
11
|
+
// R-063 #11: this object previously carried a `taskSchedules` sub-key (cron
|
|
12
|
+
// hints nominally derived by `akm setup --reset-recommended`), but nothing in
|
|
13
|
+
// the tasks subsystem or setup flow ever read or wrote it — confirmed dead at
|
|
14
|
+
// HEAD (deriveRecommendedConfig's return type never included it either; see
|
|
15
|
+
// tests/integration/setup/detect-environment.test.ts's regression guard).
|
|
16
|
+
// Removed. The `setup` namespace itself is kept (passthrough) for future
|
|
17
|
+
// setup-derived config.
|
|
18
|
+
export const SetupConfigSchema = z.object({}).passthrough();
|
|
@@ -0,0 +1,169 @@
|
|
|
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
|
+
* Sources / registries / installed entries + the 0.9.0 `bundles` shape.
|
|
6
|
+
* Extracted verbatim from the former `config-schema.ts` monolith — no behavior
|
|
7
|
+
* change.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { isBundleSlug } from "../../asset/asset-ref.js";
|
|
11
|
+
import { httpUrl, nonEmptyString, positiveInt } from "./primitives.js";
|
|
12
|
+
// ── Sources / registries / installed ────────────────────────────────────────
|
|
13
|
+
const SourceConfigEntryOptionsSchema = z.record(z.unknown());
|
|
14
|
+
export const SourceConfigEntrySchema = z
|
|
15
|
+
.object({
|
|
16
|
+
type: nonEmptyString,
|
|
17
|
+
path: z.string().min(1).optional(),
|
|
18
|
+
url: z.string().min(1).optional(),
|
|
19
|
+
name: z.string().min(1).optional(),
|
|
20
|
+
enabled: z.boolean().optional(),
|
|
21
|
+
writable: z.boolean().optional(),
|
|
22
|
+
primary: z.boolean().optional(),
|
|
23
|
+
options: SourceConfigEntryOptionsSchema.optional(),
|
|
24
|
+
})
|
|
25
|
+
.passthrough()
|
|
26
|
+
.superRefine((entry, ctx) => {
|
|
27
|
+
if (entry.options && "pushOnCommit" in entry.options) {
|
|
28
|
+
ctx.addIssue({
|
|
29
|
+
code: z.ZodIssueCode.custom,
|
|
30
|
+
path: ["options", "pushOnCommit"],
|
|
31
|
+
message: "options.pushOnCommit is not supported",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (!["filesystem", "git", "website", "npm"].includes(entry.type)) {
|
|
35
|
+
ctx.addIssue({
|
|
36
|
+
code: z.ZodIssueCode.custom,
|
|
37
|
+
path: ["type"],
|
|
38
|
+
message: `unsupported source type "${entry.type}"; expected filesystem, git, website, or npm`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
if (entry.writable === true && (entry.type === "website" || entry.type === "npm")) {
|
|
42
|
+
ctx.addIssue({
|
|
43
|
+
code: z.ZodIssueCode.custom,
|
|
44
|
+
message: `writable: true is only supported on filesystem and git sources (got "${entry.type}"` +
|
|
45
|
+
(entry.name ? ` on source "${entry.name}"` : "") +
|
|
46
|
+
").",
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
export const RegistryConfigEntrySchema = z
|
|
51
|
+
.object({
|
|
52
|
+
url: httpUrl,
|
|
53
|
+
name: z.string().min(1).optional(),
|
|
54
|
+
enabled: z.boolean().optional(),
|
|
55
|
+
provider: z.string().min(1).optional(),
|
|
56
|
+
options: z.record(z.unknown()).optional(),
|
|
57
|
+
})
|
|
58
|
+
.passthrough();
|
|
59
|
+
// ── Bundles (0.9.0 config-shape cutover, spec §10.1 / D-R5) ─────────────────
|
|
60
|
+
//
|
|
61
|
+
// `bundles` + `defaultBundle` are the 0.9.0 desired-configuration shape that
|
|
62
|
+
// supersedes the pre-cutover `stashDir` / `sources[]` / `installed[]` trio. Each
|
|
63
|
+
// bundle entry carries ONE source descriptor (`path` | `git` | `website` | `npm`
|
|
64
|
+
// — mirroring today's source types), an optional `writable`, an optional
|
|
65
|
+
// `registryId` locator (the original registry install id, preserved verbatim so
|
|
66
|
+
// a non-slug-legal id like `github:owner/repo` is not lost when its slug-legal
|
|
67
|
+
// bundle KEY is derived), and an optional single-entry `components` map (spec
|
|
68
|
+
// §10.1; the transitional one-component-per-bundle coupling — NOT multi-component
|
|
69
|
+
// machinery). The map KEY is the workspace bundle slug (spec §11.1 charset: no
|
|
70
|
+
// `/`, `:`, `.`, `#`, whitespace), validated with {@link isBundleSlug}.
|
|
71
|
+
//
|
|
72
|
+
// The config migrator ({@link migrateConfigSourcesToBundles}) emits these keyed
|
|
73
|
+
// by exactly what `deriveInstallations` derives today (D-R5). `bindings` (spec
|
|
74
|
+
// §10.1) is Tier B and is NEVER accepted here (the top-level superRefine rejects
|
|
75
|
+
// it) — it is not part of the 0.9.0 config-shape cutover.
|
|
76
|
+
/** Website source descriptor for a bundle entry (spec §10.1). */
|
|
77
|
+
const BundleWebsiteDescriptorSchema = z
|
|
78
|
+
.object({
|
|
79
|
+
url: httpUrl,
|
|
80
|
+
refresh: z.string().min(1).optional(),
|
|
81
|
+
maxPages: positiveInt.optional(),
|
|
82
|
+
maxDepth: positiveInt.optional(),
|
|
83
|
+
})
|
|
84
|
+
.passthrough();
|
|
85
|
+
/** One component of a bundle (spec §10.1). Single-entry, transitional. */
|
|
86
|
+
const BundleComponentConfigSchema = z
|
|
87
|
+
.object({
|
|
88
|
+
root: z.string().min(1).optional(),
|
|
89
|
+
adapter: nonEmptyString.optional(),
|
|
90
|
+
writable: z.boolean().optional(),
|
|
91
|
+
})
|
|
92
|
+
.passthrough();
|
|
93
|
+
export const BundleConfigEntrySchema = z
|
|
94
|
+
.object({
|
|
95
|
+
// Exactly one source descriptor (enforced in superRefine below):
|
|
96
|
+
path: z.string().min(1).optional(),
|
|
97
|
+
git: z.string().min(1).optional(),
|
|
98
|
+
website: BundleWebsiteDescriptorSchema.optional(),
|
|
99
|
+
npm: z.string().min(1).optional(),
|
|
100
|
+
writable: z.boolean().optional(),
|
|
101
|
+
// Opt a bundle out of indexing, search, refresh, and write targeting
|
|
102
|
+
// without deleting it. Carried over from the pre-cutover `sources[].enabled`
|
|
103
|
+
// flag, which the runtime still honors on the derived source entry
|
|
104
|
+
// (`write-source.ts`, `search-source.ts`); without it here, migrating a
|
|
105
|
+
// disabled source would silently reactivate it.
|
|
106
|
+
enabled: z.boolean().optional(),
|
|
107
|
+
// The original registry install id when the bundle KEY was slug-derived from
|
|
108
|
+
// it (e.g. registryId `github:owner/repo` → key `repo`). Preserved so the
|
|
109
|
+
// source locator survives the config-shape migration (D-R5). Absent when the
|
|
110
|
+
// bundle key already equals the source's stable id.
|
|
111
|
+
registryId: z.string().min(1).optional(),
|
|
112
|
+
components: z.record(z.string().min(1), BundleComponentConfigSchema).optional(),
|
|
113
|
+
})
|
|
114
|
+
.passthrough()
|
|
115
|
+
.superRefine((entry, ctx) => {
|
|
116
|
+
const options = entry.options;
|
|
117
|
+
if (options && typeof options === "object" && "pushOnCommit" in options) {
|
|
118
|
+
ctx.addIssue({
|
|
119
|
+
code: z.ZodIssueCode.custom,
|
|
120
|
+
path: ["options", "pushOnCommit"],
|
|
121
|
+
message: "options.pushOnCommit is not supported",
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const descriptors = ["path", "git", "website", "npm"].filter((k) => entry[k] !== undefined);
|
|
125
|
+
if (descriptors.length === 0) {
|
|
126
|
+
ctx.addIssue({
|
|
127
|
+
code: z.ZodIssueCode.custom,
|
|
128
|
+
message: "a bundle entry must carry exactly one source descriptor (path, git, website, or npm)",
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
else if (descriptors.length > 1) {
|
|
132
|
+
ctx.addIssue({
|
|
133
|
+
code: z.ZodIssueCode.custom,
|
|
134
|
+
message: `a bundle entry must carry exactly one source descriptor; got ${descriptors.join(", ")}`,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (entry.writable === true && (entry.website !== undefined || entry.npm !== undefined)) {
|
|
138
|
+
ctx.addIssue({
|
|
139
|
+
code: z.ZodIssueCode.custom,
|
|
140
|
+
path: ["writable"],
|
|
141
|
+
message: "writable: true is only supported on path and git bundle sources",
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const componentEntries = entry.components ? Object.entries(entry.components) : [];
|
|
145
|
+
if (entry.components !== undefined && componentEntries.length !== 1) {
|
|
146
|
+
ctx.addIssue({
|
|
147
|
+
code: z.ZodIssueCode.custom,
|
|
148
|
+
path: ["components"],
|
|
149
|
+
message: "a bundle components map must contain exactly one component",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
const componentEntry = componentEntries[0];
|
|
153
|
+
if (componentEntry?.[1].writable === true && (entry.website !== undefined || entry.npm !== undefined)) {
|
|
154
|
+
ctx.addIssue({
|
|
155
|
+
code: z.ZodIssueCode.custom,
|
|
156
|
+
path: ["components", componentEntry[0], "writable"],
|
|
157
|
+
message: "writable: true is only supported on path and git bundle sources",
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
/**
|
|
162
|
+
* `bundles` map. Keys are workspace bundle slugs (spec §11.1 / D-R5 charset).
|
|
163
|
+
* The key charset is validated with {@link isBundleSlug} so a key can never carry
|
|
164
|
+
* `/`, `:`, `.`, `#`, or whitespace (which would break the `bundle//conceptId`
|
|
165
|
+
* ref grammar).
|
|
166
|
+
*/
|
|
167
|
+
export const BundlesConfigSchema = z.record(z.string().min(1).refine(isBundleSlug, {
|
|
168
|
+
message: "bundle key must be a legal slug (no '/', ':', '.', '#', or whitespace)",
|
|
169
|
+
}), BundleConfigEntrySchema);
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
* `workflow` engine settings. Extracted verbatim from the former
|
|
6
|
+
* `config-schema.ts` monolith — no behavior change.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { positiveInt } from "./primitives.js";
|
|
10
|
+
// ── Workflow engine ─────────────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Workflow-engine settings (`workflow`).
|
|
13
|
+
*
|
|
14
|
+
* `maxConcurrency` is the engine-wide ceiling on concurrent units for native
|
|
15
|
+
* fan-out (`akm workflow run`). It replaces the hard-coded `min(16, cores−2)`
|
|
16
|
+
* cap (which matched Claude Code) with a user knob:
|
|
17
|
+
* - UNSET → the CPU-derived default `min(16, max(1, cores−2))`.
|
|
18
|
+
* - SET → the explicit positive integer, CLAMPED at read time to
|
|
19
|
+
* `[1, WORKFLOW_MAX_CONCURRENCY_CEILING]` (64). Values above the ceiling
|
|
20
|
+
* are clamped, not rejected, so a config shared across machines with wildly
|
|
21
|
+
* different core counts never hard-fails validation.
|
|
22
|
+
* The R3 brief/report driver surface does NOT consult this — drivers own their
|
|
23
|
+
* own parallelism (the engine only caps native dispatch).
|
|
24
|
+
*/
|
|
25
|
+
export const WorkflowConfigSchema = z
|
|
26
|
+
.object({
|
|
27
|
+
maxConcurrency: positiveInt.optional(),
|
|
28
|
+
})
|
|
29
|
+
.passthrough();
|