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
|
@@ -49,26 +49,42 @@ export function resolveWritable(entry) {
|
|
|
49
49
|
return entry.writable;
|
|
50
50
|
return entry.type === "filesystem";
|
|
51
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Whether a resolved source is write-activated. Only the primary stash and
|
|
54
|
+
* sources explicitly marked `writable: true` are writable; registry-cached
|
|
55
|
+
* (installed, read-only) sources are never written in place because
|
|
56
|
+
* `akm update` overwrites them.
|
|
57
|
+
*/
|
|
58
|
+
export function isSourceWriteActivated(source) {
|
|
59
|
+
return source.writable === true;
|
|
60
|
+
}
|
|
52
61
|
/** The two kinds writes are defined for; scheduler state binds only to these. */
|
|
53
62
|
export function isWriteCapableSourceKind(kind) {
|
|
54
63
|
return kind === "filesystem" || kind === "git";
|
|
55
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Throw when `name` is a configured bundle that is disabled. Callers run it
|
|
67
|
+
* after a name failed to resolve against the active set, so a disabled bundle
|
|
68
|
+
* is reported as disabled rather than as not configured.
|
|
69
|
+
*/
|
|
70
|
+
export function assertBundleNotDisabled(akmConfig, name) {
|
|
71
|
+
if (resolveConfiguredSources(akmConfig).some((source) => source.name === name)) {
|
|
72
|
+
throw new UsageError(`Bundle "${name}" is disabled.`, "INVALID_FLAG_VALUE");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
56
75
|
/**
|
|
57
76
|
* Resolve the destination for a write: explicit `--bundle`, then
|
|
58
77
|
* `defaultWriteTarget`, then the working stash (`defaultBundle`). There is no
|
|
59
78
|
* fallback to the first writable source.
|
|
60
79
|
*/
|
|
61
80
|
export function resolveWriteTarget(akmConfig, explicitTarget, options = {}) {
|
|
62
|
-
const allConfiguredSources = resolveConfiguredSources(akmConfig);
|
|
63
81
|
const configuredSources = resolveActiveConfiguredSources(akmConfig);
|
|
64
82
|
const requireWritable = options.requireWritable !== false;
|
|
65
83
|
const flag = options.flag ?? "--bundle";
|
|
66
84
|
if (explicitTarget) {
|
|
67
85
|
const match = configuredSources.find((s) => s.name === explicitTarget);
|
|
68
86
|
if (!match) {
|
|
69
|
-
|
|
70
|
-
throw new UsageError(`Bundle "${explicitTarget}" is disabled.`, "INVALID_FLAG_VALUE");
|
|
71
|
-
}
|
|
87
|
+
assertBundleNotDisabled(akmConfig, explicitTarget);
|
|
72
88
|
throw new UsageError(`${flag} must reference a source name from your config. No source named "${explicitTarget}" is configured. Run \`akm bundle list\` to see available sources.`, "INVALID_FLAG_VALUE");
|
|
73
89
|
}
|
|
74
90
|
if (requireWritable && !resolveWritable({ type: match.type, writable: match.writable })) {
|
|
@@ -6,15 +6,12 @@
|
|
|
6
6
|
* `src/workflows/ir/params.ts` (workflow parameters) into a contract-shaped
|
|
7
7
|
* vocabulary both workflow params AND task source v4's `inputs:`
|
|
8
8
|
* declarations consume — one validation/coercion implementation, injected
|
|
9
|
-
* per-caller diagnostics
|
|
10
|
-
* never import `src/workflows/**`
|
|
9
|
+
* per-caller diagnostics. Binding boundary: `src/execution/**` must
|
|
10
|
+
* never import `src/workflows/**` — `INPUT_NAME_PATTERN` and the
|
|
11
11
|
* canonical-JSON helpers are therefore defined locally rather than imported
|
|
12
|
-
* from the workflow side
|
|
12
|
+
* from the workflow side, verified by
|
|
13
13
|
* `tests/execution/input-contract.test.ts`'s purity/byte-equality scans.
|
|
14
14
|
* Pure module: no IO, no engine imports.
|
|
15
|
-
*
|
|
16
|
-
* See docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md
|
|
17
|
-
* for the full generalization history and the D3-N1/D3-N2/D3-N3 rationale.
|
|
18
15
|
*/
|
|
19
16
|
import { createHash } from "node:crypto";
|
|
20
17
|
import { validateJsonSchemaSubset } from "../core/json-schema.js";
|
|
@@ -0,0 +1,49 @@
|
|
|
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 place lowering notices from several sources become one list.
|
|
6
|
+
*
|
|
7
|
+
* Notices are live execution metadata only: executor, report and output paths
|
|
8
|
+
* merge them, result and evidence journal writers never do.
|
|
9
|
+
*/
|
|
10
|
+
import { sortExecutionJson } from "./json.js";
|
|
11
|
+
/**
|
|
12
|
+
* Merge notices in first-seen order, each once. Two notices are the same when
|
|
13
|
+
* everything about them is, `details` included and key order aside, so two
|
|
14
|
+
* genuinely different structured diagnostics are not collapsed because their
|
|
15
|
+
* headline fields match. `undefined` when there are none.
|
|
16
|
+
*/
|
|
17
|
+
export function mergeNotices(...groups) {
|
|
18
|
+
const merged = new Map();
|
|
19
|
+
for (const group of groups) {
|
|
20
|
+
for (const notice of group ?? []) {
|
|
21
|
+
const key = JSON.stringify(sortExecutionJson(notice));
|
|
22
|
+
if (!merged.has(key))
|
|
23
|
+
merged.set(key, notice);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return merged.size > 0 ? Object.freeze([...merged.values()]) : undefined;
|
|
27
|
+
}
|
|
28
|
+
const NONE = Object.freeze([]);
|
|
29
|
+
/**
|
|
30
|
+
* The notices a run's dispatches report as they go, merged when read.
|
|
31
|
+
* `forward` also receives each batch as it arrives.
|
|
32
|
+
*/
|
|
33
|
+
export function noticeSet(forward) {
|
|
34
|
+
const groups = [];
|
|
35
|
+
const add = (notices) => {
|
|
36
|
+
groups.push(notices);
|
|
37
|
+
forward?.(notices);
|
|
38
|
+
};
|
|
39
|
+
const list = () => mergeNotices(...groups) ?? NONE;
|
|
40
|
+
return {
|
|
41
|
+
add,
|
|
42
|
+
list,
|
|
43
|
+
/** `{ notices }` for a result that carries them, `{}` when there are none. */
|
|
44
|
+
fields: () => {
|
|
45
|
+
const notices = mergeNotices(...groups);
|
|
46
|
+
return notices ? { notices } : {};
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -3,25 +3,14 @@
|
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
import { sortExecutionJson } from "./json.js";
|
|
5
5
|
import { decodeExecutionSourceIdentity, } from "./source.js";
|
|
6
|
-
export const RESOLVED_EXECUTION_SCHEMA_VERSION =
|
|
7
|
-
const COMMAND_KEYS = ["template", "argumentInput", "content", "source"
|
|
8
|
-
const PERSONA_KEYS = ["content", "source"
|
|
9
|
-
const
|
|
10
|
-
const MODEL_KEYS = ["
|
|
11
|
-
const
|
|
12
|
-
const RUNTIME_KEYS = ["timeoutMs", "workspace", "environment", "settings", "extensions"];
|
|
13
|
-
const NOTICE_KEYS = ["code", "severity", "adapter", "field", "message", "details"];
|
|
6
|
+
export const RESOLVED_EXECUTION_SCHEMA_VERSION = 2;
|
|
7
|
+
const COMMAND_KEYS = ["template", "argumentInput", "content", "source"];
|
|
8
|
+
const PERSONA_KEYS = ["content", "source"];
|
|
9
|
+
const TARGET_KEYS = ["name", "kind", "platform"];
|
|
10
|
+
const MODEL_KEYS = ["model", "alias"];
|
|
11
|
+
const RUNTIME_KEYS = ["timeoutMs", "workspace", "environment"];
|
|
14
12
|
const IDENTITY_KEYS = ["ref", "bundle", "adapter", "file", "hash"];
|
|
15
|
-
const OPTIONAL_REQUEST_KEYS = [
|
|
16
|
-
"conversation",
|
|
17
|
-
"agent",
|
|
18
|
-
"persona",
|
|
19
|
-
"model",
|
|
20
|
-
"inference",
|
|
21
|
-
"outputSchema",
|
|
22
|
-
"tools",
|
|
23
|
-
"extensions",
|
|
24
|
-
];
|
|
13
|
+
const OPTIONAL_REQUEST_KEYS = ["conversation", "agent", "persona", "model", "inference", "outputSchema"];
|
|
25
14
|
/** Copy the own, defined fields named by `keys`; omitted stays omitted, `null` stays `null`. */
|
|
26
15
|
function pick(value, keys) {
|
|
27
16
|
const record = value;
|
|
@@ -46,7 +35,6 @@ export function createResolvedCommand(input) {
|
|
|
46
35
|
...(input.argumentInput !== undefined ? { argumentInput: input.argumentInput } : {}),
|
|
47
36
|
content: input.content,
|
|
48
37
|
source: decodeExecutionSourceIdentity(input.source.identity),
|
|
49
|
-
...(input.source.extensions ? { extensions: input.source.extensions } : {}),
|
|
50
38
|
});
|
|
51
39
|
}
|
|
52
40
|
export function createInlineResolvedCommand(input) {
|
|
@@ -64,28 +52,27 @@ export function createResolvedPersona(source) {
|
|
|
64
52
|
return Object.freeze({
|
|
65
53
|
content: source.content,
|
|
66
54
|
source: decodeExecutionSourceIdentity(source.identity),
|
|
67
|
-
...(source.extensions ? { extensions: source.extensions } : {}),
|
|
68
55
|
});
|
|
69
56
|
}
|
|
70
57
|
/** Freeze one request without normalizing away optional-field presence. */
|
|
71
58
|
export function createResolvedExecutionRequest(input) {
|
|
72
|
-
if (!input.command || !input.
|
|
73
|
-
throw new TypeError("resolved execution request requires command,
|
|
59
|
+
if (!input.command || !input.target || !input.runtime || typeof input.modelWork !== "boolean") {
|
|
60
|
+
throw new TypeError("resolved execution request requires command, target, modelWork, and runtime");
|
|
74
61
|
}
|
|
75
62
|
const out = {
|
|
76
63
|
schemaVersion: RESOLVED_EXECUTION_SCHEMA_VERSION,
|
|
77
64
|
command: input.command,
|
|
78
|
-
|
|
79
|
-
|
|
65
|
+
target: input.target,
|
|
66
|
+
modelWork: input.modelWork,
|
|
80
67
|
runtime: input.runtime,
|
|
81
|
-
notices: input.notices,
|
|
82
68
|
...pick(input, OPTIONAL_REQUEST_KEYS),
|
|
83
69
|
};
|
|
84
70
|
return Object.freeze(out);
|
|
85
71
|
}
|
|
86
72
|
/**
|
|
87
73
|
* Rehydrate a frozen JSON request after workflow resume/replay. Tolerant of
|
|
88
|
-
* unknown keys; refuses
|
|
74
|
+
* unknown keys; refuses a request of any other schema version: an earlier
|
|
75
|
+
* release's names an engine and cannot run now.
|
|
89
76
|
*/
|
|
90
77
|
export function decodeResolvedExecutionRequest(value) {
|
|
91
78
|
const input = requireRecord(value, "resolved execution request");
|
|
@@ -99,22 +86,20 @@ export function decodeResolvedExecutionRequest(value) {
|
|
|
99
86
|
if (typeof command.template !== "string" || typeof command.content !== "string") {
|
|
100
87
|
throw new TypeError("command template and content must be strings");
|
|
101
88
|
}
|
|
102
|
-
const
|
|
103
|
-
if (typeof
|
|
104
|
-
throw new TypeError("
|
|
89
|
+
const target = requireRecord(input.target, "target");
|
|
90
|
+
if (typeof target.name !== "string" || (target.kind !== "connection" && target.kind !== "harness")) {
|
|
91
|
+
throw new TypeError("target.name must be a string and target.kind must be connection or harness");
|
|
105
92
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
throw new TypeError("notices must be an array");
|
|
93
|
+
if (typeof input.modelWork !== "boolean")
|
|
94
|
+
throw new TypeError("modelWork must be a boolean");
|
|
109
95
|
const request = {
|
|
110
96
|
command: Object.freeze({
|
|
111
97
|
...pick(command, COMMAND_KEYS),
|
|
112
98
|
source: command.source === null ? null : decodeExecutionSourceIdentity(command.source, "command.source"),
|
|
113
99
|
}),
|
|
114
|
-
|
|
115
|
-
|
|
100
|
+
target: Object.freeze(pick(target, TARGET_KEYS)),
|
|
101
|
+
modelWork: input.modelWork,
|
|
116
102
|
runtime: Object.freeze(pick(requireRecord(input.runtime, "runtime"), RUNTIME_KEYS)),
|
|
117
|
-
notices: Object.freeze(notices.map((notice, index) => Object.freeze(pick(requireRecord(notice, `notices[${index}]`), NOTICE_KEYS)))),
|
|
118
103
|
};
|
|
119
104
|
if (Array.isArray(input.conversation)) {
|
|
120
105
|
request.conversation = Object.freeze(input.conversation.map((message, index) => Object.freeze(pick(requireRecord(message, `conversation[${index}]`), ["role", "content"]))));
|
|
@@ -135,7 +120,7 @@ export function decodeResolvedExecutionRequest(value) {
|
|
|
135
120
|
if (Object.hasOwn(input, "model") && input.model !== undefined) {
|
|
136
121
|
request.model = input.model === null ? null : Object.freeze(pick(requireRecord(input.model, "model"), MODEL_KEYS));
|
|
137
122
|
}
|
|
138
|
-
for (const key of ["inference", "outputSchema"
|
|
123
|
+
for (const key of ["inference", "outputSchema"]) {
|
|
139
124
|
if (Object.hasOwn(input, key) && input[key] !== undefined)
|
|
140
125
|
request[key] = input[key];
|
|
141
126
|
}
|
|
@@ -149,10 +134,9 @@ export function canonicalResolvedExecutionRequest(request) {
|
|
|
149
134
|
...pick(request.command, COMMAND_KEYS),
|
|
150
135
|
source: request.command.source === null ? null : pick(request.command.source, IDENTITY_KEYS),
|
|
151
136
|
},
|
|
152
|
-
|
|
153
|
-
|
|
137
|
+
target: pick(request.target, TARGET_KEYS),
|
|
138
|
+
modelWork: request.modelWork,
|
|
154
139
|
runtime: pick(request.runtime, RUNTIME_KEYS),
|
|
155
|
-
notices: request.notices.map((notice) => pick(notice, NOTICE_KEYS)),
|
|
156
140
|
};
|
|
157
141
|
if (request.conversation !== undefined) {
|
|
158
142
|
wire.conversation = request.conversation.map((message) => ({ role: message.role, content: message.content }));
|
|
@@ -168,7 +152,7 @@ export function canonicalResolvedExecutionRequest(request) {
|
|
|
168
152
|
if (Object.hasOwn(request, "model") && request.model !== undefined) {
|
|
169
153
|
wire.model = request.model === null ? null : pick(request.model, MODEL_KEYS);
|
|
170
154
|
}
|
|
171
|
-
for (const key of ["inference", "outputSchema"
|
|
155
|
+
for (const key of ["inference", "outputSchema"]) {
|
|
172
156
|
if (Object.hasOwn(request, key) && request[key] !== undefined)
|
|
173
157
|
wire[key] = request[key];
|
|
174
158
|
}
|
package/dist/execution/source.js
CHANGED
|
@@ -1,42 +1,34 @@
|
|
|
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 {
|
|
4
|
+
import { warnOnce } from "../core/warn.js";
|
|
5
|
+
import { cloneExecutionJsonObject } from "./json.js";
|
|
5
6
|
export const EXECUTION_SOURCE_SCHEMA_VERSION = 1;
|
|
6
7
|
/** Current internal adapter identifiers are lowercase kebab-case registry keys. */
|
|
7
8
|
export const EXECUTION_ADAPTER_ID_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
/** What an asset that still says `engine:` is told, once. */
|
|
10
|
+
export function warnRetiredEngineKey() {
|
|
11
|
+
warnOnce("asset-engine-key-retired", "`engine` is retired; use `connection:` or `harness:`.");
|
|
12
|
+
}
|
|
13
|
+
/** Those settings as one layer's defaults. A setting that is absent says nothing; `null` is a real value. */
|
|
14
|
+
export function executionDefaultsOf(settings) {
|
|
15
|
+
if (!settings)
|
|
16
|
+
return {};
|
|
17
|
+
return {
|
|
18
|
+
...(settings.connection !== undefined ? { connection: settings.connection } : {}),
|
|
19
|
+
...(settings.harness !== undefined ? { harness: settings.harness } : {}),
|
|
20
|
+
...(settings.engine !== undefined ? { engine: settings.engine } : {}),
|
|
21
|
+
...(settings.model !== undefined ? { model: settings.model } : {}),
|
|
22
|
+
...(settings.llm !== undefined ? { inference: cloneExecutionJsonObject(settings.llm, "inference") } : {}),
|
|
23
|
+
...(settings.timeoutMs !== undefined ? { timeout: settings.timeoutMs } : {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
18
26
|
function requireRecord(value, path) {
|
|
19
27
|
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
20
28
|
throw new TypeError(`${path} must be an object`);
|
|
21
29
|
}
|
|
22
30
|
return value;
|
|
23
31
|
}
|
|
24
|
-
export function createAdapterExtensions(first, second, ...rest) {
|
|
25
|
-
const entries = typeof first === "string"
|
|
26
|
-
? [[first, second]]
|
|
27
|
-
: [first, ...(second === undefined ? [] : [second]), ...rest];
|
|
28
|
-
const out = {};
|
|
29
|
-
for (const [owner, values] of entries)
|
|
30
|
-
out[owner] = cloneExecutionJsonObject(values, `extensions.${owner}`);
|
|
31
|
-
return Object.freeze(out);
|
|
32
|
-
}
|
|
33
|
-
export function cloneAdapterExtensions(value, path) {
|
|
34
|
-
const out = {};
|
|
35
|
-
for (const [owner, fields] of Object.entries(requireRecord(value, path))) {
|
|
36
|
-
out[owner] = cloneExecutionJsonObject(fields, `${path}.${owner}`);
|
|
37
|
-
}
|
|
38
|
-
return Object.freeze(out);
|
|
39
|
-
}
|
|
40
32
|
/** A selector or layer identifier that may cross the durable execution boundary. */
|
|
41
33
|
export function requireStableExecutionSelector(value, path) {
|
|
42
34
|
if (typeof value !== "string" || value.length === 0 || value.trim() !== value) {
|
|
@@ -75,7 +67,7 @@ export function cloneUnresolvedExecutionDefaults(input, path = "execution source
|
|
|
75
67
|
const record = requireRecord(input, path);
|
|
76
68
|
const present = (key) => Object.hasOwn(record, key) && record[key] !== undefined;
|
|
77
69
|
const out = {};
|
|
78
|
-
for (const key of ["agent", "engine", "model", "workspace"]) {
|
|
70
|
+
for (const key of ["agent", "connection", "harness", "engine", "model", "workspace"]) {
|
|
79
71
|
if (!present(key))
|
|
80
72
|
continue;
|
|
81
73
|
const value = record[key];
|
|
@@ -90,7 +82,7 @@ export function cloneUnresolvedExecutionDefaults(input, path = "execution source
|
|
|
90
82
|
}
|
|
91
83
|
out.timeout = timeout;
|
|
92
84
|
}
|
|
93
|
-
for (const key of ["inference", "outputSchema"
|
|
85
|
+
for (const key of ["inference", "outputSchema"]) {
|
|
94
86
|
if (!present(key))
|
|
95
87
|
continue;
|
|
96
88
|
out[key] = record[key] === null ? null : cloneExecutionJsonObject(record[key], `${path}.${key}`);
|
|
@@ -102,21 +94,8 @@ export function cloneUnresolvedExecutionDefaults(input, path = "execution source
|
|
|
102
94
|
}
|
|
103
95
|
out.environment = environment;
|
|
104
96
|
}
|
|
105
|
-
if (present("tools"))
|
|
106
|
-
out.tools = cloneToolSelection(record.tools, `${path}.tools`);
|
|
107
97
|
return Object.freeze(out);
|
|
108
98
|
}
|
|
109
|
-
export function cloneToolSelection(value, path = "tools") {
|
|
110
|
-
if (value === null || typeof value === "string")
|
|
111
|
-
return value;
|
|
112
|
-
const cloned = cloneExecutionJson(value, path);
|
|
113
|
-
if (Array.isArray(cloned)) {
|
|
114
|
-
if (cloned.some((tool) => typeof tool !== "string"))
|
|
115
|
-
throw new TypeError(`${path} array values must be strings`);
|
|
116
|
-
return cloned;
|
|
117
|
-
}
|
|
118
|
-
return cloneExecutionJsonObject(cloned, path);
|
|
119
|
-
}
|
|
120
99
|
export function createAdapterRenderedExecutionSource(input) {
|
|
121
100
|
const { kind, content } = input;
|
|
122
101
|
if (kind !== "command" && kind !== "persona")
|
|
@@ -129,8 +108,5 @@ export function createAdapterRenderedExecutionSource(input) {
|
|
|
129
108
|
content,
|
|
130
109
|
defaults: cloneUnresolvedExecutionDefaults(input.defaults ?? {}),
|
|
131
110
|
identity: createExecutionSourceIdentity(input.identity),
|
|
132
|
-
...(input.extensions
|
|
133
|
-
? { extensions: cloneAdapterExtensions(input.extensions, "execution source extensions") }
|
|
134
|
-
: {}),
|
|
135
111
|
});
|
|
136
112
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
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
|
-
* The target-ref classifier
|
|
5
|
+
* The target-ref classifier.
|
|
6
6
|
*
|
|
7
7
|
* `classifyTargetRef` is the canonical classifier for a canonical asset ref
|
|
8
8
|
* used as an execution target: `commands/<name>`, `scripts/<name>`,
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* first `/` is one of `commands`, `scripts`, `tasks`, `workflows`;
|
|
21
21
|
* 5. the name segment after the first `/` is non-empty.
|
|
22
22
|
*
|
|
23
|
-
* Explicit non-goals
|
|
23
|
+
* Explicit non-goals: no GitHub locator grammar, no
|
|
24
24
|
* `akm/command` builtin special case, no resolution, no filesystem access, no
|
|
25
25
|
* guessing.
|
|
26
26
|
*/
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* §11.5 bundle-rename startup guard.
|
|
6
6
|
*
|
|
7
7
|
* Renaming a workspace bundle id is a mass identity migration (every ref in the
|
|
8
|
-
* bundle changes without any file moving) and MUST go through the
|
|
8
|
+
* bundle changes without any file moving) and MUST go through the
|
|
9
9
|
* explicit `akm bundle rename <old> <new>` command, which rekeys the index +
|
|
10
10
|
* every ref-keyed state table atomically. If a user instead hand-edits the
|
|
11
11
|
* `bundles` KEY in config.json, the durable index/state rows still carry the OLD
|
|
@@ -131,8 +131,9 @@ export function warnOnBundleRenameDrift(config = loadConfig()) {
|
|
|
131
131
|
warn("WARNING: bundle identity drift detected. " +
|
|
132
132
|
`Configured bundle(s) with no indexed content: ${renamedConfiguredIds.map((id) => `"${id}"`).join(", ")}; ` +
|
|
133
133
|
`indexed content under unconfigured bundle id(s): ${renamedOldIds.map((id) => `"${id}"`).join(", ")}. ` +
|
|
134
|
-
"This is the signature of a hand-renamed bundle id
|
|
135
|
-
"under the new id.
|
|
136
|
-
"
|
|
137
|
-
"that learned state (utility, salience, outcomes,
|
|
134
|
+
"This is the signature of a hand-renamed bundle id. AKM will NOT silently re-mint fresh state " +
|
|
135
|
+
"under the new id. To keep the learned state, restore the previous bundle id in config.json and rename it with " +
|
|
136
|
+
"`akm bundle rename <old> <new>`, which rekeys the config, the index and akm's state together; or keep the new " +
|
|
137
|
+
"id and run `akm index --full` to re-mint under it, accepting that learned state (utility, salience, outcomes, " +
|
|
138
|
+
"usage history) keyed to the old id is left behind.");
|
|
138
139
|
}
|
|
@@ -225,7 +225,7 @@ export async function ensureIndex(stashDir, options = {}) {
|
|
|
225
225
|
// Blocking callers (improve's planning preflight) are a sanctioned
|
|
226
226
|
// materialization point and hydrate cache-backed sources as usual. The
|
|
227
227
|
// background READ path (`show` auto-index) must never clone/pull/fetch at
|
|
228
|
-
// query time
|
|
228
|
+
// query time: it builds from already-materialized
|
|
229
229
|
// content, and absent source caches are skipped with a warning.
|
|
230
230
|
...(blocking ? {} : { hydrateSources: false }),
|
|
231
231
|
});
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* longer take any lease.
|
|
17
17
|
*
|
|
18
18
|
* What remains here guards actual data loss (a lost or conflicting git
|
|
19
|
-
* commit), so
|
|
19
|
+
* commit), so core principle 1's data-loss exemption keeps it — but with the same
|
|
20
20
|
* fix applied: no age-based stale-reclaim. A holder is only ever reclaimed
|
|
21
21
|
* once its PID is verifiably dead; a live-but-wedged holder makes an
|
|
22
22
|
* acquisition attempt wait (bounded by `maxWaitMs`) or fail, never silently
|
package/dist/indexer/indexer.js
CHANGED
|
@@ -12,6 +12,8 @@ import { getDbPath } from "../core/paths.js";
|
|
|
12
12
|
import { SCRIPT_EXTENSIONS } from "../core/recognition-util.js";
|
|
13
13
|
import { withStateDb } from "../core/state-db.js";
|
|
14
14
|
import { isVerbose, warn, warnOnce, warnVerbose } from "../core/warn.js";
|
|
15
|
+
import { localEmbeddingRuntime } from "../llm/embedder.js";
|
|
16
|
+
import { effectiveEmbedding } from "../llm/embedders/connection.js";
|
|
15
17
|
import { resolveSourcesForOrigin } from "../registry/origin-resolve.js";
|
|
16
18
|
import { closeDatabase, openExistingDatabase, openIndexDatabase, openReadonlyExistingDatabase, } from "../storage/repositories/index-connection.js";
|
|
17
19
|
import { deleteEntriesByBundle, deleteEntriesByDirAndBundle, deleteEntriesByDirExceptRefs, deleteEntriesByIds, deleteUsageEventsByEntryIds, findEntryIdByRef, getAllEntries, getEmbeddableEntryCount, getEntryCount, getIndexedBundleIdsByDir, getIndexedDirPathsByBundleId, relinkUsageEvents, upsertEntry, } from "../storage/repositories/index-entries-repository.js";
|
|
@@ -25,12 +27,13 @@ import { INDEX_DB_VACUUMED_EVENT, readFreelistInfo, vacuumIfReclaimable } from "
|
|
|
25
27
|
import { assertIndexedWorkflowSourceIdentity, WorkflowSourceIdentityError } from "../workflows/source-files.js";
|
|
26
28
|
import { reclassifyIndexDbContention } from "./index-db-contention.js";
|
|
27
29
|
import { deriveEntryProvenance, deriveInstallations } from "./installations.js";
|
|
28
|
-
import { indexedPathMatchesOwner,
|
|
30
|
+
import { indexedPathMatchesOwner, resolveConceptOwner } from "./lookup/adapter-concept-owner.js";
|
|
29
31
|
import { generateEmbeddingsForDb } from "./materialize-embeddings.js";
|
|
30
32
|
import { canUseIncrementalSkip, computeDirFingerprint, getCachedDirState, getDirIndexState, inferZeroRowReason, } from "./passes/dir-staleness.js";
|
|
31
33
|
import { isWorkflowSkipWarning, withFileSize } from "./passes/metadata.js";
|
|
32
34
|
import { drainDirDocuments } from "./scan/drain-dir.js";
|
|
33
35
|
import { purgeOldUsageEvents, USAGE_EVENT_RETENTION_DAYS } from "./usage/usage-events.js";
|
|
36
|
+
import { SEMANTIC_SEARCH_META_KEY, } from "./walk/index-context.js";
|
|
34
37
|
import { walkStashFlatWithStatus } from "./walk/walker.js";
|
|
35
38
|
function throwIfAborted(signal) {
|
|
36
39
|
if (signal?.aborted) {
|
|
@@ -104,7 +107,7 @@ function applyRemovedSources(db, sources, removedSources, isIncremental) {
|
|
|
104
107
|
/**
|
|
105
108
|
* The embedding phase (#954): generate and store vectors for every entry
|
|
106
109
|
* missing one, then compute the `hasEmbeddings` fact and the semantic-search
|
|
107
|
-
* verification off the result
|
|
110
|
+
* verification off the result, and record it for `akm health`. `db` must have no ambient transaction open —
|
|
108
111
|
* each per-batch commit is its own durable write.
|
|
109
112
|
*/
|
|
110
113
|
export async function runEmbeddingPass(params) {
|
|
@@ -116,6 +119,15 @@ export async function runEmbeddingPass(params) {
|
|
|
116
119
|
const semanticEntryCount = getEmbeddableEntryCount(db);
|
|
117
120
|
onProgress({ phase: "finalize", message: "Verifying semantic search state." });
|
|
118
121
|
const verification = verifyIndexState(db, config, semanticEntryCount, embeddingResult);
|
|
122
|
+
const unavailable = verification.semanticStatus === "blocked" ? embeddingResult.runtimeUnavailable : undefined;
|
|
123
|
+
const record = {
|
|
124
|
+
status: unavailable ? "unavailable" : verification.semanticStatus,
|
|
125
|
+
...(unavailable ? { unavailable } : {}),
|
|
126
|
+
provider: verification.embeddingProvider,
|
|
127
|
+
...(verification.embeddingRuntime ? { runtime: verification.embeddingRuntime } : {}),
|
|
128
|
+
...(verification.ok ? {} : { reason: verification.message }),
|
|
129
|
+
};
|
|
130
|
+
setMeta(db, SEMANTIC_SEARCH_META_KEY, JSON.stringify(record));
|
|
119
131
|
onProgress({ phase: "verify", message: verification.message });
|
|
120
132
|
return { embeddingResult, verification };
|
|
121
133
|
}
|
|
@@ -384,7 +396,6 @@ async function akmIndexReal(options) {
|
|
|
384
396
|
// path. `secret-seam` is imported here, never from inside the cycle.
|
|
385
397
|
const { storeSecretResolver } = await import("../sources/snapshot-fetchers/secret-seam.js");
|
|
386
398
|
await ensureSourceCaches(config, {
|
|
387
|
-
force: full,
|
|
388
399
|
materialize: options.hydrateSources !== false,
|
|
389
400
|
secrets: storeSecretResolver,
|
|
390
401
|
// Same progress channel as every other phase (#954) — a
|
|
@@ -423,7 +434,7 @@ async function akmIndexReal(options) {
|
|
|
423
434
|
mode,
|
|
424
435
|
sourcesCount: sourceDirs.length,
|
|
425
436
|
semanticSearchMode: config.semanticSearchMode,
|
|
426
|
-
embeddingProvider: getEmbeddingProvider(config
|
|
437
|
+
embeddingProvider: getEmbeddingProvider(effectiveEmbedding(config)),
|
|
427
438
|
}),
|
|
428
439
|
});
|
|
429
440
|
const removedSources = findRemovedSources(db, sources);
|
|
@@ -669,9 +680,6 @@ function buildSourceScanPlans(db, allSourceEntries, isIncremental, reconcileMiss
|
|
|
669
680
|
}
|
|
670
681
|
const walked = walkStashFlatWithStatus(currentStashDir, {
|
|
671
682
|
includeAllDirectories: component.adapter === "okf",
|
|
672
|
-
...(component.adapter === "akm" || component.adapter === "akm-workflow"
|
|
673
|
-
? { workflowSymlinkAdapter: component.adapter }
|
|
674
|
-
: {}),
|
|
675
683
|
});
|
|
676
684
|
const dirGroups = groupFileContextsByDir(walked.files);
|
|
677
685
|
const adapter = adapterForId(component.adapter);
|
|
@@ -961,7 +969,7 @@ function persistDirRecords(db, dirRecords, warnings, bundleByRoot) {
|
|
|
961
969
|
}
|
|
962
970
|
continue;
|
|
963
971
|
}
|
|
964
|
-
// Diff-persist
|
|
972
|
+
// Diff-persist: upsert the current file set
|
|
965
973
|
// FIRST (ON CONFLICT preserving `entries.id` so embeddings / utility /
|
|
966
974
|
// usage stay attached to unchanged rows), tracking every upserted
|
|
967
975
|
// durable `item_ref`, then prune only the departed rows below. Replaces the old
|
|
@@ -1091,7 +1099,8 @@ function getEmbeddingProvider(embedding) {
|
|
|
1091
1099
|
}
|
|
1092
1100
|
function verifyIndexState(db, config, embeddableEntries, embeddingResult) {
|
|
1093
1101
|
const embeddingCount = getEmbeddingCount(db);
|
|
1094
|
-
const embeddingProvider = getEmbeddingProvider(config
|
|
1102
|
+
const embeddingProvider = getEmbeddingProvider(effectiveEmbedding(config));
|
|
1103
|
+
const embeddingRuntime = embeddingProvider === "local" ? localEmbeddingRuntime() : undefined;
|
|
1095
1104
|
const verification = (ok, message, semanticSearchEnabled, semanticStatus, guidance) => ({
|
|
1096
1105
|
ok,
|
|
1097
1106
|
message,
|
|
@@ -1100,6 +1109,7 @@ function verifyIndexState(db, config, embeddableEntries, embeddingResult) {
|
|
|
1100
1109
|
semanticSearchMode: config.semanticSearchMode,
|
|
1101
1110
|
semanticStatus,
|
|
1102
1111
|
embeddingProvider,
|
|
1112
|
+
...(embeddingRuntime !== undefined ? { embeddingRuntime } : {}),
|
|
1103
1113
|
entryCount: embeddableEntries,
|
|
1104
1114
|
embeddingCount,
|
|
1105
1115
|
});
|
|
@@ -1132,10 +1142,8 @@ borrowed = false) {
|
|
|
1132
1142
|
const sources = await resolveLookupSources();
|
|
1133
1143
|
if (sources.length === 0)
|
|
1134
1144
|
return { entry: null };
|
|
1135
|
-
const bundleBySourcePath = new Map(sourceComponents(sources).map((component, index) => [path.resolve(sources[index].path), component.id]));
|
|
1136
1145
|
const qualified = Boolean(ref.bundle);
|
|
1137
|
-
|
|
1138
|
-
if (candidateSources.length === 0)
|
|
1146
|
+
if ((ref.bundle ? resolveSourcesForOrigin(ref.bundle, sources) : sources).length === 0)
|
|
1139
1147
|
return { entry: null };
|
|
1140
1148
|
let db;
|
|
1141
1149
|
let indexError;
|
|
@@ -1151,42 +1159,38 @@ borrowed = false) {
|
|
|
1151
1159
|
...(indexError === undefined ? {} : { indexError }),
|
|
1152
1160
|
});
|
|
1153
1161
|
try {
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
if (
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
throw new WorkflowSourceIdentityError(inputRef, entry.filePath, owner.path);
|
|
1169
|
-
}
|
|
1170
|
-
}
|
|
1171
|
-
catch (error) {
|
|
1172
|
-
if (!(error instanceof WorkflowSourceIdentityError))
|
|
1173
|
-
throw error;
|
|
1174
|
-
warn(`${error.message} Falling back to the physical owner.`);
|
|
1175
|
-
return resolved(null, owner);
|
|
1162
|
+
const match = resolveConceptOwner(ref, sources);
|
|
1163
|
+
if (!match)
|
|
1164
|
+
return resolved(null);
|
|
1165
|
+
const { owner, source, bundleId, adapterId } = match;
|
|
1166
|
+
const inputRef = makeBundleRef(qualified ? ref.bundle : undefined, owner.conceptId);
|
|
1167
|
+
const id = db ? findEntryIdByRef(db, inputRef, bundleId) : undefined;
|
|
1168
|
+
if (id !== undefined && db) {
|
|
1169
|
+
const entry = readLookupEntry(db, id, ref.conceptId, source.path);
|
|
1170
|
+
if (entry) {
|
|
1171
|
+
if (owner.workflowSource) {
|
|
1172
|
+
try {
|
|
1173
|
+
assertIndexedWorkflowSourceIdentity(inputRef, entry.filePath, owner.workflowSource);
|
|
1174
|
+
if (entry.adapterId !== adapterId) {
|
|
1175
|
+
throw new WorkflowSourceIdentityError(inputRef, entry.filePath, owner.path);
|
|
1176
1176
|
}
|
|
1177
1177
|
}
|
|
1178
|
-
|
|
1178
|
+
catch (error) {
|
|
1179
|
+
if (!(error instanceof WorkflowSourceIdentityError))
|
|
1180
|
+
throw error;
|
|
1181
|
+
warn(`${error.message} Falling back to the physical owner.`);
|
|
1179
1182
|
return resolved(null, owner);
|
|
1180
1183
|
}
|
|
1181
|
-
return resolved(entry, owner);
|
|
1182
1184
|
}
|
|
1185
|
+
else if (entry.adapterId !== adapterId || !indexedPathMatchesOwner(entry.filePath, owner)) {
|
|
1186
|
+
return resolved(null, owner);
|
|
1187
|
+
}
|
|
1188
|
+
return resolved(entry, owner);
|
|
1183
1189
|
}
|
|
1184
|
-
// A physical owner with a missing/incomplete index row still owns this
|
|
1185
|
-
// unqualified concept. Stop here so a later source cannot retarget it.
|
|
1186
|
-
if (owner)
|
|
1187
|
-
return resolved(null, owner);
|
|
1188
1190
|
}
|
|
1189
|
-
|
|
1191
|
+
// A physical owner with a missing/incomplete index row still owns this
|
|
1192
|
+
// concept: no later source can retarget it.
|
|
1193
|
+
return resolved(null, owner);
|
|
1190
1194
|
}
|
|
1191
1195
|
finally {
|
|
1192
1196
|
if (db && !borrowed)
|
|
@@ -1290,7 +1294,7 @@ function readLookupEntry(db, id, fallbackConceptId, sourceRoot) {
|
|
|
1290
1294
|
};
|
|
1291
1295
|
}
|
|
1292
1296
|
/**
|
|
1293
|
-
* Look up a single asset by ref.
|
|
1297
|
+
* Look up a single asset by ref. `akm show` queries this and
|
|
1294
1298
|
* reads the file from disk. The index is the source of truth for which
|
|
1295
1299
|
* file corresponds to which ref; the indexer walks `provider.path()` for
|
|
1296
1300
|
* every configured source, so this query covers all source kinds.
|