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
|
@@ -19,6 +19,7 @@ import { withStateDbTelemetry } from "../../core/state-db.js";
|
|
|
19
19
|
import { systemErrorCode } from "../../core/system-error.js";
|
|
20
20
|
import { presentationFor } from "../../core/type-presentation.js";
|
|
21
21
|
import { embed } from "../../llm/embedder.js";
|
|
22
|
+
import { effectiveEmbedding } from "../../llm/embedders/connection.js";
|
|
22
23
|
import { applyEmbeddingTemplate, resolveEmbeddingProfile } from "../../llm/embedders/profile.js";
|
|
23
24
|
import { normalizeEmbeddingEndpoint } from "../../llm/embedders/remote.js";
|
|
24
25
|
import { assertIndexPathReadable, closeDatabase, openExistingDatabase, openReadonlyExistingDatabase, } from "../../storage/repositories/index-connection.js";
|
|
@@ -400,7 +401,7 @@ export function applyEntryFilters(items, opts) {
|
|
|
400
401
|
const scopeFiltered = filters
|
|
401
402
|
? sourceFiltered.filter((item) => entryMatchesScope(item.entry.scope, filters))
|
|
402
403
|
: sourceFiltered;
|
|
403
|
-
// Proposed-quality filter
|
|
404
|
+
// Proposed-quality filter: exclude `quality: "proposed"`
|
|
404
405
|
// entries unless the caller opts in.
|
|
405
406
|
const qualityFiltered = opts.includeProposed
|
|
406
407
|
? scopeFiltered
|
|
@@ -469,7 +470,8 @@ function startVectorChannel(db, query, config, filterCandidates) {
|
|
|
469
470
|
// a live warning instead of silently skipping with no signal.
|
|
470
471
|
if (getEmbeddingCount(db) === 0)
|
|
471
472
|
return Promise.resolve({ neighbors: null });
|
|
472
|
-
const
|
|
473
|
+
const embedding = effectiveEmbedding(config);
|
|
474
|
+
const timeoutMs = embedding?.queryTimeoutMs ?? DEFAULT_QUERY_EMBED_TIMEOUT_MS;
|
|
473
475
|
const controller = new AbortController();
|
|
474
476
|
let timer;
|
|
475
477
|
const timeout = new Promise((_, reject) => {
|
|
@@ -478,8 +480,8 @@ function startVectorChannel(db, query, config, filterCandidates) {
|
|
|
478
480
|
reject(new Error(`Query embedding timed out after ${timeoutMs}ms`));
|
|
479
481
|
}, timeoutMs);
|
|
480
482
|
});
|
|
481
|
-
const queryText = applyEmbeddingTemplate(resolveEmbeddingProfile(
|
|
482
|
-
return Promise.race([embed(queryText,
|
|
483
|
+
const queryText = applyEmbeddingTemplate(resolveEmbeddingProfile(embedding).queryTemplate, query);
|
|
484
|
+
return Promise.race([embed(queryText, embedding, controller.signal), timeout])
|
|
483
485
|
.then((vector) => ({ neighbors: searchVec(db, vector, CHANNEL_DEPTH, undefined, filterCandidates) }))
|
|
484
486
|
.catch((error) => ({ neighbors: null, warning: buildVectorFallbackWarning(config, error) }))
|
|
485
487
|
.finally(() => clearTimeout(timer));
|
|
@@ -489,7 +491,7 @@ function buildVectorFallbackWarning(config, error) {
|
|
|
489
491
|
const reason = classifyVectorFailure(error);
|
|
490
492
|
const target = endpoint
|
|
491
493
|
? `embedding endpoint ${endpoint}`
|
|
492
|
-
: config
|
|
494
|
+
: effectiveEmbedding(config)?.endpoint
|
|
493
495
|
? "configured embedding endpoint"
|
|
494
496
|
: "local embedding model";
|
|
495
497
|
const unavailable = reason === "connection failed" ? `cannot reach ${target}` : `${target} is unavailable`;
|
|
@@ -500,7 +502,7 @@ function buildVectorFallbackWarning(config, error) {
|
|
|
500
502
|
* or fragments into a warning. Invalid authored values fail closed.
|
|
501
503
|
*/
|
|
502
504
|
function safeEmbeddingEndpoint(config) {
|
|
503
|
-
const endpoint = config
|
|
505
|
+
const endpoint = effectiveEmbedding(config)?.endpoint;
|
|
504
506
|
if (!endpoint)
|
|
505
507
|
return undefined;
|
|
506
508
|
try {
|
|
@@ -564,7 +566,7 @@ export async function buildDbHit(input) {
|
|
|
564
566
|
score: input.score,
|
|
565
567
|
...(input.whyMatched ? { whyMatched: input.whyMatched } : {}),
|
|
566
568
|
...(estimatedTokens !== undefined ? { estimatedTokens } : {}),
|
|
567
|
-
// Surface optional quality
|
|
569
|
+
// Surface optional quality. Omitted when entry has
|
|
568
570
|
// no `quality` field so payloads stay compact for the common case.
|
|
569
571
|
...(input.entry.quality ? { quality: input.entry.quality } : {}),
|
|
570
572
|
...(input.entry.beliefState ? { beliefState: input.entry.beliefState } : {}),
|
|
@@ -13,6 +13,20 @@ import { lockContentRootFor } from "../../integrations/lockfile.js";
|
|
|
13
13
|
import { resolveSourceProviderFactory } from "../../sources/provider-factory.js";
|
|
14
14
|
import { ensureWebsiteMirror } from "../../sources/snapshot-fetchers/website-ingest.js";
|
|
15
15
|
// ── Resolution ──────────────────────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* The working stash read besides the configured bundles: an explicit argument,
|
|
18
|
+
* else `AKM_BUNDLE_DIR`, else the platform default stash when no `defaultBundle`
|
|
19
|
+
* is configured. With a `defaultBundle` and no override there is none, because
|
|
20
|
+
* the configured bundle is the working stash. Throws as `resolveStashDir` does
|
|
21
|
+
* when the directory is missing.
|
|
22
|
+
*/
|
|
23
|
+
export function implicitStashDir(config, overrideStashDir) {
|
|
24
|
+
if (overrideStashDir !== undefined)
|
|
25
|
+
return path.resolve(overrideStashDir);
|
|
26
|
+
if (process.env.AKM_BUNDLE_DIR?.trim())
|
|
27
|
+
return resolveStashDir();
|
|
28
|
+
return config.defaultBundle ? undefined : resolveStashDir();
|
|
29
|
+
}
|
|
16
30
|
/**
|
|
17
31
|
* Build the ordered list of stash sources, walking every configured stash
|
|
18
32
|
* once. Iteration order:
|
|
@@ -29,21 +43,16 @@ import { ensureWebsiteMirror } from "../../sources/snapshot-fetchers/website-ing
|
|
|
29
43
|
export function resolveSourceEntries(overrideStashDir, existingConfig) {
|
|
30
44
|
const config = existingConfig ?? loadConfig();
|
|
31
45
|
const configuredEntries = bundlesToSourceEntries(config) ?? [];
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
? path.resolve(overrideStashDir)
|
|
35
|
-
: envOverride
|
|
36
|
-
? resolveStashDir()
|
|
37
|
-
: config.defaultBundle
|
|
38
|
-
? undefined
|
|
39
|
-
: resolveStashDir();
|
|
40
|
-
const implicitConfiguredBundle = implicitStashDir ? bundleKeyForContentRoot(config, implicitStashDir) : undefined;
|
|
46
|
+
const implicitStash = implicitStashDir(config, overrideStashDir);
|
|
47
|
+
const implicitConfiguredBundle = implicitStash ? bundleKeyForContentRoot(config, implicitStash) : undefined;
|
|
41
48
|
if (implicitConfiguredBundle && !isBundleEnabled(config, implicitConfiguredBundle)) {
|
|
42
49
|
throw new ConfigError(`The requested working source is disabled as bundle ${JSON.stringify(implicitConfiguredBundle)}.`, "INVALID_CONFIG_FILE");
|
|
43
50
|
}
|
|
44
51
|
// Explicit and environment overrides stay first. Without either override,
|
|
45
52
|
// the configured default enters through the validated loop below.
|
|
46
|
-
const sources =
|
|
53
|
+
const sources = implicitStash
|
|
54
|
+
? [{ path: implicitStash, writable: true, isDefault: true, type: "filesystem" }]
|
|
55
|
+
: [];
|
|
47
56
|
const sourceIdentity = (dir) => {
|
|
48
57
|
const resolved = path.resolve(dir);
|
|
49
58
|
try {
|
|
@@ -53,7 +62,7 @@ export function resolveSourceEntries(overrideStashDir, existingConfig) {
|
|
|
53
62
|
return resolved;
|
|
54
63
|
}
|
|
55
64
|
};
|
|
56
|
-
const seen = new Set(
|
|
65
|
+
const seen = new Set(implicitStash ? [sourceIdentity(implicitStash)] : []);
|
|
57
66
|
const addSource = (dir, registryId, writable, type, adapterId, unresolved = false, isDefault = false) => {
|
|
58
67
|
const resolved = path.resolve(dir);
|
|
59
68
|
const identity = sourceIdentity(resolved);
|
|
@@ -65,7 +74,7 @@ export function resolveSourceEntries(overrideStashDir, existingConfig) {
|
|
|
65
74
|
// identity-less and a user-named primary source ("name": "my-stash")
|
|
66
75
|
// would validate but match zero entries when filtering.
|
|
67
76
|
const existing = sources.find((source) => sourceIdentity(source.path) === identity);
|
|
68
|
-
if (existing && existing.
|
|
77
|
+
if (existing && existing.registryId === undefined) {
|
|
69
78
|
if (registryId)
|
|
70
79
|
existing.registryId = registryId;
|
|
71
80
|
if (isDefault)
|
|
@@ -92,7 +101,7 @@ export function resolveSourceEntries(overrideStashDir, existingConfig) {
|
|
|
92
101
|
...(unresolved ? { unresolved: true } : {}),
|
|
93
102
|
});
|
|
94
103
|
};
|
|
95
|
-
//
|
|
104
|
+
// Resolve from `bundles` + `defaultBundle`.
|
|
96
105
|
// `bundlesToSourceEntries` returns the configured default first, then map
|
|
97
106
|
// insertion order. Each entry is validated before insertion so a component
|
|
98
107
|
// root can never escape its provider's materialized content root.
|
|
@@ -102,7 +111,7 @@ export function resolveSourceEntries(overrideStashDir, existingConfig) {
|
|
|
102
111
|
const component = bundleComponentConfig(config.bundles?.[entry.name ?? ""]);
|
|
103
112
|
const contentRoot = resolveEntryContentDir(entry);
|
|
104
113
|
if (contentRoot == null) {
|
|
105
|
-
const unresolvedPath = path.join(getUnresolvedSourcesDir(
|
|
114
|
+
const unresolvedPath = path.join(getUnresolvedSourcesDir(implicitStash ?? process.cwd()), entry.name ?? entry.type);
|
|
106
115
|
addSource(unresolvedPath, entry.name, component?.writable ?? resolveWritable(entry), entry.type, component?.adapter, true, entry.name === config.defaultBundle);
|
|
107
116
|
continue;
|
|
108
117
|
}
|
|
@@ -124,9 +133,7 @@ export function resolveSourceEntries(overrideStashDir, existingConfig) {
|
|
|
124
133
|
*
|
|
125
134
|
* Single source of truth: each provider owns its own path. We instantiate the
|
|
126
135
|
* registered {@link import("../../sources/provider.js").SourceProvider} for the entry
|
|
127
|
-
* and call `provider.path()`.
|
|
128
|
-
* (filesystem path / git cache / website cache) that lived here in 0.6.0 —
|
|
129
|
-
* see spec §10 step 4 and §7 "Removed from 0.6.0".
|
|
136
|
+
* and call `provider.path()`.
|
|
130
137
|
*
|
|
131
138
|
* The git case still does one extra step: the provider returns the cloned
|
|
132
139
|
* repo dir, but the indexer walks the `content/` subdirectory inside it.
|
|
@@ -238,20 +245,23 @@ function isSuspiciousStashRoot(dir) {
|
|
|
238
245
|
* `resolveSourceEntries()` so the content directories pass the
|
|
239
246
|
* `isValidDirectory()` check.
|
|
240
247
|
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
248
|
+
* Sources are never refreshed here: `sync()` is called without `force`, so a
|
|
249
|
+
* source is fetched only when it has never been materialized on this host.
|
|
250
|
+
* `akm bundle update` is what refreshes one.
|
|
251
|
+
*
|
|
252
|
+
* `materialize` (default `true`) is the query-time safety valve: the sanctioned
|
|
253
|
+
* materialization callers (`akm index`, source
|
|
243
254
|
* add/update/sync, improve's blocking preflight) pass it truthy and clone/pull/
|
|
244
255
|
* fetch as needed. A READ command's inline auto-index passes `materialize:
|
|
245
256
|
* false` — network is FORBIDDEN at query time, so instead of `sync()` we only
|
|
246
257
|
* check whether each cache-backed source is already materialized: a present
|
|
247
|
-
* cache is served as-is (last-known-good
|
|
258
|
+
* cache is served as-is (last-known-good), while an absent
|
|
248
259
|
* or partially-staged cache makes that source UNAVAILABLE for the read and is
|
|
249
260
|
* skipped with one warning naming the remedy. The rest of the command still
|
|
250
261
|
* resolves.
|
|
251
262
|
*/
|
|
252
263
|
export async function ensureSourceCaches(config, options) {
|
|
253
264
|
const cfg = config ?? loadConfig();
|
|
254
|
-
const force = options?.force === true;
|
|
255
265
|
const materialize = options?.materialize !== false;
|
|
256
266
|
const onProgress = options?.onProgress ?? (() => { });
|
|
257
267
|
// Polymorphic refresh: walk every enabled source through its registered
|
|
@@ -285,6 +295,16 @@ export async function ensureSourceCaches(config, options) {
|
|
|
285
295
|
// and writes continue using the lock root.
|
|
286
296
|
continue;
|
|
287
297
|
}
|
|
298
|
+
if (entry.type === "npm") {
|
|
299
|
+
// A configured npm bundle with no lock entry has no walkable path (its
|
|
300
|
+
// provider path is the package spec), and nothing marks it materialized,
|
|
301
|
+
// so syncing it here would hit the npm registry on every index run and
|
|
302
|
+
// still leave it unindexed. `akm bundle update` installs it and writes
|
|
303
|
+
// the lock entry.
|
|
304
|
+
warn(`Warning: npm source "${entry.name}" is not installed; skipping it. ` +
|
|
305
|
+
`Run \`akm bundle update ${entry.name}\` to install it.`);
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
288
308
|
const factory = resolveSourceProviderFactory(entry.type);
|
|
289
309
|
if (!factory)
|
|
290
310
|
continue;
|
|
@@ -316,7 +336,7 @@ export async function ensureSourceCaches(config, options) {
|
|
|
316
336
|
// `toSync` only ever holds providers whose `.sync` passed the check
|
|
317
337
|
// above; the optional-chain here is just to satisfy the type (the
|
|
318
338
|
// narrowing does not survive the array round-trip).
|
|
319
|
-
await provider.sync?.({
|
|
339
|
+
await provider.sync?.({ secrets: options?.secrets, ensureWebsiteMirror });
|
|
320
340
|
}
|
|
321
341
|
catch (err) {
|
|
322
342
|
warn(`Warning: failed to refresh ${provider.kind} source "${provider.name}": ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -14,9 +14,8 @@ const USAGE_EVENT_SOURCES = new Set(["user", "improve", "task", "audit", "unknow
|
|
|
14
14
|
* Resolve subprocess provenance without treating an invalid value as user
|
|
15
15
|
* demand.
|
|
16
16
|
*
|
|
17
|
-
* `fallback`
|
|
18
|
-
*
|
|
19
|
-
* reproduces every pre-P1b call site byte-for-byte (P-07). A caller that
|
|
17
|
+
* `fallback` is what an unset/empty ambient value resolves to — it defaults to `"user"`.
|
|
18
|
+
* A caller that
|
|
20
19
|
* already knows the invocation's provenance (the task runner, threading its
|
|
21
20
|
* `ExecutionProvenanceContext`) passes its resolved value as the fallback
|
|
22
21
|
* instead, so a recognized ambient `AKM_EVENT_SOURCE` still wins everywhere it
|
|
@@ -1,4 +1,5 @@
|
|
|
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
|
-
|
|
4
|
+
/** The `index_meta` key holding the last index run's {@link SemanticSearchRecord}. */
|
|
5
|
+
export const SEMANTIC_SEARCH_META_KEY = "semanticSearch";
|
|
@@ -118,7 +118,6 @@ const ARGUMENTS_PLACEHOLDER_RE = /\$ARGUMENTS/;
|
|
|
118
118
|
const NUMERIC_PLACEHOLDER_RE = /\$[123](?!\d|[.,]\d)/;
|
|
119
119
|
const SMART_MD_FACTS = {
|
|
120
120
|
workflow: { type: "workflow", specificity: 19 },
|
|
121
|
-
toolsAgent: { type: "agent", specificity: 20 },
|
|
122
121
|
command: { type: "command", specificity: 18 },
|
|
123
122
|
modelAgent: { type: "agent", specificity: 8 },
|
|
124
123
|
knowledge: { type: "knowledge", specificity: 5 },
|
|
@@ -213,22 +212,15 @@ function classifyBySmartMd(ctx) {
|
|
|
213
212
|
const body = ctx.content();
|
|
214
213
|
const fm = ctx.frontmatter();
|
|
215
214
|
// Recognition is frontmatter `type: workflow` or residence under `workflows/`
|
|
216
|
-
//
|
|
215
|
+
// — no content sniffing. The
|
|
217
216
|
// directory rule is `classifyByDirectory`/`classifyByParentDirHint`'s job;
|
|
218
217
|
// this only catches a workflow living OUTSIDE `workflows/` that still
|
|
219
218
|
// declares its type explicitly.
|
|
220
219
|
if (fm && fm.type === "workflow") {
|
|
221
220
|
return SMART_MD_FACTS.workflow;
|
|
222
221
|
}
|
|
223
|
-
if (fm) {
|
|
224
|
-
|
|
225
|
-
// covers only the key the renderer honors.
|
|
226
|
-
if ("tools" in fm) {
|
|
227
|
-
return SMART_MD_FACTS.toolsAgent;
|
|
228
|
-
}
|
|
229
|
-
if ("agent" in fm) {
|
|
230
|
-
return SMART_MD_FACTS.command;
|
|
231
|
-
}
|
|
222
|
+
if (fm && "agent" in fm) {
|
|
223
|
+
return SMART_MD_FACTS.command;
|
|
232
224
|
}
|
|
233
225
|
// `$ARGUMENTS` is unambiguous, so it keeps its long-standing precedence: a
|
|
234
226
|
// command dropped under `knowledge/` is still found as a command. A skill's
|
|
@@ -1,55 +1,15 @@
|
|
|
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 path from "node:path";
|
|
6
|
-
import { assetPathForName, stashDirFor } from "../../core/asset/asset-placement.js";
|
|
7
|
-
import { parseRefInput } from "../../core/asset/resolve-ref.js";
|
|
8
|
-
import { isWithin } from "../../core/common.js";
|
|
9
|
-
import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
|
|
4
|
+
import { conceptIdFromTypeName, parseRefInput } from "../../core/asset/resolve-ref.js";
|
|
10
5
|
import { lookup } from "../indexer.js";
|
|
11
6
|
import { deriveInstallations } from "../installations.js";
|
|
7
|
+
import { resolveConceptOwner } from "../lookup/adapter-concept-owner.js";
|
|
12
8
|
import { resolveSourceEntries } from "../search/search-source.js";
|
|
13
9
|
function normalizeRef(ref) {
|
|
14
10
|
// String inputs use the current `[bundle//]conceptId` grammar.
|
|
15
11
|
return typeof ref === "string" ? parseRefInput(ref) : ref;
|
|
16
12
|
}
|
|
17
|
-
function buildDiskCandidates(sourcePath, ref, preserveDirectNameFallback) {
|
|
18
|
-
const placementStashDir = stashDirFor(ref.type);
|
|
19
|
-
// Opaque adapter conceptIds are index-resolved. Core cannot infer their
|
|
20
|
-
// adapter-owned serialization or path extension before indexing.
|
|
21
|
-
if (placementStashDir === undefined)
|
|
22
|
-
return [];
|
|
23
|
-
const typeDir = path.join(sourcePath, placementStashDir);
|
|
24
|
-
const candidates = [
|
|
25
|
-
assetPathForName(ref.type, typeDir, ref.name),
|
|
26
|
-
path.join(sourcePath, ref.type, `${ref.name}.md`),
|
|
27
|
-
path.join(sourcePath, ref.type, ref.name),
|
|
28
|
-
];
|
|
29
|
-
if (preserveDirectNameFallback) {
|
|
30
|
-
candidates.push(path.join(sourcePath, `${ref.name}.md`), path.join(sourcePath, ref.name));
|
|
31
|
-
}
|
|
32
|
-
return candidates;
|
|
33
|
-
}
|
|
34
|
-
function resolveDirectoryEntry(filePath, directoryIndexNames) {
|
|
35
|
-
let stat;
|
|
36
|
-
try {
|
|
37
|
-
stat = fs.statSync(filePath);
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
if (stat.isFile())
|
|
43
|
-
return filePath;
|
|
44
|
-
if (!stat.isDirectory())
|
|
45
|
-
return null;
|
|
46
|
-
for (const indexName of directoryIndexNames) {
|
|
47
|
-
const candidate = path.join(filePath, indexName);
|
|
48
|
-
if (fs.existsSync(candidate) && fs.statSync(candidate).isFile())
|
|
49
|
-
return candidate;
|
|
50
|
-
}
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
13
|
async function resolveViaIndex(ref) {
|
|
54
14
|
try {
|
|
55
15
|
const entry = await lookup(ref);
|
|
@@ -60,32 +20,17 @@ async function resolveViaIndex(ref) {
|
|
|
60
20
|
}
|
|
61
21
|
}
|
|
62
22
|
function resolveViaDisk(ref, options) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const candidates = buildDiskCandidates(source.path, ref, preserveDirectNameFallback);
|
|
75
|
-
for (const candidate of candidates) {
|
|
76
|
-
if (!fs.existsSync(candidate))
|
|
77
|
-
continue;
|
|
78
|
-
const resolved = resolveDirectoryEntry(candidate, directoryIndexNames);
|
|
79
|
-
if (!resolved)
|
|
80
|
-
continue;
|
|
81
|
-
const resolvedRoot = fs.realpathSync(source.path);
|
|
82
|
-
const realTarget = fs.realpathSync(resolved);
|
|
83
|
-
if (!isWithin(realTarget, resolvedRoot))
|
|
84
|
-
continue;
|
|
85
|
-
return realTarget;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
23
|
+
const allSources = resolveSourceEntries(options.stashDir);
|
|
24
|
+
const installations = deriveInstallations(allSources);
|
|
25
|
+
const sources = options.writableBundleIds
|
|
26
|
+
? allSources.filter((_, index) => {
|
|
27
|
+
const bundleId = installations[index]?.id;
|
|
28
|
+
return bundleId !== undefined && options.writableBundleIds?.has(bundleId);
|
|
29
|
+
})
|
|
30
|
+
: allSources;
|
|
31
|
+
const bundle = options.honorOrigin !== false ? ref.origin : undefined;
|
|
32
|
+
return (resolveConceptOwner({ bundle, conceptId: conceptIdFromTypeName(ref.type, ref.name) }, sources)?.owner.realPath ??
|
|
33
|
+
null);
|
|
89
34
|
}
|
|
90
35
|
export async function resolveAssetPath(ref, options = {}) {
|
|
91
36
|
const parsed = normalizeRef(ref);
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
import fs from "node:fs";
|
|
12
12
|
import path from "node:path";
|
|
13
13
|
import { isRelevantAssetFile } from "../../core/asset/asset-placement.js";
|
|
14
|
-
import { WORKFLOW_EXTENSIONS } from "../../core/recognition-util.js";
|
|
15
14
|
import { spawnSync } from "../../runtime.js";
|
|
16
15
|
import { buildFileContext } from "./file-context.js";
|
|
17
16
|
const ALWAYS_SKIP_DIRS = new Set([".git"]);
|
|
@@ -60,7 +59,8 @@ export function walkStash(typeRoot, assetType) {
|
|
|
60
59
|
* Unlike walkStash(), this does NOT filter by asset type or require files to
|
|
61
60
|
* live under type-specific directories. Matchers decide what each file is.
|
|
62
61
|
*
|
|
63
|
-
* If the directory is a git repo, uses `git ls-files` to respect .gitignore
|
|
62
|
+
* If the directory is a git repo, uses `git ls-files` to respect .gitignore,
|
|
63
|
+
* except that git-ignored files under `env/` and `secrets/` are still walked.
|
|
64
64
|
* Otherwise falls back to a manual walk that skips .git, node_modules, bin,
|
|
65
65
|
* .cache, dot-directories, and the legacy metadata sidecar.
|
|
66
66
|
*/
|
|
@@ -78,7 +78,8 @@ export function walkStashFlatWithStatus(stashRoot, options = {}) {
|
|
|
78
78
|
return walkStashManual(stashRoot, options);
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
81
|
-
* Walk using `git ls-files` to respect .gitignore
|
|
81
|
+
* Walk using `git ls-files` to respect .gitignore (ignored `env/` and
|
|
82
|
+
* `secrets/` files excepted).
|
|
82
83
|
* Returns null if the directory is not a git repo or git fails.
|
|
83
84
|
*/
|
|
84
85
|
function walkStashGit(stashRoot, options) {
|
|
@@ -101,12 +102,20 @@ function walkStashGit(stashRoot, options) {
|
|
|
101
102
|
? deletedResult.stdout.toString("utf8")
|
|
102
103
|
: String(deletedResult.stdout ?? "");
|
|
103
104
|
const deletedFiles = new Set(deletedStdout.split("\0").filter(Boolean));
|
|
105
|
+
// `akm bundle create` git-ignores `env/` and `secrets/` so credentials are
|
|
106
|
+
// never committed, but they are still bundle assets. List the ignored files
|
|
107
|
+
// under those two directories as well; the adapters index key names only.
|
|
108
|
+
const ignoredResult = spawnSync(["git", "ls-files", "--others", "--ignored", "--exclude-standard", "-z", "--", "env/", "secrets/"], { cwd: stashRoot });
|
|
109
|
+
if (!ignoredResult.success)
|
|
110
|
+
return null;
|
|
111
|
+
const ignoredStdout = Buffer.isBuffer(ignoredResult.stdout)
|
|
112
|
+
? ignoredResult.stdout.toString("utf8")
|
|
113
|
+
: String(ignoredResult.stdout ?? "");
|
|
104
114
|
// Data-hygiene filename skips: the legacy metadata sidecar (never indexed as
|
|
105
115
|
// content — Chunk-8 folds it into the bundle format) plus git dot-files.
|
|
106
116
|
const SKIP_FILES = new Set([".stash.json", ".gitignore", ".gitattributes"]);
|
|
107
117
|
const stdout = Buffer.isBuffer(result.stdout) ? result.stdout.toString("utf8") : String(result.stdout ?? "");
|
|
108
|
-
const files = stdout
|
|
109
|
-
.split("\0")
|
|
118
|
+
const files = [...stdout.split("\0"), ...ignoredStdout.split("\0")]
|
|
110
119
|
.filter((f) => f.length > 0)
|
|
111
120
|
.filter((f) => !deletedFiles.has(f))
|
|
112
121
|
.filter((f) => !f.startsWith("..") && !path.isAbsolute(f))
|
|
@@ -124,13 +133,11 @@ function walkStashGit(stashRoot, options) {
|
|
|
124
133
|
for (const relFile of files) {
|
|
125
134
|
const absPath = path.join(stashRoot, relFile);
|
|
126
135
|
try {
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
//
|
|
130
|
-
// reason; the two walkers have to agree regardless of whether the stash
|
|
131
|
-
// happens to sit inside a git repo.
|
|
136
|
+
// A file that is a symlink to a file anywhere is indexed like any other
|
|
137
|
+
// file: installing a bundle is the trust decision. git lists a symlinked
|
|
138
|
+
// directory as one entry, so directory symlinks are never descended.
|
|
132
139
|
const stat = fs.lstatSync(absPath);
|
|
133
|
-
if (stat.isFile() || (stat.isSymbolicLink() &&
|
|
140
|
+
if (stat.isFile() || (stat.isSymbolicLink() && isFileOrFileSymlink(absPath))) {
|
|
134
141
|
results.push(buildFileContext(stashRoot, absPath));
|
|
135
142
|
}
|
|
136
143
|
}
|
|
@@ -191,8 +198,11 @@ export function walkMarkdownFiles(root) {
|
|
|
191
198
|
}
|
|
192
199
|
for (const entry of entries) {
|
|
193
200
|
const full = path.join(current, entry.name);
|
|
194
|
-
if (entry.isSymbolicLink())
|
|
201
|
+
if (entry.isSymbolicLink()) {
|
|
202
|
+
if (entry.name.toLowerCase().endsWith(".md") && isFileOrFileSymlink(full))
|
|
203
|
+
files.push(full);
|
|
195
204
|
continue;
|
|
205
|
+
}
|
|
196
206
|
if (entry.isDirectory()) {
|
|
197
207
|
stack.push(full);
|
|
198
208
|
}
|
|
@@ -225,11 +235,10 @@ function walkStashManual(stashRoot, options) {
|
|
|
225
235
|
continue;
|
|
226
236
|
const fullPath = path.join(current, entry.name);
|
|
227
237
|
if (entry.isSymbolicLink()) {
|
|
228
|
-
//
|
|
229
|
-
//
|
|
230
|
-
if (
|
|
238
|
+
// A file symlink is indexed like any other file; a directory symlink
|
|
239
|
+
// is never descended (no cycles).
|
|
240
|
+
if (isFileOrFileSymlink(fullPath))
|
|
231
241
|
results.push(buildFileContext(stashRoot, fullPath));
|
|
232
|
-
}
|
|
233
242
|
continue;
|
|
234
243
|
}
|
|
235
244
|
if (entry.isDirectory()) {
|
|
@@ -245,15 +254,12 @@ function walkStashManual(stashRoot, options) {
|
|
|
245
254
|
}
|
|
246
255
|
return { files: results, complete };
|
|
247
256
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
return
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
return false;
|
|
255
|
-
if (adapterId === "akm" && !relativePath.startsWith("workflows/"))
|
|
257
|
+
/** True for a regular file, or a symlink whose target is a regular file. */
|
|
258
|
+
export function isFileOrFileSymlink(filePath) {
|
|
259
|
+
try {
|
|
260
|
+
return fs.statSync(filePath).isFile();
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
256
263
|
return false;
|
|
257
|
-
|
|
258
|
-
return WORKFLOW_EXTENSIONS.includes(extension);
|
|
264
|
+
}
|
|
259
265
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
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
|
+
* akm's read-only tools for agent work, in harness-neutral form (#1244): the
|
|
6
|
+
* `akm` capability. A harness adapts each one to its own tool API; the tool runs
|
|
7
|
+
* in akm's process and returns what `akm --detail agent <command> --format json`
|
|
8
|
+
* would print.
|
|
9
|
+
*/
|
|
10
|
+
import { renderOutput } from "../../cli/shared.js";
|
|
11
|
+
import { akmSearch } from "../../commands/read/search.js";
|
|
12
|
+
import { runCurate } from "../../commands/read/search-cli.js";
|
|
13
|
+
import { akmShowUnified } from "../../commands/read/show.js";
|
|
14
|
+
import { loadConfig } from "../../core/config/config.js";
|
|
15
|
+
import { withQuiet } from "../../core/warn.js";
|
|
16
|
+
import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
|
|
17
|
+
import { resolveOutputMode } from "../../output/context.js";
|
|
18
|
+
import { stdoutText } from "../../output/stdout.js";
|
|
19
|
+
/** The usage-event source a tool call records: the run's own, validated; the default only for a run with none. */
|
|
20
|
+
const sourceOf = (context) => context?.eventSource === undefined ? undefined : resolveUsageEventSource({ AKM_EVENT_SOURCE: context.eventSource });
|
|
21
|
+
const str = (value) => typeof value === "string" && value.trim() !== "" ? value.trim() : undefined;
|
|
22
|
+
const positiveInt = (value) => typeof value === "number" && Number.isInteger(value) && value > 0 ? value : undefined;
|
|
23
|
+
/** Run one read command the way the CLI does with `--detail agent --format json`, quietly. */
|
|
24
|
+
function asCli(command, compute) {
|
|
25
|
+
return withQuiet(async () => {
|
|
26
|
+
const mode = resolveOutputMode(["--detail", "agent", "--format", "json"], loadConfig().output ?? {});
|
|
27
|
+
return stdoutText(renderOutput(command, await compute(mode), { ...mode, format: "json" }));
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function required(input, key) {
|
|
31
|
+
const value = str(input[key]);
|
|
32
|
+
if (!value)
|
|
33
|
+
throw new Error(`"${key}" is required`);
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
export const AKM_READ_TOOLS = [
|
|
37
|
+
{
|
|
38
|
+
name: "akm_curate",
|
|
39
|
+
description: "Find the akm assets (skills, knowledge, memories, workflows) that best fit a task. Read one with akm_show before relying on it.",
|
|
40
|
+
inputSchema: {
|
|
41
|
+
type: "object",
|
|
42
|
+
properties: {
|
|
43
|
+
query: { type: "string", description: "The task or question" },
|
|
44
|
+
type: { type: "string", description: "Optional asset type filter" },
|
|
45
|
+
limit: { type: "integer", minimum: 1 },
|
|
46
|
+
},
|
|
47
|
+
required: ["query"],
|
|
48
|
+
},
|
|
49
|
+
run: (input, context) => asCli("curate", (mode) => runCurate({
|
|
50
|
+
query: required(input, "query"),
|
|
51
|
+
type: str(input.type),
|
|
52
|
+
limit: positiveInt(input.limit) === undefined ? undefined : String(input.limit),
|
|
53
|
+
eventSource: sourceOf(context),
|
|
54
|
+
}, mode)),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: "akm_search",
|
|
58
|
+
description: "Search akm assets by name or keyword.",
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
query: { type: "string" },
|
|
63
|
+
type: { type: "string", description: "Optional asset type filter" },
|
|
64
|
+
limit: { type: "integer", minimum: 1 },
|
|
65
|
+
},
|
|
66
|
+
required: ["query"],
|
|
67
|
+
},
|
|
68
|
+
run: (input, context) => asCli("search", () => akmSearch({
|
|
69
|
+
query: required(input, "query"),
|
|
70
|
+
type: str(input.type),
|
|
71
|
+
limit: positiveInt(input.limit),
|
|
72
|
+
eventSource: sourceOf(context),
|
|
73
|
+
})),
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: "akm_show",
|
|
77
|
+
description: "Read one akm asset by its ref, as returned by akm_curate or akm_search.",
|
|
78
|
+
inputSchema: { type: "object", properties: { ref: { type: "string" } }, required: ["ref"] },
|
|
79
|
+
run: (input, context) => asCli("show", () => akmShowUnified({ ref: required(input, "ref"), eventSource: sourceOf(context) })),
|
|
80
|
+
},
|
|
81
|
+
];
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/** Default agent CLI timeout; null means agents run until they finish. */
|
|
5
5
|
export const DEFAULT_AGENT_TIMEOUT_MS = null;
|
|
6
|
-
/** Default hard timeout for
|
|
6
|
+
/** Default hard timeout for model work (a call on a connection, or model work on a harness) when neither the request nor the connection's or harness's `timeoutMs` sets one. Agent work has none. */
|
|
7
7
|
export const DEFAULT_LLM_TIMEOUT_MS = 600_000;
|