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
package/dist/llm/memory-infer.js
CHANGED
|
@@ -18,10 +18,9 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import memoryInferSystemPrompt from "../assets/prompts/memory-infer-system.md" with { type: "text" };
|
|
20
20
|
import memoryInferUserPrompt from "../assets/prompts/memory-infer-user.md" with { type: "text" };
|
|
21
|
-
import {
|
|
21
|
+
import { effectiveRequestFields } from "../core/llm-inference.js";
|
|
22
22
|
import { parseEmbeddedJsonResponse } from "../core/parse.js";
|
|
23
23
|
import { warn } from "../core/warn.js";
|
|
24
|
-
import { runnerLlmConnection } from "../integrations/agent/runner.js";
|
|
25
24
|
import { callStructured } from "./structured-call.js";
|
|
26
25
|
const SYSTEM_PROMPT = memoryInferSystemPrompt;
|
|
27
26
|
const USER_PROMPT_PREFIX = memoryInferUserPrompt;
|
|
@@ -40,8 +39,7 @@ export function isMemoryInferNoChange(value) {
|
|
|
40
39
|
}
|
|
41
40
|
/**
|
|
42
41
|
* Strict JSON Schema for the derived-memory payload. Sent as `response_format`
|
|
43
|
-
*
|
|
44
|
-
* for a provider that rejects it.
|
|
42
|
+
* and the client drops it once for a provider that rejects it.
|
|
45
43
|
*
|
|
46
44
|
* Every property is required (a strict provider refuses otherwise), so the
|
|
47
45
|
* explicit no-change decision is `noChange: true` with the other fields empty.
|
|
@@ -61,6 +59,51 @@ export const DERIVED_MEMORY_JSON_SCHEMA = {
|
|
|
61
59
|
required: ["noChange", "title", "description", "content", "tags", "searchHints"],
|
|
62
60
|
additionalProperties: false,
|
|
63
61
|
};
|
|
62
|
+
/** The temperature a connection's request fields set, if any. */
|
|
63
|
+
function configuredTemperature(runner) {
|
|
64
|
+
const temperature = runner.kind === "connection" ? effectiveRequestFields(runner.request, runner.inference).temperature : undefined;
|
|
65
|
+
return typeof temperature === "number" ? temperature : undefined;
|
|
66
|
+
}
|
|
67
|
+
/** Read the model's reply: a draft, an explicit no-change decision, or `undefined` for one that is unusable. */
|
|
68
|
+
function parseDerivedMemory(raw) {
|
|
69
|
+
if (!raw)
|
|
70
|
+
return undefined;
|
|
71
|
+
const parsed = parseEmbeddedJsonResponse(raw);
|
|
72
|
+
if (!parsed) {
|
|
73
|
+
warn("memory inference: invalid JSON response from LLM; skipping memory.");
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
// Only a literal boolean `true` is a decision; anything else falls through
|
|
77
|
+
// to the complete-payload checks, so a malformed reply is never restraint.
|
|
78
|
+
if (parsed.noChange === true)
|
|
79
|
+
return MEMORY_INFER_NO_CHANGE;
|
|
80
|
+
const title = typeof parsed.title === "string" ? parsed.title.trim() : "";
|
|
81
|
+
const description = typeof parsed.description === "string" ? parsed.description.trim() : "";
|
|
82
|
+
const content = typeof parsed.content === "string" ? parsed.content.trim() : "";
|
|
83
|
+
const tags = Array.isArray(parsed.tags)
|
|
84
|
+
? parsed.tags
|
|
85
|
+
.filter((t) => typeof t === "string")
|
|
86
|
+
.map((t) => t.trim())
|
|
87
|
+
.filter(Boolean)
|
|
88
|
+
.slice(0, 8)
|
|
89
|
+
: [];
|
|
90
|
+
const searchHints = Array.isArray(parsed.searchHints)
|
|
91
|
+
? parsed.searchHints
|
|
92
|
+
.filter((h) => typeof h === "string")
|
|
93
|
+
.map((h) => h.trim())
|
|
94
|
+
.filter(Boolean)
|
|
95
|
+
.slice(0, 6)
|
|
96
|
+
: [];
|
|
97
|
+
if (!title || !description || !content || tags.length === 0 || searchHints.length === 0) {
|
|
98
|
+
warn("memory inference: incomplete derived memory payload from LLM; skipping memory.");
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
if ([title, description, content, ...tags, ...searchHints].some((value) => PROMPT_PLACEHOLDERS.has(value.toLowerCase()))) {
|
|
102
|
+
warn("memory inference: prompt placeholder response from LLM; skipping memory.");
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
return { title, description, tags, searchHints, content };
|
|
106
|
+
}
|
|
64
107
|
/**
|
|
65
108
|
* Compress a single memory into one derived memory via the configured LLM.
|
|
66
109
|
* `body` is the pass's effective input (a `Source context:` section, then the
|
|
@@ -68,92 +111,39 @@ export const DERIVED_MEMORY_JSON_SCHEMA = {
|
|
|
68
111
|
*
|
|
69
112
|
* Returns the draft, or {@link MEMORY_INFER_NO_CHANGE} when the model explicitly
|
|
70
113
|
* decides the memory needs no derived memory. Returns `undefined` on any failure
|
|
71
|
-
* (timeout, invalid JSON, empty or incomplete response, HTML, abort,
|
|
72
|
-
*
|
|
73
|
-
* must not abort the rest of the index
|
|
74
|
-
*
|
|
75
|
-
* Routes through `callStructured({ feature: "memory_inference", ... })` so the
|
|
76
|
-
* feature gate, error classification, and onFallback hook are honoured uniformly
|
|
77
|
-
* (Fix C5).
|
|
114
|
+
* (timeout, invalid JSON, empty or incomplete response, HTML, abort), which is
|
|
115
|
+
* never the same thing as no-change. Failures are logged via `warn()` but never
|
|
116
|
+
* thrown — a failed split for one memory must not abort the rest of the index
|
|
117
|
+
* pass. Whether the pass runs at all is the pass's decision, not this helper's.
|
|
78
118
|
*/
|
|
79
|
-
export async function compressMemoryToDerivedMemory(llmRunner, body, signal,
|
|
119
|
+
export async function compressMemoryToDerivedMemory(llmRunner, body, signal, telemetry, onRetryAttempt, onNotices) {
|
|
80
120
|
const trimmedBody = body.trim();
|
|
81
121
|
if (!trimmedBody)
|
|
82
122
|
return undefined;
|
|
83
|
-
const
|
|
84
|
-
// Memory inference is always gated: no config closes the gate instead of
|
|
85
|
-
// taking callStructured's ungated path for direct callers.
|
|
86
|
-
if (!akmConfig) {
|
|
87
|
-
onFallback?.({ feature: "memory_inference", reason: "disabled" });
|
|
88
|
-
return undefined;
|
|
89
|
-
}
|
|
90
|
-
return callStructured({
|
|
91
|
-
feature: "memory_inference",
|
|
92
|
-
akmConfig,
|
|
123
|
+
const outcome = await callStructured({
|
|
93
124
|
runner: llmRunner,
|
|
94
125
|
messages: [
|
|
95
126
|
{ role: "system", content: SYSTEM_PROMPT },
|
|
96
|
-
{ role: "user", content:
|
|
127
|
+
{ role: "user", content: `${USER_PROMPT_PREFIX}${trimmedBody}` },
|
|
97
128
|
],
|
|
98
129
|
request: {
|
|
99
|
-
// The
|
|
100
|
-
temperature:
|
|
101
|
-
...(Object.hasOwn(llmRunner, "timeoutMs") ? { timeoutMs: llmRunner.timeoutMs } : {}),
|
|
130
|
+
// The connection's or the process's configured temperature; 0.1 only when neither sets one.
|
|
131
|
+
temperature: configuredTemperature(llmRunner) ?? 0.1,
|
|
102
132
|
signal,
|
|
103
133
|
responseSchema: DERIVED_MEMORY_JSON_SCHEMA,
|
|
104
134
|
onRetryAttempt,
|
|
105
135
|
},
|
|
106
136
|
onNotices,
|
|
107
|
-
parse: (raw) => {
|
|
108
|
-
if (!raw)
|
|
109
|
-
return undefined;
|
|
110
|
-
const parsed = parseEmbeddedJsonResponse(raw);
|
|
111
|
-
if (!parsed) {
|
|
112
|
-
warn("memory inference: invalid JSON response from LLM; skipping memory.");
|
|
113
|
-
return undefined;
|
|
114
|
-
}
|
|
115
|
-
// Only a literal boolean `true` is a decision; anything else falls through
|
|
116
|
-
// to the complete-payload checks, so a malformed reply is never restraint.
|
|
117
|
-
if (parsed.noChange === true)
|
|
118
|
-
return MEMORY_INFER_NO_CHANGE;
|
|
119
|
-
const title = typeof parsed.title === "string" ? parsed.title.trim() : "";
|
|
120
|
-
const description = typeof parsed.description === "string" ? parsed.description.trim() : "";
|
|
121
|
-
const content = typeof parsed.content === "string" ? parsed.content.trim() : "";
|
|
122
|
-
const tags = Array.isArray(parsed.tags)
|
|
123
|
-
? parsed.tags
|
|
124
|
-
.filter((t) => typeof t === "string")
|
|
125
|
-
.map((t) => t.trim())
|
|
126
|
-
.filter(Boolean)
|
|
127
|
-
.slice(0, 8)
|
|
128
|
-
: [];
|
|
129
|
-
const searchHints = Array.isArray(parsed.searchHints)
|
|
130
|
-
? parsed.searchHints
|
|
131
|
-
.filter((h) => typeof h === "string")
|
|
132
|
-
.map((h) => h.trim())
|
|
133
|
-
.filter(Boolean)
|
|
134
|
-
.slice(0, 6)
|
|
135
|
-
: [];
|
|
136
|
-
if (!title || !description || !content || tags.length === 0 || searchHints.length === 0) {
|
|
137
|
-
warn("memory inference: incomplete derived memory payload from LLM; skipping memory.");
|
|
138
|
-
return undefined;
|
|
139
|
-
}
|
|
140
|
-
if ([title, description, content, ...tags, ...searchHints].some((value) => PROMPT_PLACEHOLDERS.has(value.toLowerCase()))) {
|
|
141
|
-
warn("memory inference: prompt placeholder response from LLM; skipping memory.");
|
|
142
|
-
return undefined;
|
|
143
|
-
}
|
|
144
|
-
return { title, description, tags, searchHints, content };
|
|
145
|
-
},
|
|
146
|
-
onError: (cls, err) => {
|
|
147
|
-
if (cls === "html") {
|
|
148
|
-
if (telemetry)
|
|
149
|
-
telemetry.htmlErrorCount = (telemetry.htmlErrorCount ?? 0) + 1;
|
|
150
|
-
warn(`memory inference: provider returned HTML instead of JSON; skipping memory: ${toErrorMessage(err)}`);
|
|
151
|
-
return undefined;
|
|
152
|
-
}
|
|
153
|
-
warn(`memory inference failed: ${toErrorMessage(err)}`);
|
|
154
|
-
return undefined;
|
|
155
|
-
},
|
|
156
|
-
fallback: undefined,
|
|
157
|
-
onFallback,
|
|
158
137
|
});
|
|
138
|
+
if (outcome.ok)
|
|
139
|
+
return parseDerivedMemory(outcome.raw);
|
|
140
|
+
if (outcome.result?.llmErrorCode === "provider_html_error") {
|
|
141
|
+
if (telemetry)
|
|
142
|
+
telemetry.htmlErrorCount = (telemetry.htmlErrorCount ?? 0) + 1;
|
|
143
|
+
warn(`memory inference: provider returned HTML instead of JSON; skipping memory: ${outcome.error}`);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
warn(`memory inference failed: ${outcome.error}`);
|
|
147
|
+
}
|
|
148
|
+
return undefined;
|
|
159
149
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
* The models an OpenAI-compatible endpoint serves: one `GET <base>/models`, with
|
|
6
|
+
* the connection's key when it has one. `akm setup` (the connection, its local-server
|
|
7
|
+
* detection and an embedding endpoint) and `akm models` list models this way, so
|
|
8
|
+
* what they show agrees. `akm health` asks only whether the endpoint answers, with
|
|
9
|
+
* its own request (`probeLlmEndpoint` in `client.ts`), and reads no list.
|
|
10
|
+
*/
|
|
11
|
+
import { openAiOperationUrl } from "../core/endpoint-url.js";
|
|
12
|
+
const LIST_TIMEOUT_MS = 3_000;
|
|
13
|
+
/** The model ids the endpoint lists, in the order it lists them. Never throws; a failure says why. */
|
|
14
|
+
export async function listEndpointModels(connection, timeoutMs = LIST_TIMEOUT_MS) {
|
|
15
|
+
try {
|
|
16
|
+
const response = await fetch(openAiOperationUrl(connection.endpoint, "models"), {
|
|
17
|
+
headers: connection.apiKey ? { authorization: `Bearer ${connection.apiKey}` } : {},
|
|
18
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
19
|
+
});
|
|
20
|
+
if (!response.ok)
|
|
21
|
+
return { ok: false, error: `HTTP ${response.status}` };
|
|
22
|
+
const body = (await response.json());
|
|
23
|
+
if (!Array.isArray(body.data))
|
|
24
|
+
return { ok: false, error: "the response has no model list" };
|
|
25
|
+
const ids = body.data.flatMap((entry) => typeof entry?.id === "string" && entry.id ? [entry.id] : []);
|
|
26
|
+
return { ok: true, models: [...new Set(ids)] };
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Whether a model id names an embedding model rather than a chat model. */
|
|
33
|
+
export function isEmbeddingModel(id) {
|
|
34
|
+
return /embed|nomic|minilm|bge/i.test(id);
|
|
35
|
+
}
|
|
@@ -25,10 +25,8 @@
|
|
|
25
25
|
* `core/config/schema/search.ts` for why.
|
|
26
26
|
*/
|
|
27
27
|
import { fetchWithTimeout, readBodyWithByteCap } from "../core/common.js";
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import { redactErrorBody, redactSensitiveText } from "../core/redaction.js";
|
|
31
|
-
import { resolveSecretFromStore } from "../sources/snapshot-fetchers/secret-seam.js";
|
|
28
|
+
import { resolveApiKey } from "../core/config/credentials.js";
|
|
29
|
+
import { redactErrorBody, redactSensitiveText, redactUrlCredentials } from "../core/redaction.js";
|
|
32
30
|
const DEFAULT_RERANK_TIMEOUT_MS = 10_000;
|
|
33
31
|
export class RerankCallError extends Error {
|
|
34
32
|
code;
|
|
@@ -44,10 +42,8 @@ export class RerankCallError extends Error {
|
|
|
44
42
|
* didn't return a score for keeps its original relative order, appended
|
|
45
43
|
* after every scored document (never dropped).
|
|
46
44
|
*
|
|
47
|
-
* Throws {@link RerankCallError} on any transport/parse failure —
|
|
48
|
-
* that
|
|
49
|
-
* (`llm/feature-gate.ts`), matching every other bounded in-tree LLM/rerank
|
|
50
|
-
* call site.
|
|
45
|
+
* Throws {@link RerankCallError} on any transport/parse failure — a caller
|
|
46
|
+
* that wants a graceful fallback catches it.
|
|
51
47
|
*/
|
|
52
48
|
export async function rerankDocuments(config, query, documents) {
|
|
53
49
|
if (!config.endpoint) {
|
|
@@ -55,9 +51,7 @@ export async function rerankDocuments(config, query, documents) {
|
|
|
55
51
|
}
|
|
56
52
|
if (documents.length === 0)
|
|
57
53
|
return [];
|
|
58
|
-
const resolvedKey = config.apiKey
|
|
59
|
-
? resolveSecret(config.apiKey, resolveSecretFromStore)
|
|
60
|
-
: config.apiKey;
|
|
54
|
+
const resolvedKey = resolveApiKey(config.apiKey, { service: "curateRerank" }, config.endpoint);
|
|
61
55
|
const headers = { "Content-Type": "application/json" };
|
|
62
56
|
if (resolvedKey)
|
|
63
57
|
headers.Authorization = `Bearer ${resolvedKey}`;
|
|
@@ -81,7 +75,7 @@ export async function rerankDocuments(config, query, documents) {
|
|
|
81
75
|
if (!response.ok) {
|
|
82
76
|
const rawBody = await readBodyWithByteCap(response).catch(() => "");
|
|
83
77
|
const safeBody = redactSensitiveText(redactErrorBody(rawBody), resolvedKey ? [resolvedKey] : []);
|
|
84
|
-
throw new RerankCallError(`Rerank request failed (${response.status}) ${config.endpoint}: ${safeBody}`, "provider_error");
|
|
78
|
+
throw new RerankCallError(`Rerank request failed (${response.status}) ${redactUrlCredentials(config.endpoint)}: ${safeBody}`, "provider_error");
|
|
85
79
|
}
|
|
86
80
|
const rawBody = await readBodyWithByteCap(response);
|
|
87
81
|
let json;
|
|
@@ -89,10 +83,10 @@ export async function rerankDocuments(config, query, documents) {
|
|
|
89
83
|
json = JSON.parse(rawBody);
|
|
90
84
|
}
|
|
91
85
|
catch {
|
|
92
|
-
throw new RerankCallError(`Rerank response was not valid JSON ${config.endpoint}: ${redactSensitiveText(redactErrorBody(rawBody), resolvedKey ? [resolvedKey] : [])}`, "parse_error");
|
|
86
|
+
throw new RerankCallError(`Rerank response was not valid JSON ${redactUrlCredentials(config.endpoint)}: ${redactSensitiveText(redactErrorBody(rawBody), resolvedKey ? [resolvedKey] : [])}`, "parse_error");
|
|
93
87
|
}
|
|
94
88
|
if (!Array.isArray(json.results)) {
|
|
95
|
-
throw new RerankCallError(`Rerank response from ${config.endpoint} has no "results" array.`, "parse_error");
|
|
89
|
+
throw new RerankCallError(`Rerank response from ${redactUrlCredentials(config.endpoint)} has no "results" array.`, "parse_error");
|
|
96
90
|
}
|
|
97
91
|
const scored = new Map();
|
|
98
92
|
for (const entry of json.results) {
|
|
@@ -1,34 +1,29 @@
|
|
|
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 { ConfigError } from "../core/errors.js";
|
|
5
|
-
import { DEFAULT_LLM_TIMEOUT_MS } from "../integrations/agent/config.js";
|
|
6
|
-
import { buildExecution, resolveExecution } from "../integrations/agent/execution.js";
|
|
7
|
-
import { runExecution } from "../integrations/agent/runner-dispatch.js";
|
|
8
|
-
import { isContextSizeError, LlmCallError } from "./client.js";
|
|
9
|
-
import { isLlmFeatureEnabled, tryLlmFeature, } from "./feature-gate.js";
|
|
10
4
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
5
|
+
* `callStructured()` — one model call on any runner kind.
|
|
6
|
+
*
|
|
7
|
+
* It resolves the call once (the runner's target, model and timeout, the call's
|
|
8
|
+
* own settings), lowers it for the runner's transport, dispatches it, and
|
|
9
|
+
* returns the reply text or the failure. A provider's failure (transport error,
|
|
10
|
+
* timeout, abort, a harness that exits non-zero) is a failed outcome, the same
|
|
11
|
+
* for every caller; only a configuration failure throws, because it is not the
|
|
12
|
+
* provider's and no fallback can repair it.
|
|
13
|
+
*
|
|
14
|
+
* What stays per-caller: reading the reply (the structured loop, `llm/structured.ts`),
|
|
15
|
+
* and what a failed outcome means for that caller.
|
|
14
16
|
*/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return "context_limit";
|
|
19
|
-
if (err instanceof LlmCallError && err.code === "provider_html_error")
|
|
20
|
-
return "html";
|
|
21
|
-
return "other";
|
|
22
|
-
}
|
|
17
|
+
import { ConfigError } from "../core/errors.js";
|
|
18
|
+
import { buildExecution, currentLayer, resolveExecution } from "../integrations/agent/execution.js";
|
|
19
|
+
import { runExecution } from "../integrations/agent/runner-dispatch.js";
|
|
23
20
|
function own(value, key) {
|
|
24
21
|
return value !== undefined && Object.hasOwn(value, key);
|
|
25
22
|
}
|
|
26
23
|
/**
|
|
27
24
|
* @internal Exact request-to-cascade projection, exported for presence-semantics contracts.
|
|
28
|
-
* Model work is bounded: with no timeout from the request or the runner, it
|
|
29
|
-
* gets {@link DEFAULT_LLM_TIMEOUT_MS} on every runner kind.
|
|
30
25
|
*/
|
|
31
|
-
export function resolveStructuredCurrent(current, request
|
|
26
|
+
export function resolveStructuredCurrent(current, request) {
|
|
32
27
|
const out = current ? { ...current } : {};
|
|
33
28
|
const requestHasInference = own(request, "temperature") || own(request, "maxTokens") || own(request, "enableThinking");
|
|
34
29
|
const baseInference = current?.inference && typeof current.inference === "object" && !Array.isArray(current.inference)
|
|
@@ -51,9 +46,6 @@ export function resolveStructuredCurrent(current, request, runner) {
|
|
|
51
46
|
}
|
|
52
47
|
if (own(request, "timeoutMs"))
|
|
53
48
|
out.timeout = request?.timeoutMs ?? null;
|
|
54
|
-
else if (runner && !Object.hasOwn(runner, "timeoutMs") && !own(current, "timeout")) {
|
|
55
|
-
out.timeout = DEFAULT_LLM_TIMEOUT_MS;
|
|
56
|
-
}
|
|
57
49
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
58
50
|
}
|
|
59
51
|
function requireTerminalUserMessage(messages) {
|
|
@@ -66,92 +58,46 @@ function requireTerminalUserMessage(messages) {
|
|
|
66
58
|
conversation: messages.slice(0, -1).map((message) => ({ role: message.role, content: message.content })),
|
|
67
59
|
};
|
|
68
60
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
return
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
61
|
+
/** Timeout and abort come from the dispatch's own reason, whatever the runner's kind. */
|
|
62
|
+
function failed(error, result) {
|
|
63
|
+
const reason = result?.reason;
|
|
64
|
+
return {
|
|
65
|
+
ok: false,
|
|
66
|
+
reason: reason === "timeout" || reason === "aborted" ? reason : "error",
|
|
67
|
+
error,
|
|
68
|
+
...(result ? { result } : {}),
|
|
69
|
+
};
|
|
77
70
|
}
|
|
78
|
-
/**
|
|
79
|
-
export function
|
|
80
|
-
return
|
|
71
|
+
/** A dispatch's result as the reply it produced or the failure it reports. */
|
|
72
|
+
export function outcomeOf(result) {
|
|
73
|
+
return result.ok
|
|
74
|
+
? { ok: true, raw: result.stdout }
|
|
75
|
+
: failed(result.error ?? result.stderr ?? result.reason ?? "dispatch failed", result);
|
|
81
76
|
}
|
|
82
77
|
export async function callStructured(opts) {
|
|
83
|
-
const {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
// before execution planning begins.
|
|
88
|
-
if (akmConfig !== undefined && !isLlmFeatureEnabled(akmConfig, feature, enabled)) {
|
|
89
|
-
return tryLlmFeature(feature, akmConfig, async () => fallback, fallback, {
|
|
90
|
-
...(own(request, "timeoutMs") ? { timeoutMs: request?.timeoutMs } : {}),
|
|
91
|
-
...(enabled !== undefined ? { enabled } : {}),
|
|
92
|
-
onFallback,
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
const runner = opts.runner;
|
|
96
|
-
if (!runner)
|
|
97
|
-
throw new TypeError("callStructured requires a resolved runner");
|
|
98
|
-
const terminal = requireTerminalUserMessage(messages);
|
|
99
|
-
// `gateSignal` aborts when the feature gate's timeout fires, so the dispatch stops with it.
|
|
100
|
-
// Every structured call is unattended model work, so it runs under the model-work tool policy.
|
|
101
|
-
const prepareInvocation = () => {
|
|
78
|
+
const { runner, messages, request } = opts;
|
|
79
|
+
try {
|
|
80
|
+
const terminal = requireTerminalUserMessage(messages);
|
|
81
|
+
// Every structured call is unattended model work, so it runs under the model-work tool policy.
|
|
102
82
|
const prepared = resolveExecution({
|
|
103
83
|
content: terminal.content,
|
|
104
84
|
conversation: terminal.conversation,
|
|
105
85
|
runner,
|
|
106
|
-
|
|
86
|
+
layers: [currentLayer(resolveStructuredCurrent(opts.current, request) ?? {})],
|
|
107
87
|
modelWork: true,
|
|
108
88
|
});
|
|
109
89
|
const lowered = buildExecution(prepared.request, prepared.runner);
|
|
110
90
|
opts.onNotices?.(lowered.notices);
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
return parse(result.stdout);
|
|
123
|
-
};
|
|
124
|
-
};
|
|
125
|
-
// UNGATED: run the chat+parse directly. Errors propagate — no `onError`
|
|
126
|
-
// funnel — matching the pre-gate behaviour of direct callers.
|
|
127
|
-
if (akmConfig === undefined) {
|
|
128
|
-
return prepareInvocation()();
|
|
91
|
+
const result = await runExecution(lowered, {
|
|
92
|
+
...(request?.chat ? { chat: request.chat } : {}),
|
|
93
|
+
...(request?.onRetryAttempt ? { onRetryAttempt: request.onRetryAttempt } : {}),
|
|
94
|
+
...(request?.signal ? { signal: request.signal } : {}),
|
|
95
|
+
});
|
|
96
|
+
return outcomeOf(result);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
if (err instanceof ConfigError)
|
|
100
|
+
throw err;
|
|
101
|
+
return failed(err instanceof Error ? err.message : String(err));
|
|
129
102
|
}
|
|
130
|
-
// On an enabled path, preparation/lowering happen OUTSIDE tryLlmFeature so
|
|
131
|
-
// authorization and invalid-config failures remain hard failures instead of
|
|
132
|
-
// being mistaken for provider fallbacks.
|
|
133
|
-
const invoke = prepareInvocation();
|
|
134
|
-
// GATED: run through `tryLlmFeature`. A throw inside is classified ONCE and
|
|
135
|
-
// routed to `onError`; `tryLlmFeature` returns `fallback` on disablement/timeout.
|
|
136
|
-
const outcome = await tryLlmFeature(feature, akmConfig, async (gateSignal) => {
|
|
137
|
-
try {
|
|
138
|
-
return { kind: "value", value: await invoke(gateSignal) };
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
// Credential materialization remains dispatch-owned, so a missing
|
|
142
|
-
// required symbolic credential can surface here. Preserve config
|
|
143
|
-
// failures as hard pre-provider errors instead of sending them through
|
|
144
|
-
// a leaf's provider/runtime fallback policy.
|
|
145
|
-
if (err instanceof ConfigError)
|
|
146
|
-
return { kind: "config-error", error: err };
|
|
147
|
-
return { kind: "value", value: onError(classifyLlmError(err), err) };
|
|
148
|
-
}
|
|
149
|
-
}, { kind: "value", value: fallback }, {
|
|
150
|
-
...(own(request, "timeoutMs") ? { timeoutMs: request?.timeoutMs } : {}),
|
|
151
|
-
...(enabled !== undefined ? { enabled } : {}),
|
|
152
|
-
onFallback,
|
|
153
|
-
});
|
|
154
|
-
if (outcome.kind === "config-error")
|
|
155
|
-
throw outcome.error;
|
|
156
|
-
return outcome.value;
|
|
157
103
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
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
|
+
* The one corrective loop for a model call whose reply must have a shape:
|
|
6
|
+
* dispatch, parse, and, when the parser refuses the reply, one more dispatch that
|
|
7
|
+
* carries what was wrong. Whoever dispatches decides how the correction reaches
|
|
8
|
+
* the model (appended to the prompt, or as the next turns of the conversation);
|
|
9
|
+
* whoever parses decides what a good reply is.
|
|
10
|
+
*
|
|
11
|
+
* Only a refused reply is corrected. A dispatch that fails, in transport or by
|
|
12
|
+
* timeout, ends the loop with that failure as the dispatch reported it: the
|
|
13
|
+
* transports own their retries, and a command is never run twice to fix its
|
|
14
|
+
* output (`attempts: 1`).
|
|
15
|
+
*/
|
|
16
|
+
import { parseEmbeddedJsonResponse } from "../core/parse.js";
|
|
17
|
+
/** The reply was refused by the parser, as against the dispatch failing. */
|
|
18
|
+
export function isRefused(result) {
|
|
19
|
+
return !result.ok && "errors" in result;
|
|
20
|
+
}
|
|
21
|
+
/** The default instruction for a refused reply. */
|
|
22
|
+
export function correctionText(refusal) {
|
|
23
|
+
if ((refusal.reason ?? "parse_error") === "parse_error") {
|
|
24
|
+
return "Your previous response contained no parseable JSON. Respond with ONLY a JSON value that matches the requested schema — no prose, no code fences.";
|
|
25
|
+
}
|
|
26
|
+
return `Your previous JSON response failed validation:\n- ${refusal.errors.join("\n- ")}\nRespond again with ONLY a corrected JSON value.`;
|
|
27
|
+
}
|
|
28
|
+
export async function structuredLoop(options) {
|
|
29
|
+
const attempts = Math.max(1, options.attempts ?? 2);
|
|
30
|
+
const correct = options.correct ?? correctionText;
|
|
31
|
+
let correction;
|
|
32
|
+
for (let attempt = 1;; attempt += 1) {
|
|
33
|
+
const dispatched = await options.dispatch(correction);
|
|
34
|
+
if (!dispatched.ok)
|
|
35
|
+
return { ...dispatched, attempts: attempt };
|
|
36
|
+
const raw = dispatched.raw;
|
|
37
|
+
const parsed = options.parse(raw);
|
|
38
|
+
if (parsed.ok)
|
|
39
|
+
return { ok: true, value: parsed.value, raw, attempts: attempt };
|
|
40
|
+
if (attempt >= attempts) {
|
|
41
|
+
return { ok: false, reason: parsed.reason ?? "parse_error", errors: parsed.errors, raw, attempts: attempt };
|
|
42
|
+
}
|
|
43
|
+
correction = { text: correct(parsed), reply: raw };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A parser for a reply that is JSON, perhaps in prose or code fences: the JSON
|
|
48
|
+
* found in it, held to `validate`. A reply with no JSON in it is a `parse_error`;
|
|
49
|
+
* JSON that fails `validate` is a `validation_error`.
|
|
50
|
+
*/
|
|
51
|
+
export function jsonParser(validate) {
|
|
52
|
+
return (raw) => {
|
|
53
|
+
const candidate = parseEmbeddedJsonResponse(raw);
|
|
54
|
+
if (candidate === undefined) {
|
|
55
|
+
return { ok: false, errors: ["no JSON structure found in response"], reason: "parse_error" };
|
|
56
|
+
}
|
|
57
|
+
const verdict = validate(candidate);
|
|
58
|
+
return verdict.ok ? verdict : { ...verdict, reason: verdict.reason ?? "validation_error" };
|
|
59
|
+
};
|
|
60
|
+
}
|
package/dist/output/renderers.js
CHANGED
|
@@ -204,20 +204,14 @@ const agentMdRenderer = {
|
|
|
204
204
|
buildShowResponse(ctx) {
|
|
205
205
|
const name = deriveName(ctx);
|
|
206
206
|
const parsedMd = parseFrontmatter(ctx.content());
|
|
207
|
-
const toolPolicy = parsedMd.data.tools;
|
|
208
207
|
const modelHint = typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined;
|
|
209
208
|
return {
|
|
210
209
|
type: "agent",
|
|
211
210
|
name,
|
|
212
211
|
path: ctx.absPath,
|
|
213
|
-
action: "Dispatch using the prompt below verbatim. Use modelHint
|
|
212
|
+
action: "Dispatch using the prompt below verbatim. Use modelHint if present.",
|
|
214
213
|
description: asNonEmptyString(parsedMd.data.description),
|
|
215
214
|
prompt: parsedMd.content,
|
|
216
|
-
// `tools` is self-declared frontmatter. The provenance CEILING that decides
|
|
217
|
-
// whether this self-declared policy is honoured is applied at the show
|
|
218
|
-
// layer (`akmShowUnified`), which knows whether the source is the operator's
|
|
219
|
-
// own writable stash vs a read-only third-party source (07 P1-D).
|
|
220
|
-
...(toolPolicy !== undefined ? { toolPolicy } : {}),
|
|
221
215
|
...(modelHint !== undefined ? { modelHint } : {}),
|
|
222
216
|
};
|
|
223
217
|
},
|
|
@@ -240,7 +234,7 @@ const knowledgeMdRenderer = {
|
|
|
240
234
|
};
|
|
241
235
|
// ── 4c. lesson-md ────────────────────────────────────────────────────────────
|
|
242
236
|
/**
|
|
243
|
-
* Renderer for the `lesson` asset type
|
|
237
|
+
* Renderer for the `lesson` asset type.
|
|
244
238
|
*
|
|
245
239
|
* Lessons are markdown files with required `description` and `when_to_use`
|
|
246
240
|
* frontmatter. The renderer projects both fields explicitly so consumers can
|