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
|
@@ -1,475 +0,0 @@
|
|
|
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 fs from "node:fs";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
import { fileURLToPath } from "node:url";
|
|
7
|
-
import { writeFileAtomic } from "../../core/common.js";
|
|
8
|
-
import { ENGINE_NAME_PATTERN_SOURCE } from "../../core/config/engine-semantics.js";
|
|
9
|
-
import { ConfigError, UsageError } from "../../core/errors.js";
|
|
10
|
-
import { getConfigDir } from "../../core/paths.js";
|
|
11
|
-
import { warnOnce } from "../../core/warn.js";
|
|
12
|
-
import { cloneExecutionJsonObject } from "../../execution/json.js";
|
|
13
|
-
/**
|
|
14
|
-
* Installed and operator-owned model intent aliases (#802). `resolveExecution`
|
|
15
|
-
* expands a recognized alias once, into an exact model and inference defaults
|
|
16
|
-
* at the layer that chose it; harness builders never reinterpret it.
|
|
17
|
-
*/
|
|
18
|
-
export const MODEL_MAP_VERSION = 1;
|
|
19
|
-
let standaloneInstalledModelMapText;
|
|
20
|
-
const ENGINE_KEY_PATTERN = new RegExp(ENGINE_NAME_PATTERN_SOURCE);
|
|
21
|
-
const ALIAS_KEY_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
22
|
-
const RESERVED_MAP_KEYS = new Set(["__proto__", "constructor", "prototype", "tostring"]);
|
|
23
|
-
/**
|
|
24
|
-
* A profile's own field names (#946). When one of these appears directly
|
|
25
|
-
* under an alias — e.g. `"fast": { "engine": "local-fast" }` — it is not a
|
|
26
|
-
* per-platform column named `model`/`inference`/`engine`; it is a wildcard
|
|
27
|
-
* default profile applied to every platform column of that alias, exactly
|
|
28
|
-
* the flat shorthand the original proposal asked for. A nested per-platform
|
|
29
|
-
* entry in the same alias (`"fast": { "claude": { ... } }`) still overrides
|
|
30
|
-
* the wildcard for that one column, so both forms compose.
|
|
31
|
-
*/
|
|
32
|
-
const PROFILE_FIELD_KEYS = new Set(["model", "inference", "engine"]);
|
|
33
|
-
/** Internal key the wildcard default profile is stored under (never user-writable directly). */
|
|
34
|
-
export const WILDCARD_ENGINE_KEY = "*";
|
|
35
|
-
function assertSafeMapKey(key, source, jsonPath) {
|
|
36
|
-
if (RESERVED_MAP_KEYS.has(key.toLowerCase())) {
|
|
37
|
-
invalid(source, jsonPath, "reserved prototype-like key is not allowed");
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
function invalid(source, jsonPath, detail) {
|
|
41
|
-
throw new ConfigError(`Invalid ${source} at ${jsonPath}: ${detail}`, "INVALID_CONFIG_FILE", `Fix ${source}, or remove the optional user models.json to use AKM's installed defaults.`);
|
|
42
|
-
}
|
|
43
|
-
function requireRecord(value, source, jsonPath) {
|
|
44
|
-
if (value === null ||
|
|
45
|
-
typeof value !== "object" ||
|
|
46
|
-
Array.isArray(value) ||
|
|
47
|
-
Object.getPrototypeOf(value) !== Object.prototype) {
|
|
48
|
-
invalid(source, jsonPath, "expected a JSON object");
|
|
49
|
-
}
|
|
50
|
-
return value;
|
|
51
|
-
}
|
|
52
|
-
function assertOnlyKeys(value, allowed, source, jsonPath) {
|
|
53
|
-
const allowedSet = new Set(allowed);
|
|
54
|
-
for (const key of Object.keys(value)) {
|
|
55
|
-
if (!allowedSet.has(key))
|
|
56
|
-
invalid(source, `${jsonPath}.${key}`, "unknown field");
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
function requireNonemptyString(value, source, jsonPath) {
|
|
60
|
-
if (typeof value !== "string" || value.length === 0 || value.trim() !== value) {
|
|
61
|
-
invalid(source, jsonPath, "expected a nonempty string without surrounding whitespace");
|
|
62
|
-
}
|
|
63
|
-
return value;
|
|
64
|
-
}
|
|
65
|
-
function freezeRecord(entries) {
|
|
66
|
-
const record = Object.create(null);
|
|
67
|
-
for (const [key, value] of entries)
|
|
68
|
-
record[key] = value;
|
|
69
|
-
return Object.freeze(record);
|
|
70
|
-
}
|
|
71
|
-
function ownValue(record, key) {
|
|
72
|
-
return record !== undefined && Object.hasOwn(record, key) ? record[key] : undefined;
|
|
73
|
-
}
|
|
74
|
-
function parseProfileLayer(value, source, jsonPath) {
|
|
75
|
-
if (typeof value === "string")
|
|
76
|
-
return requireNonemptyString(value, source, jsonPath);
|
|
77
|
-
const record = requireRecord(value, source, jsonPath);
|
|
78
|
-
assertOnlyKeys(record, ["model", "inference", "engine"], source, jsonPath);
|
|
79
|
-
if (!Object.hasOwn(record, "model") && !Object.hasOwn(record, "inference") && !Object.hasOwn(record, "engine")) {
|
|
80
|
-
invalid(source, jsonPath, "structured profile must contain model, inference, and/or engine");
|
|
81
|
-
}
|
|
82
|
-
if (Object.hasOwn(record, "model") && Object.hasOwn(record, "engine")) {
|
|
83
|
-
invalid(source, jsonPath, "model and engine cannot both be set; engine is an indirection for the model value");
|
|
84
|
-
}
|
|
85
|
-
const out = {};
|
|
86
|
-
if (Object.hasOwn(record, "model"))
|
|
87
|
-
out.model = requireNonemptyString(record.model, source, `${jsonPath}.model`);
|
|
88
|
-
if (Object.hasOwn(record, "engine")) {
|
|
89
|
-
const rawEngine = requireNonemptyString(record.engine, source, `${jsonPath}.engine`);
|
|
90
|
-
const engine = rawEngine.toLowerCase();
|
|
91
|
-
assertSafeMapKey(engine, source, `${jsonPath}.engine`);
|
|
92
|
-
if (!ENGINE_KEY_PATTERN.test(engine)) {
|
|
93
|
-
invalid(source, `${jsonPath}.engine`, "engine reference must be lowercase kebab-case");
|
|
94
|
-
}
|
|
95
|
-
out.engine = engine;
|
|
96
|
-
}
|
|
97
|
-
if (Object.hasOwn(record, "inference")) {
|
|
98
|
-
if (record.inference === null)
|
|
99
|
-
out.inference = null;
|
|
100
|
-
else {
|
|
101
|
-
try {
|
|
102
|
-
out.inference = cloneExecutionJsonObject(record.inference, `${source} ${jsonPath}.inference`);
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
invalid(source, `${jsonPath}.inference`, error instanceof Error ? error.message : String(error));
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return Object.freeze(out);
|
|
110
|
-
}
|
|
111
|
-
/** Parse one installed or user layer. Partial structured profiles are valid at this stage. */
|
|
112
|
-
export function parseModelMapLayer(text, source) {
|
|
113
|
-
let parsed;
|
|
114
|
-
try {
|
|
115
|
-
parsed = JSON.parse(text);
|
|
116
|
-
}
|
|
117
|
-
catch {
|
|
118
|
-
invalid(source, "$", "invalid JSON syntax");
|
|
119
|
-
}
|
|
120
|
-
const root = requireRecord(parsed, source, "$");
|
|
121
|
-
assertOnlyKeys(root, ["version", "aliases"], source, "$");
|
|
122
|
-
if (root.version !== MODEL_MAP_VERSION) {
|
|
123
|
-
invalid(source, "$.version", `expected version ${MODEL_MAP_VERSION}`);
|
|
124
|
-
}
|
|
125
|
-
if (!Object.hasOwn(root, "aliases"))
|
|
126
|
-
invalid(source, "$.aliases", "required field is missing");
|
|
127
|
-
const rawAliases = requireRecord(root.aliases, source, "$.aliases");
|
|
128
|
-
const aliases = [];
|
|
129
|
-
const aliasesSeen = new Map();
|
|
130
|
-
for (const [rawAlias, rawEngines] of Object.entries(rawAliases)) {
|
|
131
|
-
const alias = rawAlias.toLowerCase();
|
|
132
|
-
assertSafeMapKey(alias, source, `$.aliases.${rawAlias}`);
|
|
133
|
-
if (!ALIAS_KEY_PATTERN.test(alias))
|
|
134
|
-
invalid(source, `$.aliases.${rawAlias}`, "alias must be lowercase kebab-case");
|
|
135
|
-
const previous = aliasesSeen.get(alias);
|
|
136
|
-
if (previous !== undefined) {
|
|
137
|
-
invalid(source, `$.aliases.${rawAlias}`, `alias collides case-insensitively with ${previous}`);
|
|
138
|
-
}
|
|
139
|
-
aliasesSeen.set(alias, rawAlias);
|
|
140
|
-
const engineRecord = requireRecord(rawEngines, source, `$.aliases.${rawAlias}`);
|
|
141
|
-
if (Object.keys(engineRecord).length === 0) {
|
|
142
|
-
invalid(source, `$.aliases.${rawAlias}`, "alias must contain at least one engine mapping");
|
|
143
|
-
}
|
|
144
|
-
const engines = [];
|
|
145
|
-
const enginesSeen = new Map();
|
|
146
|
-
const wildcardFields = {};
|
|
147
|
-
const platformEntries = [];
|
|
148
|
-
for (const [rawKey, rawValue] of Object.entries(engineRecord)) {
|
|
149
|
-
if (PROFILE_FIELD_KEYS.has(rawKey))
|
|
150
|
-
wildcardFields[rawKey] = rawValue;
|
|
151
|
-
else
|
|
152
|
-
platformEntries.push([rawKey, rawValue]);
|
|
153
|
-
}
|
|
154
|
-
if (Object.keys(wildcardFields).length > 0) {
|
|
155
|
-
engines.push([WILDCARD_ENGINE_KEY, parseProfileLayer(wildcardFields, source, `$.aliases.${rawAlias}`)]);
|
|
156
|
-
}
|
|
157
|
-
for (const [rawEngine, rawProfile] of platformEntries) {
|
|
158
|
-
const engine = rawEngine.toLowerCase();
|
|
159
|
-
assertSafeMapKey(engine, source, `$.aliases.${rawAlias}.${rawEngine}`);
|
|
160
|
-
if (!ENGINE_KEY_PATTERN.test(engine)) {
|
|
161
|
-
invalid(source, `$.aliases.${rawAlias}.${rawEngine}`, "engine key must be lowercase kebab-case");
|
|
162
|
-
}
|
|
163
|
-
const previousEngine = enginesSeen.get(engine);
|
|
164
|
-
if (previousEngine !== undefined) {
|
|
165
|
-
invalid(source, `$.aliases.${rawAlias}.${rawEngine}`, `engine key collides case-insensitively with ${previousEngine}`);
|
|
166
|
-
}
|
|
167
|
-
enginesSeen.set(engine, rawEngine);
|
|
168
|
-
engines.push([engine, parseProfileLayer(rawProfile, source, `$.aliases.${rawAlias}.${rawEngine}`)]);
|
|
169
|
-
}
|
|
170
|
-
aliases.push([alias, freezeRecord(engines)]);
|
|
171
|
-
}
|
|
172
|
-
return Object.freeze({ version: MODEL_MAP_VERSION, aliases: freezeRecord(aliases) });
|
|
173
|
-
}
|
|
174
|
-
function isJsonObject(value) {
|
|
175
|
-
return value !== null && value !== undefined && typeof value === "object" && !Array.isArray(value);
|
|
176
|
-
}
|
|
177
|
-
function mergeJsonValue(base, overlay) {
|
|
178
|
-
if (!isJsonObject(base) || !isJsonObject(overlay))
|
|
179
|
-
return overlay;
|
|
180
|
-
const entries = new Map(Object.entries(base));
|
|
181
|
-
for (const [key, value] of Object.entries(overlay))
|
|
182
|
-
entries.set(key, mergeJsonValue(entries.get(key), value));
|
|
183
|
-
return Object.freeze(Object.fromEntries(entries));
|
|
184
|
-
}
|
|
185
|
-
function normalizeLayerEntry(entry) {
|
|
186
|
-
return typeof entry === "string" ? Object.freeze({ model: entry }) : entry;
|
|
187
|
-
}
|
|
188
|
-
function mergeProfiles(base, overlay) {
|
|
189
|
-
const next = normalizeLayerEntry(overlay);
|
|
190
|
-
const out = {};
|
|
191
|
-
if (base?.model !== undefined)
|
|
192
|
-
out.model = base.model;
|
|
193
|
-
if (base?.engine !== undefined)
|
|
194
|
-
out.engine = base.engine;
|
|
195
|
-
if (base && Object.hasOwn(base, "inference"))
|
|
196
|
-
out.inference = base.inference;
|
|
197
|
-
// A literal `model` and an `engine` indirection are mutually exclusive within
|
|
198
|
-
// one layer (enforced at parse time); across layers, whichever the nearer
|
|
199
|
-
// layer sets replaces the other so the merged profile keeps that invariant.
|
|
200
|
-
if (next.model !== undefined) {
|
|
201
|
-
out.model = next.model;
|
|
202
|
-
delete out.engine;
|
|
203
|
-
}
|
|
204
|
-
if (next.engine !== undefined) {
|
|
205
|
-
out.engine = next.engine;
|
|
206
|
-
delete out.model;
|
|
207
|
-
}
|
|
208
|
-
if (Object.hasOwn(next, "inference")) {
|
|
209
|
-
out.inference =
|
|
210
|
-
next.inference !== null && next.inference !== undefined && isJsonObject(base?.inference)
|
|
211
|
-
? mergeJsonValue(base.inference, next.inference)
|
|
212
|
-
: next.inference;
|
|
213
|
-
}
|
|
214
|
-
return Object.freeze(out);
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Derive the `{ model, inference }` a model-map profile borrows from a
|
|
218
|
-
* configured engine (#946). `resolveExecution` derives an engine's own
|
|
219
|
-
* defaults with the same function, so the two cannot diverge. `model` is
|
|
220
|
-
* copied verbatim from the engine's own config value; it must already be
|
|
221
|
-
* meaningful for the model-map column's platform (akm does not translate
|
|
222
|
-
* between an engine's connection and an agent platform's own provider
|
|
223
|
-
* registry). Only `kind: "llm"` engines contribute inference defaults — an
|
|
224
|
-
* agent-kind engine's schema carries no temperature/thinking fields.
|
|
225
|
-
*/
|
|
226
|
-
export function engineModelAndInference(engine) {
|
|
227
|
-
const out = {};
|
|
228
|
-
if (Object.hasOwn(engine, "model") && engine.model !== undefined)
|
|
229
|
-
out.model = engine.model;
|
|
230
|
-
if (engine.kind === "llm") {
|
|
231
|
-
const inference = {};
|
|
232
|
-
if (Object.hasOwn(engine, "temperature"))
|
|
233
|
-
inference.temperature = engine.temperature;
|
|
234
|
-
if (Object.hasOwn(engine, "maxTokens"))
|
|
235
|
-
inference.maxTokens = engine.maxTokens;
|
|
236
|
-
if (Object.hasOwn(engine, "supportsJsonSchema"))
|
|
237
|
-
inference.supportsJsonSchema = engine.supportsJsonSchema;
|
|
238
|
-
if (Object.hasOwn(engine, "extraParams"))
|
|
239
|
-
inference.extraParams = engine.extraParams;
|
|
240
|
-
if (Object.hasOwn(engine, "contextLength"))
|
|
241
|
-
inference.contextLength = engine.contextLength;
|
|
242
|
-
if (Object.hasOwn(engine, "enableThinking"))
|
|
243
|
-
inference.enableThinking = engine.enableThinking;
|
|
244
|
-
if (Object.hasOwn(engine, "reasoningEffort"))
|
|
245
|
-
inference.reasoningEffort = engine.reasoningEffort;
|
|
246
|
-
if (Object.keys(inference).length > 0)
|
|
247
|
-
out.inference = inference;
|
|
248
|
-
}
|
|
249
|
-
return Object.freeze(out);
|
|
250
|
-
}
|
|
251
|
-
/** Overlay user fields over installed fields, per (alias, column), without resolving `engine` indirection. */
|
|
252
|
-
function mergeRawProfileLayers(installed, user) {
|
|
253
|
-
const aliases = new Map();
|
|
254
|
-
const apply = (layer) => {
|
|
255
|
-
for (const [alias, layerEngines] of Object.entries(layer.aliases)) {
|
|
256
|
-
const mergedEngines = aliases.get(alias) ?? new Map();
|
|
257
|
-
const wildcard = ownValue(layerEngines, WILDCARD_ENGINE_KEY);
|
|
258
|
-
if (wildcard !== undefined) {
|
|
259
|
-
// This layer's wildcard default (#946) overlays every platform column
|
|
260
|
-
// already accumulated from earlier layers, before this layer's own
|
|
261
|
-
// explicit per-platform entries (applied below) get a chance to
|
|
262
|
-
// override it for their one column.
|
|
263
|
-
for (const [engineKey, profile] of mergedEngines) {
|
|
264
|
-
if (engineKey === WILDCARD_ENGINE_KEY)
|
|
265
|
-
continue;
|
|
266
|
-
mergedEngines.set(engineKey, mergeProfiles(profile, wildcard));
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
for (const [engineKey, profile] of Object.entries(layerEngines)) {
|
|
270
|
-
mergedEngines.set(engineKey, mergeProfiles(mergedEngines.get(engineKey), profile));
|
|
271
|
-
}
|
|
272
|
-
aliases.set(alias, mergedEngines);
|
|
273
|
-
}
|
|
274
|
-
};
|
|
275
|
-
apply(installed);
|
|
276
|
-
if (user)
|
|
277
|
-
apply(user);
|
|
278
|
-
return aliases;
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* The overlaid-but-unresolved profile per (alias, column), before any
|
|
282
|
-
* `engine` indirection is expanded. `akm models list` (#946) uses this to
|
|
283
|
-
* report whether a column resolves through a literal `model` or an `engine`
|
|
284
|
-
* reference — information {@link mergeModelMapLayers} collapses away once it
|
|
285
|
-
* performs the final resolution.
|
|
286
|
-
*/
|
|
287
|
-
export function mergedModelMapProfiles(installed, user) {
|
|
288
|
-
const aliases = mergeRawProfileLayers(installed, user);
|
|
289
|
-
const out = [];
|
|
290
|
-
for (const [alias, engineProfiles] of aliases)
|
|
291
|
-
out.push([alias, freezeRecord(engineProfiles)]);
|
|
292
|
-
return freezeRecord(out);
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Overlay user fields over installed fields, resolve any `engine` indirection
|
|
296
|
-
* against configured engines, then enforce usable merged profiles.
|
|
297
|
-
*/
|
|
298
|
-
export function mergeModelMapLayers(installed, user, engines) {
|
|
299
|
-
const aliases = mergeRawProfileLayers(installed, user);
|
|
300
|
-
const resolvedAliases = [];
|
|
301
|
-
for (const [alias, engineProfiles] of aliases) {
|
|
302
|
-
const resolvedEngines = [];
|
|
303
|
-
for (const [engineKey, profile] of engineProfiles) {
|
|
304
|
-
let model = profile.model;
|
|
305
|
-
let inference = Object.hasOwn(profile, "inference") ? profile.inference : undefined;
|
|
306
|
-
if (model === undefined && profile.engine !== undefined) {
|
|
307
|
-
const target = ownValue(engines, profile.engine);
|
|
308
|
-
if (target === undefined) {
|
|
309
|
-
invalid("merged models.json", `$.aliases.${alias}.${engineKey}.engine`, `references unknown engine ${JSON.stringify(profile.engine)}; a usable model is required after overlay`);
|
|
310
|
-
}
|
|
311
|
-
const expansion = engineModelAndInference(target);
|
|
312
|
-
if (expansion.model === undefined) {
|
|
313
|
-
invalid("merged models.json", `$.aliases.${alias}.${engineKey}.engine`, `engine ${JSON.stringify(profile.engine)} has no usable model; a usable model is required after overlay`);
|
|
314
|
-
}
|
|
315
|
-
model = expansion.model;
|
|
316
|
-
inference =
|
|
317
|
-
inference === undefined
|
|
318
|
-
? expansion.inference
|
|
319
|
-
: inference !== null && isJsonObject(expansion.inference)
|
|
320
|
-
? mergeJsonValue(expansion.inference, inference)
|
|
321
|
-
: inference;
|
|
322
|
-
}
|
|
323
|
-
if (model === undefined) {
|
|
324
|
-
invalid("merged models.json", `$.aliases.${alias}.${engineKey}.model`, "a usable model is required after overlay");
|
|
325
|
-
}
|
|
326
|
-
resolvedEngines.push([engineKey, Object.freeze(inference !== undefined ? { model, inference } : { model })]);
|
|
327
|
-
}
|
|
328
|
-
resolvedAliases.push([alias, freezeRecord(resolvedEngines)]);
|
|
329
|
-
}
|
|
330
|
-
return Object.freeze({ version: MODEL_MAP_VERSION, aliases: freezeRecord(resolvedAliases) });
|
|
331
|
-
}
|
|
332
|
-
function selectionFromProfile(input, profile) {
|
|
333
|
-
if (!profile.model)
|
|
334
|
-
throw new ConfigError(`Model alias ${JSON.stringify(input)} does not resolve to a usable model.`);
|
|
335
|
-
return Object.freeze({
|
|
336
|
-
input,
|
|
337
|
-
interpretation: "alias",
|
|
338
|
-
model: profile.model,
|
|
339
|
-
...(Object.hasOwn(profile, "inference") ? { inference: profile.inference } : {}),
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
/** Resolve one alias through the merged installed/user registry. */
|
|
343
|
-
export function resolveModelMapAlias(input, engine, map) {
|
|
344
|
-
const alias = input.toLowerCase();
|
|
345
|
-
const selectedEngine = engine.toLowerCase();
|
|
346
|
-
const tier = ownValue(map.aliases, alias);
|
|
347
|
-
// A specific platform column always wins; the alias-level wildcard default
|
|
348
|
-
// (#946) is only a fallback for a column no layer ever set explicitly.
|
|
349
|
-
const profile = ownValue(tier, selectedEngine) ?? ownValue(tier, WILDCARD_ENGINE_KEY);
|
|
350
|
-
if (profile !== undefined)
|
|
351
|
-
return selectionFromProfile(input, profile);
|
|
352
|
-
const knownAliasUnmappedForEngine = tier !== undefined;
|
|
353
|
-
if (knownAliasUnmappedForEngine) {
|
|
354
|
-
warnOnce(`model-map-alias-no-engine-mapping:${alias}:${selectedEngine}`, `[akm] Model alias ${JSON.stringify(input)} has no mapping for engine ${JSON.stringify(engine)}; using ${JSON.stringify(input)} as the literal model name. Add $.aliases.${alias}.${engine} to models.json to map it.`);
|
|
355
|
-
}
|
|
356
|
-
return Object.freeze({
|
|
357
|
-
input,
|
|
358
|
-
interpretation: "exact",
|
|
359
|
-
model: input,
|
|
360
|
-
...(knownAliasUnmappedForEngine ? { unmappedForEngine: true } : {}),
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
export function userModelMapPath(env = process.env) {
|
|
364
|
-
return path.join(getConfigDir(env), "models.json");
|
|
365
|
-
}
|
|
366
|
-
function modelMapFileError(label, filePath, action) {
|
|
367
|
-
return new ConfigError(`${label} could not be ${action}: ${filePath}.`, "INVALID_CONFIG_FILE", `Ensure ${filePath} is a readable regular file owned by the expected user.`);
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Read one models.json. `optional` treats absence (including a dangling
|
|
371
|
-
* symlink) as "no file"; anything that is not a regular file is refused
|
|
372
|
-
* rather than read, so a FIFO cannot hang the CLI.
|
|
373
|
-
*/
|
|
374
|
-
function readModelMapFile(filePath, label, optional) {
|
|
375
|
-
let stat;
|
|
376
|
-
try {
|
|
377
|
-
stat = fs.statSync(filePath);
|
|
378
|
-
}
|
|
379
|
-
catch (error) {
|
|
380
|
-
if (optional && error?.code === "ENOENT")
|
|
381
|
-
return undefined;
|
|
382
|
-
throw modelMapFileError(label, filePath, optional ? "inspected" : "found");
|
|
383
|
-
}
|
|
384
|
-
if (!stat.isFile()) {
|
|
385
|
-
throw new ConfigError(`Unable to read ${label.toLowerCase()} because it is not a readable regular file: ${filePath}.`, "INVALID_CONFIG_FILE", "Replace it with a readable regular models.json file, or a symlink to one.");
|
|
386
|
-
}
|
|
387
|
-
try {
|
|
388
|
-
return fs.readFileSync(filePath, "utf8");
|
|
389
|
-
}
|
|
390
|
-
catch {
|
|
391
|
-
throw modelMapFileError(label, filePath, "read");
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
/** Resolve the one authoritative external-asset location for this runtime. */
|
|
395
|
-
export function installedModelMapPaths(moduleUrl = import.meta.url) {
|
|
396
|
-
const modulePath = fileURLToPath(moduleUrl);
|
|
397
|
-
const moduleDirectory = path.dirname(modulePath);
|
|
398
|
-
const unbundledModule = path.basename(moduleDirectory) === "agent" && path.basename(path.dirname(moduleDirectory)) === "integrations";
|
|
399
|
-
const assetPath = path.resolve(moduleDirectory, unbundledModule ? "../../assets/models.json" : "assets/models.json");
|
|
400
|
-
return Object.freeze([assetPath]);
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* Standalone bootstrap only. `scripts/akm-standalone.ts` derives these bytes
|
|
404
|
-
* from the authoritative JSON import that Bun embeds into the executable.
|
|
405
|
-
*/
|
|
406
|
-
export function registerStandaloneModelMapFallback(text) {
|
|
407
|
-
standaloneInstalledModelMapText = text;
|
|
408
|
-
}
|
|
409
|
-
/** Load installed bytes lazily so health can report a missing/bad package asset. */
|
|
410
|
-
export function readInstalledModelMapText(options = {}) {
|
|
411
|
-
if (options.installedText !== undefined)
|
|
412
|
-
return options.installedText;
|
|
413
|
-
// Registration occurs only in the compiled standalone bootstrap. Once set,
|
|
414
|
-
// the embedded authority must win over any mutable file beside the binary.
|
|
415
|
-
if (standaloneInstalledModelMapText !== undefined)
|
|
416
|
-
return standaloneInstalledModelMapText;
|
|
417
|
-
const candidates = installedModelMapPaths();
|
|
418
|
-
for (const candidate of candidates) {
|
|
419
|
-
const external = readModelMapFile(candidate, "Installed models.json", true);
|
|
420
|
-
if (external !== undefined)
|
|
421
|
-
return external;
|
|
422
|
-
}
|
|
423
|
-
throw new ConfigError(`Installed models.json is missing from this AKM installation (checked: ${candidates.join(", ")}).`, "INVALID_CONFIG_FILE", "Reinstall AKM so its dist/assets/models.json package asset is restored.");
|
|
424
|
-
}
|
|
425
|
-
/** Read and parse the installed authority plus the optional operator overlay, without resolving them. */
|
|
426
|
-
export function loadModelMapLayers(options = {}) {
|
|
427
|
-
const installed = parseModelMapLayer(readInstalledModelMapText(options), "installed models.json");
|
|
428
|
-
const userPath = userModelMapPath(options.env);
|
|
429
|
-
const userText = readModelMapFile(userPath, "User models.json", true);
|
|
430
|
-
const user = userText !== undefined ? parseModelMapLayer(userText, `user models.json (${userPath})`) : undefined;
|
|
431
|
-
return Object.freeze({ installed, ...(user ? { user } : {}), userPath, userStatus: user ? "loaded" : "absent" });
|
|
432
|
-
}
|
|
433
|
-
/** Load the installed authority plus the optional operator overlay. */
|
|
434
|
-
export function loadModelMap(options = {}) {
|
|
435
|
-
const { installed, user, userPath, userStatus } = loadModelMapLayers(options);
|
|
436
|
-
return Object.freeze({ map: mergeModelMapLayers(installed, user, options.engines), userPath, userStatus });
|
|
437
|
-
}
|
|
438
|
-
function targetExistsError(target, detail) {
|
|
439
|
-
return new UsageError(`${detail}: ${target}`, "RESOURCE_ALREADY_EXISTS", "Move the existing target aside, then retry. Use --overwrite only for a regular file you intend to replace.");
|
|
440
|
-
}
|
|
441
|
-
function copyIoError(target, action) {
|
|
442
|
-
return new ConfigError(`Unable to ${action} user models.json at ${target}.`, "INVALID_CONFIG_FILE", "Check the configuration directory ownership and permissions, then retry.");
|
|
443
|
-
}
|
|
444
|
-
/** `akm models copy-defaults`: copy the validated installed map into the config directory. */
|
|
445
|
-
export function copyDefaultModelMap(options = {}) {
|
|
446
|
-
const text = readInstalledModelMapText(options);
|
|
447
|
-
mergeModelMapLayers(parseModelMapLayer(text, "installed models.json"));
|
|
448
|
-
const target = userModelMapPath(options.env);
|
|
449
|
-
let existing;
|
|
450
|
-
try {
|
|
451
|
-
existing = fs.lstatSync(target);
|
|
452
|
-
}
|
|
453
|
-
catch (error) {
|
|
454
|
-
if (error?.code !== "ENOENT")
|
|
455
|
-
throw copyIoError(target, "inspect");
|
|
456
|
-
}
|
|
457
|
-
if (existing && !existing.isFile()) {
|
|
458
|
-
throw targetExistsError(target, "Refusing to replace a non-regular models.json target");
|
|
459
|
-
}
|
|
460
|
-
if (existing && options.overwrite !== true)
|
|
461
|
-
throw targetExistsError(target, "User models.json already exists");
|
|
462
|
-
try {
|
|
463
|
-
fs.mkdirSync(path.dirname(target), { recursive: true, mode: 0o700 });
|
|
464
|
-
}
|
|
465
|
-
catch {
|
|
466
|
-
throw copyIoError(target, "create the configuration directory for");
|
|
467
|
-
}
|
|
468
|
-
try {
|
|
469
|
-
writeFileAtomic(target, text, 0o600);
|
|
470
|
-
}
|
|
471
|
-
catch {
|
|
472
|
-
throw copyIoError(target, "write");
|
|
473
|
-
}
|
|
474
|
-
return { path: target, copied: true, overwritten: existing !== undefined };
|
|
475
|
-
}
|
|
@@ -1,107 +0,0 @@
|
|
|
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
|
-
* Aider CLI agent command builder (P2, plan §"The adapter contract" step 2 /
|
|
6
|
-
* §"Capability matrix").
|
|
7
|
-
*
|
|
8
|
-
* Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
|
|
9
|
-
* headless argv the `aider` CLI expects. Per the capability matrix the
|
|
10
|
-
* headless invocation is:
|
|
11
|
-
*
|
|
12
|
-
* aider -m "<p>" --yes-always
|
|
13
|
-
*
|
|
14
|
-
* with `--model <m>` for model selection, NO structured-output mode (Aider is
|
|
15
|
-
* the "none" tier — prompt-injected schema + embedded-JSON extraction), and
|
|
16
|
-
* NO session flag (resume is chat-history files, not an id).
|
|
17
|
-
*
|
|
18
|
-
* Platform-specific mapping decisions (all localized here, per the adapter
|
|
19
|
-
* contract):
|
|
20
|
-
*
|
|
21
|
-
* - **prompt** — `--message` is Aider's one-shot non-interactive mode (the
|
|
22
|
-
* matrix's `-m`; the long form is used for self-documenting argv). Unlike
|
|
23
|
-
* claude/codex/pi there is NO positional prompt and NO `--` end-of-options
|
|
24
|
-
* separator to hide behind: the prompt is a *flag value*. The glued
|
|
25
|
-
* `--message=<payload>` form is therefore used so a payload that begins
|
|
26
|
-
* with `-`/`--` binds to the flag lexically and can never be parsed as a
|
|
27
|
-
* separate option by Aider's argument parser.
|
|
28
|
-
* - **--yes-always** — always emitted: auto-confirms every interactive
|
|
29
|
-
* prompt (create file? run command? …), which is what makes a captured,
|
|
30
|
-
* unattended run possible. This is the matrix's documented headless shape.
|
|
31
|
-
* - **--no-pretty** — always emitted: disables colored/pretty terminal
|
|
32
|
-
* rendering so captured stdout is clean text for `./result-extractor.ts`
|
|
33
|
-
* (the same "dispatch is the captured path" reasoning as the Claude
|
|
34
|
-
* builder's unconditional `--print` and Codex's unconditional `--json`).
|
|
35
|
-
* - **systemPrompt** — Aider has no system-prompt flag (its nearest concept
|
|
36
|
-
* is conventions files via `--read`, which take a path, not text). Folded
|
|
37
|
-
* into the message payload — system text first, blank line, then the task —
|
|
38
|
-
* mirroring the codex builder's treatment.
|
|
39
|
-
* - **schema** — the matrix places Aider in the "via prompt+validate" tier
|
|
40
|
-
* with *no* structured output mode at all (plan §"Structured-output
|
|
41
|
-
* normalization", tier "none"): there is no schema flag and no JSON output
|
|
42
|
-
* flag, so the JSON Schema reaches it only as the instruction the shared
|
|
43
|
-
* request lowering appends to the prompt. Downstream, embedded-JSON
|
|
44
|
-
* extraction + the engine's shared retry-until-valid loop supply the
|
|
45
|
-
* validation Aider lacks. No temp schema file is written — that is Codex's
|
|
46
|
-
* native-schema mechanism (`--output-schema`), which Aider does not have.
|
|
47
|
-
* - **tools** — deliberately unconsumed. Aider has no per-tool allowlist
|
|
48
|
-
* flag; tool-ish behaviour is governed by its own switches (`--yes-always`,
|
|
49
|
-
* git integration, shell-command confirmation). A restrictive policy is
|
|
50
|
-
* therefore dropped rather than approximated — never silently widened.
|
|
51
|
-
* - **resume/session** — NOT expressible: Aider persists context in
|
|
52
|
-
* chat-history files (`.aider.chat.history.md`), not session ids, so there
|
|
53
|
-
* is no flag-shaped resume to describe and the extractor
|
|
54
|
-
* never yields a `sessionId`. akm's `workflow_run_units` remains the
|
|
55
|
-
* durable source of truth; resume works even against a harness with no
|
|
56
|
-
* session model (plan §"Session, MCP, and identity across harnesses" —
|
|
57
|
-
* Aider is the plan's named example).
|
|
58
|
-
* - **inference** — not translated: the shared lowering reports each field of
|
|
59
|
-
* the request's inference as untranslated.
|
|
60
|
-
*
|
|
61
|
-
* Registered: `aiderBuilder` is `AiderHarness.agentBuilder` (`./index.ts`),
|
|
62
|
-
* one of the ten harnesses `HARNESS_REGISTRY` constructs
|
|
63
|
-
* (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
|
|
64
|
-
* that registry, so this builder is reachable under the `"aider"` platform
|
|
65
|
-
* name without any further wiring.
|
|
66
|
-
*/
|
|
67
|
-
import { resolveDispatchModel } from "../../agent/builder-shared.js";
|
|
68
|
-
import { createAgentRequestLowerer } from "../../agent/request-lowering.js";
|
|
69
|
-
/** Canonical harness/platform id used for model-alias resolution. */
|
|
70
|
-
export const AIDER_PLATFORM = "aider";
|
|
71
|
-
/** Assemble the `--message` payload: optional system text, then the task prompt. */
|
|
72
|
-
function buildMessagePayload(req) {
|
|
73
|
-
const sections = [];
|
|
74
|
-
if (req.systemPrompt)
|
|
75
|
-
sections.push(req.systemPrompt);
|
|
76
|
-
sections.push(req.prompt);
|
|
77
|
-
return sections.join("\n\n");
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Aider builder.
|
|
81
|
-
* Command shape:
|
|
82
|
-
* aider [--model <m>] --yes-always --no-pretty --message=<[system\n\n]prompt>
|
|
83
|
-
*/
|
|
84
|
-
export const aiderBuilder = {
|
|
85
|
-
platform: AIDER_PLATFORM,
|
|
86
|
-
personaChannel: "prompt",
|
|
87
|
-
lower: createAgentRequestLowerer({
|
|
88
|
-
adapter: AIDER_PLATFORM,
|
|
89
|
-
personaChannel: "prompt",
|
|
90
|
-
tools: "none",
|
|
91
|
-
}),
|
|
92
|
-
build(profile, req) {
|
|
93
|
-
const args = [...profile.args];
|
|
94
|
-
if (req.model) {
|
|
95
|
-
const resolved = resolveDispatchModel(req, profile, AIDER_PLATFORM);
|
|
96
|
-
args.push("--model", resolved);
|
|
97
|
-
}
|
|
98
|
-
// Headless essentials (matrix shape): auto-confirm everything, and keep
|
|
99
|
-
// captured stdout free of pretty/ANSI rendering for the extractor.
|
|
100
|
-
args.push("--yes-always");
|
|
101
|
-
args.push("--no-pretty");
|
|
102
|
-
// Glued form: the payload is a flag VALUE (no positional prompt exists),
|
|
103
|
-
// so `=` binding keeps a dash-leading payload from parsing as an option.
|
|
104
|
-
args.push(`--message=${buildMessagePayload(req)}`);
|
|
105
|
-
return { argv: [profile.bin, ...args] };
|
|
106
|
-
},
|
|
107
|
-
};
|
|
@@ -1,53 +0,0 @@
|
|
|
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
|
-
* ANSI escape sequences (CSI color/cursor codes). Defensive only: the builder
|
|
6
|
-
* always passes `--no-pretty`, but a user profile may override that.
|
|
7
|
-
* Constructed from a char code so no literal control character appears in
|
|
8
|
-
* source (lint-friendly, same bytes).
|
|
9
|
-
*/
|
|
10
|
-
const ANSI_ESCAPE_RE = new RegExp(`${String.fromCharCode(27)}\\[[0-9;?]*[ -/]*[@-~]`, "g");
|
|
11
|
-
/**
|
|
12
|
-
* Aider's own announcement lines — banner, model/repo configuration echo,
|
|
13
|
-
* chat-history notices, edit/commit/usage reports. All patterns are anchored
|
|
14
|
-
* at line start and match documented phrasings only; anything else is treated
|
|
15
|
-
* as reply content.
|
|
16
|
-
*/
|
|
17
|
-
const NOISE_LINE_PATTERNS = [
|
|
18
|
-
/^aider v\d/, // version banner
|
|
19
|
-
/^(Main model|Weak model|Editor model|Model):\s/, // model announcements
|
|
20
|
-
/^Git repo:\s/, // repo detection
|
|
21
|
-
/^Repo-map:\s/, // repo-map status
|
|
22
|
-
/^Added .+ to the chat\.?$/, // file add notices
|
|
23
|
-
/^Restored previous conversation history\.?$/, // chat-history reload notice
|
|
24
|
-
/^Use \/help\b/, // onboarding hint line
|
|
25
|
-
/^Tokens: .+/, // usage/cost footer
|
|
26
|
-
/^Cost: .+/, // standalone cost footer
|
|
27
|
-
/^Applied edit to .+/, // edit application notices
|
|
28
|
-
/^Commit [0-9a-f]{6,}\b/, // auto-commit notices
|
|
29
|
-
/^You can use \/undo\b/, // undo hint after auto-commit
|
|
30
|
-
/^[─━-]{4,}$/, // ── / ━━ / ---- separator rules
|
|
31
|
-
];
|
|
32
|
-
function isNoiseLine(line) {
|
|
33
|
-
return NOISE_LINE_PATTERNS.some((pattern) => pattern.test(line));
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Normalize a raw aider run result into `{ text, sessionId? }`.
|
|
37
|
-
* See the module doc for the stdout shape handled.
|
|
38
|
-
*/
|
|
39
|
-
export const aiderResultExtractor = (result) => {
|
|
40
|
-
const raw = result.stdout.replace(ANSI_ESCAPE_RE, "").trim();
|
|
41
|
-
const kept = raw
|
|
42
|
-
.split("\n")
|
|
43
|
-
.filter((line) => !isNoiseLine(line.trim()))
|
|
44
|
-
.join("\n")
|
|
45
|
-
.trim();
|
|
46
|
-
// Never return empty text when stdout had content: an all-noise filter
|
|
47
|
-
// outcome means the patterns over-matched for this capture, so fall back to
|
|
48
|
-
// the full trimmed stdout (downstream parsing still gets material).
|
|
49
|
-
const text = kept.length > 0 ? kept : raw;
|
|
50
|
-
// No session model (chat-history files, not ids): only a spawn-layer id
|
|
51
|
-
// passes through; output never supplies one.
|
|
52
|
-
return result.sessionId === undefined ? { text } : { text, sessionId: result.sessionId };
|
|
53
|
-
};
|