akm-cli 0.9.16 → 0.9.17-alpha.10
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 +2101 -0
- package/STABILITY.md +11 -10
- package/dist/akm +124 -193
- package/dist/akm-migrate +38 -19
- package/dist/assets/hints/cli-hints-full.md +6 -7
- package/dist/assets/improve-strategies/catchup.json +0 -3
- package/dist/assets/improve-strategies/consolidate.json +0 -1
- package/dist/assets/improve-strategies/default.json +1 -2
- package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
- package/dist/assets/improve-strategies/quick.json +1 -2
- package/dist/assets/improve-strategies/reflect-distill.json +1 -2
- package/dist/assets/improve-strategies/thorough.json +0 -3
- package/dist/assets/prompts/consolidate-pair.md +20 -0
- package/dist/assets/prompts/consolidate-system.md +4 -11
- package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
- package/dist/assets/templates/html/health.html +3 -5
- package/dist/cli/retired-commands.js +1 -1
- package/dist/cli/shared.js +6 -2
- package/dist/cli/unknown-flags.js +24 -1
- package/dist/cli.js +68 -10
- package/dist/commands/agent/agent-dispatch.js +1 -1
- package/dist/commands/command/command-execution.js +24 -62
- package/dist/commands/feedback-cli.js +0 -1
- package/dist/commands/health/accept-rate.js +6 -0
- package/dist/commands/health/archive-usage.js +92 -0
- package/dist/commands/health/checks.js +83 -74
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/data-dir-usage.js +25 -13
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +1 -42
- package/dist/commands/health/improve-metrics.js +136 -591
- package/dist/commands/health/md-report.js +1 -6
- package/dist/commands/health/plugin-staleness.js +53 -3
- package/dist/commands/health/renderers.js +12 -4
- package/dist/commands/health/report-view-model.js +14 -120
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -74
- package/dist/commands/health.js +145 -143
- package/dist/commands/improve/consolidate/chunking.js +26 -117
- package/dist/commands/improve/consolidate/continuity-check.js +137 -0
- package/dist/commands/improve/consolidate/pair-pass.js +791 -0
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +589 -1127
- package/dist/commands/improve/content-hash.js +16 -24
- package/dist/commands/improve/distill/content-repair.js +18 -100
- package/dist/commands/improve/distill-guards.js +20 -81
- package/dist/commands/improve/distill-promotion-policy.js +23 -243
- package/dist/commands/improve/distill.js +608 -1041
- package/dist/commands/improve/eligibility.js +126 -390
- package/dist/commands/improve/execution.js +8 -10
- package/dist/commands/improve/extract-prompt.js +1 -2
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +75 -169
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +52 -4
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +480 -1074
- package/dist/commands/improve/ledger.js +119 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +415 -1073
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +16 -118
- package/dist/commands/improve/memory/memory-improve.js +266 -14
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -15
- package/dist/commands/improve/preparation.js +779 -2319
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +642 -1353
- package/dist/commands/improve/retrieval-gate.js +127 -0
- package/dist/commands/improve/retrieval-scope.js +92 -0
- package/dist/commands/improve/salience.js +41 -240
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +322 -0
- package/dist/commands/lint/base-linter.js +37 -15
- package/dist/commands/proposal/drain.js +261 -578
- package/dist/commands/proposal/proposal-cli.js +19 -20
- package/dist/commands/proposal/proposal-types.js +31 -24
- package/dist/commands/proposal/proposal.js +38 -8
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +1097 -1394
- package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
- package/dist/commands/proposal/validators/proposal-validators.js +1 -1
- package/dist/commands/proposal/validators/proposals.js +22 -89
- package/dist/commands/read/curate.js +105 -462
- package/dist/commands/read/knowledge.js +3 -2
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +57 -108
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +4 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +127 -29
- package/dist/commands/sources/installed-stashes.js +197 -746
- package/dist/commands/sources/schema-repair.js +98 -129
- package/dist/commands/sources/source-add.js +62 -12
- package/dist/commands/sources/source-manage.js +9 -2
- package/dist/commands/sources/stash-cli.js +24 -4
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +12 -13
- package/dist/commands/tasks/tasks.js +350 -936
- package/dist/commands/tasks/validate.js +26 -24
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +2 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +42 -12
- package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/asset-placement.js +4 -13
- package/dist/core/asset/frontmatter.js +106 -1
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +285 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +9 -34
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +184 -111
- package/dist/core/config/engine-semantics.js +0 -2
- package/dist/core/config/legacy-source-shape-shim.js +38 -9
- package/dist/core/config/schema/embedding.js +20 -5
- package/dist/core/config/schema/engines.js +5 -0
- package/dist/core/config/schema/execution.js +1 -1
- package/dist/core/config/schema/experimental.js +1 -1
- package/dist/core/config/schema/improve-processes.js +54 -125
- package/dist/core/config/schema/improve.js +4 -42
- package/dist/core/config/schema/index-config.js +9 -48
- package/dist/core/config/schema/scheduler.js +12 -12
- package/dist/core/config/schema/search.js +6 -22
- package/dist/core/env-secret-ref.js +0 -1
- package/dist/core/errors.js +8 -9
- package/dist/core/file-change.js +13 -5
- package/dist/core/file-lock.js +76 -173
- package/dist/core/improve-result.js +35 -7
- package/dist/core/improve-types.js +0 -1
- package/dist/core/logs-db.js +2 -2
- package/dist/core/loopback.js +7 -12
- package/dist/core/non-task-input.js +20 -0
- package/dist/core/parse.js +13 -16
- package/dist/core/paths.js +0 -24
- package/dist/core/redaction.js +109 -2
- package/dist/core/run-lock.js +2 -5
- package/dist/core/spawn-env.js +1 -1
- package/dist/core/state/migrations.js +123 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/time.js +0 -20
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +294 -1005
- package/dist/execution/input-contract.js +1 -1
- package/dist/execution/resolved-request.js +135 -689
- package/dist/execution/source.js +63 -257
- package/dist/execution/target-ref.js +1 -1
- package/dist/indexer/bundle-identity-guard.js +2 -2
- package/dist/indexer/db/llm-cache.js +2 -2
- package/dist/indexer/ensure-index.js +77 -73
- package/dist/indexer/index-rebuild-lock.js +3 -11
- package/dist/indexer/index-writer-lock.js +8 -17
- package/dist/indexer/index-written-assets.js +141 -154
- package/dist/indexer/indexer.js +400 -1124
- package/dist/indexer/links/declared-links.js +90 -0
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +96 -90
- package/dist/indexer/passes/metadata.js +132 -219
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +2 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +190 -590
- package/dist/indexer/search/fts-query.js +30 -41
- package/dist/indexer/search/ranking.js +28 -154
- package/dist/indexer/search/search-attribution.js +12 -32
- package/dist/indexer/search/search-fields.js +11 -15
- package/dist/indexer/search/search-hit-enrichers.js +54 -85
- package/dist/indexer/search/search-source.js +1 -4
- package/dist/indexer/usage/usage-events.js +36 -7
- package/dist/indexer/walk/walker.js +3 -4
- package/dist/integrations/agent/engine-fallback.js +23 -40
- package/dist/integrations/agent/engine-resolution.js +93 -183
- package/dist/integrations/agent/execution.js +507 -0
- package/dist/integrations/agent/model-map.js +28 -156
- package/dist/integrations/agent/request-lowering.js +66 -141
- package/dist/integrations/agent/runner-dispatch.js +143 -321
- package/dist/integrations/agent/runner.js +54 -14
- package/dist/integrations/lockfile.js +53 -101
- package/dist/llm/client.js +18 -6
- package/dist/llm/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +11 -17
- package/dist/llm/feature-gate.js +0 -8
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/structured-call.js +5 -24
- package/dist/output/generic-render.js +23 -11
- package/dist/output/html-render.js +13 -10
- package/dist/output/render-registry.js +3 -32
- package/dist/output/shapes/helpers.js +25 -38
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +69 -31
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +48 -3
- package/dist/output/text/show-format.js +13 -17
- package/dist/output/text/workflow-format.js +0 -32
- package/dist/output/text.js +2 -0
- package/dist/registry/factory.js +4 -19
- package/dist/registry/network.js +66 -220
- package/dist/registry/providers/index.js +0 -2
- package/dist/registry/providers/skills-sh.js +3 -14
- package/dist/registry/providers/static-index.js +24 -26
- package/dist/registry/resolve.js +55 -131
- package/dist/scripts/akm-migrate-node.js +42948 -92369
- package/dist/scripts/akm-migrate.js +42935 -92354
- package/dist/setup/registry-stash-loader.js +4 -13
- package/dist/setup/semantic-assets.js +3 -44
- package/dist/setup/setup.js +1 -1
- package/dist/setup/steps/connection.js +5 -6
- package/dist/setup/steps/platforms.js +2 -2
- package/dist/setup/steps/tasks.js +25 -15
- package/dist/sources/provider-factory.js +17 -18
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +7 -1
- package/dist/sources/providers/git-provider.js +0 -3
- package/dist/sources/providers/git-stash.js +83 -21
- package/dist/sources/providers/npm.js +2 -4
- package/dist/sources/providers/provider-utils.js +5 -10
- package/dist/sources/providers/website.js +0 -2
- package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
- package/dist/sources/website-url.js +2 -2
- package/dist/storage/database.js +9 -35
- package/dist/storage/repositories/improve-ledger-repository.js +209 -0
- package/dist/storage/repositories/index-connection.js +39 -72
- package/dist/storage/repositories/index-entries-repository.js +131 -129
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +101 -268
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-links-repository.js +143 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +257 -325
- package/dist/storage/repositories/index-utility-repository.js +8 -29
- package/dist/storage/repositories/index-vec-repository.js +133 -414
- package/dist/storage/repositories/outcome-repository.js +2 -1
- package/dist/storage/repositories/proposals-repository.js +104 -1
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- package/dist/storage/repositories/salience-repository.js +1 -19
- package/dist/storage/repositories/task-history-repository.js +26 -4
- package/dist/storage/repositories/workflow-runs-repository.js +53 -244
- package/dist/storage/sqlite-migrations.js +136 -0
- package/dist/storage/sqlite-pragmas.js +11 -9
- package/dist/storage/sqlite-transaction.js +170 -0
- package/dist/storage/state-db-integrity.js +130 -0
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +191 -302
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +141 -748
- package/dist/tasks/backends/schtasks.js +119 -623
- package/dist/tasks/prepare/prepare-support.js +5 -15
- package/dist/tasks/prepare/prepare.js +0 -2
- package/dist/tasks/resolve-akm-bin.js +20 -79
- package/dist/tasks/run/attempt-lifecycle.js +0 -1
- package/dist/tasks/run/load-task.js +1 -1
- package/dist/tasks/scheduler-binding.js +20 -238
- package/dist/tasks/scheduler-invocation.js +136 -244
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +368 -679
- package/dist/tasks/source/parse-task-source.js +55 -9
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +464 -88
- package/dist/workflows/authoring/authoring.js +3 -12
- package/dist/workflows/compile.js +211 -0
- package/dist/workflows/concurrency-policy.js +13 -74
- package/dist/workflows/exec/child-invocation.js +3 -17
- package/dist/workflows/exec/child-workflow.js +32 -141
- package/dist/workflows/exec/dispatch-redaction.js +13 -53
- package/dist/workflows/exec/environment.js +98 -0
- package/dist/workflows/exec/exec-unit.js +33 -140
- package/dist/workflows/exec/frozen-judge.js +7 -59
- package/dist/workflows/exec/native-executor.js +82 -341
- package/dist/workflows/exec/param-secrets.js +29 -47
- package/dist/workflows/exec/run-workflow.js +154 -387
- package/dist/workflows/exec/scheduler.js +9 -36
- package/dist/workflows/exec/step-work.js +127 -430
- package/dist/workflows/exec/unit-dispatch.js +11 -63
- package/dist/workflows/exec/unit-writer.js +8 -52
- package/dist/workflows/exec/worktree.js +39 -273
- package/dist/workflows/freeze/child-output-references.js +4 -15
- package/dist/workflows/freeze/environment.js +99 -92
- package/dist/workflows/freeze/freeze.js +172 -0
- package/dist/workflows/freeze/step-values.js +19 -21
- package/dist/workflows/freeze/targets/child-workflow.js +23 -92
- package/dist/workflows/freeze/targets/command.js +10 -33
- package/dist/workflows/freeze/targets/script.js +5 -12
- package/dist/workflows/freeze/targets/shell.js +3 -6
- package/dist/workflows/freeze/targets/task.js +25 -80
- package/dist/workflows/freeze/task-bindings.js +20 -67
- package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
- package/dist/workflows/ir/params.js +6 -51
- package/dist/workflows/ir/plan-hash.js +2 -34
- package/dist/workflows/parser.js +140 -43
- package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
- package/dist/workflows/renderer.js +36 -69
- package/dist/workflows/resource-limits.js +12 -120
- package/dist/workflows/runtime/agent-identity.js +8 -40
- package/dist/workflows/runtime/run-outputs.js +3 -6
- package/dist/workflows/runtime/run-plan.js +316 -0
- package/dist/workflows/runtime/runs.js +48 -200
- package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
- package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
- package/dist/workflows/validate-summary.js +2 -7
- package/docs/integration/bundling-akm.md +49 -42
- package/docs/migration/README.md +1 -0
- package/docs/migration/release-notes/0.9.17.md +43 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
- package/docs/reference/cli.md +232 -135
- package/docs/reference/configuration.md +71 -57
- package/docs/reference/data-and-telemetry.md +20 -21
- package/docs/reference/tasks.md +105 -39
- package/docs/reference/workflow-schema.md +14 -18
- package/docs/reference/workflows.md +6 -9
- package/package.json +1 -1
- package/schemas/akm-config.json +115 -738
- package/schemas/akm-workflow.json +1 -0
- package/dist/assets/improve-strategies/graph-refresh.json +0 -15
- package/dist/assets/prompts/contradiction-judge.md +0 -33
- package/dist/assets/prompts/graph-extract-system.md +0 -1
- package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
- package/dist/assets/prompts/metadata-enhance-system.md +0 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
- package/dist/commands/health/advisories.js +0 -150
- package/dist/commands/health/metrics.js +0 -329
- package/dist/commands/health/surfaces.js +0 -102
- package/dist/commands/improve/anti-collapse.js +0 -83
- package/dist/commands/improve/collapse-detector.js +0 -432
- package/dist/commands/improve/consolidate/eligibility.js +0 -48
- package/dist/commands/improve/consolidate/merge.js +0 -149
- package/dist/commands/improve/distill/promote-memory.js +0 -291
- package/dist/commands/improve/distill/quality-gate.js +0 -337
- package/dist/commands/improve/eval-cases.js +0 -52
- package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
- package/dist/commands/improve/proposal-envelope.js +0 -31
- package/dist/commands/improve/run-context.js +0 -123
- package/dist/commands/improve/shared.js +0 -31
- package/dist/commands/improve/source-identity.js +0 -28
- package/dist/commands/improve/triage.js +0 -96
- package/dist/commands/proposal/drain-policies.js +0 -151
- package/dist/commands/sources/update-transaction.js +0 -220
- package/dist/core/action-contributors.js +0 -28
- package/dist/core/config/config-version-shim.js +0 -101
- package/dist/core/fs-txn.js +0 -405
- package/dist/core/lexical-score.js +0 -25
- package/dist/core/maintenance-barrier.js +0 -167
- package/dist/execution/executable-identity.js +0 -105
- package/dist/execution/guarded-source.js +0 -427
- package/dist/indexer/db/graph-db.js +0 -444
- package/dist/indexer/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/graph/graph-extraction.js +0 -1108
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- package/dist/indexer/search/ranking-types.js +0 -4
- package/dist/indexer/walk/project-context.js +0 -192
- package/dist/integrations/agent/execution-cascade.js +0 -566
- package/dist/integrations/agent/execution-definitions.js +0 -202
- package/dist/integrations/agent/execution-lowering.js +0 -841
- package/dist/integrations/agent/execution-preparation.js +0 -98
- package/dist/integrations/agent/inline-execution.js +0 -74
- package/dist/llm/graph-extract.js +0 -728
- package/dist/llm/metadata-enhance.js +0 -96
- package/dist/registry/create-provider-registry.js +0 -29
- package/dist/registry/pinned-request-helper.js +0 -247
- package/dist/registry/pinned-transport.js +0 -717
- package/dist/sources/providers/index.js +0 -14
- package/dist/storage/engines/sqlite-migrations.js +0 -271
- package/dist/storage/repositories/canaries-repository.js +0 -107
- package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
- package/dist/storage/repositories/registry-cache.js +0 -113
- package/dist/tasks/scheduler-sync-preview.js +0 -52
- package/dist/tasks/source/task-to-v3.js +0 -507
- package/dist/workflows/freeze/resolve-steps.js +0 -86
- package/dist/workflows/freeze/source-freeze.js +0 -64
- package/dist/workflows/ir/compile.js +0 -321
- package/dist/workflows/ir/environment-v4.js +0 -330
- package/dist/workflows/ir/freeze-v4.js +0 -153
- package/dist/workflows/ir/schema-v4.js +0 -745
- package/dist/workflows/ir/schema.js +0 -354
- package/dist/workflows/program/schema.js +0 -77
- package/dist/workflows/runtime/checkin.js +0 -57
- package/dist/workflows/runtime/plan-classifier.js +0 -196
- package/dist/workflows/runtime/unit-checkin.js +0 -45
- package/dist/workflows/runtime/unit-phases.js +0 -20
- package/dist/workflows/schema.js +0 -4
- package/dist/workflows/source-ir/compile.js +0 -200
- package/dist/workflows/source-ir/program.js +0 -50
- package/dist/workflows/source-ir/result.js +0 -26
- package/dist/workflows/source-ir/schema.js +0 -786
- package/dist/workflows/source-ir/triggers.js +0 -79
- package/dist/workflows/source-ir/uses.js +0 -40
- package/dist/workflows/validator.js +0 -60
|
@@ -2,21 +2,12 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* The `exec` unit runner — the
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* from `env:` bindings by NAME — the caller scrubs the outcome with
|
|
12
|
-
* `redactUnitOutcome` before anything is journaled. A LEAF module by
|
|
13
|
-
* layering (Node built-ins, `core/spawn-env`, `core/subprocess`, `core/warn`,
|
|
14
|
-
* the import-free `workflows/resource-limits` only).
|
|
15
|
-
*
|
|
16
|
-
* See docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md
|
|
17
|
-
* for the full per-invariant design history.
|
|
18
|
-
*
|
|
19
|
-
* @module workflows/exec/exec-unit
|
|
5
|
+
* The `exec` unit runner — the one place a frozen workflow spawns a command:
|
|
6
|
+
* argv-only, detached with a SIGTERM→SIGKILL ladder against the process group,
|
|
7
|
+
* cwd-contained by a resolved-path recheck, bounded (timeout, output bytes,
|
|
8
|
+
* context size), with an allowlisted environment ({@link childEnv}). The
|
|
9
|
+
* caller redacts the outcome before anything is journaled.
|
|
10
|
+
* See docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md.
|
|
20
11
|
*/
|
|
21
12
|
import fs from "node:fs";
|
|
22
13
|
import path from "node:path";
|
|
@@ -26,30 +17,16 @@ import { runManagedSubprocess, streamCaptureFailure, } from "../../core/subproce
|
|
|
26
17
|
import { warn } from "../../core/warn.js";
|
|
27
18
|
import { execContextLimits, utf8Bytes, WORKFLOW_EXEC_OUTPUT_TRUNCATED_MARKER, WORKFLOW_MAX_EXEC_OUTPUT_BYTES, WORKFLOW_UNIT_DIAGNOSTIC_CLIP, } from "../resource-limits.js";
|
|
28
19
|
/**
|
|
29
|
-
* Max characters of a failed command's stderr
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* Deliberately BELOW {@link WORKFLOW_UNIT_DIAGNOSTIC_CLIP}: the composed
|
|
33
|
-
* diagnostic reads `<what happened>. stderr (last N chars): <tail>`, and the
|
|
34
|
-
* journal clips that COMPOSED string head-first. Reserving 500 characters for
|
|
35
|
-
* the prefix keeps the whole stderr tail — the part that actually says why the
|
|
36
|
-
* command failed — inside the journaled and displayed diagnostic, instead of
|
|
37
|
-
* losing its final few hundred characters to the outer clip.
|
|
20
|
+
* Max characters of a failed command's stderr tail kept in its diagnostic —
|
|
21
|
+
* below {@link WORKFLOW_UNIT_DIAGNOSTIC_CLIP} so the journal's head-first clip
|
|
22
|
+
* of the composed message never cuts the tail.
|
|
38
23
|
*/
|
|
39
24
|
const EXEC_STDERR_DIAGNOSTIC_CLIP = WORKFLOW_UNIT_DIAGNOSTIC_CLIP - 500;
|
|
40
25
|
/**
|
|
41
|
-
* The
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* (PATH, HOME, USER/LOGNAME, SHELL, locale, TERM, TZ, TMPDIR, the
|
|
46
|
-
* {@link WIN32_SPAWN_ENV_FLOOR}, Windows toolchain roots) and
|
|
47
|
-
* `AKM_EVENT_SOURCE` (provenance, DRIFT-6). Deliberately ABSENT and reachable
|
|
48
|
-
* only through `exec.passEnv` / `env:`: credentials, cloud/CI vars, and the
|
|
49
|
-
* proxy family.
|
|
50
|
-
*
|
|
51
|
-
* See docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md
|
|
52
|
-
* for the per-entry rationale and why the default is an allowlist at all.
|
|
26
|
+
* The default environment allowlist for an exec unit's child (`exec.passEnv`
|
|
27
|
+
* extends it): the agent-harness baseline plus names ordinary commands need
|
|
28
|
+
* and `AKM_EVENT_SOURCE`. Credentials, cloud/CI vars, and proxies reach a
|
|
29
|
+
* child only through `pass_env` or `env:`.
|
|
53
30
|
*/
|
|
54
31
|
export const EXEC_DEFAULT_ENV_PASSTHROUGH = [
|
|
55
32
|
// PATH, HOME, USER, LANG, LC_ALL, TERM, TMPDIR, AKM_EVENT_SOURCE
|
|
@@ -70,21 +47,11 @@ export const EXEC_DEFAULT_ENV_PASSTHROUGH = [
|
|
|
70
47
|
"ProgramFiles",
|
|
71
48
|
];
|
|
72
49
|
/**
|
|
73
|
-
* Run one exec unit and map its
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* `exec_context_too_large` and `exec_capture_incomplete` are deliberate: each
|
|
79
|
-
* is tampering, a runaway, an authoring bug, or work that ALREADY RAN — never
|
|
80
|
-
* a transient — so no `retry.on` value can ever re-dispatch one. An
|
|
81
|
-
* INCOMPLETE stdout capture is always a failure, never a partial artifact;
|
|
82
|
-
* output OVERFLOW past {@link WORKFLOW_MAX_EXEC_OUTPUT_BYTES} does not fail a
|
|
83
|
-
* command that otherwise passed unless the unit declared an `output:` schema
|
|
84
|
-
* (a truncated JSON prefix cannot parse).
|
|
85
|
-
*
|
|
86
|
-
* See docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md
|
|
87
|
-
* for the full capture/overflow reasoning.
|
|
50
|
+
* Run one exec unit and map its outcome onto the dispatch vocabulary
|
|
51
|
+
* (`non_zero_exit`, `timeout`, `aborted`, `spawn_failed` — retryable). The
|
|
52
|
+
* `exec_*` reasons (cwd escape, output limit, context too large, incomplete
|
|
53
|
+
* capture) are deliberately outside `retry.on`. Output overflow fails only a
|
|
54
|
+
* unit that declared an `output:` schema.
|
|
88
55
|
*/
|
|
89
56
|
export async function runExecUnit(input) {
|
|
90
57
|
const cwd = await resolveExecCwd(input);
|
|
@@ -98,11 +65,7 @@ export async function runExecUnit(input) {
|
|
|
98
65
|
cwd: cwd.path,
|
|
99
66
|
env: childEnv(input.exec, input.env, input.context, input.eventSource),
|
|
100
67
|
timeoutMs: input.timeoutMs,
|
|
101
|
-
// stdout
|
|
102
|
-
// capture is memory the akm process spends on a command's behalf with no
|
|
103
|
-
// ceiling at all until it exits or the (default 10-minute) budget expires.
|
|
104
|
-
// The cap discards past the bound rather than killing — the command's own
|
|
105
|
-
// outcome is not akm's memory problem to solve.
|
|
68
|
+
// stdout is the artifact; retention is bounded (discarding past the cap, never killing).
|
|
106
69
|
maxOutputBytes: WORKFLOW_MAX_EXEC_OUTPUT_BYTES,
|
|
107
70
|
...(input.signal ? { signal: input.signal } : {}),
|
|
108
71
|
...(input.spawnFn ? { spawnFn: input.spawnFn } : {}),
|
|
@@ -172,21 +135,10 @@ export async function runExecUnit(input) {
|
|
|
172
135
|
if (result.stdoutRead.overflowed && input.hasOutputSchema) {
|
|
173
136
|
return outputLimitFailure(input, display, result);
|
|
174
137
|
}
|
|
175
|
-
// The
|
|
176
|
-
// like shell command substitution `$(…)`, so a one-line command's artifact is
|
|
177
|
-
// the value an author expects rather than the value plus a `\n`. stderr is a
|
|
178
|
-
// diagnostic channel only and never contributes to the artifact. When stdout
|
|
179
|
-
// overflowed, `stdout` already carries the truncation marker (which is
|
|
180
|
-
// deliberately the LAST thing in the artifact, so it survives the strip).
|
|
138
|
+
// The artifact is stdout with trailing newlines stripped, like `$(…)`; stderr is diagnostic only.
|
|
181
139
|
return { ok: true, text: stripTrailingNewlines(stdout) };
|
|
182
140
|
}
|
|
183
|
-
/**
|
|
184
|
-
* A drain report with nothing wrong in it, passed as the OTHER pipe so
|
|
185
|
-
* {@link streamCaptureFailure} classifies exactly one of them.
|
|
186
|
-
*
|
|
187
|
-
* The classifier stays shared with the agent path — what a failed drain means
|
|
188
|
-
* must not drift — while each caller decides which pipes are fatal for IT.
|
|
189
|
-
*/
|
|
141
|
+
/** A clean drain report, passed as the other pipe so {@link streamCaptureFailure} classifies one. */
|
|
190
142
|
const DRAINED_CLEAN = {
|
|
191
143
|
text: "",
|
|
192
144
|
timedOut: false,
|
|
@@ -194,14 +146,7 @@ const DRAINED_CLEAN = {
|
|
|
194
146
|
bytesRead: 0,
|
|
195
147
|
retainedBytes: 0,
|
|
196
148
|
};
|
|
197
|
-
/**
|
|
198
|
-
* Report a stderr drain that did not finish on an otherwise successful unit.
|
|
199
|
-
*
|
|
200
|
-
* Warn-only by construction: the artifact is stdout, which was captured whole,
|
|
201
|
-
* so there is nothing wrong with the unit's RESULT — only with how much of its
|
|
202
|
-
* log tail akm holds. A dispatch result has no channel for a non-fatal note, so
|
|
203
|
-
* the operator surface is the warn stream.
|
|
204
|
-
*/
|
|
149
|
+
/** Warn about an unfinished stderr drain on an otherwise successful unit (its stdout artifact is whole). */
|
|
205
150
|
function reportStderrCaptureFailure(input, display, result) {
|
|
206
151
|
const stderrFailure = streamCaptureFailure(DRAINED_CLEAN, result.stderrRead);
|
|
207
152
|
if (!stderrFailure)
|
|
@@ -216,14 +161,7 @@ function truncationNote(read) {
|
|
|
216
161
|
return (`the command wrote ${read.bytesRead} bytes to stdout and only the first ${read.retainedBytes} were retained ` +
|
|
217
162
|
`(the ${WORKFLOW_MAX_EXEC_OUTPUT_BYTES}-byte per-pipe capture limit)`);
|
|
218
163
|
}
|
|
219
|
-
/**
|
|
220
|
-
* The captured stdout, with an unmistakable truncation block appended when the
|
|
221
|
-
* retention cap discarded part of it.
|
|
222
|
-
*
|
|
223
|
-
* Truncated data must never be mistakable for complete data. The block names
|
|
224
|
-
* both byte counts, so a reader can see exactly how much is missing rather
|
|
225
|
-
* than inferring it from a suspiciously round length.
|
|
226
|
-
*/
|
|
164
|
+
/** The captured stdout, with a truncation block naming both byte counts when the cap discarded some. */
|
|
227
165
|
function markTruncatedStdout(result) {
|
|
228
166
|
const read = result.stdoutRead;
|
|
229
167
|
if (!read.overflowed)
|
|
@@ -235,17 +173,7 @@ function markTruncatedStdout(result) {
|
|
|
235
173
|
`so its exit code is real, but THIS TEXT IS INCOMPLETE and must not be treated as the command's whole output. ` +
|
|
236
174
|
`Have the command write bulk output to a file and print the path, or quiet it down.`);
|
|
237
175
|
}
|
|
238
|
-
/**
|
|
239
|
-
* The output-cap failure for a unit that declared an `output:` schema —
|
|
240
|
-
* deliberately UNMISTAKABLE.
|
|
241
|
-
*
|
|
242
|
-
* `text` is emptied rather than carrying the partial capture: for a failed unit
|
|
243
|
-
* `text` is only a diagnostic (the durable evidence graph keeps a failure's
|
|
244
|
-
* `failureReason` alone), and handing back several megabytes of a runaway
|
|
245
|
-
* command's output as "the text" would just move the memory problem one layer
|
|
246
|
-
* up. The byte counts go in the message instead, so the operator can see how far
|
|
247
|
-
* past the cap the command ran.
|
|
248
|
-
*/
|
|
176
|
+
/** The output-cap failure for a unit with an `output:` schema: no partial text, byte counts in the message. */
|
|
249
177
|
function outputLimitFailure(input, display, result) {
|
|
250
178
|
return {
|
|
251
179
|
ok: false,
|
|
@@ -259,31 +187,9 @@ function outputLimitFailure(input, display, result) {
|
|
|
259
187
|
};
|
|
260
188
|
}
|
|
261
189
|
/**
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
*
|
|
265
|
-
* A workflow artifact has no bound comparable to an OS environment entry, so a
|
|
266
|
-
* perfectly legitimate declared input can serialize into an `AKM_INPUTS` far
|
|
267
|
-
* past what `execve` accepts. Left unchecked that surfaces as a bare `E2BIG`
|
|
268
|
-
* from the spawn syscall — reported as `spawn_failed` with a message about
|
|
269
|
-
* "argument list too long" that names neither the variable nor the artifact
|
|
270
|
-
* that produced it. Checking here converts it into a located, actionable
|
|
271
|
-
* failure BEFORE process creation is attempted.
|
|
272
|
-
*
|
|
273
|
-
* ## The ceiling is the CURRENT platform's, never the smallest one
|
|
274
|
-
*
|
|
275
|
-
* That translation is this check's ONLY job, which fixes its bound exactly: the
|
|
276
|
-
* limits come from {@link execContextLimits} for the platform the run is on. A
|
|
277
|
-
* guard that applied Windows' 32 767-character ceiling on Linux would fail
|
|
278
|
-
* spawns the kernel would happily have accepted — inventing a failure instead of
|
|
279
|
-
* explaining an inevitable one, which is a tripwire and not a guard. Workflows
|
|
280
|
-
* that must also run on Windows should stay under the smaller bound; that is
|
|
281
|
-
* documented guidance (`docs/reference/workflow-schema.md`), not something a
|
|
282
|
-
* Linux host enforces.
|
|
283
|
-
*
|
|
284
|
-
* Only the engine-authored context is measured. The unit's `env:` bindings are
|
|
285
|
-
* authored values a human wrote and sized; this is the surface where the SIZE
|
|
286
|
-
* is data-dependent and therefore surprising.
|
|
190
|
+
* Name the `AKM_*` variable that would not fit in the child's environment on
|
|
191
|
+
* this platform ({@link execContextLimits}), instead of a bare E2BIG from the
|
|
192
|
+
* spawn. Only the engine-authored context is measured.
|
|
287
193
|
*/
|
|
288
194
|
function checkExecContextSize(input) {
|
|
289
195
|
const limits = execContextLimits(input.platform ?? process.platform);
|
|
@@ -315,12 +221,8 @@ function contextTooLarge(input, what, names, limits) {
|
|
|
315
221
|
}
|
|
316
222
|
/**
|
|
317
223
|
* Resolve `exec.cwd` inside `baseDir` and prove containment against the
|
|
318
|
-
*
|
|
319
|
-
*
|
|
320
|
-
* symlink to `/etc`, and only a realpath comparison catches that.
|
|
321
|
-
*
|
|
322
|
-
* Async on purpose: this runs once per unit — up to 10 000 times for one map
|
|
323
|
-
* step — on the dispatch path that must never block (see the module note).
|
|
224
|
+
* resolved base (a symlinked `reports` could point at `/etc`). Async: it runs
|
|
225
|
+
* per unit on the dispatch path.
|
|
324
226
|
*/
|
|
325
227
|
async function resolveExecCwd(input) {
|
|
326
228
|
const base = path.resolve(input.baseDir);
|
|
@@ -351,22 +253,13 @@ async function isExistingDirectory(candidate) {
|
|
|
351
253
|
}
|
|
352
254
|
}
|
|
353
255
|
/**
|
|
354
|
-
* The child's environment, in
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
* `AKM_*` context, LAST so a workflow-supplied binding can never shadow the
|
|
358
|
-
* ids/item the engine is telling the command the truth about.
|
|
359
|
-
*
|
|
360
|
-
* See docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md
|
|
361
|
-
* for why the default is an allowlist rather than full inheritance.
|
|
256
|
+
* The child's environment, in precedence order: the allowlist plus
|
|
257
|
+
* `exec.passEnv`; the resolved `env:` bindings; then the engine's `AKM_*`
|
|
258
|
+
* context, last so a binding cannot shadow it.
|
|
362
259
|
*/
|
|
363
260
|
function childEnv(exec, bindings, context, eventSource) {
|
|
364
261
|
const env = collectAllowlistedEnv(execAllowlist(exec));
|
|
365
|
-
//
|
|
366
|
-
// ambient passthrough above left the name absent — an ambient
|
|
367
|
-
// AKM_EVENT_SOURCE already collected into `env` still wins, and this runs
|
|
368
|
-
// strictly BEFORE the bindings/context overlays below, so an authored
|
|
369
|
-
// `env:` binding (or the engine-authored context) still wins too.
|
|
262
|
+
// Only when absent from the base, and before the overlays, so ambient and authored values win.
|
|
370
263
|
if (eventSource !== undefined && env.AKM_EVENT_SOURCE === undefined) {
|
|
371
264
|
env.AKM_EVENT_SOURCE = eventSource;
|
|
372
265
|
}
|
|
@@ -2,41 +2,11 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* The gate judge built from the
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* 1. **Redaction.** A judge response IS journaled — `journalGateEvaluationFinish`
|
|
11
|
-
* (exec/step-work.ts) writes the parsed verdict into the gate row's
|
|
12
|
-
* `result_json`, and a judge failure's message becomes the blocked step's
|
|
13
|
-
* notes. So the judge outcome goes through the SAME scrub every unit outcome
|
|
14
|
-
* goes through: {@link collectWorkflowDispatchSensitiveValues} +
|
|
15
|
-
* {@link withDispatchRedaction} (exec/dispatch-redaction.ts). Nothing about
|
|
16
|
-
* a judge call reaches durable state before that scrub. Agent and direct-LLM
|
|
17
|
-
* judges share one prepared/lowered dispatch request; the manual completion
|
|
18
|
-
* path uses the same config-free dispatcher without opening an executor
|
|
19
|
-
* import cycle.
|
|
20
|
-
*
|
|
21
|
-
* 2. **Identity.** The dispatch request carries the REAL run/step and the gate's
|
|
22
|
-
* real node/unit ids — the same ids `journalGateEvaluationStart/Finish` write
|
|
23
|
-
* (`<stepId>.gate` / `<stepId>.gate:l<loop>`) — so per-dispatch telemetry and
|
|
24
|
-
* harness-side correlation describe the same thing the gate row describes.
|
|
25
|
-
* The identity is threaded in from the caller that writes the row
|
|
26
|
-
* ({@link SummaryJudge}'s `identity` argument); it is never synthesized here.
|
|
27
|
-
*
|
|
28
|
-
* A judge dispatch carries NO `env` bindings: the normalized gate target has
|
|
29
|
-
* no environment key, so there is nothing authored to thread — and a step's
|
|
30
|
-
* unit environment is scoped to the WORK,
|
|
31
|
-
* not to the verifier. Redaction is unaffected: the sensitive-value set below
|
|
32
|
-
* still covers the judge engine's credential and unsafe passthrough values.
|
|
33
|
-
* Lowering notices are live execution metadata: units expose a typed result,
|
|
34
|
-
* while judges retain their public string contract and emit only the common
|
|
35
|
-
* lowerer's prompt/body-free notice projection through `warn()`. Current
|
|
36
|
-
* result/evidence journal writers intentionally exclude these diagnostics;
|
|
37
|
-
* this boundary makes no claim about future persistence ownership.
|
|
38
|
-
*
|
|
39
|
-
* @module workflows/exec/frozen-judge
|
|
5
|
+
* The gate judge built from the step's frozen judge target. Its outcome is
|
|
6
|
+
* journaled (the gate row, or a blocked step's notes), so it goes through the
|
|
7
|
+
* same dispatch redaction as every unit; its dispatch carries the real
|
|
8
|
+
* run/step and gate unit ids the gate row records. A judge carries no `env:`
|
|
9
|
+
* bindings (a step's environment belongs to the work, not the verifier).
|
|
40
10
|
*/
|
|
41
11
|
import { warn } from "../../core/warn.js";
|
|
42
12
|
import { collectWorkflowDispatchSensitiveValues, withDispatchRedaction } from "./dispatch-redaction.js";
|
|
@@ -45,13 +15,7 @@ import { dispatchWorkflowExecution, prepareWorkflowExecution, } from "./unit-dis
|
|
|
45
15
|
export function gateNodeId(stepId) {
|
|
46
16
|
return `${stepId}.gate`;
|
|
47
17
|
}
|
|
48
|
-
/**
|
|
49
|
-
* Identity for one judge dispatch: the journaling caller's exact row identity
|
|
50
|
-
* when it supplied one, else the owning run/step with the gate's node id as the
|
|
51
|
-
* unit id. Either way the request names the REAL run — never a synthetic
|
|
52
|
-
* `"gate"` placeholder, which made every judge dispatch indistinguishable from
|
|
53
|
-
* every other one.
|
|
54
|
-
*/
|
|
18
|
+
/** Identity for one judge dispatch: the caller's row identity, else the run/step with the gate node id. */
|
|
55
19
|
function dispatchIdentity(owner, identity) {
|
|
56
20
|
return identity ?? { ...owner, unitId: gateNodeId(owner.stepId) };
|
|
57
21
|
}
|
|
@@ -67,23 +31,7 @@ function warnLoweringNotices(...groups) {
|
|
|
67
31
|
}
|
|
68
32
|
}
|
|
69
33
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Build a gate judge from the normalized frozen target without consulting live
|
|
72
|
-
* config.
|
|
73
|
-
*
|
|
74
|
-
* `eventSource` (P1b spec §5.2 point 2, gap closed — code review): the task
|
|
75
|
-
* runner's resolved provenance event source, threaded through exactly like
|
|
76
|
-
* `executeStepSubgraph`'s units so a workflow-task run's judge dispatch is not
|
|
77
|
-
* the one dispatch left silently unstamped. Spread onto the built
|
|
78
|
-
* {@link UnitDispatchRequest} the same way every other optional field here is
|
|
79
|
-
* — `undefined` for the manual `akm workflow step complete` judge
|
|
80
|
-
* (`runtime/runs.ts`, which passes no 5th argument) and for `akm workflow run`
|
|
81
|
-
* (no task context), so both stay byte-identical. When present, it flows
|
|
82
|
-
* through the same `forwardedDispatchEventSource` precedence gate every other
|
|
83
|
-
* "command"-kind dispatch uses (`unit-dispatch.ts`): the module doc above
|
|
84
|
-
* already establishes a judge request never carries an authored `env:`
|
|
85
|
-
* binding, so the gate always forwards it here.
|
|
86
|
-
*/
|
|
34
|
+
/** Build a gate judge from the frozen target without consulting live config; `eventSource` stamps it like a unit. */
|
|
87
35
|
export function frozenSummaryJudge(target, signal, dispatcher, owner, eventSource) {
|
|
88
36
|
if (!target)
|
|
89
37
|
return null;
|