akm-cli 0.10.261012-beta → 0.10.261014-beta
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 +710 -3
- package/README.md +15 -0
- package/SECURITY.md +11 -10
- package/STABILITY.md +47 -51
- package/dist/assets/hints/cli-hints-full.md +21 -19
- package/dist/assets/hints/cli-hints-short.md +3 -4
- package/dist/assets/opencode/akm-plugin.js +177 -0
- package/dist/assets/stash-skeleton/README.md +1 -1
- package/dist/assets/tasks/core/improve.yml +1 -1
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
- package/dist/assets/ui/config.js +27 -10
- package/dist/assets/workflows/workflow-template.md +2 -2
- package/dist/cli/clack.js +3 -1
- package/dist/cli/selection.js +33 -0
- package/dist/cli/shared.js +14 -1
- package/dist/cli/unknown-flags.js +6 -37
- package/dist/cli.js +69 -48
- package/dist/commands/agent/agent-dispatch.js +17 -25
- package/dist/commands/agent/contribute-cli.js +9 -8
- package/dist/commands/command/command-cli.js +4 -8
- package/dist/commands/command/command-execution.js +25 -39
- package/dist/commands/command/execution-source-loader.js +10 -14
- package/dist/commands/completions.js +1 -1
- package/dist/commands/config-cli.js +14 -5
- package/dist/commands/env/child-env.js +12 -14
- package/dist/commands/env/env-binding.js +47 -58
- package/dist/commands/env/env-cli.js +22 -24
- package/dist/commands/env/env.js +10 -58
- package/dist/commands/env/secret-cli.js +11 -29
- package/dist/commands/env/secret.js +3 -10
- package/dist/commands/health/checks.js +10 -849
- package/dist/commands/health/connections-and-harnesses-check.js +109 -0
- package/dist/commands/health/egress.js +3 -3
- package/dist/commands/health/html-report.js +9 -10
- package/dist/commands/health/plugin-staleness.js +18 -11
- package/dist/commands/health/report-view-model.js +16 -12
- package/dist/commands/health/scheduler-binary.js +1 -1
- package/dist/commands/health/semantic-search-check.js +85 -0
- package/dist/commands/health/type-directory-check.js +0 -3
- package/dist/commands/health.js +30 -42
- package/dist/commands/improve/consolidate/pair-pass.js +10 -25
- package/dist/commands/improve/consolidate.js +10 -15
- package/dist/commands/improve/distill.js +5 -17
- package/dist/commands/improve/eligibility.js +1 -3
- package/dist/commands/improve/execution.js +37 -40
- package/dist/commands/improve/extract-cli.js +6 -11
- package/dist/commands/improve/extract-prompt.js +2 -2
- package/dist/commands/improve/extract.js +67 -97
- package/dist/commands/improve/improve-cli.js +22 -128
- package/dist/commands/improve/improve-report.js +1 -1
- package/dist/commands/improve/improve-strategies.js +25 -108
- package/dist/commands/improve/improve.js +10 -14
- package/dist/commands/improve/loop-stages.js +3 -0
- package/dist/commands/improve/memory/memory-improve.js +1 -1
- package/dist/commands/improve/preparation.js +8 -13
- package/dist/commands/improve/reflect.js +203 -332
- package/dist/commands/improve/retrieval-scope.js +1 -1
- package/dist/commands/improve/session-asset.js +3 -2
- package/dist/commands/improve/stage.js +87 -115
- package/dist/commands/lint/base-linter.js +3 -3
- package/dist/commands/lint/env-key-rules.js +7 -6
- package/dist/commands/lint/index.js +3 -3
- package/dist/commands/models-cli.js +103 -63
- package/dist/commands/proposal/drain.js +26 -39
- package/dist/commands/proposal/proposal-cli.js +14 -18
- package/dist/commands/proposal/propose-cli.js +4 -2
- package/dist/commands/proposal/propose.js +37 -64
- package/dist/commands/proposal/repository.js +17 -17
- package/dist/commands/proposal/validators/proposal-validators.js +3 -6
- package/dist/commands/read/curate.js +10 -6
- package/dist/commands/read/registry-search.js +2 -48
- package/dist/commands/read/search-cli.js +1 -8
- package/dist/commands/read/search.js +5 -6
- package/dist/commands/read/show.js +6 -29
- package/dist/commands/remember.js +25 -40
- package/dist/commands/sources/add-cli.js +8 -63
- package/dist/commands/sources/bundle-cli.js +8 -9
- package/dist/commands/sources/bundle-config-ops.js +2 -2
- package/dist/commands/sources/info.js +12 -1
- package/dist/commands/sources/init.js +1 -1
- package/dist/commands/sources/installed-stashes.js +119 -63
- package/dist/commands/sources/migration-help.js +1 -1
- package/dist/commands/sources/plugin-upgrade.js +8 -15
- package/dist/commands/sources/schema-repair.js +4 -10
- package/dist/commands/sources/source-add.js +2 -2
- package/dist/commands/sources/source-clone.js +31 -7
- package/dist/commands/sources/source-manage.js +4 -4
- package/dist/commands/targets.js +175 -0
- package/dist/commands/tasks/explain.js +104 -69
- package/dist/commands/tasks/tasks-cli.js +9 -11
- package/dist/commands/tasks/tasks.js +75 -97
- package/dist/commands/ui/api.js +11 -3
- package/dist/commands/ui/redact.js +5 -31
- package/dist/commands/ui/workspace-actions.js +1 -1
- package/dist/commands/workflow/plan.js +48 -9
- package/dist/commands/workflow-cli.js +40 -45
- package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
- package/dist/core/adapter/adapters/akm-adapter.js +36 -41
- package/dist/core/adapter/adapters/akm-lint.js +10 -12
- package/dist/core/adapter/adapters/akm-metadata.js +2 -2
- package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
- package/dist/core/adapter/adapters/claude-adapter.js +1 -1
- package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
- package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
- package/dist/core/adapter/adapters/index.js +3 -4
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
- package/dist/core/adapter/adapters/okf-adapter.js +8 -10
- package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
- package/dist/core/adapter/adapters/shared.js +3 -3
- package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
- package/dist/core/adapter/detect-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +13 -35
- package/dist/core/adapter/registry.js +1 -1
- package/dist/core/adapter/validate-context.js +2 -4
- package/dist/core/asset/asset-placement.js +1 -1
- package/dist/core/asset/asset-ref.js +3 -3
- package/dist/core/asset/resolve-ref.js +5 -0
- package/dist/core/bundle-rename.js +12 -4
- package/dist/core/closest-match.js +37 -0
- package/dist/core/common.js +37 -57
- package/dist/core/config/config-io.js +26 -18
- package/dist/core/config/config-schema.js +19 -106
- package/dist/core/config/config-sources.js +3 -3
- package/dist/core/config/config-types.js +4 -4
- package/dist/core/config/config-walker.js +50 -77
- package/dist/core/config/config.js +438 -109
- package/dist/core/config/convert-engine-references.js +114 -0
- package/dist/core/config/convert-engines-shared.js +40 -0
- package/dist/core/config/convert-engines.js +300 -0
- package/dist/core/config/convert-models-overlay.js +137 -0
- package/dist/core/config/credentials.js +304 -0
- package/dist/core/config/engine-semantics.js +3 -3
- package/dist/core/config/migrate-keys.js +222 -0
- package/dist/core/config/model-aliases.js +37 -0
- package/dist/core/config/models-file.js +34 -0
- package/dist/core/config/retired-engines.js +53 -0
- package/dist/core/config/schema/connections.js +41 -0
- package/dist/core/config/schema/embedding.js +2 -2
- package/dist/core/config/schema/harnesses.js +41 -0
- package/dist/core/config/schema/improve-processes.js +9 -28
- package/dist/core/config/schema/improve.js +36 -1
- package/dist/core/config/schema/index-config.js +18 -20
- package/dist/core/config/schema/primitives.js +42 -17
- package/dist/core/config/schema/search.js +6 -11
- package/dist/core/config/schema/sources-bundles.js +9 -9
- package/dist/core/config/schema/workflow.js +2 -6
- package/dist/core/config/unusable-entries.js +66 -0
- package/dist/core/content-safety.js +3 -6
- package/dist/core/endpoint-url.js +47 -0
- package/dist/core/env-secret-ref.js +84 -73
- package/dist/core/errors.js +10 -16
- package/dist/core/extra-params.js +3 -3
- package/dist/core/improve-result.js +8 -9
- package/dist/core/json-schema.js +1 -1
- package/dist/core/lesson-lint.js +1 -1
- package/dist/core/llm-inference.js +80 -0
- package/dist/core/parse.js +2 -2
- package/dist/core/paths.js +33 -10
- package/dist/core/recognition-util.js +8 -10
- package/dist/core/redaction.js +94 -55
- package/dist/core/ref-token.js +82 -0
- package/dist/core/secret-value.js +14 -0
- package/dist/core/state/migrations.js +17 -22
- package/dist/core/structured.js +2 -68
- package/dist/core/subprocess.js +63 -22
- package/dist/core/type-presentation.js +10 -14
- package/dist/core/write-source.js +20 -4
- package/dist/execution/input-contract.js +3 -6
- package/dist/execution/notices.js +49 -0
- package/dist/execution/resolved-request.js +24 -40
- package/dist/execution/source.js +21 -45
- package/dist/execution/target-ref.js +2 -2
- package/dist/indexer/bundle-identity-guard.js +6 -5
- package/dist/indexer/ensure-index.js +1 -1
- package/dist/indexer/index-writer-lock.js +1 -1
- package/dist/indexer/indexer.js +46 -42
- package/dist/indexer/installations.js +12 -22
- package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
- package/dist/indexer/materialize-embeddings.js +20 -16
- package/dist/indexer/passes/memory-inference.js +21 -50
- package/dist/indexer/passes/metadata.js +5 -5
- package/dist/indexer/scan/doc-to-entry.js +1 -1
- package/dist/indexer/scan/drain-dir.js +9 -11
- package/dist/indexer/search/db-search.js +9 -7
- package/dist/indexer/search/search-source.js +42 -22
- package/dist/indexer/usage/usage-events.js +2 -3
- package/dist/indexer/walk/index-context.js +2 -1
- package/dist/indexer/walk/matchers.js +3 -11
- package/dist/indexer/walk/path-resolver.js +13 -68
- package/dist/indexer/walk/walker.js +32 -26
- package/dist/integrations/agent/akm-read-tools.js +81 -0
- package/dist/integrations/agent/config.js +1 -1
- package/dist/integrations/agent/detect.js +32 -36
- package/dist/integrations/agent/execution.js +130 -428
- package/dist/integrations/agent/index.js +1 -1
- package/dist/integrations/agent/profiles.js +24 -28
- package/dist/integrations/agent/prompts.js +17 -30
- package/dist/integrations/agent/request-lowering.js +67 -101
- package/dist/integrations/agent/resolution.js +332 -0
- package/dist/integrations/agent/runner-dispatch.js +156 -181
- package/dist/integrations/agent/runner.js +20 -70
- package/dist/integrations/agent/runtime-port.js +4 -0
- package/dist/integrations/agent/runtime.js +10 -0
- package/dist/integrations/agent/spawn.js +65 -190
- package/dist/integrations/harnesses/aider/index.js +19 -39
- package/dist/integrations/harnesses/amazonq/index.js +17 -32
- package/dist/integrations/harnesses/claude/index.js +59 -28
- package/dist/integrations/harnesses/claude/session-log.js +7 -5
- package/dist/integrations/harnesses/codex/index.js +19 -31
- package/dist/integrations/harnesses/copilot/index.js +17 -35
- package/dist/integrations/harnesses/gemini/index.js +18 -34
- package/dist/integrations/harnesses/harness.js +36 -0
- package/dist/integrations/harnesses/index.js +20 -51
- package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
- package/dist/integrations/harnesses/opencode/index.js +11 -33
- package/dist/integrations/harnesses/opencode/roots.js +50 -0
- package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
- package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
- package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
- package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
- package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
- package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
- package/dist/integrations/harnesses/opencode/session-log.js +58 -137
- package/dist/integrations/harnesses/opencode/version.js +34 -53
- package/dist/integrations/harnesses/openhands/index.js +13 -37
- package/dist/integrations/harnesses/pi/index.js +21 -32
- package/dist/integrations/lockfile.js +1 -1
- package/dist/integrations/session-logs/index.js +11 -31
- package/dist/llm/client.js +93 -111
- package/dist/llm/embedder.js +19 -34
- package/dist/llm/embedders/connection.js +31 -0
- package/dist/llm/embedders/local-model-files.js +56 -0
- package/dist/llm/embedders/local.js +146 -115
- package/dist/llm/embedders/remote.js +26 -23
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/index-passes.js +33 -39
- package/dist/llm/memory-infer.js +67 -77
- package/dist/llm/model-list.js +35 -0
- package/dist/llm/rerank-client.js +8 -14
- package/dist/llm/structured-call.js +45 -99
- package/dist/llm/structured.js +60 -0
- package/dist/output/renderers.js +2 -8
- package/dist/output/shapes/helpers.js +18 -44
- package/dist/output/shapes/passthrough.js +1 -0
- package/dist/output/shapes.js +1 -7
- package/dist/output/text/command-format.js +41 -39
- package/dist/output/text/health-format.js +8 -2
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +12 -0
- package/dist/output/text/models.js +3 -2
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +16 -28
- package/dist/output/text/show-format.js +0 -2
- package/dist/output/text/targets-table.js +70 -0
- package/dist/output/text/workflow-format.js +44 -15
- package/dist/output/text.js +1 -1
- package/dist/registry/providers/skills-sh.js +1 -28
- package/dist/registry/providers/static-index.js +1 -71
- package/dist/runtime.js +6 -2
- package/dist/scripts/akm-migrate-node.js +47095 -44905
- package/dist/scripts/akm-migrate.js +46946 -44755
- package/dist/setup/detect.js +28 -273
- package/dist/setup/endpoint.js +36 -0
- package/dist/setup/semantic-assets.js +13 -19
- package/dist/setup/setup-flags.js +77 -0
- package/dist/setup/setup-plan.js +144 -0
- package/dist/setup/setup.js +134 -358
- package/dist/setup/steps/connection-shared.js +49 -101
- package/dist/setup/steps/connection.js +121 -524
- package/dist/setup/steps/embeddings.js +151 -0
- package/dist/setup/steps/harnesses.js +118 -0
- package/dist/setup/steps/platforms.js +2 -81
- package/dist/setup/steps/tasks.js +1 -2
- package/dist/setup/steps.js +10 -0
- package/dist/setup/summary.js +67 -0
- package/dist/sources/freshness.js +16 -21
- package/dist/sources/providers/git-provider.js +2 -9
- package/dist/sources/providers/provider-utils.js +13 -5
- package/dist/sources/resolve.js +12 -16
- package/dist/sources/snapshot-fetchers/robots.js +11 -12
- package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
- package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
- package/dist/sources/snapshot-fetchers/x.js +1 -1
- package/dist/standalone/onnxruntime-library.js +52 -0
- package/dist/storage/repositories/improve-ledger-repository.js +1 -1
- package/dist/storage/repositories/improve-runs-repository.js +0 -13
- package/dist/storage/repositories/index-entries-repository.js +2 -2
- package/dist/storage/repositories/proposals-repository.js +2 -2
- package/dist/storage/repositories/task-history-repository.js +2 -2
- package/dist/storage/repositories/workflow-runs-repository.js +44 -129
- package/dist/storage/sqlite-read-snapshot.js +33 -29
- package/dist/tasks/embedded.js +1 -1
- package/dist/tasks/log-redaction.js +7 -119
- package/dist/tasks/prepare/prepare-support.js +8 -7
- package/dist/tasks/prepare/prepare.js +8 -9
- package/dist/tasks/prepare/script-capture.js +9 -25
- package/dist/tasks/run/attempt-lifecycle.js +17 -35
- package/dist/tasks/run/load-task.js +54 -27
- package/dist/tasks/run/run-command-task.js +15 -10
- package/dist/tasks/run/run-native-task.js +8 -21
- package/dist/tasks/run/run-task.js +5 -8
- package/dist/tasks/run/run-workflow-task.js +14 -21
- package/dist/tasks/run/task-history.js +9 -17
- package/dist/tasks/run/task-log.js +1 -5
- package/dist/tasks/scheduler-invocation.js +13 -18
- package/dist/tasks/scheduler-sync.js +0 -1
- package/dist/tasks/source/bounded-document.js +31 -117
- package/dist/tasks/source/parse-task-source.js +0 -1
- package/dist/tasks/source/project-v4.js +5 -3
- package/dist/tasks/source/task-input-diagnostics.js +3 -4
- package/dist/tasks/source/task-source-v4.js +48 -72
- package/dist/tasks/source-v3.js +2 -5
- package/dist/tasks/task-run-reserved-flags.js +1 -2
- package/dist/workflows/authoring/authoring.js +2 -7
- package/dist/workflows/compile.js +1 -15
- package/dist/workflows/concurrency-policy.js +4 -4
- package/dist/workflows/exec/child-workflow.js +1 -4
- package/dist/workflows/exec/dispatch-redaction.js +35 -86
- package/dist/workflows/exec/environment.js +13 -77
- package/dist/workflows/exec/exec-unit.js +14 -55
- package/dist/workflows/exec/frozen-judge.js +26 -28
- package/dist/workflows/exec/native-executor.js +126 -71
- package/dist/workflows/exec/run-workflow.js +38 -42
- package/dist/workflows/exec/step-work.js +13 -17
- package/dist/workflows/exec/unit-dispatch.js +7 -21
- package/dist/workflows/freeze/environment.js +14 -119
- package/dist/workflows/freeze/freeze.js +14 -33
- package/dist/workflows/freeze/step-values.js +6 -13
- package/dist/workflows/freeze/targets/child-workflow.js +3 -5
- package/dist/workflows/freeze/targets/command.js +9 -15
- package/dist/workflows/freeze/targets/shell.js +0 -3
- package/dist/workflows/freeze/task-bindings.js +0 -1
- package/dist/workflows/parser.js +50 -59
- package/dist/workflows/plan.js +8 -2
- package/dist/workflows/renderer.js +83 -9
- package/dist/workflows/resource-limits.js +2 -2
- package/dist/workflows/runtime/run-plan.js +38 -23
- package/dist/workflows/runtime/runs.js +55 -93
- package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
- package/dist/workflows/source-files.js +7 -19
- package/docs/README.md +10 -16
- package/docs/architecture/README.md +2 -37
- package/docs/architecture/adapters.md +2 -2
- package/docs/architecture/akm-core-principles.md +256 -118
- package/docs/architecture/architecture.md +283 -99
- package/docs/architecture/improvement.md +8 -2
- package/docs/architecture/internals/classification.md +1 -3
- package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
- package/docs/architecture/internals/health-advisories.md +35 -74
- package/docs/architecture/internals/improve-workflow.md +27 -26
- package/docs/architecture/internals/indexing.md +3 -3
- package/docs/architecture/internals/storage-locations.md +48 -15
- package/docs/architecture/persisted-data-compat.md +10 -6
- package/docs/architecture/specs/okf-support.md +9 -11
- package/docs/architecture/specs/ref.md +7 -9
- package/docs/architecture/testing/testing-workflow.md +172 -52
- package/docs/architecture/workflow-engine.md +51 -34
- package/docs/guides/README.md +0 -1
- package/docs/guides/author-bundles.md +15 -20
- package/docs/guides/author-workflows.md +93 -71
- package/docs/guides/bundles.md +20 -16
- package/docs/guides/discover-and-load.md +1 -1
- package/docs/guides/getting-started.md +49 -3
- package/docs/guides/improve-the-library.md +10 -4
- package/docs/guides/recipes/headless-install.md +11 -16
- package/docs/guides/run-workflows.md +29 -20
- package/docs/guides/scheduling.md +2 -2
- package/docs/guides/use-with-any-agent.md +20 -22
- package/docs/integration/bundling-akm.md +19 -9
- package/docs/maintainers/README.md +2 -6
- package/docs/maintainers/release-checklist.md +73 -126
- package/docs/migration/README.md +10 -3
- package/docs/migration/release-notes/0.10.0.md +81 -16
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.9.0.md +1 -1
- package/docs/migration/release-notes/README.md +1 -1
- package/docs/migration/v0.9-to-v0.10.md +300 -60
- package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
- package/docs/posts/config-v2-lessons-16.md +1 -1
- package/docs/posts/llm-mode-reflect-13.md +1 -1
- package/docs/posts/release-0.6.0.md +11 -11
- package/docs/posts/release-0.8.0.md +4 -4
- package/docs/posts/workflows-vaults-09.md +1 -1
- package/docs/reference/README.md +1 -1
- package/docs/reference/asset-types.md +2 -2
- package/docs/reference/cli.md +477 -388
- package/docs/reference/configuration.md +569 -550
- package/docs/reference/data-and-telemetry.md +9 -6
- package/docs/reference/env-and-secrets.md +72 -15
- package/docs/reference/refs.md +3 -20
- package/docs/reference/registry.md +12 -38
- package/docs/reference/supported-formats.md +1 -1
- package/docs/reference/tasks.md +22 -11
- package/docs/reference/ui-api.md +14 -9
- package/docs/reference/workflow-schema.md +199 -154
- package/docs/reference/workflows.md +4 -6
- package/package.json +9 -11
- package/schemas/akm-config.json +1696 -2922
- package/schemas/akm-task.json +4 -4
- package/schemas/akm-workflow.json +36 -9
- package/ROADMAP.md +0 -112
- package/dist/assets/models.json +0 -35
- package/dist/commands/health/engine-usage.js +0 -45
- package/dist/commands/sources/dangerous-env-audit.js +0 -134
- package/dist/core/activation-policy.js +0 -67
- package/dist/core/config/schema/engines.js +0 -160
- package/dist/core/config/schema/execution.js +0 -23
- package/dist/core/spawn-env.js +0 -268
- package/dist/execution/directory-identity.js +0 -78
- package/dist/integrations/agent/builder-shared.js +0 -33
- package/dist/integrations/agent/builders.js +0 -43
- package/dist/integrations/agent/engine-fallback.js +0 -59
- package/dist/integrations/agent/engine-resolution.js +0 -333
- package/dist/integrations/agent/model-map.js +0 -475
- package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
- package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
- package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
- package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
- package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
- package/dist/integrations/harnesses/claude/config-import.js +0 -67
- package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
- package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
- package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
- package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
- package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
- package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
- package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
- package/dist/integrations/harnesses/opencode/config-import.js +0 -149
- package/dist/integrations/harnesses/opencode/model-config.js +0 -33
- package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
- package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
- package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
- package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
- package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
- package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
- package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
- package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
- package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
- package/dist/integrations/harnesses/shared.js +0 -18
- package/dist/integrations/harnesses/types.js +0 -55
- package/dist/llm/feature-gate.js +0 -115
- package/dist/output/shapes/models-list.js +0 -16
- package/dist/output/shapes/registry-search.js +0 -10
- package/dist/setup/detected-engines.js +0 -136
- package/dist/setup/engine-config.js +0 -97
- package/dist/setup/harness-config-import.js +0 -47
- package/dist/setup/providers.js +0 -14
- package/dist/setup/steps/semantic.js +0 -39
- package/dist/workflows/authoring/scope-key.js +0 -79
- package/dist/workflows/exec/lowering-notices.js +0 -23
- package/dist/workflows/source-semantics.js +0 -110
- package/docs/architecture/0.10-process-rules.md +0 -832
- package/docs/architecture/akm-architecture-decision-history.md +0 -2055
- package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
- package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
- package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
- package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
- package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
- package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
- package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
- package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
- package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
- package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
- package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
- package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
- package/docs/architecture/decisions/README.md +0 -62
- package/docs/architecture/internals/functional-contract-patterns.md +0 -340
- package/docs/architecture/internals/registry-network-boundary.md +0 -57
- package/docs/architecture/internals/search.md +0 -248
- package/docs/architecture/reviews/env-secret-access.md +0 -319
- package/docs/architecture/runtime-boundary-design.md +0 -153
- package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
- package/docs/architecture/specs/0.9.0-decisions.md +0 -532
- package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
- package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
- package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
- package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
- package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
- package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
- package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
- package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
- package/docs/architecture/specs/di-seams-plan.md +0 -539
- package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
- package/docs/architecture/specs/fact-asset-type.md +0 -142
- package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
- package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
- package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
- package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
- package/docs/architecture/specs/stash-organization-conventions.md +0 -377
- package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
- package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
- package/docs/architecture/specs/workflow-format-unification.md +0 -432
- package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
- package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
- package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
- package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
- package/docs/guides/knowledge-management.md +0 -18
- package/docs/maintainers/curate-workmap.md +0 -335
- package/docs/migration/v0.5-to-v0.6.md +0 -759
- package/docs/migration/v0.7-to-v0.8.md +0 -1378
- package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
* `connections`: the OpenAI-compatible endpoints akm reaches models through.
|
|
6
|
+
*
|
|
7
|
+
* akm owns `endpoint`, `apiKey`, `models`, `contextLength`, `timeoutMs` and
|
|
8
|
+
* `concurrency` (and keeps the retired `apiKeyFile` as written, never reading it). Every other key on a connection, or on a model entry, is a
|
|
9
|
+
* request field in the endpoint's own spelling and is sent with each request as
|
|
10
|
+
* written: the connection's fields apply to all its models, a model entry's
|
|
11
|
+
* override them.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
import { WORKFLOW_MAX_TIMEOUT_MS } from "../../../workflows/resource-limits.js";
|
|
15
|
+
import { connectionEndpoint, engineName, envReferenceApiKey, nonEmptyString, positiveInt, retiredApiKeyFile, } from "./primitives.js";
|
|
16
|
+
/**
|
|
17
|
+
* Timeouts share the workflow ceiling: a larger value would pass config
|
|
18
|
+
* validation and then fail every run with an unlocated "invocation is invalid".
|
|
19
|
+
* `null` runs unbounded.
|
|
20
|
+
*/
|
|
21
|
+
export const timeoutMsField = z.union([positiveInt.max(WORKFLOW_MAX_TIMEOUT_MS), z.null()]).optional();
|
|
22
|
+
/**
|
|
23
|
+
* One alias's target: the model's name, or an object holding it together with
|
|
24
|
+
* request fields of its own. The object is listed first so a JSON value given to
|
|
25
|
+
* `akm config set` is read as one.
|
|
26
|
+
*/
|
|
27
|
+
export const ModelEntrySchema = z.union([z.object({ model: nonEmptyString }).catchall(z.unknown()), nonEmptyString]);
|
|
28
|
+
/** Alias (`fast`, `balanced`, `reasoning`, or any the user adds) to the model it names. */
|
|
29
|
+
export const ModelAliasesSchema = z.record(nonEmptyString, ModelEntrySchema);
|
|
30
|
+
export const ConnectionSchema = z
|
|
31
|
+
.object({
|
|
32
|
+
endpoint: connectionEndpoint,
|
|
33
|
+
apiKey: envReferenceApiKey.optional(),
|
|
34
|
+
apiKeyFile: retiredApiKeyFile.optional(),
|
|
35
|
+
models: ModelAliasesSchema.optional(),
|
|
36
|
+
contextLength: positiveInt.optional(),
|
|
37
|
+
timeoutMs: timeoutMsField,
|
|
38
|
+
concurrency: positiveInt.optional(),
|
|
39
|
+
})
|
|
40
|
+
.catchall(z.unknown());
|
|
41
|
+
export const ConnectionsSchema = z.record(engineName, ConnectionSchema);
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* `config-schema.ts` monolith — no behavior change.
|
|
7
7
|
*/
|
|
8
8
|
import { z } from "zod";
|
|
9
|
-
import {
|
|
9
|
+
import { envReferenceApiKey, positiveInt } from "./primitives.js";
|
|
10
10
|
const EmbeddingOllamaOptionsSchema = z
|
|
11
11
|
.object({
|
|
12
12
|
num_ctx: positiveInt.optional(),
|
|
@@ -26,7 +26,7 @@ export const EmbeddingConnectionConfigSchema = z
|
|
|
26
26
|
provider: z.string().optional(),
|
|
27
27
|
endpoint: z.string().optional(),
|
|
28
28
|
model: z.string().optional(),
|
|
29
|
-
apiKey:
|
|
29
|
+
apiKey: envReferenceApiKey.optional(),
|
|
30
30
|
dimension: positiveInt.optional(),
|
|
31
31
|
localModel: z.string().min(1).optional(),
|
|
32
32
|
/**
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
* `harnesses`: agent programs the user already has (Claude Code, Codex,
|
|
6
|
+
* OpenCode, ...). An entry's key is its platform unless `platform` says
|
|
7
|
+
* otherwise, so `{ "claude": {} }` enables Claude Code and a second install is
|
|
8
|
+
* `{ "claude-work": { "platform": "claude", "bin": "/opt/claude-work/bin/claude" } }`.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { HARNESS_CONFIG_PLATFORMS } from "../../../integrations/harnesses/index.js";
|
|
12
|
+
import { ModelAliasesSchema, timeoutMsField } from "./connections.js";
|
|
13
|
+
import { engineName, nonEmptyString } from "./primitives.js";
|
|
14
|
+
export const HarnessSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
platform: z.enum(HARNESS_CONFIG_PLATFORMS).optional(),
|
|
17
|
+
bin: nonEmptyString.optional(),
|
|
18
|
+
args: z.array(z.string()).optional(),
|
|
19
|
+
workspace: nonEmptyString.optional(),
|
|
20
|
+
/** The harness's native agent to run when a request names none (platforms with native agents only). */
|
|
21
|
+
agent: nonEmptyString.optional(),
|
|
22
|
+
timeoutMs: timeoutMsField,
|
|
23
|
+
/** Alias to model for this harness, over the map akm ships for its platform. A harness is given the name only. */
|
|
24
|
+
models: ModelAliasesSchema.optional(),
|
|
25
|
+
/** `false`: akm's own model calls are never sent here by default; a call that names this harness still runs on it. */
|
|
26
|
+
modelWork: z.boolean().optional(),
|
|
27
|
+
})
|
|
28
|
+
.passthrough();
|
|
29
|
+
/** Why a harness parsed from this entry cannot be run: it names no platform and its name is not one. */
|
|
30
|
+
export function harnessNameProblem(name, harness) {
|
|
31
|
+
if (harness.platform !== undefined || HARNESS_CONFIG_PLATFORMS.includes(name))
|
|
32
|
+
return undefined;
|
|
33
|
+
return `harness "${name}" is not a platform name; set platform to one of ${HARNESS_CONFIG_PLATFORMS.join(", ")}`;
|
|
34
|
+
}
|
|
35
|
+
export const HarnessesSchema = z.record(engineName, HarnessSchema).superRefine((harnesses, ctx) => {
|
|
36
|
+
for (const [name, harness] of Object.entries(harnesses)) {
|
|
37
|
+
const message = harnessNameProblem(name, harness);
|
|
38
|
+
if (message !== undefined)
|
|
39
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: [name, "platform"], message });
|
|
40
|
+
}
|
|
41
|
+
});
|
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { z } from "zod";
|
|
9
9
|
import { IMPROVE_PROCESS_NAMES } from "../engine-semantics.js";
|
|
10
|
-
import {
|
|
10
|
+
import { nonEmptyString, positiveInt } from "./primitives.js";
|
|
11
11
|
// ── Improve profile / process ──────────────────────────────────────────────
|
|
12
12
|
//
|
|
13
13
|
// WI-9.6 (§4.2/§10.2): each of the improve processes (reflect, distill,
|
|
14
14
|
// consolidate, memoryInference, extract, validation, triage,
|
|
15
15
|
// proactiveMaintenance — graphExtraction had one too, until the LLM
|
|
16
16
|
// entity-graph it ran was retired in 0.9.17-alpha.9) gets its OWN schema
|
|
17
|
-
// below — a shared base (
|
|
17
|
+
// below — a shared base (`enabled`) extended
|
|
18
18
|
// with only the fields meaningful on that process — replacing the prior
|
|
19
19
|
// single ImproveProcessConfigSchema reused via `.optional()` for all of them
|
|
20
20
|
// (which accepted, and silently ignored, any field on any process). Field→process assignment is derived from each
|
|
@@ -34,12 +34,10 @@ import { engineName, LlmInvocationOverridesSchema, nonEmptyString, positiveInt }
|
|
|
34
34
|
// `processes.<name>` uses the NARROW per-process schemas via
|
|
35
35
|
// {@link ImproveProfileProcessesSchema} below — setting a field on the wrong
|
|
36
36
|
// process there is now rejected (the intended §4.2 improvement).
|
|
37
|
+
// A strategy says which processes run and how; where a process runs (connection,
|
|
38
|
+
// harness, model, inference, timeout) is `improve.processes.<name>`, never here.
|
|
37
39
|
const IMPROVE_PROCESS_BASE_FIELDS = {
|
|
38
|
-
engine: engineName.optional(),
|
|
39
|
-
model: nonEmptyString.optional(),
|
|
40
|
-
llm: LlmInvocationOverridesSchema.optional(),
|
|
41
40
|
enabled: z.boolean().optional(),
|
|
42
|
-
timeoutMs: z.union([positiveInt, z.null()]).optional(),
|
|
43
41
|
};
|
|
44
42
|
/** Reflect/distill/consolidate: process-level asset-type filter (see improve-strategies.ts shouldSkipRef/DEFAULT_ALLOWED_TYPES). */
|
|
45
43
|
const allowedTypesField = z.array(z.string().min(1)).optional();
|
|
@@ -61,17 +59,11 @@ const processLimitField = positiveInt.optional();
|
|
|
61
59
|
* The distill and reflect LLM-as-judge quality gates. Default ON; set
|
|
62
60
|
* `enabled: false` on the process to opt out. A judge error, timeout or
|
|
63
61
|
* unparsable reply never passes: distill and reflect both send the content
|
|
64
|
-
* to a person.
|
|
65
|
-
* gate a judge of its own (#1011), resolved over the process's own settings;
|
|
66
|
-
* with none set, the gate judges with the generator's runner.
|
|
62
|
+
* to a person. Where the judge runs is `improve.qualityGate`.
|
|
67
63
|
*/
|
|
68
64
|
const qualityGateField = z
|
|
69
65
|
.object({
|
|
70
66
|
enabled: z.boolean().optional(),
|
|
71
|
-
engine: engineName.optional(),
|
|
72
|
-
model: nonEmptyString.optional(),
|
|
73
|
-
timeoutMs: z.union([positiveInt, z.null()]).optional(),
|
|
74
|
-
llm: LlmInvocationOverridesSchema.passthrough().optional(),
|
|
75
67
|
})
|
|
76
68
|
.passthrough()
|
|
77
69
|
.optional();
|
|
@@ -120,20 +112,13 @@ const extractTriageGateField = z
|
|
|
120
112
|
})
|
|
121
113
|
.passthrough()
|
|
122
114
|
.optional();
|
|
123
|
-
// Unknown keys pass through here like every other nested surface (the loader
|
|
124
|
-
// names them once); `extraParams` remains the arbitrary provider-parameter
|
|
125
|
-
// escape hatch.
|
|
126
|
-
const triageJudgmentLlmOverridesField = LlmInvocationOverridesSchema.passthrough();
|
|
115
|
+
// Unknown keys pass through here like every other nested surface (the loader names them once).
|
|
127
116
|
const triageJudgmentObjectField = z
|
|
128
117
|
.object({
|
|
129
118
|
enabled: z.boolean().optional(),
|
|
130
|
-
engine: engineName.optional(),
|
|
131
|
-
model: nonEmptyString.optional(),
|
|
132
|
-
timeoutMs: z.union([positiveInt, z.null()]).optional(),
|
|
133
|
-
llm: triageJudgmentLlmOverridesField.optional(),
|
|
134
119
|
})
|
|
135
120
|
.passthrough();
|
|
136
|
-
/** Triage process:
|
|
121
|
+
/** Triage process: whether the LLM-as-judge runs; it runs where `improve.processes.triage` says. */
|
|
137
122
|
const triageJudgmentField = z
|
|
138
123
|
.union([z.boolean(), triageJudgmentObjectField])
|
|
139
124
|
.transform((value) => typeof value === "boolean" ? { enabled: value } : { ...value, enabled: value.enabled ?? true })
|
|
@@ -258,8 +243,8 @@ export const ProactiveMaintenanceProcessConfigSchema = z
|
|
|
258
243
|
/**
|
|
259
244
|
* Process names that once had a dedicated schema and are now gone. Setting
|
|
260
245
|
* one, even with `enabled: true`, is tolerated rather than rejected by the
|
|
261
|
-
* "unknown enabled process" check below — an old config must keep loading
|
|
262
|
-
*
|
|
246
|
+
* "unknown enabled process" check below — an old config must keep loading.
|
|
247
|
+
* `graphExtraction`: the LLM
|
|
263
248
|
* entity-graph extraction it ran was retired in 0.9.17-alpha.9.
|
|
264
249
|
* `feedbackDistillation`: a wrapper of `processes.distill.enabled`, removed in
|
|
265
250
|
* 0.8.0.
|
|
@@ -297,10 +282,6 @@ const ImproveProfileProcessesSchema = z
|
|
|
297
282
|
});
|
|
298
283
|
export const ImproveProfileConfigSchema = z
|
|
299
284
|
.object({
|
|
300
|
-
engine: engineName.optional(),
|
|
301
|
-
model: nonEmptyString.optional(),
|
|
302
|
-
timeoutMs: z.union([positiveInt, z.null()]).optional(),
|
|
303
|
-
llm: LlmInvocationOverridesSchema.optional(),
|
|
304
285
|
description: z.string().min(1).optional(),
|
|
305
286
|
processes: ImproveProfileProcessesSchema.optional(),
|
|
306
287
|
limit: positiveInt.optional(),
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { z } from "zod";
|
|
10
10
|
import { ImproveProfileConfigSchema } from "./improve-processes.js";
|
|
11
|
-
import { engineName, nonNegativeNumber } from "./primitives.js";
|
|
11
|
+
import { engineName, LlmInvocationOverridesSchema, nonEmptyString, nonNegativeNumber, positiveInt } from "./primitives.js";
|
|
12
12
|
// ── Improve top-level (event retention, salience, state GC) ────────────────
|
|
13
13
|
const ImproveSalienceSchema = z.object({}).passthrough();
|
|
14
14
|
// #733 — orphan-GC pass (Workstream C, lean by design: one config gate).
|
|
@@ -27,8 +27,43 @@ const ImproveStateGcSchema = z
|
|
|
27
27
|
collect: z.boolean().optional(),
|
|
28
28
|
})
|
|
29
29
|
.passthrough();
|
|
30
|
+
/**
|
|
31
|
+
* Where one improve call runs: a connection or a harness, the model (an alias or
|
|
32
|
+
* a name), inference settings and a timeout. Strategies say which processes run;
|
|
33
|
+
* this says where, whichever strategy is selected.
|
|
34
|
+
*/
|
|
35
|
+
export const ImproveWhereSchema = z
|
|
36
|
+
.object({
|
|
37
|
+
connection: nonEmptyString.optional(),
|
|
38
|
+
harness: nonEmptyString.optional(),
|
|
39
|
+
model: nonEmptyString.optional(),
|
|
40
|
+
llm: LlmInvocationOverridesSchema.optional(),
|
|
41
|
+
timeoutMs: z.union([positiveInt, z.null()]).optional(),
|
|
42
|
+
})
|
|
43
|
+
.passthrough();
|
|
44
|
+
/** The improve processes that make a model call; `proactiveMaintenance` makes none, so it has no place to run. */
|
|
45
|
+
const ImproveProcessesSchema = z
|
|
46
|
+
.object({
|
|
47
|
+
reflect: ImproveWhereSchema.optional(),
|
|
48
|
+
distill: ImproveWhereSchema.optional(),
|
|
49
|
+
consolidate: ImproveWhereSchema.optional(),
|
|
50
|
+
memoryInference: ImproveWhereSchema.optional(),
|
|
51
|
+
extract: ImproveWhereSchema.optional(),
|
|
52
|
+
validation: ImproveWhereSchema.optional(),
|
|
53
|
+
triage: ImproveWhereSchema.optional(),
|
|
54
|
+
})
|
|
55
|
+
.passthrough();
|
|
30
56
|
export const ImproveConfigSchema = z
|
|
31
57
|
.object({
|
|
58
|
+
/** The strategy `akm improve` runs when `--strategy` names none. */
|
|
59
|
+
strategy: engineName.optional(),
|
|
60
|
+
/** Where improve's model work runs: a connection, or a harness, over the default. */
|
|
61
|
+
connection: nonEmptyString.optional(),
|
|
62
|
+
harness: nonEmptyString.optional(),
|
|
63
|
+
/** Where each improve process runs, over `connection` / `harness` above. */
|
|
64
|
+
processes: ImproveProcessesSchema.optional(),
|
|
65
|
+
/** Where the judge of the reflect and distill quality gates runs, over `connection` / `harness` above (not over the process's own settings, which are the writer's). */
|
|
66
|
+
qualityGate: ImproveWhereSchema.optional(),
|
|
32
67
|
strategies: z.record(engineName, ImproveProfileConfigSchema).optional(),
|
|
33
68
|
eventRetentionDays: nonNegativeNumber.optional(),
|
|
34
69
|
salience: ImproveSalienceSchema.optional(),
|
|
@@ -2,41 +2,34 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* `index` config:
|
|
6
|
-
* Extracted verbatim from the former `config-schema.ts` monolith — no behavior
|
|
7
|
-
* change.
|
|
5
|
+
* `index` config: the index-wide model-work settings + arbitrary per-pass entries.
|
|
8
6
|
*/
|
|
9
7
|
import { z } from "zod";
|
|
10
|
-
import {
|
|
8
|
+
import { LlmInvocationOverridesSchema, nonEmptyString, positiveInt } from "./primitives.js";
|
|
11
9
|
// ── Index / per-pass ────────────────────────────────────────────────────────
|
|
12
10
|
/**
|
|
13
|
-
* Per-pass `index.<pass>` entry. Unknown keys (including inline
|
|
11
|
+
* Per-pass `index.<pass>` entry. Unknown keys (including inline connection
|
|
14
12
|
* settings an earlier release carried) are kept and named by the config
|
|
15
13
|
* loader's schema walk like any other unknown key.
|
|
16
14
|
*/
|
|
17
15
|
export const IndexPassConfigSchema = z
|
|
18
16
|
.object({
|
|
19
|
-
|
|
17
|
+
connection: nonEmptyString.optional(),
|
|
20
18
|
model: nonEmptyString.optional(),
|
|
21
19
|
timeoutMs: z.union([positiveInt, z.null()]).optional(),
|
|
22
20
|
enabled: z.boolean().optional(),
|
|
23
21
|
llm: LlmInvocationOverridesSchema.optional(),
|
|
24
22
|
})
|
|
25
23
|
.passthrough();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
engine: engineName.optional(),
|
|
29
|
-
model: nonEmptyString.optional(),
|
|
30
|
-
timeoutMs: z.union([positiveInt, z.null()]).optional(),
|
|
31
|
-
llm: LlmInvocationOverridesSchema.optional(),
|
|
32
|
-
})
|
|
33
|
-
.passthrough();
|
|
24
|
+
/** The keys that are settings for every pass, not a pass of their own. */
|
|
25
|
+
const INDEX_WIDE_KEYS = ["connection", "model", "timeoutMs", "llm"];
|
|
34
26
|
/**
|
|
35
|
-
* Index config is
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* for the two most common
|
|
27
|
+
* Index config is the index-wide model-work settings (`connection`, `model`,
|
|
28
|
+
* `timeoutMs`, `llm`) plus per-pass entries keyed by pass name. Passthrough so
|
|
29
|
+
* per-pass entries (keyed by arbitrary pass names like `memory`, or a retired
|
|
30
|
+
* one like `graph`) can live next to the index-wide keys. The outer preprocess
|
|
31
|
+
* emits the legacy parser's actionable error messages for the two most common
|
|
32
|
+
* type-shape mistakes:
|
|
40
33
|
* - An array at the `index` block.
|
|
41
34
|
* - A non-object at `index.<passName>`.
|
|
42
35
|
* Inner field validation (invocation overrides, provider-key rejection) is
|
|
@@ -55,6 +48,8 @@ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
|
|
|
55
48
|
if (typeof raw !== "object")
|
|
56
49
|
return raw;
|
|
57
50
|
for (const [passName, value] of Object.entries(raw)) {
|
|
51
|
+
if (INDEX_WIDE_KEYS.includes(passName))
|
|
52
|
+
continue;
|
|
58
53
|
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
59
54
|
ctx.addIssue({
|
|
60
55
|
code: z.ZodIssueCode.custom,
|
|
@@ -66,7 +61,10 @@ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
|
|
|
66
61
|
return raw;
|
|
67
62
|
}, z
|
|
68
63
|
.object({
|
|
69
|
-
|
|
64
|
+
connection: nonEmptyString.optional(),
|
|
65
|
+
model: nonEmptyString.optional(),
|
|
66
|
+
timeoutMs: z.union([positiveInt, z.null()]).optional(),
|
|
67
|
+
llm: LlmInvocationOverridesSchema.optional(),
|
|
70
68
|
})
|
|
71
69
|
.catchall(IndexPassConfigSchema));
|
|
72
70
|
// The runtime catchall correctly validates arbitrary pass objects, but its
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { z } from "zod";
|
|
10
10
|
import { validateExtraParams } from "../../extra-params.js";
|
|
11
|
+
import { redactUrlCredentials } from "../../redaction.js";
|
|
12
|
+
import { isSecretRefToken } from "../../ref-token.js";
|
|
11
13
|
import { warnOnce } from "../../warn.js";
|
|
12
14
|
import { ENGINE_NAME_PATTERN_SOURCE } from "../engine-semantics.js";
|
|
13
15
|
/** Persisted config schema version. Package prerelease/patch versions do not change this value. */
|
|
@@ -28,24 +30,50 @@ export const httpUrl = z.string().refine((v) => v.startsWith("http://") || v.sta
|
|
|
28
30
|
});
|
|
29
31
|
const ENGINE_NAME_PATTERN = new RegExp(ENGINE_NAME_PATTERN_SOURCE);
|
|
30
32
|
export const ENV_REFERENCE_PATTERN = /^\$[A-Za-z_][A-Za-z0-9_]*$|^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/;
|
|
31
|
-
/** `secret://<name>` — an apiKey reference into the akm secret store, resolved via `resolveSecretFromStore`. */
|
|
32
|
-
export const SECRET_STORE_REFERENCE_PATTERN = /^secret:\/\/(.+)$/;
|
|
33
33
|
export const engineName = z
|
|
34
34
|
.string()
|
|
35
35
|
.max(63)
|
|
36
36
|
.regex(ENGINE_NAME_PATTERN, "names must be lowercase kebab-case and must not begin with reserved akm-");
|
|
37
|
-
/** The two symbolic
|
|
37
|
+
/** The two symbolic credential forms akm accepts in a bundle source's `credential`: an env-var reference (`$VAR`, `${VAR}`) or a `secrets/` ref (`${secrets/name}`). Never matches a literal key. */
|
|
38
38
|
export function isApiKeyReference(value) {
|
|
39
|
-
return ENV_REFERENCE_PATTERN.test(value) ||
|
|
39
|
+
return ENV_REFERENCE_PATTERN.test(value) || isSecretRefToken(value);
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return;
|
|
45
|
-
warnOnce(`config:literal-api-key:${label}`, `A ${label} in config.json is a literal API key, not a $VAR/\${VAR}/secret:// reference; using it as configured. Prefer \`akm config set ...apiKey '$VAR'\` (with the corresponding env var set) or \`secret://<name>\` (with \`akm secret set <name> ...\`) — see docs/reference/data-and-telemetry.md.`);
|
|
46
|
-
});
|
|
41
|
+
/** A `$VAR` / `${VAR}` reference to an environment variable. */
|
|
42
|
+
export function isEnvReference(value) {
|
|
43
|
+
return ENV_REFERENCE_PATTERN.test(value);
|
|
47
44
|
}
|
|
48
|
-
|
|
45
|
+
/** The variable a `$VAR` / `${VAR}` reference names. */
|
|
46
|
+
export function envReferenceName(value) {
|
|
47
|
+
return /^\$(?:\{)?([A-Za-z_][A-Za-z0-9_]*)(?:\})?$/.exec(value)?.[1];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The `apiKey` of a connection, `embedding` or `search.curateRerank`: a `$VAR` /
|
|
51
|
+
* `${VAR}` reference, or absent (the key is then `credentials.json`'s under the
|
|
52
|
+
* block's name). Anything else is never read or sent: it is warned about once,
|
|
53
|
+
* never a load error, and kept as written so an ordinary write does not delete
|
|
54
|
+
* the user's key from their file (`akm migrate apply` moves it).
|
|
55
|
+
*/
|
|
56
|
+
export const envReferenceApiKey = z.string().transform((value) => {
|
|
57
|
+
if (isEnvReference(value))
|
|
58
|
+
return value;
|
|
59
|
+
if (isSecretRefToken(value)) {
|
|
60
|
+
warnOnce("config:secret-ref-api-key", "An apiKey that is a secret-store reference is ignored: akm reads a key from a $VAR or credentials.json. `akm migrate apply` moves it into credentials.json.");
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
warnOnce("config:literal-api-key", "A literal apiKey in config.json is ignored: akm does not read keys from config. Use a $VAR reference, or run `akm migrate apply` to move the key into credentials.json.");
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
});
|
|
67
|
+
/**
|
|
68
|
+
* The retired `apiKeyFile` of an engine that `akm migrate apply` could not read yet: kept as written so a
|
|
69
|
+
* later run can move the key it names, never read, sent or printed by akm.
|
|
70
|
+
*/
|
|
71
|
+
export const retiredApiKeyFile = z.string().transform((value) => {
|
|
72
|
+
warnOnce("config:api-key-file", "An apiKeyFile in config.json is ignored: akm reads a key from a $VAR or credentials.json. `akm migrate apply` moves the key the file holds once it can be read.");
|
|
73
|
+
return value;
|
|
74
|
+
});
|
|
75
|
+
/** A connection endpoint: a complete http(s) URL, the OpenAI-compatible base (`…/v1`) or the chat-completions URL itself. */
|
|
76
|
+
export const connectionEndpoint = z.string().superRefine((value, ctx) => {
|
|
49
77
|
let url;
|
|
50
78
|
try {
|
|
51
79
|
url = new URL(value);
|
|
@@ -59,10 +87,9 @@ export const chatCompletionsEndpoint = z.string().superRefine((value, ctx) => {
|
|
|
59
87
|
return;
|
|
60
88
|
}
|
|
61
89
|
if (url.username || url.password) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
warnOnce(`chatCompletionsEndpoint:path:${value}`, `Config endpoint "${value}" does not end in /chat/completions; using it as configured.`);
|
|
90
|
+
// The warning names the endpoint without the credential it is about, and is keyed by that too.
|
|
91
|
+
const shown = redactUrlCredentials(value);
|
|
92
|
+
warnOnce(`connectionEndpoint:userinfo:${shown}`, `Config endpoint "${shown}" embeds a username/password; move the credential out of the URL (apiKey: "$VAR", or credentials.json).`);
|
|
66
93
|
}
|
|
67
94
|
});
|
|
68
95
|
export const ExtraParamsSchema = z.record(z.unknown()).superRefine((value, ctx) => {
|
|
@@ -75,9 +102,7 @@ export const LlmInvocationOverridesSchema = z
|
|
|
75
102
|
.object({
|
|
76
103
|
temperature: z.number().finite().optional(),
|
|
77
104
|
maxTokens: positiveInt.optional(),
|
|
78
|
-
supportsJsonSchema: z.boolean().optional(),
|
|
79
105
|
extraParams: ExtraParamsSchema.optional(),
|
|
80
|
-
contextLength: positiveInt.optional(),
|
|
81
106
|
enableThinking: z.boolean().optional(),
|
|
82
107
|
reasoningEffort: nonEmptyString.optional(),
|
|
83
108
|
})
|
|
@@ -6,21 +6,16 @@
|
|
|
6
6
|
* reranker.
|
|
7
7
|
*/
|
|
8
8
|
import { z } from "zod";
|
|
9
|
-
import { httpUrl, nonEmptyString, positiveInt
|
|
9
|
+
import { envReferenceApiKey, httpUrl, nonEmptyString, positiveInt } from "./primitives.js";
|
|
10
10
|
// ── Search ──────────────────────────────────────────────────────────────────
|
|
11
11
|
/**
|
|
12
12
|
* `search.curateRerank` (#951) — an optional cross-encoder rerank pass over
|
|
13
13
|
* `akm curate`'s top fused candidates.
|
|
14
14
|
*
|
|
15
|
-
* Deliberately its own small config
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* `engine.kind`). A reranker is neither — it never dispatches an agent or
|
|
20
|
-
* lowers to a chat-completions call — so folding it into that union would
|
|
21
|
-
* force every one of those call sites to account for a kind they can't do
|
|
22
|
-
* anything with. `endpoint` + `model` (+ optional `apiKey`) is the same
|
|
23
|
-
* connection shape as an LLM engine without inheriting that machinery.
|
|
15
|
+
* Deliberately its own small config block rather than a `connections` entry: a
|
|
16
|
+
* reranker never dispatches an agent or lowers to a chat-completions call, and
|
|
17
|
+
* its `endpoint` is the full rerank URL. Its `apiKey` follows the connection
|
|
18
|
+
* rule (`$VAR`, or `credentials.json` under the name `curateRerank`).
|
|
24
19
|
*
|
|
25
20
|
* `curate_rerank` was removed as a dead `llm.features.*` key in 0.8.0 (no
|
|
26
21
|
* implementation ever sent a request); this is a new, real implementation,
|
|
@@ -32,7 +27,7 @@ export const CurateRerankConfigSchema = z
|
|
|
32
27
|
/** Full URL of the reranker's rerank endpoint, e.g. `http://host:port/rerank`. */
|
|
33
28
|
endpoint: httpUrl.optional(),
|
|
34
29
|
model: nonEmptyString.optional(),
|
|
35
|
-
apiKey:
|
|
30
|
+
apiKey: envReferenceApiKey.optional(),
|
|
36
31
|
timeoutMs: positiveInt.optional(),
|
|
37
32
|
/** How many of the top fused search candidates curate sends to the reranker. Default 30. */
|
|
38
33
|
topN: positiveInt.max(50).optional(),
|
|
@@ -64,7 +64,7 @@ export const SourceConfigEntrySchema = z
|
|
|
64
64
|
ctx.addIssue({
|
|
65
65
|
code: z.ZodIssueCode.custom,
|
|
66
66
|
path: ["credential"],
|
|
67
|
-
message: "git credential must be a $VAR or
|
|
67
|
+
message: "git credential must be a $VAR, ${VAR} or ${secrets/<name>} reference",
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
});
|
|
@@ -77,20 +77,20 @@ export const RegistryConfigEntrySchema = z
|
|
|
77
77
|
options: z.record(z.unknown()).optional(),
|
|
78
78
|
})
|
|
79
79
|
.passthrough();
|
|
80
|
-
// ── Bundles
|
|
80
|
+
// ── Bundles ─────────────────────────────────────────────────────────────────
|
|
81
81
|
//
|
|
82
82
|
// `bundles` + `defaultBundle` are the desired-configuration shape. Each bundle
|
|
83
83
|
// entry carries ONE source descriptor (`path` | `git` | `website` | `npm`
|
|
84
84
|
// — mirroring today's source types), an optional `writable`, an optional
|
|
85
85
|
// `registryId` locator (the original registry install id, preserved verbatim so
|
|
86
86
|
// a non-slug-legal id like `github:owner/repo` is not lost when its slug-legal
|
|
87
|
-
// bundle KEY is derived), and an optional single-entry `components` map (
|
|
88
|
-
//
|
|
89
|
-
// machinery). The map KEY is the workspace bundle slug (
|
|
87
|
+
// bundle KEY is derived), and an optional single-entry `components` map (the
|
|
88
|
+
// transitional one-component-per-bundle coupling — NOT multi-component
|
|
89
|
+
// machinery). The map KEY is the workspace bundle slug (charset: no
|
|
90
90
|
// `/`, `:`, `.`, `#`, whitespace), validated with {@link isBundleSlug}.
|
|
91
91
|
//
|
|
92
92
|
// `bindings` is not accepted here; the top-level schema rejects it.
|
|
93
|
-
/** Website source descriptor for a bundle entry
|
|
93
|
+
/** Website source descriptor for a bundle entry. */
|
|
94
94
|
const BundleWebsiteDescriptorSchema = z
|
|
95
95
|
.object({
|
|
96
96
|
url: httpUrl,
|
|
@@ -110,7 +110,7 @@ const BundleWebsiteDescriptorSchema = z
|
|
|
110
110
|
crawlTimeoutMs: z.number().int().min(0).optional(),
|
|
111
111
|
})
|
|
112
112
|
.passthrough();
|
|
113
|
-
/** One component of a bundle
|
|
113
|
+
/** One component of a bundle. Single-entry, transitional. */
|
|
114
114
|
const BundleComponentConfigSchema = z
|
|
115
115
|
.object({
|
|
116
116
|
root: z.string().min(1).optional(),
|
|
@@ -178,7 +178,7 @@ export const BundleConfigEntrySchema = z
|
|
|
178
178
|
ctx.addIssue({
|
|
179
179
|
code: z.ZodIssueCode.custom,
|
|
180
180
|
path: ["credential"],
|
|
181
|
-
message: "git credential must be a $VAR or
|
|
181
|
+
message: "git credential must be a $VAR, ${VAR} or ${secrets/<name>} reference",
|
|
182
182
|
});
|
|
183
183
|
}
|
|
184
184
|
const componentEntries = entry.components ? Object.entries(entry.components) : [];
|
|
@@ -216,7 +216,7 @@ export const BundleConfigEntrySchema = z
|
|
|
216
216
|
}
|
|
217
217
|
});
|
|
218
218
|
/**
|
|
219
|
-
* `bundles` map. Keys are workspace bundle slugs
|
|
219
|
+
* `bundles` map. Keys are workspace bundle slugs.
|
|
220
220
|
* The key charset is validated with {@link isBundleSlug} so a key can never carry
|
|
221
221
|
* `/`, `:`, `.`, `#`, or whitespace (which would break the `bundle//conceptId`
|
|
222
222
|
* ref grammar).
|
|
@@ -2,12 +2,10 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* `workflow`
|
|
6
|
-
* `config-schema.ts` monolith — no behavior change.
|
|
5
|
+
* `workflow` settings (fan-out limits).
|
|
7
6
|
*/
|
|
8
7
|
import { z } from "zod";
|
|
9
|
-
import {
|
|
10
|
-
// ── Workflow engine ─────────────────────────────────────────────────────────
|
|
8
|
+
import { positiveInt } from "./primitives.js";
|
|
11
9
|
/**
|
|
12
10
|
* Workflow-engine settings (`workflow`).
|
|
13
11
|
*
|
|
@@ -34,7 +32,5 @@ export const WorkflowConfigSchema = z
|
|
|
34
32
|
.object({
|
|
35
33
|
maxConcurrency: positiveInt.optional(),
|
|
36
34
|
defaultMapConcurrency: positiveInt.optional(),
|
|
37
|
-
/** Named LLM or agent engine frozen into every criteria-bearing gate. */
|
|
38
|
-
judgeEngine: engineName.optional(),
|
|
39
35
|
})
|
|
40
36
|
.passthrough();
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
import { isRecord } from "../common.js";
|
|
5
|
+
import { warnOnce } from "../warn.js";
|
|
6
|
+
import { ConnectionSchema } from "./schema/connections.js";
|
|
7
|
+
import { HarnessSchema, harnessNameProblem } from "./schema/harnesses.js";
|
|
8
|
+
import { engineName } from "./schema/primitives.js";
|
|
9
|
+
/** The first thing a schema found wrong with an entry, as a sentence fragment. */
|
|
10
|
+
function firstIssue(error) {
|
|
11
|
+
const issue = error.issues[0];
|
|
12
|
+
const where = issue?.path.join(".");
|
|
13
|
+
return `${where ? `${where}: ` : ""}${issue?.message ?? "it is not valid"}`;
|
|
14
|
+
}
|
|
15
|
+
/** Why an entry cannot have this name, if it cannot: the rule every connection and harness name follows. */
|
|
16
|
+
function nameProblem(name) {
|
|
17
|
+
const parsed = engineName.safeParse(name);
|
|
18
|
+
return parsed.success ? undefined : `its name breaks the naming rule (${firstIssue(parsed.error)})`;
|
|
19
|
+
}
|
|
20
|
+
/** Why a connection entry cannot be used, if it cannot: its name breaks the rule, or its own schema rejects it. */
|
|
21
|
+
function connectionProblem(name, entry) {
|
|
22
|
+
const parsed = ConnectionSchema.safeParse(entry);
|
|
23
|
+
return nameProblem(name) ?? (parsed.success ? undefined : firstIssue(parsed.error));
|
|
24
|
+
}
|
|
25
|
+
/** Why a harness entry cannot be used, if it cannot: as for a connection, or it names no platform and is not one. */
|
|
26
|
+
function harnessProblem(name, entry) {
|
|
27
|
+
const parsed = HarnessSchema.safeParse(entry);
|
|
28
|
+
return nameProblem(name) ?? (parsed.success ? harnessNameProblem(name, parsed.data) : firstIssue(parsed.error));
|
|
29
|
+
}
|
|
30
|
+
/** The connections and harnesses of `raw` that their own schemas reject, in file order. */
|
|
31
|
+
export function findUnusableEntries(raw) {
|
|
32
|
+
const unusable = [];
|
|
33
|
+
const check = (entries, kind, problem) => {
|
|
34
|
+
if (!isRecord(entries))
|
|
35
|
+
return;
|
|
36
|
+
for (const [name, entry] of Object.entries(entries)) {
|
|
37
|
+
const why = problem(name, entry);
|
|
38
|
+
if (why !== undefined)
|
|
39
|
+
unusable.push({ kind, name, why });
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
check(raw.connections, "connection", connectionProblem);
|
|
43
|
+
check(raw.harnesses, "harness", harnessProblem);
|
|
44
|
+
return unusable;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A connection or harness its own schema rejects (no endpoint, an endpoint that
|
|
48
|
+
* is not a URL, a model that is not a name, a harness akm cannot run, a name that
|
|
49
|
+
* breaks the naming rule) is of no
|
|
50
|
+
* use, but it is not a reason to refuse the rest of the config or to disable the
|
|
51
|
+
* entries beside it: each is dropped from what is read, with one warning naming
|
|
52
|
+
* it and the first thing wrong. The file keeps it, and a write does not remove it.
|
|
53
|
+
*/
|
|
54
|
+
export function dropUnusableEntries(raw, sourcePath) {
|
|
55
|
+
const unusable = findUnusableEntries(raw);
|
|
56
|
+
if (unusable.length === 0)
|
|
57
|
+
return raw;
|
|
58
|
+
const out = { ...raw };
|
|
59
|
+
for (const { kind, name, why } of unusable) {
|
|
60
|
+
warnOnce(`config:unusable:${kind}:${sourcePath ?? "inline"}:${name}`, `Ignoring ${kind} "${name}"${sourcePath ? ` in ${sourcePath}` : ""}: ${why}.`);
|
|
61
|
+
const holder = kind === "connection" ? "connections" : "harnesses";
|
|
62
|
+
const { [name]: _dropped, ...kept } = out[holder];
|
|
63
|
+
out[holder] = kept;
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
@@ -14,15 +14,12 @@ export function containsReflectPromptScaffolding(content) {
|
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Return a secret-free rejection reason when generated content is unsafe to
|
|
17
|
-
* persist.
|
|
18
|
-
*
|
|
17
|
+
* persist. A dispatch redacts its reply before anything reads it, so content
|
|
18
|
+
* that echoed a credential reaches here carrying the marker.
|
|
19
19
|
*/
|
|
20
|
-
export function generatedContentRejection(content
|
|
20
|
+
export function generatedContentRejection(content) {
|
|
21
21
|
if (containsRedactedContent(content)) {
|
|
22
22
|
return `Agent proposal content contains ${REDACTED_CONTENT_MARKER}; refusing to persist already-redacted text.`;
|
|
23
23
|
}
|
|
24
|
-
if (redactedContent !== content) {
|
|
25
|
-
return "Agent proposal content echoed a configured credential; refusing to persist either the secret or a redacted replacement.";
|
|
26
|
-
}
|
|
27
24
|
return undefined;
|
|
28
25
|
}
|