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
|
@@ -2,48 +2,49 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* Local embedder
|
|
5
|
+
* Local embedder: a BERT-family embedding model run with onnxruntime-node,
|
|
6
|
+
* its text encoded by @huggingface/tokenizers, mean-pooled over the attention
|
|
7
|
+
* mask and L2-normalised.
|
|
6
8
|
*
|
|
7
|
-
* Encapsulates the
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* Encapsulates the model's lifecycle as instance state on a `LocalEmbedder` so
|
|
10
|
+
* tests can construct fresh instances without leaking loaded models across
|
|
11
|
+
* tests. The facade in `../embedder.ts` keeps a single shared instance for the
|
|
12
|
+
* production code path.
|
|
11
13
|
*/
|
|
14
|
+
import fs from "node:fs";
|
|
12
15
|
import path from "node:path";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
16
|
+
import { preloadOnnxRuntimeLibrary } from "../../standalone/onnxruntime-library.js";
|
|
17
|
+
import { ensureLocalModelFiles } from "./local-model-files.js";
|
|
15
18
|
/**
|
|
16
|
-
* Default local
|
|
19
|
+
* Default local model for embeddings.
|
|
17
20
|
* `bge-small-en-v1.5` scores higher on MTEB benchmarks than the previous
|
|
18
21
|
* `all-MiniLM-L6-v2` at the same 384-dimension footprint.
|
|
19
22
|
*/
|
|
20
23
|
export const DEFAULT_LOCAL_MODEL = "Xenova/bge-small-en-v1.5";
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
/** The runtime the local embedder reports once its model has loaded. */
|
|
25
|
+
export const LOCAL_EMBEDDING_RUNTIME = "onnxruntime-node";
|
|
26
|
+
/**
|
|
27
|
+
* The embedding runtime is not usable on this machine. `platform`: onnxruntime-node
|
|
28
|
+
* has no native library for it, so keyword search is all there is. `load`: it has
|
|
29
|
+
* one, which did not load (a missing package or addon, a `noexec` temp or cache
|
|
30
|
+
* directory).
|
|
31
|
+
*/
|
|
32
|
+
export class LocalRuntimeUnavailableError extends Error {
|
|
33
|
+
kind;
|
|
34
|
+
constructor(message, kind) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.kind = kind;
|
|
37
|
+
}
|
|
33
38
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
transformersLoader = fake ?? realTransformersLoader;
|
|
39
|
+
let pipelineLoader = loadOnnxPipeline;
|
|
40
|
+
/** TEST-ONLY. Swap the model loader; pass undefined to restore. */
|
|
41
|
+
export function _setLocalPipelineLoaderForTests(fake) {
|
|
42
|
+
pipelineLoader = fake ?? loadOnnxPipeline;
|
|
39
43
|
}
|
|
40
|
-
const LOCAL_EMBEDDER_DTYPE = "fp32";
|
|
41
|
-
const LOCAL_EMBEDDER_FALLBACK_DTYPE = "auto";
|
|
42
44
|
/**
|
|
43
|
-
* Maximum texts per batch for the local
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* throughput improvement over one-at-a-time calls on the cold minority.
|
|
45
|
+
* Maximum texts per batch for the local model. 32 is a safe default that fits
|
|
46
|
+
* well inside most model context budgets while providing 10–50× throughput
|
|
47
|
+
* improvement over one-at-a-time calls on the cold minority.
|
|
47
48
|
*/
|
|
48
49
|
const LOCAL_BATCH_SIZE = 32;
|
|
49
50
|
/**
|
|
@@ -54,6 +55,105 @@ const LOCAL_BATCH_SIZE = 32;
|
|
|
54
55
|
function resolveLocalModelName(overrideModel) {
|
|
55
56
|
return overrideModel || DEFAULT_LOCAL_MODEL;
|
|
56
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* A standalone binary built for a target with no native library (`none`) must not
|
|
60
|
+
* bundle the package: its addon for that platform does not exist. The bundler
|
|
61
|
+
* drops only the branch a build constant rules out, so the import sits in an
|
|
62
|
+
* `else`, not after the `throw`.
|
|
63
|
+
*/
|
|
64
|
+
async function importOnnxRuntime() {
|
|
65
|
+
if (typeof AKM_STANDALONE_NATIVE_MODULE !== "undefined" && AKM_STANDALONE_NATIVE_MODULE === "./native/none") {
|
|
66
|
+
throw new Error("no native library is available for this platform");
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
await preloadOnnxRuntimeLibrary();
|
|
70
|
+
return import("onnxruntime-node");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Whether onnxruntime-node has a native library for this machine. A standalone
|
|
75
|
+
* binary knows from its build (`none`). The package has one for glibc Linux
|
|
76
|
+
* x64/arm64, Apple-silicon macOS and Windows x64/arm64, and none for musl Linux
|
|
77
|
+
* or Intel macOS.
|
|
78
|
+
*/
|
|
79
|
+
function hasNativeLibrary() {
|
|
80
|
+
if (typeof AKM_STANDALONE_NATIVE_MODULE !== "undefined")
|
|
81
|
+
return AKM_STANDALONE_NATIVE_MODULE !== "./native/none";
|
|
82
|
+
if (process.platform === "linux") {
|
|
83
|
+
const header = process.report?.getReport()?.header;
|
|
84
|
+
if (!header?.glibcVersionRuntime)
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
return ["linux-x64", "linux-arm64", "darwin-arm64", "win32-x64", "win32-arm64"].includes(`${process.platform}-${process.arch}`);
|
|
88
|
+
}
|
|
89
|
+
async function loadOnnxRuntime() {
|
|
90
|
+
try {
|
|
91
|
+
return await importOnnxRuntime();
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
95
|
+
const kind = hasNativeLibrary() ? "load" : "platform";
|
|
96
|
+
// Only the package itself missing calls for a reinstall; a platform it ships no addon for (Intel macOS) fails on
|
|
97
|
+
// `../bin/napi-v6/<platform>/<arch>/onnxruntime_binding.node` and is reported below.
|
|
98
|
+
if (kind === "load" && /Cannot find (?:module|package) ['"]onnxruntime-node['"]/.test(msg)) {
|
|
99
|
+
throw new LocalRuntimeUnavailableError("Semantic search requires onnxruntime-node. Reinstall akm-cli.", kind);
|
|
100
|
+
}
|
|
101
|
+
throw new LocalRuntimeUnavailableError(`Failed to load the embedding runtime (onnxruntime-node): ${msg}. Semantic search with the local model is unavailable; keyword search still works.`, kind);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** The mean of one text's token vectors (padding excluded), scaled to unit length. */
|
|
105
|
+
function meanPooled(hidden, offset, tokens, dim) {
|
|
106
|
+
const vector = new Float32Array(dim);
|
|
107
|
+
for (let token = 0; token < tokens; token++) {
|
|
108
|
+
for (let k = 0; k < dim; k++)
|
|
109
|
+
vector[k] = vector[k] + hidden[offset + token * dim + k];
|
|
110
|
+
}
|
|
111
|
+
let norm = 0;
|
|
112
|
+
for (let k = 0; k < dim; k++) {
|
|
113
|
+
vector[k] = vector[k] / tokens;
|
|
114
|
+
norm += vector[k] ** 2;
|
|
115
|
+
}
|
|
116
|
+
return vector.map((value) => value / Math.sqrt(norm));
|
|
117
|
+
}
|
|
118
|
+
async function loadOnnxPipeline(modelName) {
|
|
119
|
+
const ort = await loadOnnxRuntime();
|
|
120
|
+
const { Tokenizer } = await import("@huggingface/tokenizers");
|
|
121
|
+
const modelDir = await ensureLocalModelFiles(modelName);
|
|
122
|
+
const readJson = (file) => JSON.parse(fs.readFileSync(path.join(modelDir, file), "utf8"));
|
|
123
|
+
const tokenizerConfig = readJson("tokenizer_config.json");
|
|
124
|
+
const tokenizer = new Tokenizer(readJson("tokenizer.json"), tokenizerConfig);
|
|
125
|
+
const maxLength = typeof tokenizerConfig.model_max_length === "number" ? tokenizerConfig.model_max_length : Number.POSITIVE_INFINITY;
|
|
126
|
+
const session = await ort.InferenceSession.create(path.join(modelDir, "onnx", "model.onnx"), {
|
|
127
|
+
executionProviders: ["cpu"],
|
|
128
|
+
logSeverityLevel: 3,
|
|
129
|
+
});
|
|
130
|
+
return async (texts) => {
|
|
131
|
+
// A text longer than the model's maximum is cut to it. Shorter ones are padded
|
|
132
|
+
// to the longest in the batch; the mask keeps padding out of the pooling.
|
|
133
|
+
const encoded = texts.map((text) => tokenizer.encode(text).ids.slice(0, maxLength));
|
|
134
|
+
const length = Math.max(...encoded.map((row) => row.length));
|
|
135
|
+
const ids = new BigInt64Array(texts.length * length);
|
|
136
|
+
const mask = new BigInt64Array(texts.length * length);
|
|
137
|
+
encoded.forEach((row, i) => {
|
|
138
|
+
row.forEach((id, j) => {
|
|
139
|
+
ids[i * length + j] = BigInt(id);
|
|
140
|
+
mask[i * length + j] = 1n;
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
const dims = [texts.length, length];
|
|
144
|
+
const inputs = {
|
|
145
|
+
input_ids: new ort.Tensor("int64", ids, dims),
|
|
146
|
+
attention_mask: new ort.Tensor("int64", mask, dims),
|
|
147
|
+
token_type_ids: new ort.Tensor("int64", new BigInt64Array(texts.length * length), dims),
|
|
148
|
+
};
|
|
149
|
+
// Models that take fewer inputs (no token_type_ids) are fed only theirs.
|
|
150
|
+
const feeds = Object.fromEntries(session.inputNames.flatMap((name) => (inputs[name] ? [[name, inputs[name]]] : [])));
|
|
151
|
+
const outputs = await session.run(feeds);
|
|
152
|
+
const hidden = (outputs.last_hidden_state ?? outputs.token_embeddings ?? outputs.logits)?.data;
|
|
153
|
+
const dim = hidden.length / (texts.length * length);
|
|
154
|
+
return encoded.map((row, i) => meanPooled(hidden, i * length * dim, row.length, dim));
|
|
155
|
+
};
|
|
156
|
+
}
|
|
57
157
|
export class LocalEmbedder {
|
|
58
158
|
defaultModel;
|
|
59
159
|
/**
|
|
@@ -63,6 +163,8 @@ export class LocalEmbedder {
|
|
|
63
163
|
*/
|
|
64
164
|
pipelinePromise;
|
|
65
165
|
pipelineModelName;
|
|
166
|
+
/** The runtime this embedder embeds with: set once a model has loaded, `undefined` before. */
|
|
167
|
+
runtime;
|
|
66
168
|
constructor(defaultModel) {
|
|
67
169
|
this.defaultModel = defaultModel;
|
|
68
170
|
}
|
|
@@ -70,6 +172,7 @@ export class LocalEmbedder {
|
|
|
70
172
|
reset() {
|
|
71
173
|
this.pipelinePromise = undefined;
|
|
72
174
|
this.pipelineModelName = undefined;
|
|
175
|
+
this.runtime = undefined;
|
|
73
176
|
}
|
|
74
177
|
async embed(text, signal) {
|
|
75
178
|
if (signal?.aborted) {
|
|
@@ -79,8 +182,8 @@ export class LocalEmbedder {
|
|
|
79
182
|
}
|
|
80
183
|
/**
|
|
81
184
|
* Embed a batch of texts. Processes in chunks of `LOCAL_BATCH_SIZE` (32) so
|
|
82
|
-
* the
|
|
83
|
-
*
|
|
185
|
+
* the model can run genuine batched inference rather than one call per text.
|
|
186
|
+
* Each chunk is checked against the AbortSignal between calls.
|
|
84
187
|
*
|
|
85
188
|
* `onBatch`, when given, fires once per chunk (indices into `texts` + the
|
|
86
189
|
* chunk's embeddings) as it completes (#954) — parity with
|
|
@@ -100,24 +203,7 @@ export class LocalEmbedder {
|
|
|
100
203
|
throw signal.reason instanceof Error ? signal.reason : new Error("embedding interrupted");
|
|
101
204
|
}
|
|
102
205
|
const chunk = texts.slice(i, i + LOCAL_BATCH_SIZE);
|
|
103
|
-
|
|
104
|
-
// that exact shape and propagate inference failures without re-executing
|
|
105
|
-
// the same inputs through a second runtime path.
|
|
106
|
-
const batchResult = await pipeline(chunk, {
|
|
107
|
-
pooling: "mean",
|
|
108
|
-
normalize: true,
|
|
109
|
-
});
|
|
110
|
-
if (!isBatchTensor(batchResult)) {
|
|
111
|
-
throw new Error("unexpected pipeline return shape for batch input");
|
|
112
|
-
}
|
|
113
|
-
const [batch, dim] = batchResult.dims;
|
|
114
|
-
if (batch !== chunk.length || batchResult.data.length !== batch * dim) {
|
|
115
|
-
throw new Error("unexpected pipeline return shape for batch input");
|
|
116
|
-
}
|
|
117
|
-
const chunkEmbeddings = [];
|
|
118
|
-
for (let row = 0; row < chunk.length; row++) {
|
|
119
|
-
chunkEmbeddings.push(Array.from(batchResult.data.subarray(row * dim, (row + 1) * dim)));
|
|
120
|
-
}
|
|
206
|
+
const chunkEmbeddings = (await pipeline(chunk)).map((vector) => Array.from(vector));
|
|
121
207
|
results.push(...chunkEmbeddings);
|
|
122
208
|
onBatch?.(Array.from({ length: chunk.length }, (_, row) => i + row), chunkEmbeddings);
|
|
123
209
|
}
|
|
@@ -126,13 +212,13 @@ export class LocalEmbedder {
|
|
|
126
212
|
/** Embed using a model name override (used by the facade for per-call model overrides). */
|
|
127
213
|
async embedWithModel(text, modelName) {
|
|
128
214
|
const pipeline = await this.getPipeline(modelName);
|
|
129
|
-
const
|
|
130
|
-
return Array.from(
|
|
215
|
+
const [vector] = await pipeline([text]);
|
|
216
|
+
return Array.from(vector);
|
|
131
217
|
}
|
|
132
218
|
/**
|
|
133
|
-
* Eagerly load (or return the cached)
|
|
134
|
-
*
|
|
135
|
-
*
|
|
219
|
+
* Eagerly load (or return the cached) model. Used by availability checks
|
|
220
|
+
* that want to surface model-download and runtime failures without
|
|
221
|
+
* performing a real embed call.
|
|
136
222
|
*/
|
|
137
223
|
async getPipeline(modelName) {
|
|
138
224
|
const resolvedModel = resolveLocalModelName(modelName);
|
|
@@ -142,36 +228,10 @@ export class LocalEmbedder {
|
|
|
142
228
|
}
|
|
143
229
|
if (!this.pipelinePromise) {
|
|
144
230
|
this.pipelineModelName = resolvedModel;
|
|
145
|
-
this.pipelinePromise = (
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
process.env.HF_HOME = path.join(getCacheDir(), "models");
|
|
150
|
-
}
|
|
151
|
-
let pipeline;
|
|
152
|
-
try {
|
|
153
|
-
const mod = await transformersLoader();
|
|
154
|
-
// Transformers.js 4.x defaults its filesystem cache underneath the
|
|
155
|
-
// installed package and no longer derives it from HF_HOME. Point the
|
|
156
|
-
// public runtime setting at our stable cache explicitly so package
|
|
157
|
-
// reinstalls and test-sandbox HOME rotation do not re-download the
|
|
158
|
-
// model. The exact pinned 4.2 module owns this public environment.
|
|
159
|
-
mod.env.cacheDir = process.env.HF_HOME;
|
|
160
|
-
if (isEnabledEnvironmentFlag(process.env.HF_HUB_OFFLINE)) {
|
|
161
|
-
mod.env.allowRemoteModels = false;
|
|
162
|
-
}
|
|
163
|
-
pipeline = mod.pipeline;
|
|
164
|
-
}
|
|
165
|
-
catch (importError) {
|
|
166
|
-
const msg = importError instanceof Error ? importError.message : String(importError);
|
|
167
|
-
if (/Cannot find (?:module|package)|MODULE_NOT_FOUND|ERR_MODULE_NOT_FOUND|Cannot resolve/i.test(msg)) {
|
|
168
|
-
throw new Error("Semantic search requires @huggingface/transformers. Reinstall akm-cli.");
|
|
169
|
-
}
|
|
170
|
-
throw new Error(`Failed to load embedding runtime: ${msg}. Check platform compatibility.`);
|
|
171
|
-
}
|
|
172
|
-
const pipelineFn = pipeline;
|
|
173
|
-
return createLocalPipeline(pipelineFn, resolvedModel);
|
|
174
|
-
})();
|
|
231
|
+
this.pipelinePromise = pipelineLoader(resolvedModel).then((pipeline) => {
|
|
232
|
+
this.runtime = LOCAL_EMBEDDING_RUNTIME;
|
|
233
|
+
return pipeline;
|
|
234
|
+
});
|
|
175
235
|
// HI-13: Clear the cached promise on failure so the next call retries
|
|
176
236
|
// instead of permanently rejecting every subsequent call with the same error.
|
|
177
237
|
this.pipelinePromise.catch(() => {
|
|
@@ -182,32 +242,3 @@ export class LocalEmbedder {
|
|
|
182
242
|
return this.pipelinePromise;
|
|
183
243
|
}
|
|
184
244
|
}
|
|
185
|
-
async function createLocalPipeline(pipelineFn, modelName) {
|
|
186
|
-
try {
|
|
187
|
-
return await pipelineFn("feature-extraction", modelName, { dtype: LOCAL_EMBEDDER_DTYPE });
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
if (!shouldRetryWithoutExplicitDtype(error)) {
|
|
191
|
-
throw error;
|
|
192
|
-
}
|
|
193
|
-
warn('Local embedding model "%s" rejected explicit dtype "%s"; retrying with explicit fallback dtype "%s".', modelName, LOCAL_EMBEDDER_DTYPE, LOCAL_EMBEDDER_FALLBACK_DTYPE);
|
|
194
|
-
return pipelineFn("feature-extraction", modelName, { dtype: LOCAL_EMBEDDER_FALLBACK_DTYPE });
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
function shouldRetryWithoutExplicitDtype(error) {
|
|
198
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
199
|
-
return /dtype|fp32|precision|quant/i.test(message);
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Check whether the declared Transformers dependency can be resolved without
|
|
203
|
-
* loading a model.
|
|
204
|
-
*/
|
|
205
|
-
export function isTransformersAvailable() {
|
|
206
|
-
try {
|
|
207
|
-
import.meta.resolve("@huggingface/transformers");
|
|
208
|
-
return true;
|
|
209
|
-
}
|
|
210
|
-
catch {
|
|
211
|
-
return false;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
@@ -9,12 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { abortableDelay, backoffDelay, fetchWithTimeout, isHttpUrl, readBodyWithByteCap } from "../../core/common.js";
|
|
11
11
|
import { concurrentMap } from "../../core/concurrent.js";
|
|
12
|
-
import {
|
|
13
|
-
import { ENV_REFERENCE_PATTERN, SECRET_STORE_REFERENCE_PATTERN } from "../../core/config/schema/primitives.js";
|
|
12
|
+
import { apiKeyReference, readCredential, resolveApiKey } from "../../core/config/credentials.js";
|
|
14
13
|
import { defaultConcurrencyForEndpoint } from "../../core/loopback.js";
|
|
15
|
-
import { redactErrorBody, redactSensitiveText } from "../../core/redaction.js";
|
|
14
|
+
import { redactErrorBody, redactSensitiveText, redactUrlCredentials } from "../../core/redaction.js";
|
|
16
15
|
import { warnVerbose } from "../../core/warn.js";
|
|
17
|
-
import { resolveSecretFromStore } from "../../sources/snapshot-fetchers/secret-seam.js";
|
|
18
16
|
/**
|
|
19
17
|
* Upper bound on the number of documents in one HTTP request, independent of
|
|
20
18
|
* the token budget below. Overridable via `config.batchSize`. Purely a
|
|
@@ -752,9 +750,12 @@ export class RemoteEmbedder {
|
|
|
752
750
|
}
|
|
753
751
|
return results;
|
|
754
752
|
}
|
|
753
|
+
resolveKey() {
|
|
754
|
+
return resolveApiKey(this.config.apiKey, embeddingSlot(this.config), this.config.endpoint ?? "");
|
|
755
|
+
}
|
|
755
756
|
buildHeaders() {
|
|
756
757
|
const headers = { "Content-Type": "application/json" };
|
|
757
|
-
const resolvedKey =
|
|
758
|
+
const resolvedKey = this.resolveKey();
|
|
758
759
|
if (resolvedKey) {
|
|
759
760
|
headers.Authorization = `Bearer ${resolvedKey}`;
|
|
760
761
|
}
|
|
@@ -770,7 +771,7 @@ export class RemoteEmbedder {
|
|
|
770
771
|
* far unredacted and uncapped, at readBodyWithByteCap's 10 MB default.
|
|
771
772
|
*/
|
|
772
773
|
safeErrorBody(body) {
|
|
773
|
-
const resolvedKey =
|
|
774
|
+
const resolvedKey = this.resolveKey();
|
|
774
775
|
return redactSensitiveText(redactErrorBody(body), resolvedKey ? [resolvedKey] : []);
|
|
775
776
|
}
|
|
776
777
|
}
|
|
@@ -813,7 +814,7 @@ export function normalizeEmbeddingEndpoint(endpoint) {
|
|
|
813
814
|
function embeddingEndpointPathHint(endpoint) {
|
|
814
815
|
const normalizedEndpoint = normalizeEmbeddingEndpoint(endpoint);
|
|
815
816
|
if (normalizedEndpoint !== endpoint) {
|
|
816
|
-
return ` Check that your endpoint includes the full embeddings path (for example "${normalizedEndpoint}", not just "${endpoint}").`;
|
|
817
|
+
return ` Check that your endpoint includes the full embeddings path (for example "${redactUrlCredentials(normalizedEndpoint)}", not just "${redactUrlCredentials(endpoint)}").`;
|
|
817
818
|
}
|
|
818
819
|
return "";
|
|
819
820
|
}
|
|
@@ -842,22 +843,24 @@ function resolveOllamaOptions(config) {
|
|
|
842
843
|
export function hasRemoteEndpoint(config) {
|
|
843
844
|
return isHttpUrl(config.endpoint);
|
|
844
845
|
}
|
|
846
|
+
/** Where the embedding key is stored: the serving connection's slot when a connection serves the model, else the embedding service's own. */
|
|
847
|
+
function embeddingSlot(config) {
|
|
848
|
+
return config.credentialName !== undefined ? { connection: config.credentialName } : { service: "embedding" };
|
|
849
|
+
}
|
|
845
850
|
/**
|
|
846
|
-
* Describe WHERE
|
|
847
|
-
*
|
|
848
|
-
*
|
|
849
|
-
*
|
|
850
|
-
* different config root, scope, or a config
|
|
851
|
-
* A default-level progress line naming the
|
|
852
|
-
* helper), printed once before the first provider
|
|
853
|
-
* self-diagnose that without ever surfacing the
|
|
851
|
+
* Describe WHERE the embedding key comes from, never its value: the `$VAR`
|
|
852
|
+
* reference in `embedding.apiKey` (or its default connection's), the key in
|
|
853
|
+
* `credentials.json` filed under `embedding` (or under that connection's
|
|
854
|
+
* name), or nothing. A keyless request can only mean neither was present in the
|
|
855
|
+
* config the run actually loaded (a different config root, scope, or a config
|
|
856
|
+
* edited after the run started). A default-level progress line naming the
|
|
857
|
+
* credential's SOURCE (this helper), printed once before the first provider
|
|
858
|
+
* request, lets a field run self-diagnose that without ever surfacing the
|
|
859
|
+
* secret itself (#953).
|
|
854
860
|
*/
|
|
855
|
-
export function describeEmbeddingCredential(
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
if (ENV_REFERENCE_PATTERN.test(apiKey))
|
|
861
|
-
return `${apiKey} (env)`;
|
|
862
|
-
return "literal apiKey";
|
|
861
|
+
export function describeEmbeddingCredential(config) {
|
|
862
|
+
const reference = apiKeyReference(config.apiKey);
|
|
863
|
+
if (reference)
|
|
864
|
+
return `${reference} (env)`;
|
|
865
|
+
return readCredential(embeddingSlot(config), config.endpoint ?? "") ? "credentials.json" : "none configured";
|
|
863
866
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Lives next to {@link EmbeddingVector} so importers (notably `db.ts`)
|
|
8
8
|
* can pull just the math without dragging in the embedder facade and its
|
|
9
|
-
* transitive
|
|
9
|
+
* transitive embedding runtime import chain.
|
|
10
10
|
*
|
|
11
11
|
* Returns 0 when the vectors have different dimensions — silently
|
|
12
12
|
* computing on a truncated view would produce meaningless scores.
|
package/dist/llm/index-passes.js
CHANGED
|
@@ -1,50 +1,44 @@
|
|
|
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 {
|
|
5
|
-
import {
|
|
4
|
+
import { SHIPPED_ALIAS } from "../core/config/model-aliases.js";
|
|
5
|
+
import { ConfigError } from "../core/errors.js";
|
|
6
|
+
import { executionDefaultsOf } from "../execution/source.js";
|
|
7
|
+
import { buildExecution, resolveExecution, shippedAlias } from "../integrations/agent/execution.js";
|
|
6
8
|
const NO_LOWERING_NOTICES = Object.freeze([]);
|
|
7
|
-
function own(value, key) {
|
|
8
|
-
return value !== undefined && Object.hasOwn(value, key);
|
|
9
|
-
}
|
|
10
|
-
/** Adapt one index invocation layer into the shared execution vocabulary. */
|
|
11
|
-
function indexExecutionDefaults(layer) {
|
|
12
|
-
if (!layer)
|
|
13
|
-
return {};
|
|
14
|
-
return {
|
|
15
|
-
...(own(layer, "engine") ? { engine: layer.engine } : {}),
|
|
16
|
-
...(own(layer, "model") ? { model: layer.model } : {}),
|
|
17
|
-
...(own(layer, "timeoutMs") ? { timeout: layer.timeoutMs } : {}),
|
|
18
|
-
...(own(layer, "llm") && layer.llm !== undefined
|
|
19
|
-
? { inference: cloneExecutionJsonObject(layer.llm, "index pass LLM inference") }
|
|
20
|
-
: {}),
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
9
|
/**
|
|
24
|
-
* Resolve standalone index passes from the index section only
|
|
25
|
-
* strategies own improve-triggered calls
|
|
10
|
+
* Resolve standalone index passes from the index section only (the index-wide
|
|
11
|
+
* settings, then the pass's own). Improve strategies own improve-triggered calls
|
|
12
|
+
* and are intentionally not consulted. No runner when the pass is off or no
|
|
13
|
+
* connection or harness is configured.
|
|
26
14
|
*/
|
|
27
15
|
export function resolveIndexPassExecution(passName, config) {
|
|
28
16
|
const pass = config.index?.[passName];
|
|
29
17
|
if (pass?.enabled === false)
|
|
30
18
|
return Object.freeze({ runner: undefined, notices: NO_LOWERING_NOTICES });
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
19
|
+
try {
|
|
20
|
+
// Under the model-work tool policy: confined where the harness can be, unrestricted (with a notice) elsewhere.
|
|
21
|
+
const prepared = resolveExecution({
|
|
22
|
+
content: "",
|
|
23
|
+
config,
|
|
24
|
+
layers: [
|
|
25
|
+
shippedAlias(SHIPPED_ALIAS.index),
|
|
26
|
+
{
|
|
27
|
+
id: "index",
|
|
28
|
+
kind: "invocation-defaults",
|
|
29
|
+
values: executionDefaultsOf(config.index),
|
|
30
|
+
},
|
|
31
|
+
{ id: `index.${passName}`, kind: "invocation-defaults", values: executionDefaultsOf(pass) },
|
|
32
|
+
],
|
|
33
|
+
modelWork: true,
|
|
34
|
+
});
|
|
35
|
+
const lowered = buildExecution(prepared.request, prepared.runner);
|
|
36
|
+
return Object.freeze({ runner: lowered.runner, notices: lowered.notices });
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error instanceof ConfigError && error.code === "LLM_NOT_CONFIGURED") {
|
|
40
|
+
return Object.freeze({ runner: undefined, notices: NO_LOWERING_NOTICES });
|
|
41
|
+
}
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
50
44
|
}
|