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
|
@@ -1,135 +0,0 @@
|
|
|
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
|
-
* OpenHands CLI result extractor (P2, plan §"The adapter contract" step 3 /
|
|
6
|
-
* §"Structured-output normalization", tier "native-json").
|
|
7
|
-
*
|
|
8
|
-
* Normalizes one raw {@link AgentRunResult} from a headless
|
|
9
|
-
* `openhands --headless --json` run into `{ text, sessionId? }` — the
|
|
10
|
-
* {@link AgentResultExtraction} seam. The engine's shared schema-validation /
|
|
11
|
-
* retry-until-valid loop runs *after* this; the extractor only strips
|
|
12
|
-
* transport framing.
|
|
13
|
-
*
|
|
14
|
-
* With `--json` OpenHands emits ONE JSON event per stdout line — its
|
|
15
|
-
* action/observation event stream, e.g.:
|
|
16
|
-
*
|
|
17
|
-
* {"id":0,"source":"user","action":"message","args":{"content":"<task>"},"message":"<task>"}
|
|
18
|
-
* {"id":1,"source":"agent","action":"run","args":{"command":"ls"},"message":"Running command: ls"}
|
|
19
|
-
* {"id":2,"source":"agent","observation":"run","content":"README.md","message":"Command `ls` executed."}
|
|
20
|
-
* {"id":3,"source":"agent","action":"message","args":{"content":"<answer>"},"message":"<answer>"}
|
|
21
|
-
* {"id":4,"source":"agent","action":"finish","args":{"final_thought":"<answer>","outputs":{}},"message":"..."}
|
|
22
|
-
*
|
|
23
|
-
* Extraction rules ("parse JSONL final message" per the capability matrix):
|
|
24
|
-
* - text: the LAST agent-sourced *message-bearing* event wins. Only two
|
|
25
|
-
* event kinds carry the agent's answer: `action:"message"`
|
|
26
|
-
* (`args.content`, falling back to the top-level `message` mirror) and
|
|
27
|
-
* `action:"finish"` (`args.final_thought`/`args.thought`, falling back to
|
|
28
|
-
* `message`). User echoes, observations, and tool actions (`run`, `edit`,
|
|
29
|
-
* …, whose `message` is progress noise like "Running command: ls") never
|
|
30
|
-
* contribute.
|
|
31
|
-
* - sessionId: the FIRST id-bearing event supplies it (`session_id`,
|
|
32
|
-
* `sessionId`, `sid`, `conversation_id`), falling back to any sessionId
|
|
33
|
-
* the spawn layer already attached. Stored opportunistically on the unit
|
|
34
|
-
* row; per the matrix OpenHands resume is workspace-state, so akm never
|
|
35
|
-
* depends on it (plan §"Session, MCP, and identity across harnesses").
|
|
36
|
-
*
|
|
37
|
-
* Also handled, so version churn stays contained in this one file (per the
|
|
38
|
-
* adapter contract):
|
|
39
|
-
* - a single whole-stdout JSON document (or a spawn-layer `result.parsed`
|
|
40
|
-
* value) is interpreted with the same rules;
|
|
41
|
-
* - plain text (no `--json`, or an unrecognized envelope) passes through
|
|
42
|
-
* trimmed — the engine's embedded-JSON parsing still runs downstream for
|
|
43
|
-
* schema units;
|
|
44
|
-
* - non-JSON banner lines interleaved in the stream are skipped.
|
|
45
|
-
*
|
|
46
|
-
* Registered: `openhandsResultExtractor` is `OpenhandsHarness.resultExtractor`
|
|
47
|
-
* (`./index.ts`); the engine resolves it via `getHarness()` in
|
|
48
|
-
* `workflows/exec/native-executor.ts` to normalize agent-unit stdout before
|
|
49
|
-
* schema validation.
|
|
50
|
-
*/
|
|
51
|
-
import { asNonEmptyString, isRecord, tryParseJson } from "../../../core/common.js";
|
|
52
|
-
/** Keys that may carry the harness-native session id, in precedence order. */
|
|
53
|
-
const SESSION_KEYS = ["session_id", "sessionId", "sid", "conversation_id"];
|
|
54
|
-
/**
|
|
55
|
-
* Extract the agent's answer text from one parsed OpenHands event, if the
|
|
56
|
-
* event is one of the two message-bearing kinds (see module doc). Everything
|
|
57
|
-
* else — user echoes, observations, tool actions — yields undefined.
|
|
58
|
-
*/
|
|
59
|
-
function extractAgentText(event) {
|
|
60
|
-
// Only agent-authored events count; a missing `source` is tolerated for
|
|
61
|
-
// finish/message actions from older serializations, but an explicit
|
|
62
|
-
// non-agent source (user echo, environment) never contributes.
|
|
63
|
-
if (event.source !== undefined && event.source !== "agent")
|
|
64
|
-
return undefined;
|
|
65
|
-
if (typeof event.action !== "string")
|
|
66
|
-
return undefined;
|
|
67
|
-
const args = isRecord(event.args) ? event.args : undefined;
|
|
68
|
-
if (event.action === "message") {
|
|
69
|
-
return asNonEmptyString(args?.content) ?? asNonEmptyString(event.message);
|
|
70
|
-
}
|
|
71
|
-
if (event.action === "finish") {
|
|
72
|
-
return asNonEmptyString(args?.final_thought) ?? asNonEmptyString(args?.thought) ?? asNonEmptyString(event.message);
|
|
73
|
-
}
|
|
74
|
-
return undefined;
|
|
75
|
-
}
|
|
76
|
-
/** Extract a harness-native session id from one parsed JSON value, if any. */
|
|
77
|
-
function extractSessionId(event) {
|
|
78
|
-
for (const key of SESSION_KEYS) {
|
|
79
|
-
const candidate = asNonEmptyString(event[key]);
|
|
80
|
-
if (candidate)
|
|
81
|
-
return candidate;
|
|
82
|
-
}
|
|
83
|
-
return undefined;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Normalize a raw openhands run result into `{ text, sessionId? }`.
|
|
87
|
-
* See the module doc for the stdout shapes handled.
|
|
88
|
-
*/
|
|
89
|
-
export const openhandsResultExtractor = (result) => {
|
|
90
|
-
// The raw result's own sessionId (SDK-style paths) is the fallback; an id
|
|
91
|
-
// found in the output stream wins because it is fresher.
|
|
92
|
-
const fallbackSessionId = result.sessionId;
|
|
93
|
-
const raw = result.stdout.trim();
|
|
94
|
-
// Shape 1 — whole stdout is one JSON document (spawn may have pre-parsed it
|
|
95
|
-
// when the profile requested parseOutput: "json"). A multi-event JSONL
|
|
96
|
-
// stream never parses as a single document, so this cannot shadow shape 2.
|
|
97
|
-
const whole = result.parsed !== undefined ? result.parsed : raw.length > 0 ? tryParseJson(raw) : undefined;
|
|
98
|
-
if (whole !== undefined) {
|
|
99
|
-
if (typeof whole === "string") {
|
|
100
|
-
return { text: whole, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
|
|
101
|
-
}
|
|
102
|
-
if (isRecord(whole)) {
|
|
103
|
-
const sessionId = extractSessionId(whole) ?? fallbackSessionId;
|
|
104
|
-
// Unknown envelope (no agent message): fall back to raw stdout so
|
|
105
|
-
// downstream embedded-JSON parsing still has material to work with.
|
|
106
|
-
const text = extractAgentText(whole) ?? raw;
|
|
107
|
-
return { text, ...(sessionId ? { sessionId } : {}) };
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// Shape 2 — JSONL event stream (`--json`): last message-bearing agent event
|
|
111
|
-
// wins; first id-bearing event supplies the session id. Non-JSON banner
|
|
112
|
-
// lines are skipped.
|
|
113
|
-
let lastText;
|
|
114
|
-
let streamSessionId;
|
|
115
|
-
let sawJsonLine = false;
|
|
116
|
-
for (const line of raw.split("\n")) {
|
|
117
|
-
const trimmed = line.trim();
|
|
118
|
-
if (trimmed.length === 0)
|
|
119
|
-
continue;
|
|
120
|
-
const event = tryParseJson(trimmed);
|
|
121
|
-
if (event === undefined || !isRecord(event))
|
|
122
|
-
continue;
|
|
123
|
-
sawJsonLine = true;
|
|
124
|
-
streamSessionId ??= extractSessionId(event);
|
|
125
|
-
const text = extractAgentText(event);
|
|
126
|
-
if (text !== undefined)
|
|
127
|
-
lastText = text;
|
|
128
|
-
}
|
|
129
|
-
if (sawJsonLine) {
|
|
130
|
-
const sessionId = streamSessionId ?? fallbackSessionId;
|
|
131
|
-
return { text: lastText ?? raw, ...(sessionId ? { sessionId } : {}) };
|
|
132
|
-
}
|
|
133
|
-
// Shape 3 — plain text passthrough.
|
|
134
|
-
return { text: raw, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
|
|
135
|
-
};
|
|
@@ -1,89 +0,0 @@
|
|
|
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
|
-
* Pi coding-agent CLI command builder (P2, plan §"The adapter contract"
|
|
6
|
-
* step 2 / §"Capability matrix").
|
|
7
|
-
*
|
|
8
|
-
* Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
|
|
9
|
-
* headless argv the `pi` CLI expects. Per the capability matrix the headless
|
|
10
|
-
* invocation is:
|
|
11
|
-
*
|
|
12
|
-
* pi -p "<prompt>"
|
|
13
|
-
*
|
|
14
|
-
* with `--mode json` for structured (JSONL) output, `--model <m>` for model
|
|
15
|
-
* selection, and `-c`/`-r`/`--session <id>` for resume — not built here
|
|
16
|
-
* because `AgentDispatchRequest` carries no session id (akm's
|
|
17
|
-
* `workflow_run_units` is the durable resume source of truth).
|
|
18
|
-
*
|
|
19
|
-
* Platform-specific mapping decisions (all localized here, per the adapter
|
|
20
|
-
* contract):
|
|
21
|
-
*
|
|
22
|
-
* - **prompt** — `-p` is Pi's non-interactive print mode (same convention as
|
|
23
|
-
* Claude Code's `--print`); the prompt is the trailing positional message.
|
|
24
|
-
* The `--` end-of-options separator precedes it, mirroring the claude/codex
|
|
25
|
-
* builders, so a prompt whose text begins with `-`/`--` can never be parsed
|
|
26
|
-
* as flags.
|
|
27
|
-
* - **systemPrompt** — passed via `--system-prompt` (Pi follows the Claude
|
|
28
|
-
* Code flag conventions).
|
|
29
|
-
* - **schema** — the matrix places Pi in the "via prompt+validate" tier (no
|
|
30
|
-
* native `--output-schema` equivalent, unlike Codex), so the JSON Schema
|
|
31
|
-
* reaches it as the instruction the shared request lowering appends to the
|
|
32
|
-
* prompt, and `--mode json` is emitted so stdout is the documented JSONL
|
|
33
|
-
* event stream that `./result-extractor.ts` normalizes. The engine's shared
|
|
34
|
-
* retry-until-valid loop performs the actual validation. Without a schema
|
|
35
|
-
* the argv matches the matrix's bare headless shape (`pi -p "<p>"`) and the
|
|
36
|
-
* extractor's plain-text path applies.
|
|
37
|
-
* - **tools** — deliberately unconsumed. Pi manages tool access through its
|
|
38
|
-
* own config/extension system (the matrix lists MCP as "extensions only");
|
|
39
|
-
* there is no documented per-tool allowlist flag, and inventing one would
|
|
40
|
-
* produce a silently broken command. A restrictive policy is therefore
|
|
41
|
-
* dropped rather than approximated — never silently widened.
|
|
42
|
-
* - **inference** — not translated: the shared lowering reports each field of
|
|
43
|
-
* the request's inference as untranslated.
|
|
44
|
-
*
|
|
45
|
-
* Registered: `piBuilder` is `PiHarness.agentBuilder` (`./index.ts`), one of
|
|
46
|
-
* the ten harnesses `HARNESS_REGISTRY` constructs (`harnesses/index.ts`);
|
|
47
|
-
* `agent/builders.ts` derives `BUILTIN_BUILDERS` from that registry, so this
|
|
48
|
-
* builder is reachable under the `"pi"` platform name without any further
|
|
49
|
-
* wiring. The `PI_SESSION_ID` identity-env marker is declared alongside it
|
|
50
|
-
* (`./index.ts`).
|
|
51
|
-
*/
|
|
52
|
-
import { resolveDispatchModel } from "../../agent/builder-shared.js";
|
|
53
|
-
import { createAgentRequestLowerer } from "../../agent/request-lowering.js";
|
|
54
|
-
/** Canonical harness/platform id used for model-alias resolution. */
|
|
55
|
-
export const PI_PLATFORM = "pi";
|
|
56
|
-
/**
|
|
57
|
-
* Pi builder.
|
|
58
|
-
* Command shape:
|
|
59
|
-
* pi [--system-prompt "..."] [--model <m>] [--mode json] -p -- "<prompt>"
|
|
60
|
-
*/
|
|
61
|
-
export const piBuilder = {
|
|
62
|
-
platform: PI_PLATFORM,
|
|
63
|
-
personaChannel: "native",
|
|
64
|
-
lower: createAgentRequestLowerer({
|
|
65
|
-
adapter: PI_PLATFORM,
|
|
66
|
-
personaChannel: "native",
|
|
67
|
-
tools: "none",
|
|
68
|
-
}),
|
|
69
|
-
build(profile, req) {
|
|
70
|
-
const args = [...profile.args];
|
|
71
|
-
if (req.systemPrompt) {
|
|
72
|
-
args.push("--system-prompt", req.systemPrompt);
|
|
73
|
-
}
|
|
74
|
-
if (req.model) {
|
|
75
|
-
const resolved = resolveDispatchModel(req, profile, PI_PLATFORM);
|
|
76
|
-
args.push("--model", resolved);
|
|
77
|
-
}
|
|
78
|
-
if (req.schema) {
|
|
79
|
-
// Structured unit: JSONL event stream on stdout — the pi result
|
|
80
|
-
// extractor's documented input (prompt+validate tier).
|
|
81
|
-
args.push("--mode", "json");
|
|
82
|
-
}
|
|
83
|
-
// -p = non-interactive print mode; prompt is the trailing positional.
|
|
84
|
-
args.push("-p");
|
|
85
|
-
args.push("--");
|
|
86
|
-
args.push(req.prompt);
|
|
87
|
-
return { argv: [profile.bin, ...args] };
|
|
88
|
-
},
|
|
89
|
-
};
|
|
@@ -1,168 +0,0 @@
|
|
|
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
|
-
* Pi coding-agent CLI result extractor (P2, plan §"The adapter contract"
|
|
6
|
-
* step 3 / §"Structured-output normalization", tier "native-json").
|
|
7
|
-
*
|
|
8
|
-
* Normalizes one raw {@link AgentRunResult} from a headless `pi` run into
|
|
9
|
-
* `{ text, sessionId? }` — the {@link AgentResultExtraction} seam. The
|
|
10
|
-
* engine's shared schema-validation / retry-until-valid loop runs *after*
|
|
11
|
-
* this; the extractor only strips transport framing.
|
|
12
|
-
*
|
|
13
|
-
* With `--mode json` (the capability matrix's structured mode) Pi emits ONE
|
|
14
|
-
* JSON event per stdout line — the agent-session event stream, e.g.:
|
|
15
|
-
*
|
|
16
|
-
* {"type":"session_start","session_id":"<id>"}
|
|
17
|
-
* {"type":"agent_start"}
|
|
18
|
-
* {"type":"message_start","message":{"role":"assistant","content":[]}}
|
|
19
|
-
* {"type":"message_end","message":{"role":"assistant","content":[{"type":"text","text":"<text>"}]}}
|
|
20
|
-
* {"type":"agent_end","messages":[{"role":"assistant","content":[...]}]}
|
|
21
|
-
*
|
|
22
|
-
* Extraction rules:
|
|
23
|
-
* - text: the LAST assistant text-bearing event wins (`message_end` bodies;
|
|
24
|
-
* an `agent_end` transcript's final assistant message; tolerant flat
|
|
25
|
-
* `role:"assistant"` events). User-role echoes / tool events never
|
|
26
|
-
* contribute. Assistant content blocks are flattened; non-text blocks
|
|
27
|
-
* (thinking, tool use) are skipped.
|
|
28
|
-
* - sessionId: the FIRST session-id-bearing event supplies it (snake_case /
|
|
29
|
-
* camelCase variants, plus `id` on `session*`-typed events), falling back
|
|
30
|
-
* to any sessionId the spawn layer already attached. Stored
|
|
31
|
-
* opportunistically on the unit row for `--session <id>` resume; akm
|
|
32
|
-
* never depends on it (plan §"Session, MCP, and identity").
|
|
33
|
-
*
|
|
34
|
-
* Also handled, so version churn stays contained in this one file (per the
|
|
35
|
-
* adapter contract):
|
|
36
|
-
* - a single whole-stdout JSON document (or a spawn-layer `result.parsed`
|
|
37
|
-
* value) is interpreted with the same rules;
|
|
38
|
-
* - plain text (no `--mode json`, or an unrecognized envelope) passes
|
|
39
|
-
* through trimmed — the engine's embedded-JSON parsing still runs
|
|
40
|
-
* downstream for schema units;
|
|
41
|
-
* - non-JSON banner lines interleaved in the stream are skipped.
|
|
42
|
-
*
|
|
43
|
-
* Registered: `piResultExtractor` is `PiHarness.resultExtractor`
|
|
44
|
-
* (`./index.ts`); the engine resolves it via `getHarness()` in
|
|
45
|
-
* `workflows/exec/native-executor.ts` to normalize agent-unit stdout before
|
|
46
|
-
* schema validation.
|
|
47
|
-
*/
|
|
48
|
-
import { isRecord, tryParseJson } from "../../../core/common.js";
|
|
49
|
-
/** Keys that may carry the harness-native session id, in precedence order. */
|
|
50
|
-
const SESSION_KEYS = ["session_id", "sessionId", "session"];
|
|
51
|
-
/**
|
|
52
|
-
* Coerce a candidate value into text. Handles the shapes Pi nests assistant
|
|
53
|
-
* answers in: bare strings, arrays of content blocks, and `{content|text}`
|
|
54
|
-
* wrappers. Blocks without a `content`/`text` string (thinking, tool-use)
|
|
55
|
-
* contribute nothing. Depth-bounded: JSON.parse output is acyclic, but
|
|
56
|
-
* nesting is capped anyway so a pathological envelope cannot recurse
|
|
57
|
-
* unboundedly.
|
|
58
|
-
*/
|
|
59
|
-
function textOf(value, depth = 0) {
|
|
60
|
-
if (depth > 4)
|
|
61
|
-
return undefined;
|
|
62
|
-
if (typeof value === "string")
|
|
63
|
-
return value;
|
|
64
|
-
if (Array.isArray(value)) {
|
|
65
|
-
const parts = [];
|
|
66
|
-
for (const block of value) {
|
|
67
|
-
const t = textOf(block, depth + 1);
|
|
68
|
-
if (t)
|
|
69
|
-
parts.push(t);
|
|
70
|
-
}
|
|
71
|
-
return parts.length > 0 ? parts.join("\n") : undefined;
|
|
72
|
-
}
|
|
73
|
-
if (isRecord(value)) {
|
|
74
|
-
return textOf(value.content ?? value.text, depth + 1);
|
|
75
|
-
}
|
|
76
|
-
return undefined;
|
|
77
|
-
}
|
|
78
|
-
/** Extract the text of one assistant-authored message record, if it is one. */
|
|
79
|
-
function assistantMessageText(message) {
|
|
80
|
-
if (!isRecord(message) || message.role !== "assistant")
|
|
81
|
-
return undefined;
|
|
82
|
-
return textOf(message.content ?? message.text);
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Extract assistant text from one parsed JSON event/value:
|
|
86
|
-
* `message` envelopes (`message_start`/`message_end`), `messages` transcripts
|
|
87
|
-
* (`agent_end` — last assistant entry wins), and tolerant flat
|
|
88
|
-
* `role:"assistant"` events.
|
|
89
|
-
*/
|
|
90
|
-
function extractAssistantText(event) {
|
|
91
|
-
const fromEnvelope = assistantMessageText(event.message);
|
|
92
|
-
if (fromEnvelope !== undefined)
|
|
93
|
-
return fromEnvelope;
|
|
94
|
-
const transcript = event.messages;
|
|
95
|
-
if (Array.isArray(transcript)) {
|
|
96
|
-
for (let i = transcript.length - 1; i >= 0; i--) {
|
|
97
|
-
const text = assistantMessageText(transcript[i]);
|
|
98
|
-
if (text !== undefined)
|
|
99
|
-
return text;
|
|
100
|
-
}
|
|
101
|
-
return undefined;
|
|
102
|
-
}
|
|
103
|
-
return assistantMessageText(event);
|
|
104
|
-
}
|
|
105
|
-
/** Extract a harness-native session id from one parsed JSON value, if any. */
|
|
106
|
-
function extractSessionId(event) {
|
|
107
|
-
for (const key of SESSION_KEYS) {
|
|
108
|
-
const candidate = event[key];
|
|
109
|
-
if (typeof candidate === "string" && candidate.length > 0)
|
|
110
|
-
return candidate;
|
|
111
|
-
}
|
|
112
|
-
// Session-lifecycle events may carry the id under a bare `id` key.
|
|
113
|
-
if (typeof event.type === "string" && event.type.startsWith("session") && typeof event.id === "string" && event.id) {
|
|
114
|
-
return event.id;
|
|
115
|
-
}
|
|
116
|
-
return undefined;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Normalize a raw pi run result into `{ text, sessionId? }`.
|
|
120
|
-
* See the module doc for the stdout shapes handled.
|
|
121
|
-
*/
|
|
122
|
-
export const piResultExtractor = (result) => {
|
|
123
|
-
// The raw result's own sessionId (SDK-style paths) is the fallback; an id
|
|
124
|
-
// found in the output stream wins because it is fresher.
|
|
125
|
-
const fallbackSessionId = result.sessionId;
|
|
126
|
-
const raw = result.stdout.trim();
|
|
127
|
-
// Shape 1 — whole stdout is one JSON document (spawn may have pre-parsed it
|
|
128
|
-
// when the profile requested parseOutput: "json"). A multi-event JSONL
|
|
129
|
-
// stream never parses as a single document, so this cannot shadow shape 2.
|
|
130
|
-
const whole = result.parsed !== undefined ? result.parsed : raw.length > 0 ? tryParseJson(raw) : undefined;
|
|
131
|
-
if (whole !== undefined) {
|
|
132
|
-
if (typeof whole === "string") {
|
|
133
|
-
return { text: whole, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
|
|
134
|
-
}
|
|
135
|
-
if (isRecord(whole)) {
|
|
136
|
-
const sessionId = extractSessionId(whole) ?? fallbackSessionId;
|
|
137
|
-
// Unknown envelope (no assistant text): fall back to raw stdout so
|
|
138
|
-
// downstream embedded-JSON parsing still has material to work with.
|
|
139
|
-
const text = extractAssistantText(whole) ?? textOf(whole) ?? raw;
|
|
140
|
-
return { text, ...(sessionId ? { sessionId } : {}) };
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
// Shape 2 — JSONL event stream (`--mode json`): last assistant text-bearing
|
|
144
|
-
// event wins; first session-id-bearing event supplies the id. Non-JSON
|
|
145
|
-
// banner lines are skipped.
|
|
146
|
-
let lastText;
|
|
147
|
-
let streamSessionId;
|
|
148
|
-
let sawJsonLine = false;
|
|
149
|
-
for (const line of raw.split("\n")) {
|
|
150
|
-
const trimmed = line.trim();
|
|
151
|
-
if (trimmed.length === 0)
|
|
152
|
-
continue;
|
|
153
|
-
const event = tryParseJson(trimmed);
|
|
154
|
-
if (event === undefined || !isRecord(event))
|
|
155
|
-
continue;
|
|
156
|
-
sawJsonLine = true;
|
|
157
|
-
streamSessionId ??= extractSessionId(event);
|
|
158
|
-
const text = extractAssistantText(event);
|
|
159
|
-
if (text !== undefined && text.length > 0)
|
|
160
|
-
lastText = text;
|
|
161
|
-
}
|
|
162
|
-
if (sawJsonLine) {
|
|
163
|
-
const sessionId = streamSessionId ?? fallbackSessionId;
|
|
164
|
-
return { text: lastText ?? raw, ...(sessionId ? { sessionId } : {}) };
|
|
165
|
-
}
|
|
166
|
-
// Shape 3 — plain text passthrough.
|
|
167
|
-
return { text: raw, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
|
|
168
|
-
};
|
|
@@ -1,18 +0,0 @@
|
|
|
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
|
-
export function caps(c) {
|
|
5
|
-
return {
|
|
6
|
-
sessionLogs: false,
|
|
7
|
-
agentDispatch: false,
|
|
8
|
-
detection: false,
|
|
9
|
-
configImport: false,
|
|
10
|
-
modelWork: false,
|
|
11
|
-
nativeAgent: false,
|
|
12
|
-
...c,
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
/** Home directory used for filesystem-only harness config detection. */
|
|
16
|
-
export function homeDir() {
|
|
17
|
-
return process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
18
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
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
|
-
* Type-guard narrowing a harness to {@link SessionLogCapableHarness}.
|
|
6
|
-
*
|
|
7
|
-
* `Array.prototype.filter`'s type-predicate overload requires the predicate's
|
|
8
|
-
* inferred type to extend the array's element type — a plain
|
|
9
|
-
* `(h: AkmHarness) => h is SessionLogCapableHarness` predicate fails that
|
|
10
|
-
* constraint against `HARNESS_REGISTRY`'s element type (the union of the ten
|
|
11
|
-
* concrete harness classes, each with literal `id`s narrower than
|
|
12
|
-
* `SessionLogCapableHarness`'s `id: string`), so `.filter` would silently fall
|
|
13
|
-
* back to its non-narrowing overload. Generic over the input `H` and
|
|
14
|
-
* intersecting it into the predicate (`H & SessionLogCapableHarness`) keeps
|
|
15
|
-
* the result always a subtype of `H`, so the constraint holds regardless of
|
|
16
|
-
* what concrete harness type(s) `H` resolves to — this is what lets
|
|
17
|
-
* `HARNESS_REGISTRY.filter(isSessionLogHarness)` (in `./index.ts`) actually
|
|
18
|
-
* narrow to a type where `sessionLogProvider` is known-present, retiring the
|
|
19
|
-
* load-time throw that used to guard this in `session-logs/index.ts`.
|
|
20
|
-
*/
|
|
21
|
-
export function isSessionLogHarness(h) {
|
|
22
|
-
return h.capabilities.sessionLogs;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Shared base for harness descriptors (#566).
|
|
26
|
-
*
|
|
27
|
-
* Provides shared optional descriptor fields for concrete harnesses.
|
|
28
|
-
*
|
|
29
|
-
* Deliberately implements {@link AkmHarnessCommon}, NOT the discriminated
|
|
30
|
-
* `AkmHarness` union (WI-9.7, H1): `AkmHarnessCommon` excludes `capabilities`
|
|
31
|
-
* and `sessionLogProvider`, the two fields whose pairing the union enforces.
|
|
32
|
-
* A base class shared by both branches cannot itself satisfy either specific
|
|
33
|
-
* union member — `capabilities` stays declared `abstract` at the (widened)
|
|
34
|
-
* `HarnessCapabilities` union type here, and each subclass narrows it to a
|
|
35
|
-
* literal `sessionLogs: true`/`false` variant via `caps({...})`.
|
|
36
|
-
* `sessionLogProvider` is intentionally NOT declared here at all (not even
|
|
37
|
-
* optional): the 7 non-session-log subclasses simply never declare it, which
|
|
38
|
-
* satisfies `NonSessionLogHarness`'s `sessionLogProvider?: undefined` (an
|
|
39
|
-
* absent optional property satisfies an `undefined`-typed optional); had this
|
|
40
|
-
* class declared it as `sessionLogProvider?: () => SessionLogHarness`
|
|
41
|
-
* instead, every non-session-log subclass would inherit that (function |
|
|
42
|
-
* undefined) type and fail to satisfy `NonSessionLogHarness` at the
|
|
43
|
-
* `HARNESS_REGISTRY` `satisfies` check. The three session-log subclasses
|
|
44
|
-
* (Claude, Codex, OpenCode) declare their own required `sessionLogProvider`.
|
|
45
|
-
*/
|
|
46
|
-
export class BaseHarness {
|
|
47
|
-
setupDetectionDir;
|
|
48
|
-
agentBuilder;
|
|
49
|
-
profile;
|
|
50
|
-
configImporter;
|
|
51
|
-
executionLowerer;
|
|
52
|
-
identityEnv;
|
|
53
|
-
presenceEnv;
|
|
54
|
-
resultExtractor;
|
|
55
|
-
}
|
package/dist/llm/feature-gate.js
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
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
|
-
import { DEFAULT_LLM_TIMEOUT_MS } from "../integrations/agent/config.js";
|
|
5
|
-
/**
|
|
6
|
-
* For each feature key, return the effective enabled state by reading the
|
|
7
|
-
* 0.9.0 config shape.
|
|
8
|
-
*/
|
|
9
|
-
const FEATURE_LOCATION = {
|
|
10
|
-
memory_inference: (cfg) => cfg.index?.memory?.enabled ?? true,
|
|
11
|
-
// #951: a real implementation of the dead `curate_rerank` key removed in
|
|
12
|
-
// 0.8.0. Off by default — it requires a `search.curateRerank.endpoint` a
|
|
13
|
-
// caller must explicitly configure.
|
|
14
|
-
curate_rerank: (cfg) => Boolean(cfg.search?.curateRerank?.enabled),
|
|
15
|
-
// Always on at the LLM-wrapper level. Enablement is decided ONCE at the
|
|
16
|
-
// extract entry point (`akmExtract`): the `extract.enabled` process toggle
|
|
17
|
-
// gates extract as a STAGE of `akm improve` (the active improve strategy, per
|
|
18
|
-
// #593/#594), while an explicit `akm extract` command always runs. Gating the
|
|
19
|
-
// inner LLM calls on `default.processes.extract.enabled` here was a footgun —
|
|
20
|
-
// dropping extract from the daily improve strategy silently disabled the
|
|
21
|
-
// standalone `akm extract` command. (cfg unused — kept for resolver signature.)
|
|
22
|
-
session_extraction: (_cfg) => true,
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* Pure predicate: is the named feature gate enabled in `config`?
|
|
26
|
-
*
|
|
27
|
-
* Reads from the unified 0.9.0 config shape.
|
|
28
|
-
*/
|
|
29
|
-
export function isLlmFeatureEnabled(config, feature, improveEnabled) {
|
|
30
|
-
if (!config)
|
|
31
|
-
return false;
|
|
32
|
-
// Improve resolves enablement from its selected strategy and passes the
|
|
33
|
-
// decision in. This module does not own a second improve config lookup.
|
|
34
|
-
if (improveEnabled !== undefined)
|
|
35
|
-
return improveEnabled;
|
|
36
|
-
const resolver = FEATURE_LOCATION[feature];
|
|
37
|
-
if (!resolver)
|
|
38
|
-
return false;
|
|
39
|
-
return resolver(config);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Run `fn()` only if `isLlmFeatureEnabled(config, feature)` is `true`. On
|
|
43
|
-
* disablement, throw, or timeout, return `fallback` (or — if it is a
|
|
44
|
-
* thunk — the value produced by calling it). The timeout aborts the signal
|
|
45
|
-
* `fn` receives, so the work it started stops too.
|
|
46
|
-
*/
|
|
47
|
-
export async function tryLlmFeature(feature, config, fn, fallback, opts) {
|
|
48
|
-
const resolveFallback = async () => typeof fallback === "function" ? await fallback() : fallback;
|
|
49
|
-
if (!isLlmFeatureEnabled(config, feature, opts?.enabled)) {
|
|
50
|
-
opts?.onFallback?.({ feature, reason: "disabled" });
|
|
51
|
-
return resolveFallback();
|
|
52
|
-
}
|
|
53
|
-
const timeoutMs = opts && Object.hasOwn(opts, "timeoutMs") ? (opts.timeoutMs ?? null) : DEFAULT_LLM_TIMEOUT_MS;
|
|
54
|
-
try {
|
|
55
|
-
if (timeoutMs === null || timeoutMs <= 0) {
|
|
56
|
-
return await fn(new AbortController().signal);
|
|
57
|
-
}
|
|
58
|
-
return await runWithTimeout(fn, timeoutMs, feature);
|
|
59
|
-
}
|
|
60
|
-
catch (err) {
|
|
61
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
62
|
-
const reason = error instanceof LlmFeatureTimeoutError ? "timeout" : "error";
|
|
63
|
-
opts?.onFallback?.({ feature, reason, error });
|
|
64
|
-
return resolveFallback();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Section-agnostic process gate that maps process identifiers to their current
|
|
69
|
-
* config locations.
|
|
70
|
-
*
|
|
71
|
-
* For unknown (section, processName) pairs the result is `false`.
|
|
72
|
-
*/
|
|
73
|
-
export function isProcessEnabled(section, processName, config) {
|
|
74
|
-
if (!config)
|
|
75
|
-
return false;
|
|
76
|
-
// Index passes are first-class 0.9 entries.
|
|
77
|
-
if (section === "index") {
|
|
78
|
-
if (processName === "memory_inference" || processName === "memoryInference") {
|
|
79
|
-
return isLlmFeatureEnabled(config, "memory_inference");
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
/** Specific error class so call sites and the wrapper can tell timeouts apart from generic throws. */
|
|
85
|
-
export class LlmFeatureTimeoutError extends Error {
|
|
86
|
-
feature;
|
|
87
|
-
timeoutMs;
|
|
88
|
-
constructor(feature, timeoutMs) {
|
|
89
|
-
super(`LLM feature "${feature}" timed out after ${timeoutMs}ms.`);
|
|
90
|
-
this.name = "LlmFeatureTimeoutError";
|
|
91
|
-
this.feature = feature;
|
|
92
|
-
this.timeoutMs = timeoutMs;
|
|
93
|
-
Object.setPrototypeOf(this, new.target.prototype);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
async function runWithTimeout(fn, timeoutMs, feature) {
|
|
97
|
-
let timer;
|
|
98
|
-
const controller = new AbortController();
|
|
99
|
-
try {
|
|
100
|
-
return await new Promise((resolve, reject) => {
|
|
101
|
-
timer = setTimeout(() => {
|
|
102
|
-
const timedOut = new LlmFeatureTimeoutError(feature, timeoutMs);
|
|
103
|
-
controller.abort(timedOut);
|
|
104
|
-
reject(timedOut);
|
|
105
|
-
}, timeoutMs);
|
|
106
|
-
Promise.resolve()
|
|
107
|
-
.then(() => fn(controller.signal))
|
|
108
|
-
.then(resolve, reject);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
finally {
|
|
112
|
-
if (timer)
|
|
113
|
-
clearTimeout(timer);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
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
|
-
export const modelsListShapes = [
|
|
5
|
-
{
|
|
6
|
-
command: "models-list",
|
|
7
|
-
handler: (result) => {
|
|
8
|
-
const r = result;
|
|
9
|
-
return {
|
|
10
|
-
...r,
|
|
11
|
-
shape: r.shape ?? "models-list",
|
|
12
|
-
schemaVersion: r.schemaVersion ?? 1,
|
|
13
|
-
};
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
];
|
|
@@ -1,10 +0,0 @@
|
|
|
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
|
-
import { shapeRegistrySearchOutput } from "./helpers.js";
|
|
5
|
-
export const registrySearchShapes = [
|
|
6
|
-
{
|
|
7
|
-
command: "registry-search",
|
|
8
|
-
handler: (result, detail) => shapeRegistrySearchOutput(result, detail),
|
|
9
|
-
},
|
|
10
|
-
];
|