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
|
@@ -1,196 +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 { UsageError } from "../../core/errors.js";
|
|
5
|
-
import { warnOnce } from "../../core/warn.js";
|
|
6
|
-
import { decodeCanonicalPlan } from "../ir/plan-hash.js";
|
|
7
|
-
import { WORKFLOW_IR_V5_VERSION } from "../ir/schema-v4.js";
|
|
8
|
-
/** Validate that a live run carries exactly the current frozen-plan format. */
|
|
9
|
-
export function classifyWorkflowRunPlan(row) {
|
|
10
|
-
const runId = row.id ?? "(unknown)";
|
|
11
|
-
if (!row.plan_json) {
|
|
12
|
-
return {
|
|
13
|
-
support: "missing-plan",
|
|
14
|
-
irVersion: row.plan_ir_version ?? null,
|
|
15
|
-
error: `Workflow run ${runId} has no frozen workflow plan.`,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
if (row.plan_ir_version !== null &&
|
|
19
|
-
row.plan_ir_version !== undefined &&
|
|
20
|
-
row.plan_ir_version !== WORKFLOW_IR_V5_VERSION) {
|
|
21
|
-
return {
|
|
22
|
-
support: "unsupported-version",
|
|
23
|
-
irVersion: row.plan_ir_version,
|
|
24
|
-
// §3.2's exact complete-or-abandon policy string (A-N2): pre-irVersion-5
|
|
25
|
-
// plans keep status/list/abandon working but can no longer execute. A
|
|
26
|
-
// version ABOVE the current one (#919) is a distinct situation — never
|
|
27
|
-
// an "upgrade" problem — so it gets its own text below rather than
|
|
28
|
-
// being folded into the pre-5 wording.
|
|
29
|
-
error: row.plan_ir_version < WORKFLOW_IR_V5_VERSION
|
|
30
|
-
? // Issue 8: leads with the remedy available to a user who has
|
|
31
|
-
`Workflow run ${runId} was frozen as workflow plan irVersion ${row.plan_ir_version}; pre-irVersion-5 ` +
|
|
32
|
-
`plans cannot execute after the 0.9.2 upgrade. Run 'akm workflow abandon ${runId}' and start a new ` +
|
|
33
|
-
`run from the authored workflow to continue. 'akm workflow status' and 'akm workflow list' still ` +
|
|
34
|
-
`work on this run.`
|
|
35
|
-
: `Workflow run ${runId} was frozen with workflow plan irVersion ${row.plan_ir_version}, which this akm ` +
|
|
36
|
-
`(irVersion ${WORKFLOW_IR_V5_VERSION}) does not understand; it was probably written by a newer akm. ` +
|
|
37
|
-
`Complete it with that akm version, or run 'akm workflow abandon ${runId}' and start a new run from ` +
|
|
38
|
-
`the authored workflow. 'akm workflow status' and 'akm workflow list' still work on this run.`,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
try {
|
|
42
|
-
return {
|
|
43
|
-
support: "supported",
|
|
44
|
-
irVersion: WORKFLOW_IR_V5_VERSION,
|
|
45
|
-
plan: decodeCanonicalPlan(runId, row.plan_json, row.plan_hash, row.plan_ir_version),
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
catch (cause) {
|
|
49
|
-
return {
|
|
50
|
-
support: "corrupt-plan",
|
|
51
|
-
irVersion: row.plan_ir_version ?? null,
|
|
52
|
-
error: cause instanceof Error ? cause.message : String(cause),
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Reject any operation that requires a valid current frozen plan. A
|
|
58
|
-
* non-current stored `plan_ir_version` (`unsupported-version`) fails closed
|
|
59
|
-
* under `WORKFLOW_IR_VERSION_UNSUPPORTED` (A-N2) — distinct from the
|
|
60
|
-
* `missing-plan` / `corrupt-plan` decode-corruption family, which keeps
|
|
61
|
-
* `INVALID_JSON_ARGUMENT`.
|
|
62
|
-
*/
|
|
63
|
-
export function requireExecutableWorkflowPlan(row) {
|
|
64
|
-
const classified = classifyWorkflowRunPlan(row);
|
|
65
|
-
if (classified.support === "supported")
|
|
66
|
-
return classified.plan;
|
|
67
|
-
if (classified.support === "unsupported-version") {
|
|
68
|
-
throw new UsageError(classified.error, "WORKFLOW_IR_VERSION_UNSUPPORTED");
|
|
69
|
-
}
|
|
70
|
-
throw new UsageError(classified.error, "INVALID_JSON_ARGUMENT");
|
|
71
|
-
}
|
|
72
|
-
/** Project persisted spine rows from the decoded plan, never from the mutable source asset. */
|
|
73
|
-
export function frozenStepRows(plan) {
|
|
74
|
-
return plan.steps.map((step) => ({
|
|
75
|
-
stepId: step.stepId,
|
|
76
|
-
stepTitle: step.title,
|
|
77
|
-
instructions: step.root
|
|
78
|
-
? step.root.kind === "map"
|
|
79
|
-
? step.root.template.instructions
|
|
80
|
-
: step.root.instructions
|
|
81
|
-
: routeInstructions(step.route),
|
|
82
|
-
completionJson: step.gate.criteria.length > 0 ? JSON.stringify(step.gate.criteria) : null,
|
|
83
|
-
sequenceIndex: step.sequenceIndex,
|
|
84
|
-
}));
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Verify the durable spine's STEP IDENTITY still agrees with the
|
|
88
|
-
* decoded/hash-verified plan: the same number of steps, and the same set of
|
|
89
|
-
* step ids. A published plan's own step ids are fixed forever at freeze
|
|
90
|
-
* time, so a mismatch here means the row set itself is wrong — genuine
|
|
91
|
-
* corruption, not something a later akm release could have caused by
|
|
92
|
-
* changing how a field is FORMATTED (that is
|
|
93
|
-
* {@link reconcileWorkflowSpineWithPlan}'s concern, issue 7).
|
|
94
|
-
*/
|
|
95
|
-
function assertSpineIdentityMatchesPlan(runId, expected, rows) {
|
|
96
|
-
if (rows.length !== expected.length)
|
|
97
|
-
corruptSpine(runId, "step count differs from the frozen plan");
|
|
98
|
-
const expectedIds = new Set(expected.map((step) => step.stepId));
|
|
99
|
-
for (const row of rows) {
|
|
100
|
-
if (!expectedIds.has(row.step_id))
|
|
101
|
-
corruptSpine(runId, `step "${row.step_id}" is not in the frozen plan`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Reconcile the durable spine's PURE-DERIVATION fields (title, instructions,
|
|
106
|
-
* completion criteria, sequence position) against the plan (issue 7).
|
|
107
|
-
*
|
|
108
|
-
* These are recomputed from the plan by {@link frozenStepRows} on every
|
|
109
|
-
* read; a later akm release changing how one of them is FORMATTED from the
|
|
110
|
-
* SAME plan data used to mark every in-flight run from the previous release
|
|
111
|
-
* "corrupt" the moment anything (`akm workflow status`, `resume`, a step
|
|
112
|
-
* completion) touched it. A mismatch here is warned about, once per run,
|
|
113
|
-
* rather than blocking the caller — never step identity (row count, which
|
|
114
|
-
* step ids exist), which stays a hard failure in
|
|
115
|
-
* {@link assertSpineIdentityMatchesPlan} because the plan cannot have
|
|
116
|
-
* produced a different step id for an already-frozen run.
|
|
117
|
-
*
|
|
118
|
-
* The durable row — not the plan — is what a driving agent actually acts
|
|
119
|
-
* on: `getNextWorkflowStep` reads `instructions` straight off this row
|
|
120
|
-
* (`toWorkflowRunStepState`/`projectNextResult` in `runtime/runs.ts`), and
|
|
121
|
-
* `exec/run-workflow.ts`/`exec/step-work.ts` dispatch from that result. So
|
|
122
|
-
* warning and proceeding with the STORED row (rather than rewriting it to
|
|
123
|
-
* match the plan's current formatting) is the conservative choice: the
|
|
124
|
-
* durable spine is the contract this run has been executing against since
|
|
125
|
-
* freeze, and a newer akm formatting the same plan data differently should
|
|
126
|
-
* not retroactively change an in-flight run's instructions out from under
|
|
127
|
-
* it mid-execution. This module has no write path for that anyway
|
|
128
|
-
* (`workflow_run_steps` is owned by
|
|
129
|
-
* `storage/repositories/workflow-runs-repository.ts`) — and it should not
|
|
130
|
-
* gain one for this purpose. Step
|
|
131
|
-
* identity (row count, which step ids exist) is the part that would
|
|
132
|
-
* actually desynchronize execution from the plan, which is exactly why
|
|
133
|
-
* {@link assertSpineIdentityMatchesPlan} keeps that a hard failure.
|
|
134
|
-
*/
|
|
135
|
-
export function reconcileWorkflowSpineWithPlan(plan, run, rows) {
|
|
136
|
-
const expected = frozenStepRows(plan);
|
|
137
|
-
assertSpineIdentityMatchesPlan(run.id, expected, rows);
|
|
138
|
-
const expectedById = new Map(expected.map((step) => [step.stepId, step]));
|
|
139
|
-
const drifted = [];
|
|
140
|
-
for (const row of rows) {
|
|
141
|
-
const planned = expectedById.get(row.step_id);
|
|
142
|
-
if (!planned)
|
|
143
|
-
continue; // unreachable after assertSpineIdentityMatchesPlan; kept defensive.
|
|
144
|
-
if (row.step_title !== planned.stepTitle ||
|
|
145
|
-
row.instructions !== planned.instructions ||
|
|
146
|
-
row.completion_json !== planned.completionJson ||
|
|
147
|
-
row.sequence_index !== planned.sequenceIndex) {
|
|
148
|
-
drifted.push(row.step_id);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
if (drifted.length > 0) {
|
|
152
|
-
warnOnce(`workflow-spine-drift:${run.id}`, `Workflow run ${run.id}: durable step row(s) [${drifted.join(", ")}] no longer match the frozen plan's ` +
|
|
153
|
-
"title/instructions/completion-criteria/sequence derivation (an akm upgrade likely changed how one of " +
|
|
154
|
-
"these is formatted from the same plan data). Continuing with the stored row(s) as-is — this run keeps " +
|
|
155
|
-
"executing against the instructions it was frozen with, rather than having them rewritten mid-flight.");
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
export function assertRunStatusMatchesSpine(run, rows) {
|
|
159
|
-
const current = run.current_step_id ? rows.find((row) => row.step_id === run.current_step_id) : undefined;
|
|
160
|
-
if (run.current_step_id !== null && !current)
|
|
161
|
-
corruptSpine(run.id, `current step ${run.current_step_id} is not in the frozen plan`);
|
|
162
|
-
if (run.status === "active") {
|
|
163
|
-
const firstPending = rows.find((row) => row.status === "pending");
|
|
164
|
-
if (!current || current.status !== "pending" || firstPending?.step_id !== current.step_id)
|
|
165
|
-
corruptSpine(run.id, "active status/current step does not match the first pending plan step");
|
|
166
|
-
}
|
|
167
|
-
else if (run.status === "blocked") {
|
|
168
|
-
if (!current || current.status !== "blocked")
|
|
169
|
-
corruptSpine(run.id, `${run.status} status does not match the current plan step`);
|
|
170
|
-
}
|
|
171
|
-
else if (run.status === "failed") {
|
|
172
|
-
// `workflow abandon` marks the run failed while intentionally leaving its
|
|
173
|
-
// current step unchanged so `resume` can reopen the same work. An active
|
|
174
|
-
// run leaves a pending step; a blocked run leaves a blocked step; and an
|
|
175
|
-
// execution failure already carries a failed step. All three are honest
|
|
176
|
-
// failed-run spines that `resumeWorkflowRun` normalizes back to pending.
|
|
177
|
-
if (!current || (current.status !== "failed" && current.status !== "pending" && current.status !== "blocked"))
|
|
178
|
-
corruptSpine(run.id, `${run.status} status does not match the current plan step`);
|
|
179
|
-
}
|
|
180
|
-
else if (run.status === "completed") {
|
|
181
|
-
if (run.current_step_id !== null ||
|
|
182
|
-
rows.some((row) => row.status === "pending" || row.status === "blocked" || row.status === "failed"))
|
|
183
|
-
corruptSpine(run.id, "completed status disagrees with the plan spine");
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
function routeInstructions(route) {
|
|
187
|
-
const branches = Object.entries(route.when)
|
|
188
|
-
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
189
|
-
.map(([match, stepId]) => `"${match}" -> ${stepId}`);
|
|
190
|
-
if (route.defaultStepId !== undefined)
|
|
191
|
-
branches.push(`default -> ${route.defaultStepId}`);
|
|
192
|
-
return `Route on ${route.input}: ${branches.join(", ")}.`;
|
|
193
|
-
}
|
|
194
|
-
function corruptSpine(runId, detail) {
|
|
195
|
-
throw new UsageError(`Workflow run ${runId} has a corrupt durable step spine: ${detail}. Refusing to mutate state that disagrees with its frozen plan.`, "INVALID_JSON_ARGUMENT");
|
|
196
|
-
}
|
|
@@ -1,45 +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 { GATE_EVALUATION_PHASE } from "./unit-phases.js";
|
|
5
|
-
/**
|
|
6
|
-
* Default staleness window. A unit claimed `running` whose last heartbeat (or,
|
|
7
|
-
* absent any heartbeat, its first claim) is older than this is surfaced as
|
|
8
|
-
* stale. Matches the run-level {@link ../runtime/checkin.CHECKIN_STALL_MS}.
|
|
9
|
-
*/
|
|
10
|
-
export const UNIT_STALE_MS = 90_000;
|
|
11
|
-
function parseIso(value) {
|
|
12
|
-
if (!value)
|
|
13
|
-
return null;
|
|
14
|
-
const ms = Date.parse(value);
|
|
15
|
-
return Number.isNaN(ms) ? null : ms;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Pure stale-unit evaluator. Returns every `running` DISPATCH unit whose last
|
|
19
|
-
* heartbeat (`last_checkin_at`, else the first-claim `started_at`) is older than
|
|
20
|
-
* `staleMs`. Gate-evaluation rows (`phase = "gate"`) are excluded — they are
|
|
21
|
-
* synchronous engine judge calls, never separately claimed work. A running row with
|
|
22
|
-
* no usable timestamp at all is treated as stale (a claim we can no longer age).
|
|
23
|
-
* Deterministic in `now` — free of timer flakiness.
|
|
24
|
-
*/
|
|
25
|
-
export function evaluateStaleUnits(rows, now = Date.now(), staleMs = UNIT_STALE_MS) {
|
|
26
|
-
const stale = [];
|
|
27
|
-
for (const row of rows) {
|
|
28
|
-
if (row.status !== "running")
|
|
29
|
-
continue;
|
|
30
|
-
if (row.phase === GATE_EVALUATION_PHASE)
|
|
31
|
-
continue;
|
|
32
|
-
const lastSeenAt = row.last_checkin_at ?? row.started_at;
|
|
33
|
-
const lastSeen = parseIso(lastSeenAt);
|
|
34
|
-
const idleMs = lastSeen === null ? Number.POSITIVE_INFINITY : now - lastSeen;
|
|
35
|
-
if (idleMs < staleMs)
|
|
36
|
-
continue;
|
|
37
|
-
stale.push({
|
|
38
|
-
unitId: row.unit_id,
|
|
39
|
-
stepId: row.step_id,
|
|
40
|
-
idleMs,
|
|
41
|
-
lastSeenAt: lastSeenAt ?? null,
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
return stale;
|
|
45
|
-
}
|
|
@@ -1,20 +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
|
-
* Unit-row phase markers — a leaf module (imports nothing) so both the exec
|
|
6
|
-
* modules (step-work, run-workflow) and the runtime (unit-checkin) can key on
|
|
7
|
-
* the phase discriminator without an exec ↔ runtime import cycle.
|
|
8
|
-
* Extracting {@link GATE_EVALUATION_PHASE} here broke the last workflows-
|
|
9
|
-
* runtime knot (step-work → runs → unit-checkin → step-work; chunk-8 WI-8.6,
|
|
10
|
-
* DoD 11).
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* `phase` marker stamped on gate-evaluation unit rows. Step ids cannot contain
|
|
14
|
-
* dots (`PROGRAM_STEP_ID_PATTERN`), so a step can never be NAMED `x.gate` and
|
|
15
|
-
* the synthetic `<stepId>.gate` node id is collision-free against user step
|
|
16
|
-
* ids. The phase column is nonetheless the discriminator we key on — an
|
|
17
|
-
* explicit marker, not a `node_id` suffix match, so recovery stays robust even
|
|
18
|
-
* if the id scheme evolves. Dispatch rows always journal `phase: null`.
|
|
19
|
-
*/
|
|
20
|
-
export const GATE_EVALUATION_PHASE = "gate";
|
package/dist/workflows/schema.js
DELETED
|
@@ -1,200 +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 path from "node:path";
|
|
5
|
-
import { parseFrontmatterBlock } from "../../core/asset/frontmatter.js";
|
|
6
|
-
import { parseWorkflow } from "../parser.js";
|
|
7
|
-
import { projectExecCore } from "../program/schema.js";
|
|
8
|
-
import { parseGithubWorkflowSource } from "./github-yaml.js";
|
|
9
|
-
import { sourceFailureResult, WorkflowSourceFailure } from "./result.js";
|
|
10
|
-
import { decodeWorkflowSourceIrV1, } from "./schema.js";
|
|
11
|
-
import { canonicalizeWorkflowWorkingDirectory, WorkflowSourceSemanticError } from "./semantics.js";
|
|
12
|
-
import { classifyWorkflowYamlTriggers } from "./triggers.js";
|
|
13
|
-
import { classifyWorkflowSourceUses } from "./uses.js";
|
|
14
|
-
export { looksLikeGithubWorkflowSource } from "./github-yaml.js";
|
|
15
|
-
export function compileGithubWorkflowSource(source, options) {
|
|
16
|
-
try {
|
|
17
|
-
return {
|
|
18
|
-
ok: true,
|
|
19
|
-
ir: decodeWorkflowSourceIrV1(parseGithubWorkflowSource(source, {
|
|
20
|
-
...options,
|
|
21
|
-
classifyUses: options.classifyUses ?? classifyWorkflowSourceUses,
|
|
22
|
-
classifyTriggers: options.classifyTriggers ?? classifyWorkflowYamlTriggers,
|
|
23
|
-
}), {
|
|
24
|
-
workspaceRoot: options.workspaceRoot,
|
|
25
|
-
}),
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
catch (cause) {
|
|
29
|
-
return sourceFailureResult(cause, options.path);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export function compileMarkdownWorkflowSource(source, options) {
|
|
33
|
-
const parsed = parseWorkflow(source, {
|
|
34
|
-
path: options.path,
|
|
35
|
-
validateExecCwd: (value) => {
|
|
36
|
-
try {
|
|
37
|
-
return { ok: true, value: canonicalizeWorkflowWorkingDirectory(value, options.workspaceRoot) };
|
|
38
|
-
}
|
|
39
|
-
catch (cause) {
|
|
40
|
-
if (cause instanceof WorkflowSourceSemanticError) {
|
|
41
|
-
return { ok: false, code: cause.code, message: cause.message };
|
|
42
|
-
}
|
|
43
|
-
return {
|
|
44
|
-
ok: false,
|
|
45
|
-
code: "working-directory-unverifiable",
|
|
46
|
-
message: cause instanceof Error ? cause.message : "working-directory cannot be physically verified.",
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
if (!parsed.ok) {
|
|
52
|
-
return {
|
|
53
|
-
ok: false,
|
|
54
|
-
errors: parsed.errors.map((error) => ({
|
|
55
|
-
code: error.code ?? "invalid-markdown-workflow",
|
|
56
|
-
message: error.message,
|
|
57
|
-
path: options.path,
|
|
58
|
-
line: error.line,
|
|
59
|
-
})),
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
try {
|
|
63
|
-
const sourceSpan = wholeSourceSpan(source, options.path);
|
|
64
|
-
const steps = parsed.document.steps.map((step) => markdownStep(step, options.path));
|
|
65
|
-
const ir = {
|
|
66
|
-
sourceIrVersion: 1,
|
|
67
|
-
name: markdownName(source, options.path),
|
|
68
|
-
...(parsed.document.description ? { description: parsed.document.description } : {}),
|
|
69
|
-
...(parsed.document.tags ? { tags: [...parsed.document.tags] } : {}),
|
|
70
|
-
...(parsed.document.params ? { params: jsonClone(parsed.document.params) } : {}),
|
|
71
|
-
...(parsed.document.outputs
|
|
72
|
-
? { outputs: jsonClone(parsed.document.outputs) }
|
|
73
|
-
: {}),
|
|
74
|
-
...(parsed.document.defaults
|
|
75
|
-
? { defaults: jsonClone(parsed.document.defaults) }
|
|
76
|
-
: {}),
|
|
77
|
-
...(parsed.document.budget ? { budget: jsonClone(parsed.document.budget) } : {}),
|
|
78
|
-
...(parsed.document.preamble ? { preamble: parsed.document.preamble } : {}),
|
|
79
|
-
triggers: [{ kind: "workflow_dispatch", source: sourceSpan }],
|
|
80
|
-
jobs: [
|
|
81
|
-
{
|
|
82
|
-
id: "contract",
|
|
83
|
-
needs: [],
|
|
84
|
-
steps,
|
|
85
|
-
source: sourceSpan,
|
|
86
|
-
},
|
|
87
|
-
],
|
|
88
|
-
extensions: {
|
|
89
|
-
"akm.dev/workflow-markdown": jsonExtension({
|
|
90
|
-
workflowSchemaVersion: parsed.document.schemaVersion,
|
|
91
|
-
}),
|
|
92
|
-
},
|
|
93
|
-
source: sourceSpan,
|
|
94
|
-
};
|
|
95
|
-
return {
|
|
96
|
-
ok: true,
|
|
97
|
-
ir: decodeWorkflowSourceIrV1(ir, { workspaceRoot: options.workspaceRoot }),
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
catch (cause) {
|
|
101
|
-
return sourceFailureResult(cause, options.path);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/** Compile by authoritative source extension without rewriting either format. */
|
|
105
|
-
export function compileWorkflowSource(source, options) {
|
|
106
|
-
const extension = path.extname(options.path).toLowerCase();
|
|
107
|
-
if (extension === ".md")
|
|
108
|
-
return compileMarkdownWorkflowSource(source, options);
|
|
109
|
-
if (extension === ".yml")
|
|
110
|
-
return compileGithubWorkflowSource(source, options);
|
|
111
|
-
return {
|
|
112
|
-
ok: false,
|
|
113
|
-
errors: [
|
|
114
|
-
{
|
|
115
|
-
code: "unsupported-workflow-extension",
|
|
116
|
-
message: `Workflow source ${options.path} must use .md or .yml.`,
|
|
117
|
-
path: options.path,
|
|
118
|
-
line: 1,
|
|
119
|
-
},
|
|
120
|
-
],
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
function markdownStep(step, filePath) {
|
|
124
|
-
const source = step.source ?? { path: filePath, start: 1, end: 1 };
|
|
125
|
-
const dispatchUnit = step.map?.unit ?? step.unit;
|
|
126
|
-
const unit = markdownUnit(dispatchUnit);
|
|
127
|
-
const common = {
|
|
128
|
-
id: step.id,
|
|
129
|
-
...(unit ? { unit } : {}),
|
|
130
|
-
...(step.map
|
|
131
|
-
? {
|
|
132
|
-
map: {
|
|
133
|
-
over: step.map.over,
|
|
134
|
-
...(step.map.concurrency !== undefined ? { concurrency: step.map.concurrency } : {}),
|
|
135
|
-
...(step.map.reducer !== undefined ? { reducer: step.map.reducer } : {}),
|
|
136
|
-
},
|
|
137
|
-
}
|
|
138
|
-
: {}),
|
|
139
|
-
...(step.route ? { route: jsonClone(step.route) } : {}),
|
|
140
|
-
...(step.inputs ? { inputs: [...step.inputs] } : {}),
|
|
141
|
-
...(step.output ? { output: jsonClone(step.output) } : {}),
|
|
142
|
-
...(step.gate || step.gateRubric
|
|
143
|
-
? {
|
|
144
|
-
gate: {
|
|
145
|
-
...(step.gate?.maxLoops !== undefined ? { maxLoops: step.gate.maxLoops } : {}),
|
|
146
|
-
...(step.gateRubric?.text.trim() ? { rubric: step.gateRubric.text } : {}),
|
|
147
|
-
},
|
|
148
|
-
}
|
|
149
|
-
: {}),
|
|
150
|
-
source,
|
|
151
|
-
};
|
|
152
|
-
if (step.route) {
|
|
153
|
-
return {
|
|
154
|
-
...common,
|
|
155
|
-
...(step.instructions?.text.trim() ? { instructions: step.instructions.text } : {}),
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
if (dispatchUnit?.exec) {
|
|
159
|
-
return {
|
|
160
|
-
...common,
|
|
161
|
-
exec: projectExecCore(dispatchUnit.exec),
|
|
162
|
-
...(step.instructions?.text.trim() ? { instructions: step.instructions.text } : {}),
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
const content = step.instructions?.text ?? "";
|
|
166
|
-
if (content.trim() === "") {
|
|
167
|
-
throw new WorkflowSourceFailure("markdown-command-content-required", `Markdown step ${JSON.stringify(step.id)} has no executable command content.`, source);
|
|
168
|
-
}
|
|
169
|
-
return {
|
|
170
|
-
...common,
|
|
171
|
-
uses: "akm/command",
|
|
172
|
-
commandMode: "literal",
|
|
173
|
-
with: { content },
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
function markdownUnit(value) {
|
|
177
|
-
if (!value)
|
|
178
|
-
return undefined;
|
|
179
|
-
const { exec: _exec, source: _source, ...unit } = value;
|
|
180
|
-
return Object.keys(unit).length > 0
|
|
181
|
-
? jsonClone(unit)
|
|
182
|
-
: undefined;
|
|
183
|
-
}
|
|
184
|
-
function markdownName(source, filePath) {
|
|
185
|
-
const block = parseFrontmatterBlock(source);
|
|
186
|
-
const body = block?.content ?? source;
|
|
187
|
-
const title = body.match(/^#\s+(.+?)\s*$/m)?.[1]?.trim();
|
|
188
|
-
if (title)
|
|
189
|
-
return title;
|
|
190
|
-
return path.basename(filePath, path.extname(filePath));
|
|
191
|
-
}
|
|
192
|
-
function wholeSourceSpan(source, filePath) {
|
|
193
|
-
return { path: filePath, start: 1, end: Math.max(1, source.split(/\r?\n/).length) };
|
|
194
|
-
}
|
|
195
|
-
function jsonClone(value) {
|
|
196
|
-
return JSON.parse(JSON.stringify(value));
|
|
197
|
-
}
|
|
198
|
-
function jsonExtension(value) {
|
|
199
|
-
return JSON.parse(JSON.stringify(value));
|
|
200
|
-
}
|
|
@@ -1,50 +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 { parseBuiltinCommandAction } from "../../commands/command/builtin-action.js";
|
|
5
|
-
import { PORTABLE_ARGUMENTS_PLACEHOLDER } from "../../commands/command/portable-template.js";
|
|
6
|
-
/** Lower one adapter-neutral source-IR step into the shared execution unit. */
|
|
7
|
-
export function sourceStepProgramUnit(source) {
|
|
8
|
-
const unit = {
|
|
9
|
-
...(source.unit ? structuredClone(source.unit) : {}),
|
|
10
|
-
source: sourceStepRef(source),
|
|
11
|
-
};
|
|
12
|
-
if (source.exec)
|
|
13
|
-
unit.exec = { ...source.exec };
|
|
14
|
-
if (source.run !== undefined) {
|
|
15
|
-
unit.exec = {
|
|
16
|
-
command: workflowShellCommand(source.shell ?? "sh", source.run),
|
|
17
|
-
...(source.workingDirectory ? { cwd: source.workingDirectory } : {}),
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
return unit;
|
|
21
|
-
}
|
|
22
|
-
/** Derive the instruction bytes consumed by the one workflow engine. */
|
|
23
|
-
export function sourceStepInstructions(source) {
|
|
24
|
-
if (source.instructions !== undefined)
|
|
25
|
-
return source.instructions;
|
|
26
|
-
if (source.run !== undefined)
|
|
27
|
-
return `Run ${source.run}.`;
|
|
28
|
-
if (source.uses === "akm/command") {
|
|
29
|
-
const action = parseBuiltinCommandAction(source.with);
|
|
30
|
-
if (action.kind === "stored") {
|
|
31
|
-
return `Invoke stored command ${action.ref}${action.arguments === undefined ? "" : " with arguments"}.`;
|
|
32
|
-
}
|
|
33
|
-
if (source.commandMode === "literal")
|
|
34
|
-
return action.content;
|
|
35
|
-
return action.content.split(PORTABLE_ARGUMENTS_PLACEHOLDER).join(action.arguments ?? "");
|
|
36
|
-
}
|
|
37
|
-
if (source.uses !== undefined)
|
|
38
|
-
return `Invoke local target ${source.uses}.`;
|
|
39
|
-
return "";
|
|
40
|
-
}
|
|
41
|
-
export function workflowShellCommand(shell, content) {
|
|
42
|
-
if (shell === "cmd")
|
|
43
|
-
return ["cmd", "/d", "/s", "/c", content];
|
|
44
|
-
if (shell === "pwsh" || shell === "powershell")
|
|
45
|
-
return [shell, "-Command", content];
|
|
46
|
-
return [shell, "-c", content];
|
|
47
|
-
}
|
|
48
|
-
export function sourceStepRef(source) {
|
|
49
|
-
return { path: source.source.path, start: source.source.start, end: source.source.end };
|
|
50
|
-
}
|
|
@@ -1,26 +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 class WorkflowSourceFailure extends Error {
|
|
5
|
-
error;
|
|
6
|
-
constructor(code, message, source) {
|
|
7
|
-
super(message);
|
|
8
|
-
this.name = "WorkflowSourceFailure";
|
|
9
|
-
this.error = { code, message, path: source.path, line: source.start };
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
export function sourceFailureResult(cause, path) {
|
|
13
|
-
if (cause instanceof WorkflowSourceFailure)
|
|
14
|
-
return { ok: false, errors: [cause.error] };
|
|
15
|
-
return {
|
|
16
|
-
ok: false,
|
|
17
|
-
errors: [
|
|
18
|
-
{
|
|
19
|
-
code: "invalid-workflow-source",
|
|
20
|
-
message: cause instanceof Error ? cause.message : String(cause),
|
|
21
|
-
path,
|
|
22
|
-
line: 1,
|
|
23
|
-
},
|
|
24
|
-
],
|
|
25
|
-
};
|
|
26
|
-
}
|