akm-cli 0.9.16 → 0.9.17-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2101 -0
- package/STABILITY.md +11 -10
- package/dist/akm +124 -193
- package/dist/akm-migrate +38 -19
- package/dist/assets/hints/cli-hints-full.md +6 -7
- package/dist/assets/improve-strategies/catchup.json +0 -3
- package/dist/assets/improve-strategies/consolidate.json +0 -1
- package/dist/assets/improve-strategies/default.json +1 -2
- package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
- package/dist/assets/improve-strategies/quick.json +1 -2
- package/dist/assets/improve-strategies/reflect-distill.json +1 -2
- package/dist/assets/improve-strategies/thorough.json +0 -3
- package/dist/assets/prompts/consolidate-pair.md +20 -0
- package/dist/assets/prompts/consolidate-system.md +4 -11
- package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
- package/dist/assets/templates/html/health.html +3 -5
- package/dist/cli/retired-commands.js +1 -1
- package/dist/cli/shared.js +6 -2
- package/dist/cli/unknown-flags.js +24 -1
- package/dist/cli.js +68 -10
- package/dist/commands/agent/agent-dispatch.js +1 -1
- package/dist/commands/command/command-execution.js +24 -62
- package/dist/commands/feedback-cli.js +0 -1
- package/dist/commands/health/accept-rate.js +6 -0
- package/dist/commands/health/archive-usage.js +92 -0
- package/dist/commands/health/checks.js +83 -74
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/data-dir-usage.js +25 -13
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +1 -42
- package/dist/commands/health/improve-metrics.js +136 -591
- package/dist/commands/health/md-report.js +1 -6
- package/dist/commands/health/plugin-staleness.js +53 -3
- package/dist/commands/health/renderers.js +12 -4
- package/dist/commands/health/report-view-model.js +14 -120
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -74
- package/dist/commands/health.js +145 -143
- package/dist/commands/improve/consolidate/chunking.js +26 -117
- package/dist/commands/improve/consolidate/continuity-check.js +137 -0
- package/dist/commands/improve/consolidate/pair-pass.js +791 -0
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +589 -1127
- package/dist/commands/improve/content-hash.js +16 -24
- package/dist/commands/improve/distill/content-repair.js +18 -100
- package/dist/commands/improve/distill-guards.js +20 -81
- package/dist/commands/improve/distill-promotion-policy.js +23 -243
- package/dist/commands/improve/distill.js +608 -1041
- package/dist/commands/improve/eligibility.js +126 -390
- package/dist/commands/improve/execution.js +8 -10
- package/dist/commands/improve/extract-prompt.js +1 -2
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +75 -169
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +52 -4
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +480 -1074
- package/dist/commands/improve/ledger.js +119 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +415 -1073
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +16 -118
- package/dist/commands/improve/memory/memory-improve.js +266 -14
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -15
- package/dist/commands/improve/preparation.js +779 -2319
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +642 -1353
- package/dist/commands/improve/retrieval-gate.js +127 -0
- package/dist/commands/improve/retrieval-scope.js +92 -0
- package/dist/commands/improve/salience.js +41 -240
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +322 -0
- package/dist/commands/lint/base-linter.js +37 -15
- package/dist/commands/proposal/drain.js +261 -578
- package/dist/commands/proposal/proposal-cli.js +19 -20
- package/dist/commands/proposal/proposal-types.js +31 -24
- package/dist/commands/proposal/proposal.js +38 -8
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +1097 -1394
- package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
- package/dist/commands/proposal/validators/proposal-validators.js +1 -1
- package/dist/commands/proposal/validators/proposals.js +22 -89
- package/dist/commands/read/curate.js +105 -462
- package/dist/commands/read/knowledge.js +3 -2
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +57 -108
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +4 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +127 -29
- package/dist/commands/sources/installed-stashes.js +197 -746
- package/dist/commands/sources/schema-repair.js +98 -129
- package/dist/commands/sources/source-add.js +62 -12
- package/dist/commands/sources/source-manage.js +9 -2
- package/dist/commands/sources/stash-cli.js +24 -4
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +12 -13
- package/dist/commands/tasks/tasks.js +350 -936
- package/dist/commands/tasks/validate.js +26 -24
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +2 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +42 -12
- package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/asset-placement.js +4 -13
- package/dist/core/asset/frontmatter.js +106 -1
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +285 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +9 -34
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +184 -111
- package/dist/core/config/engine-semantics.js +0 -2
- package/dist/core/config/legacy-source-shape-shim.js +38 -9
- package/dist/core/config/schema/embedding.js +20 -5
- package/dist/core/config/schema/engines.js +5 -0
- package/dist/core/config/schema/execution.js +1 -1
- package/dist/core/config/schema/experimental.js +1 -1
- package/dist/core/config/schema/improve-processes.js +54 -125
- package/dist/core/config/schema/improve.js +4 -42
- package/dist/core/config/schema/index-config.js +9 -48
- package/dist/core/config/schema/scheduler.js +12 -12
- package/dist/core/config/schema/search.js +6 -22
- package/dist/core/env-secret-ref.js +0 -1
- package/dist/core/errors.js +8 -9
- package/dist/core/file-change.js +13 -5
- package/dist/core/file-lock.js +76 -173
- package/dist/core/improve-result.js +35 -7
- package/dist/core/improve-types.js +0 -1
- package/dist/core/logs-db.js +2 -2
- package/dist/core/loopback.js +7 -12
- package/dist/core/non-task-input.js +20 -0
- package/dist/core/parse.js +13 -16
- package/dist/core/paths.js +0 -24
- package/dist/core/redaction.js +109 -2
- package/dist/core/run-lock.js +2 -5
- package/dist/core/spawn-env.js +1 -1
- package/dist/core/state/migrations.js +123 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/time.js +0 -20
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +294 -1005
- package/dist/execution/input-contract.js +1 -1
- package/dist/execution/resolved-request.js +135 -689
- package/dist/execution/source.js +63 -257
- package/dist/execution/target-ref.js +1 -1
- package/dist/indexer/bundle-identity-guard.js +2 -2
- package/dist/indexer/db/llm-cache.js +2 -2
- package/dist/indexer/ensure-index.js +77 -73
- package/dist/indexer/index-rebuild-lock.js +3 -11
- package/dist/indexer/index-writer-lock.js +8 -17
- package/dist/indexer/index-written-assets.js +141 -154
- package/dist/indexer/indexer.js +400 -1124
- package/dist/indexer/links/declared-links.js +90 -0
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +96 -90
- package/dist/indexer/passes/metadata.js +132 -219
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +2 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +190 -590
- package/dist/indexer/search/fts-query.js +30 -41
- package/dist/indexer/search/ranking.js +28 -154
- package/dist/indexer/search/search-attribution.js +12 -32
- package/dist/indexer/search/search-fields.js +11 -15
- package/dist/indexer/search/search-hit-enrichers.js +54 -85
- package/dist/indexer/search/search-source.js +1 -4
- package/dist/indexer/usage/usage-events.js +36 -7
- package/dist/indexer/walk/walker.js +3 -4
- package/dist/integrations/agent/engine-fallback.js +23 -40
- package/dist/integrations/agent/engine-resolution.js +93 -183
- package/dist/integrations/agent/execution.js +507 -0
- package/dist/integrations/agent/model-map.js +28 -156
- package/dist/integrations/agent/request-lowering.js +66 -141
- package/dist/integrations/agent/runner-dispatch.js +143 -321
- package/dist/integrations/agent/runner.js +54 -14
- package/dist/integrations/lockfile.js +53 -101
- package/dist/llm/client.js +18 -6
- package/dist/llm/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +11 -17
- package/dist/llm/feature-gate.js +0 -8
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/structured-call.js +5 -24
- package/dist/output/generic-render.js +23 -11
- package/dist/output/html-render.js +13 -10
- package/dist/output/render-registry.js +3 -32
- package/dist/output/shapes/helpers.js +25 -38
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +69 -31
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +48 -3
- package/dist/output/text/show-format.js +13 -17
- package/dist/output/text/workflow-format.js +0 -32
- package/dist/output/text.js +2 -0
- package/dist/registry/factory.js +4 -19
- package/dist/registry/network.js +66 -220
- package/dist/registry/providers/index.js +0 -2
- package/dist/registry/providers/skills-sh.js +3 -14
- package/dist/registry/providers/static-index.js +24 -26
- package/dist/registry/resolve.js +55 -131
- package/dist/scripts/akm-migrate-node.js +42948 -92369
- package/dist/scripts/akm-migrate.js +42935 -92354
- package/dist/setup/registry-stash-loader.js +4 -13
- package/dist/setup/semantic-assets.js +3 -44
- package/dist/setup/setup.js +1 -1
- package/dist/setup/steps/connection.js +5 -6
- package/dist/setup/steps/platforms.js +2 -2
- package/dist/setup/steps/tasks.js +25 -15
- package/dist/sources/provider-factory.js +17 -18
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +7 -1
- package/dist/sources/providers/git-provider.js +0 -3
- package/dist/sources/providers/git-stash.js +83 -21
- package/dist/sources/providers/npm.js +2 -4
- package/dist/sources/providers/provider-utils.js +5 -10
- package/dist/sources/providers/website.js +0 -2
- package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
- package/dist/sources/website-url.js +2 -2
- package/dist/storage/database.js +9 -35
- package/dist/storage/repositories/improve-ledger-repository.js +209 -0
- package/dist/storage/repositories/index-connection.js +39 -72
- package/dist/storage/repositories/index-entries-repository.js +131 -129
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +101 -268
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-links-repository.js +143 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +257 -325
- package/dist/storage/repositories/index-utility-repository.js +8 -29
- package/dist/storage/repositories/index-vec-repository.js +133 -414
- package/dist/storage/repositories/outcome-repository.js +2 -1
- package/dist/storage/repositories/proposals-repository.js +104 -1
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- package/dist/storage/repositories/salience-repository.js +1 -19
- package/dist/storage/repositories/task-history-repository.js +26 -4
- package/dist/storage/repositories/workflow-runs-repository.js +53 -244
- package/dist/storage/sqlite-migrations.js +136 -0
- package/dist/storage/sqlite-pragmas.js +11 -9
- package/dist/storage/sqlite-transaction.js +170 -0
- package/dist/storage/state-db-integrity.js +130 -0
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +191 -302
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +141 -748
- package/dist/tasks/backends/schtasks.js +119 -623
- package/dist/tasks/prepare/prepare-support.js +5 -15
- package/dist/tasks/prepare/prepare.js +0 -2
- package/dist/tasks/resolve-akm-bin.js +20 -79
- package/dist/tasks/run/attempt-lifecycle.js +0 -1
- package/dist/tasks/run/load-task.js +1 -1
- package/dist/tasks/scheduler-binding.js +20 -238
- package/dist/tasks/scheduler-invocation.js +136 -244
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +368 -679
- package/dist/tasks/source/parse-task-source.js +55 -9
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +464 -88
- package/dist/workflows/authoring/authoring.js +3 -12
- package/dist/workflows/compile.js +211 -0
- package/dist/workflows/concurrency-policy.js +13 -74
- package/dist/workflows/exec/child-invocation.js +3 -17
- package/dist/workflows/exec/child-workflow.js +32 -141
- package/dist/workflows/exec/dispatch-redaction.js +13 -53
- package/dist/workflows/exec/environment.js +98 -0
- package/dist/workflows/exec/exec-unit.js +33 -140
- package/dist/workflows/exec/frozen-judge.js +7 -59
- package/dist/workflows/exec/native-executor.js +82 -341
- package/dist/workflows/exec/param-secrets.js +29 -47
- package/dist/workflows/exec/run-workflow.js +154 -387
- package/dist/workflows/exec/scheduler.js +9 -36
- package/dist/workflows/exec/step-work.js +127 -430
- package/dist/workflows/exec/unit-dispatch.js +11 -63
- package/dist/workflows/exec/unit-writer.js +8 -52
- package/dist/workflows/exec/worktree.js +39 -273
- package/dist/workflows/freeze/child-output-references.js +4 -15
- package/dist/workflows/freeze/environment.js +99 -92
- package/dist/workflows/freeze/freeze.js +172 -0
- package/dist/workflows/freeze/step-values.js +19 -21
- package/dist/workflows/freeze/targets/child-workflow.js +23 -92
- package/dist/workflows/freeze/targets/command.js +10 -33
- package/dist/workflows/freeze/targets/script.js +5 -12
- package/dist/workflows/freeze/targets/shell.js +3 -6
- package/dist/workflows/freeze/targets/task.js +25 -80
- package/dist/workflows/freeze/task-bindings.js +20 -67
- package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
- package/dist/workflows/ir/params.js +6 -51
- package/dist/workflows/ir/plan-hash.js +2 -34
- package/dist/workflows/parser.js +140 -43
- package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
- package/dist/workflows/renderer.js +36 -69
- package/dist/workflows/resource-limits.js +12 -120
- package/dist/workflows/runtime/agent-identity.js +8 -40
- package/dist/workflows/runtime/run-outputs.js +3 -6
- package/dist/workflows/runtime/run-plan.js +316 -0
- package/dist/workflows/runtime/runs.js +48 -200
- package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
- package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
- package/dist/workflows/validate-summary.js +2 -7
- package/docs/integration/bundling-akm.md +49 -42
- package/docs/migration/README.md +1 -0
- package/docs/migration/release-notes/0.9.17.md +43 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
- package/docs/reference/cli.md +232 -135
- package/docs/reference/configuration.md +71 -57
- package/docs/reference/data-and-telemetry.md +20 -21
- package/docs/reference/tasks.md +105 -39
- package/docs/reference/workflow-schema.md +14 -18
- package/docs/reference/workflows.md +6 -9
- package/package.json +1 -1
- package/schemas/akm-config.json +115 -738
- package/schemas/akm-workflow.json +1 -0
- package/dist/assets/improve-strategies/graph-refresh.json +0 -15
- package/dist/assets/prompts/contradiction-judge.md +0 -33
- package/dist/assets/prompts/graph-extract-system.md +0 -1
- package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
- package/dist/assets/prompts/metadata-enhance-system.md +0 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
- package/dist/commands/health/advisories.js +0 -150
- package/dist/commands/health/metrics.js +0 -329
- package/dist/commands/health/surfaces.js +0 -102
- package/dist/commands/improve/anti-collapse.js +0 -83
- package/dist/commands/improve/collapse-detector.js +0 -432
- package/dist/commands/improve/consolidate/eligibility.js +0 -48
- package/dist/commands/improve/consolidate/merge.js +0 -149
- package/dist/commands/improve/distill/promote-memory.js +0 -291
- package/dist/commands/improve/distill/quality-gate.js +0 -337
- package/dist/commands/improve/eval-cases.js +0 -52
- package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
- package/dist/commands/improve/proposal-envelope.js +0 -31
- package/dist/commands/improve/run-context.js +0 -123
- package/dist/commands/improve/shared.js +0 -31
- package/dist/commands/improve/source-identity.js +0 -28
- package/dist/commands/improve/triage.js +0 -96
- package/dist/commands/proposal/drain-policies.js +0 -151
- package/dist/commands/sources/update-transaction.js +0 -220
- package/dist/core/action-contributors.js +0 -28
- package/dist/core/config/config-version-shim.js +0 -101
- package/dist/core/fs-txn.js +0 -405
- package/dist/core/lexical-score.js +0 -25
- package/dist/core/maintenance-barrier.js +0 -167
- package/dist/execution/executable-identity.js +0 -105
- package/dist/execution/guarded-source.js +0 -427
- package/dist/indexer/db/graph-db.js +0 -444
- package/dist/indexer/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/graph/graph-extraction.js +0 -1108
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- package/dist/indexer/search/ranking-types.js +0 -4
- package/dist/indexer/walk/project-context.js +0 -192
- package/dist/integrations/agent/execution-cascade.js +0 -566
- package/dist/integrations/agent/execution-definitions.js +0 -202
- package/dist/integrations/agent/execution-lowering.js +0 -841
- package/dist/integrations/agent/execution-preparation.js +0 -98
- package/dist/integrations/agent/inline-execution.js +0 -74
- package/dist/llm/graph-extract.js +0 -728
- package/dist/llm/metadata-enhance.js +0 -96
- package/dist/registry/create-provider-registry.js +0 -29
- package/dist/registry/pinned-request-helper.js +0 -247
- package/dist/registry/pinned-transport.js +0 -717
- package/dist/sources/providers/index.js +0 -14
- package/dist/storage/engines/sqlite-migrations.js +0 -271
- package/dist/storage/repositories/canaries-repository.js +0 -107
- package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
- package/dist/storage/repositories/registry-cache.js +0 -113
- package/dist/tasks/scheduler-sync-preview.js +0 -52
- package/dist/tasks/source/task-to-v3.js +0 -507
- package/dist/workflows/freeze/resolve-steps.js +0 -86
- package/dist/workflows/freeze/source-freeze.js +0 -64
- package/dist/workflows/ir/compile.js +0 -321
- package/dist/workflows/ir/environment-v4.js +0 -330
- package/dist/workflows/ir/freeze-v4.js +0 -153
- package/dist/workflows/ir/schema-v4.js +0 -745
- package/dist/workflows/ir/schema.js +0 -354
- package/dist/workflows/program/schema.js +0 -77
- package/dist/workflows/runtime/checkin.js +0 -57
- package/dist/workflows/runtime/plan-classifier.js +0 -196
- package/dist/workflows/runtime/unit-checkin.js +0 -45
- package/dist/workflows/runtime/unit-phases.js +0 -20
- package/dist/workflows/schema.js +0 -4
- package/dist/workflows/source-ir/compile.js +0 -200
- package/dist/workflows/source-ir/program.js +0 -50
- package/dist/workflows/source-ir/result.js +0 -26
- package/dist/workflows/source-ir/schema.js +0 -786
- package/dist/workflows/source-ir/triggers.js +0 -79
- package/dist/workflows/source-ir/uses.js +0 -40
- package/dist/workflows/validator.js +0 -60
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
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
|
-
import { randomBytes } from "node:crypto";
|
|
5
4
|
import fs from "node:fs";
|
|
6
5
|
import path from "node:path";
|
|
7
6
|
import { fileURLToPath } from "node:url";
|
|
@@ -12,14 +11,9 @@ import { getConfigDir } from "../../core/paths.js";
|
|
|
12
11
|
import { warnOnce } from "../../core/warn.js";
|
|
13
12
|
import { cloneExecutionJsonObject } from "../../execution/json.js";
|
|
14
13
|
/**
|
|
15
|
-
* Installed and operator-owned model intent aliases (#802
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* execution callers. A recognized alias expands once into exact model and
|
|
19
|
-
* inference defaults at its selecting layer; engine lowerers consume that
|
|
20
|
-
* resolved request and never reinterpret the alias. The independent API also
|
|
21
|
-
* remains usable by WP6/WP7 source and freeze adapters without hard-coding
|
|
22
|
-
* provider mappings.
|
|
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.
|
|
23
17
|
*/
|
|
24
18
|
export const MODEL_MAP_VERSION = 1;
|
|
25
19
|
let standaloneInstalledModelMapText;
|
|
@@ -221,9 +215,8 @@ function mergeProfiles(base, overlay) {
|
|
|
221
215
|
}
|
|
222
216
|
/**
|
|
223
217
|
* Derive the `{ model, inference }` a model-map profile borrows from a
|
|
224
|
-
* configured engine (#946).
|
|
225
|
-
*
|
|
226
|
-
* (`engineDefaults`) so the two paths cannot silently diverge. `model` is
|
|
218
|
+
* configured engine (#946). `resolveExecution` derives an engine's own
|
|
219
|
+
* defaults with the same function, so the two cannot diverge. `model` is
|
|
227
220
|
* copied verbatim from the engine's own config value; it must already be
|
|
228
221
|
* meaningful for the model-map column's platform (akm does not translate
|
|
229
222
|
* between an engine's connection and an agent platform's own provider
|
|
@@ -374,51 +367,29 @@ function modelMapFileError(label, filePath, action) {
|
|
|
374
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.`);
|
|
375
368
|
}
|
|
376
369
|
/**
|
|
377
|
-
* Read
|
|
378
|
-
*
|
|
379
|
-
*
|
|
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.
|
|
380
373
|
*/
|
|
381
374
|
function readModelMapFile(filePath, label, optional) {
|
|
382
|
-
let
|
|
375
|
+
let stat;
|
|
383
376
|
try {
|
|
384
|
-
|
|
377
|
+
stat = fs.statSync(filePath);
|
|
385
378
|
}
|
|
386
379
|
catch (error) {
|
|
387
380
|
if (optional && error?.code === "ENOENT")
|
|
388
381
|
return undefined;
|
|
389
382
|
throw modelMapFileError(label, filePath, optional ? "inspected" : "found");
|
|
390
383
|
}
|
|
391
|
-
if (!
|
|
384
|
+
if (!stat.isFile()) {
|
|
392
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.");
|
|
393
386
|
}
|
|
394
|
-
const nonblock = process.platform !== "win32" && typeof fs.constants.O_NONBLOCK === "number" ? fs.constants.O_NONBLOCK : 0;
|
|
395
|
-
let fd;
|
|
396
387
|
try {
|
|
397
|
-
|
|
398
|
-
const openedStat = fs.fstatSync(fd);
|
|
399
|
-
if (!sameFileIdentity(targetStat, openedStat)) {
|
|
400
|
-
throw new ConfigError(`${label} changed while it was being opened: ${filePath}.`, "INVALID_CONFIG_FILE", "Retry after ensuring no other process is replacing models.json.");
|
|
401
|
-
}
|
|
402
|
-
const text = fs.readFileSync(fd, "utf8");
|
|
403
|
-
fs.closeSync(fd);
|
|
404
|
-
fd = undefined;
|
|
405
|
-
return text;
|
|
388
|
+
return fs.readFileSync(filePath, "utf8");
|
|
406
389
|
}
|
|
407
|
-
catch
|
|
408
|
-
if (error instanceof ConfigError)
|
|
409
|
-
throw error;
|
|
390
|
+
catch {
|
|
410
391
|
throw modelMapFileError(label, filePath, "read");
|
|
411
392
|
}
|
|
412
|
-
finally {
|
|
413
|
-
if (fd !== undefined) {
|
|
414
|
-
try {
|
|
415
|
-
fs.closeSync(fd);
|
|
416
|
-
}
|
|
417
|
-
catch {
|
|
418
|
-
// The actionable read error above remains authoritative.
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
393
|
}
|
|
423
394
|
/** Resolve the one authoritative external-asset location for this runtime. */
|
|
424
395
|
export function installedModelMapPaths(moduleUrl = import.meta.url) {
|
|
@@ -465,139 +436,40 @@ export function loadModelMap(options = {}) {
|
|
|
465
436
|
return Object.freeze({ map: mergeModelMapLayers(installed, user, options.engines), userPath, userStatus });
|
|
466
437
|
}
|
|
467
438
|
function targetExistsError(target, detail) {
|
|
468
|
-
return new UsageError(`${detail}: ${target}`, "RESOURCE_ALREADY_EXISTS", "Move the existing target aside, then retry. Use --overwrite only for a
|
|
469
|
-
}
|
|
470
|
-
function copyIoError(target, action, hint) {
|
|
471
|
-
return new ConfigError(`Unable to ${action} user models.json at ${target}.`, "INVALID_CONFIG_FILE", hint ?? "Check the configuration directory ownership and permissions, then retry.");
|
|
472
|
-
}
|
|
473
|
-
function inspectCopyTarget(target) {
|
|
474
|
-
try {
|
|
475
|
-
return fs.lstatSync(target);
|
|
476
|
-
}
|
|
477
|
-
catch (error) {
|
|
478
|
-
if (error?.code === "ENOENT")
|
|
479
|
-
return undefined;
|
|
480
|
-
throw copyIoError(target, "inspect");
|
|
481
|
-
}
|
|
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.");
|
|
482
440
|
}
|
|
483
|
-
function
|
|
484
|
-
|
|
485
|
-
return false;
|
|
486
|
-
if (left.dev !== 0 || left.ino !== 0 || right.dev !== 0 || right.ino !== 0) {
|
|
487
|
-
return left.dev === right.dev && left.ino === right.ino;
|
|
488
|
-
}
|
|
489
|
-
return left.mode === right.mode && left.size === right.size && left.mtimeMs === right.mtimeMs;
|
|
490
|
-
}
|
|
491
|
-
function syncCopyDirectory(directory) {
|
|
492
|
-
if (process.platform === "win32")
|
|
493
|
-
return;
|
|
494
|
-
let fd;
|
|
495
|
-
try {
|
|
496
|
-
fd = fs.openSync(directory, fs.constants.O_RDONLY);
|
|
497
|
-
fs.fsyncSync(fd);
|
|
498
|
-
fs.closeSync(fd);
|
|
499
|
-
fd = undefined;
|
|
500
|
-
}
|
|
501
|
-
catch (error) {
|
|
502
|
-
const code = error?.code;
|
|
503
|
-
if (code !== "EINVAL" && code !== "ENOTSUP")
|
|
504
|
-
throw error;
|
|
505
|
-
}
|
|
506
|
-
finally {
|
|
507
|
-
if (fd !== undefined) {
|
|
508
|
-
try {
|
|
509
|
-
fs.closeSync(fd);
|
|
510
|
-
}
|
|
511
|
-
catch {
|
|
512
|
-
// A preceding sync/open failure is more useful than a cleanup failure.
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
function stageDefaultModelMap(target, text) {
|
|
518
|
-
const stage = `${target}.copy.${process.pid}.${randomBytes(8).toString("hex")}`;
|
|
519
|
-
try {
|
|
520
|
-
writeFileAtomic(stage, text, 0o600);
|
|
521
|
-
return stage;
|
|
522
|
-
}
|
|
523
|
-
catch {
|
|
524
|
-
throw copyIoError(target, "write a staged copy of");
|
|
525
|
-
}
|
|
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.");
|
|
526
443
|
}
|
|
527
|
-
/**
|
|
444
|
+
/** `akm models copy-defaults`: copy the validated installed map into the config directory. */
|
|
528
445
|
export function copyDefaultModelMap(options = {}) {
|
|
529
446
|
const text = readInstalledModelMapText(options);
|
|
530
447
|
mergeModelMapLayers(parseModelMapLayer(text, "installed models.json"));
|
|
531
448
|
const target = userModelMapPath(options.env);
|
|
449
|
+
let existing;
|
|
532
450
|
try {
|
|
533
|
-
fs.
|
|
451
|
+
existing = fs.lstatSync(target);
|
|
534
452
|
}
|
|
535
|
-
catch {
|
|
536
|
-
|
|
453
|
+
catch (error) {
|
|
454
|
+
if (error?.code !== "ENOENT")
|
|
455
|
+
throw copyIoError(target, "inspect");
|
|
537
456
|
}
|
|
538
|
-
const existing = inspectCopyTarget(target);
|
|
539
457
|
if (existing && !existing.isFile()) {
|
|
540
458
|
throw targetExistsError(target, "Refusing to replace a non-regular models.json target");
|
|
541
459
|
}
|
|
542
|
-
if (existing && options.overwrite !== true)
|
|
460
|
+
if (existing && options.overwrite !== true)
|
|
543
461
|
throw targetExistsError(target, "User models.json already exists");
|
|
544
|
-
}
|
|
545
|
-
const stage = stageDefaultModelMap(target, text);
|
|
546
|
-
let stagePresent = true;
|
|
547
462
|
try {
|
|
548
|
-
|
|
549
|
-
try {
|
|
550
|
-
// Hard-link publication is an atomic no-replace operation: EEXIST
|
|
551
|
-
// means a racing creator won, and their bytes remain untouched.
|
|
552
|
-
fs.linkSync(stage, target);
|
|
553
|
-
}
|
|
554
|
-
catch (error) {
|
|
555
|
-
if (error?.code === "EEXIST") {
|
|
556
|
-
throw targetExistsError(target, "User models.json was created while defaults were being prepared");
|
|
557
|
-
}
|
|
558
|
-
throw copyIoError(target, "publish");
|
|
559
|
-
}
|
|
560
|
-
try {
|
|
561
|
-
fs.unlinkSync(stage);
|
|
562
|
-
stagePresent = false;
|
|
563
|
-
}
|
|
564
|
-
catch {
|
|
565
|
-
// The target was already published atomically. Cleanup is best-effort
|
|
566
|
-
// from this point forward; `finally` retries without turning a
|
|
567
|
-
// successful copy into a false failure.
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
else {
|
|
571
|
-
const current = inspectCopyTarget(target);
|
|
572
|
-
if (!current || !sameFileIdentity(existing, current)) {
|
|
573
|
-
throw targetExistsError(target, "User models.json changed while defaults were being prepared");
|
|
574
|
-
}
|
|
575
|
-
try {
|
|
576
|
-
// rename replaces the directory entry itself; it never follows a
|
|
577
|
-
// symlink inserted after the final identity check.
|
|
578
|
-
fs.renameSync(stage, target);
|
|
579
|
-
stagePresent = false;
|
|
580
|
-
}
|
|
581
|
-
catch {
|
|
582
|
-
throw copyIoError(target, "replace");
|
|
583
|
-
}
|
|
584
|
-
}
|
|
463
|
+
fs.mkdirSync(path.dirname(target), { recursive: true, mode: 0o700 });
|
|
585
464
|
}
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
try {
|
|
589
|
-
fs.unlinkSync(stage);
|
|
590
|
-
}
|
|
591
|
-
catch {
|
|
592
|
-
// Best-effort cleanup; the target was never published from this path.
|
|
593
|
-
}
|
|
594
|
-
}
|
|
465
|
+
catch {
|
|
466
|
+
throw copyIoError(target, "create the configuration directory for");
|
|
595
467
|
}
|
|
596
468
|
try {
|
|
597
|
-
|
|
469
|
+
writeFileAtomic(target, text, 0o600);
|
|
598
470
|
}
|
|
599
471
|
catch {
|
|
600
|
-
throw copyIoError(target, "
|
|
472
|
+
throw copyIoError(target, "write");
|
|
601
473
|
}
|
|
602
474
|
return { path: target, copied: true, overwritten: existing !== undefined };
|
|
603
475
|
}
|
|
@@ -4,184 +4,109 @@
|
|
|
4
4
|
import { ConfigError } from "../../core/errors.js";
|
|
5
5
|
import { composeConversationFallbackPrompt } from "./conversation-fallback.js";
|
|
6
6
|
import { composePersonaFallbackPrompt } from "./persona-fallback.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
function hasToolSelection(value) {
|
|
11
|
-
if (value === null)
|
|
7
|
+
/** A tool selection that actually names tools (not omitted, null, or empty). */
|
|
8
|
+
export function hasToolSelection(value) {
|
|
9
|
+
if (value === null || value === undefined)
|
|
12
10
|
return false;
|
|
13
|
-
if (typeof value === "string")
|
|
14
|
-
return value.length > 0;
|
|
15
|
-
if (Array.isArray(value))
|
|
11
|
+
if (typeof value === "string" || Array.isArray(value))
|
|
16
12
|
return value.length > 0;
|
|
17
13
|
return Object.keys(value).length > 0;
|
|
18
14
|
}
|
|
19
15
|
function translatesTools(mode, value) {
|
|
20
|
-
if (!hasToolSelection(value))
|
|
21
|
-
return true;
|
|
22
16
|
if (mode === "all")
|
|
23
17
|
return true;
|
|
24
|
-
if (
|
|
25
|
-
return
|
|
26
|
-
|
|
27
|
-
return (typeof value === "string" ||
|
|
28
|
-
Array.isArray(value) ||
|
|
29
|
-
(value !== null && Object.values(value).every((entry) => typeof entry === "boolean")));
|
|
30
|
-
}
|
|
31
|
-
return false;
|
|
18
|
+
if (typeof value === "string" || Array.isArray(value))
|
|
19
|
+
return mode === "flat" || mode === "sdk";
|
|
20
|
+
return mode === "sdk" && value !== null && Object.values(value).every((entry) => typeof entry === "boolean");
|
|
32
21
|
}
|
|
33
|
-
|
|
34
|
-
|
|
22
|
+
/** The notice for a request field a transport does not carry; dispatch continues. */
|
|
23
|
+
export function untranslated(adapter, field) {
|
|
24
|
+
return {
|
|
35
25
|
code: "untranslated-field",
|
|
36
26
|
severity: "warning",
|
|
37
27
|
adapter,
|
|
38
28
|
field,
|
|
39
29
|
message: `The ${adapter} lowerer does not translate resolved field ${field}; dispatch will continue optimistically.`,
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function conversationFallbackNotice(adapter) {
|
|
43
|
-
return Object.freeze({
|
|
44
|
-
code: "conversation-prompt-composed",
|
|
45
|
-
severity: "warning",
|
|
46
|
-
adapter,
|
|
47
|
-
field: "conversation",
|
|
48
|
-
message: `The ${adapter} transport has no native multi-message channel; AKM composed the conversation prefix into one deterministic JSON prompt block.`,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
function selectedExtensionPaths(request) {
|
|
52
|
-
const out = [];
|
|
53
|
-
if (own(request, "extensions"))
|
|
54
|
-
out.push("extensions");
|
|
55
|
-
if (own(request.command, "extensions"))
|
|
56
|
-
out.push("command.extensions");
|
|
57
|
-
const persona = own(request, "persona") ? request.persona : undefined;
|
|
58
|
-
if (persona && own(persona, "extensions"))
|
|
59
|
-
out.push("persona.extensions");
|
|
60
|
-
if (own(request.engine, "extensions"))
|
|
61
|
-
out.push("engine.extensions");
|
|
62
|
-
if (own(request.runtime, "extensions"))
|
|
63
|
-
out.push("runtime.extensions");
|
|
64
|
-
return out;
|
|
30
|
+
};
|
|
65
31
|
}
|
|
66
|
-
|
|
67
|
-
|
|
32
|
+
/** Request fields carrying adapter-owned extensions, which no transport translates. */
|
|
33
|
+
export function extensionFields(request) {
|
|
34
|
+
return [
|
|
35
|
+
...(request.extensions ? ["extensions"] : []),
|
|
36
|
+
...(request.command.extensions ? ["command.extensions"] : []),
|
|
37
|
+
...(request.persona?.extensions ? ["persona.extensions"] : []),
|
|
38
|
+
...(request.engine.extensions ? ["engine.extensions"] : []),
|
|
39
|
+
...(request.runtime.extensions ? ["runtime.extensions"] : []),
|
|
40
|
+
];
|
|
68
41
|
}
|
|
69
42
|
/**
|
|
70
|
-
* Build one harness
|
|
71
|
-
*
|
|
72
|
-
*
|
|
43
|
+
* Build one harness's request builder: map a resolved request onto the
|
|
44
|
+
* harness-neutral {@link AgentDispatchRequest} its argv builder consumes,
|
|
45
|
+
* composing into the prompt what the harness has no channel for.
|
|
73
46
|
*/
|
|
74
47
|
export function createAgentRequestLowerer(options) {
|
|
75
48
|
const supportedInference = new Set(options.inference ?? []);
|
|
76
49
|
return (_profile, request) => {
|
|
77
|
-
const translated = new Set(["command.content", "engine"]);
|
|
78
|
-
for (const field of ["timeoutMs", "workspace", "environment"]) {
|
|
79
|
-
if (own(request.runtime, field))
|
|
80
|
-
translated.add(`runtime.${field}`);
|
|
81
|
-
}
|
|
82
|
-
const untranslated = new Set();
|
|
83
50
|
const notices = [];
|
|
84
|
-
const
|
|
85
|
-
untranslated.
|
|
86
|
-
notices.push(notice(options.adapter, field));
|
|
51
|
+
const skip = (field) => {
|
|
52
|
+
notices.push(untranslated(options.adapter, field));
|
|
87
53
|
};
|
|
88
54
|
let prompt = request.command.content;
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
55
|
+
if (request.conversation && request.conversation.length > 0) {
|
|
56
|
+
prompt = composeConversationFallbackPrompt(request.conversation, prompt);
|
|
57
|
+
notices.push({
|
|
58
|
+
code: "conversation-prompt-composed",
|
|
59
|
+
severity: "warning",
|
|
60
|
+
adapter: options.adapter,
|
|
61
|
+
field: "conversation",
|
|
62
|
+
message: `The ${options.adapter} transport has no native multi-message channel; AKM composed the conversation prefix into one deterministic JSON prompt block.`,
|
|
63
|
+
});
|
|
95
64
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (persona) {
|
|
101
|
-
if (options.personaChannel === "native") {
|
|
102
|
-
systemPrompt = persona.content;
|
|
103
|
-
translated.add("persona");
|
|
104
|
-
}
|
|
65
|
+
const dispatch = { prompt };
|
|
66
|
+
if (request.persona) {
|
|
67
|
+
if (options.personaChannel === "native")
|
|
68
|
+
dispatch.systemPrompt = request.persona.content;
|
|
105
69
|
else {
|
|
106
|
-
const composed = composePersonaFallbackPrompt(persona.content, prompt, options.adapter);
|
|
70
|
+
const composed = composePersonaFallbackPrompt(request.persona.content, prompt, options.adapter);
|
|
107
71
|
prompt = composed.prompt;
|
|
108
72
|
notices.push(...composed.notices);
|
|
109
|
-
translated.add("persona");
|
|
110
73
|
}
|
|
111
|
-
if (typeof agent === "string")
|
|
112
|
-
translated.add("agent");
|
|
113
74
|
}
|
|
114
|
-
else if (typeof agent === "string") {
|
|
75
|
+
else if (typeof request.agent === "string") {
|
|
115
76
|
if (!options.nativeAgentSelector) {
|
|
116
|
-
throw new ConfigError(`The ${options.adapter} transport cannot consume native agent selector ${JSON.stringify(agent)}.`, "INVALID_CONFIG_FILE");
|
|
117
|
-
}
|
|
118
|
-
nativeAgent = agent;
|
|
119
|
-
translated.add("agent");
|
|
120
|
-
}
|
|
121
|
-
else if (own(request, "agent")) {
|
|
122
|
-
translated.add("agent");
|
|
123
|
-
}
|
|
124
|
-
const dispatch = { prompt };
|
|
125
|
-
if (nativeAgent !== undefined)
|
|
126
|
-
dispatch.agent = nativeAgent;
|
|
127
|
-
if (systemPrompt !== undefined)
|
|
128
|
-
dispatch.systemPrompt = systemPrompt;
|
|
129
|
-
if (own(request, "model")) {
|
|
130
|
-
translated.add("model");
|
|
131
|
-
if (request.model) {
|
|
132
|
-
dispatch.model = request.model.resolved;
|
|
77
|
+
throw new ConfigError(`The ${options.adapter} transport cannot consume native agent selector ${JSON.stringify(request.agent)}.`, "INVALID_CONFIG_FILE");
|
|
133
78
|
}
|
|
79
|
+
dispatch.agent = request.agent;
|
|
134
80
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
else
|
|
144
|
-
reject(field);
|
|
145
|
-
}
|
|
146
|
-
if (typeof inference.effort === "string")
|
|
147
|
-
dispatch.effort = inference.effort;
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
translated.add("inference");
|
|
81
|
+
dispatch.prompt = prompt;
|
|
82
|
+
if (request.model)
|
|
83
|
+
dispatch.model = request.model.resolved;
|
|
84
|
+
if (Object.hasOwn(request, "inference")) {
|
|
85
|
+
dispatch.inference = request.inference ?? null;
|
|
86
|
+
for (const key of Object.keys(request.inference ?? {}).sort()) {
|
|
87
|
+
if (!supportedInference.has(key))
|
|
88
|
+
skip(`inference.${key}`);
|
|
151
89
|
}
|
|
90
|
+
if (typeof request.inference?.effort === "string")
|
|
91
|
+
dispatch.effort = request.inference.effort;
|
|
152
92
|
}
|
|
153
|
-
if (
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
reject("outputSchema");
|
|
158
|
-
if (request.outputSchema)
|
|
159
|
-
dispatch.schema = request.outputSchema;
|
|
93
|
+
if (request.outputSchema) {
|
|
94
|
+
if (!options.outputSchema)
|
|
95
|
+
skip("outputSchema");
|
|
96
|
+
dispatch.schema = request.outputSchema;
|
|
160
97
|
}
|
|
161
|
-
if (
|
|
162
|
-
|
|
163
|
-
if (translatesTools(options.tools, tools))
|
|
164
|
-
translated.add("tools");
|
|
165
|
-
else {
|
|
98
|
+
if (request.tools !== undefined) {
|
|
99
|
+
// An explicit empty selection still reaches the builder (e.g. an empty allowlist).
|
|
100
|
+
if (hasToolSelection(request.tools) && !translatesTools(options.tools, request.tools)) {
|
|
166
101
|
throw new ConfigError(`The ${options.adapter} transport cannot enforce the resolved tool policy.`, "INVALID_CONFIG_FILE");
|
|
167
102
|
}
|
|
168
|
-
dispatch.tools = tools;
|
|
169
|
-
}
|
|
170
|
-
if (own(request.runtime, "settings")) {
|
|
171
|
-
const settings = request.runtime.settings;
|
|
172
|
-
if (settings === null || Object.keys(settings).length === 0)
|
|
173
|
-
translated.add("runtime.settings");
|
|
174
|
-
else
|
|
175
|
-
reject("runtime.settings");
|
|
103
|
+
dispatch.tools = request.tools;
|
|
176
104
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
untranslatedFields: sortedUnique(untranslated),
|
|
184
|
-
notices: Object.freeze(notices),
|
|
185
|
-
});
|
|
105
|
+
const settings = request.runtime.settings;
|
|
106
|
+
if (settings && Object.keys(settings).length > 0)
|
|
107
|
+
skip("runtime.settings");
|
|
108
|
+
for (const field of extensionFields(request))
|
|
109
|
+
skip(field);
|
|
110
|
+
return { prompt, dispatch, notices };
|
|
186
111
|
};
|
|
187
112
|
}
|