akm-cli 0.9.0-rc.8 → 0.9.0
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 +1063 -44
- package/README.md +51 -25
- package/SECURITY.md +14 -1
- package/STABILITY.md +497 -0
- package/dist/akm +148 -35
- package/dist/{akm-migrate-storage → akm-migrate} +6 -9
- package/dist/assets/hints/cli-hints-full.md +223 -95
- package/dist/assets/hints/cli-hints-short.md +85 -22
- package/dist/assets/improve-strategies/default.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/stash-skeleton/README.md +6 -5
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
- package/dist/assets/tasks/core/extract.yml +1 -1
- package/dist/assets/tasks/core/version-check.yml +1 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
- package/dist/assets/templates/html/health.html +1 -3
- package/dist/assets/workflows/workflow-template.md +32 -15
- package/dist/cli/invocation.js +40 -15
- package/dist/cli/parse-args.js +0 -22
- package/dist/cli/retired-commands.js +121 -0
- package/dist/cli/shared.js +154 -22
- package/dist/cli/unknown-flags.js +236 -0
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +696 -258
- package/dist/commands/agent/agent-dispatch.js +14 -3
- package/dist/commands/agent/contribute-cli.js +73 -88
- package/dist/commands/completions.js +79 -22
- package/dist/commands/config-cli.js +17 -150
- package/dist/commands/env/env-cli.js +59 -143
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +36 -66
- package/dist/commands/env/secret.js +24 -57
- package/dist/commands/feedback-cli.js +141 -87
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +3 -4
- package/dist/commands/health/checks.js +85 -23
- package/dist/commands/health/html-report.js +7 -10
- package/dist/commands/health/improve-metrics.js +25 -83
- package/dist/commands/health/md-report.js +5 -9
- package/dist/commands/health/metrics.js +62 -20
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +4 -5
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +3 -48
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/commands/health/types-improve.js +7 -0
- package/dist/commands/health.js +99 -28
- package/dist/commands/improve/anti-collapse.js +2 -2
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +41 -40
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +140 -1000
- package/dist/commands/improve/distill/promote-memory.js +12 -12
- package/dist/commands/improve/distill/quality-gate.js +6 -6
- package/dist/commands/improve/distill.js +58 -69
- package/dist/commands/improve/eligibility.js +105 -57
- package/dist/commands/improve/extract-cli.js +14 -133
- package/dist/commands/improve/improve-cli.js +98 -114
- package/dist/commands/improve/improve-result-file.js +1 -28
- package/dist/commands/improve/improve-strategies.js +8 -5
- package/dist/commands/improve/improve.js +128 -91
- package/dist/commands/improve/loop-stages.js +182 -20
- package/dist/commands/improve/memory/derived-ref.js +45 -43
- package/dist/commands/improve/memory/memory-belief.js +1 -1
- package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
- package/dist/commands/improve/memory/memory-improve.js +6 -5
- package/dist/commands/improve/outcome-loop.js +22 -65
- package/dist/commands/improve/preparation.js +114 -123
- package/dist/commands/improve/proactive-maintenance.js +2 -5
- package/dist/commands/improve/reflect.js +56 -160
- package/dist/commands/improve/salience.js +11 -122
- package/dist/commands/improve/source-identity.js +10 -38
- package/dist/commands/lint/base-linter.js +20 -124
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +249 -43
- package/dist/commands/{events.js → log.js} +33 -38
- package/dist/commands/migrate-cli.js +92 -12
- package/dist/commands/migration-tool.js +46 -0
- package/dist/commands/observability-cli.js +70 -209
- package/dist/commands/proposal/drain.js +101 -29
- package/dist/commands/proposal/proposal-cli.js +76 -48
- package/dist/commands/proposal/proposal.js +54 -18
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +23 -15
- package/dist/commands/proposal/repository.js +701 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
- package/dist/commands/proposal/validators/proposal-validators.js +55 -7
- package/dist/commands/proposal/validators/proposals.js +4 -7
- package/dist/commands/read/curate.js +34 -53
- package/dist/commands/read/knowledge.js +150 -95
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +42 -15
- package/dist/commands/read/search-cli.js +180 -78
- package/dist/commands/read/search.js +58 -43
- package/dist/commands/read/show.js +197 -141
- package/dist/commands/registry-cli.js +12 -51
- package/dist/commands/remember.js +14 -57
- package/dist/commands/sources/add-cli.js +100 -31
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +7 -2
- package/dist/commands/sources/info.js +18 -5
- package/dist/commands/sources/init.js +12 -12
- package/dist/commands/sources/installed-stashes.js +382 -98
- package/dist/commands/sources/schema-repair.js +3 -2
- package/dist/commands/sources/self-update.js +131 -38
- package/dist/commands/sources/source-add.js +72 -17
- package/dist/commands/sources/source-clone.js +129 -45
- package/dist/commands/sources/source-manage.js +43 -23
- package/dist/commands/sources/sources-cli.js +57 -208
- package/dist/commands/sources/stash-cli.js +46 -53
- package/dist/commands/tasks/tasks-cli.js +91 -97
- package/dist/commands/tasks/tasks.js +276 -421
- package/dist/commands/workflow-cli.js +175 -450
- package/dist/core/adapter/adapters/akm-adapter.js +47 -28
- package/dist/core/adapter/adapters/akm-lint.js +42 -27
- package/dist/core/adapter/adapters/akm-metadata.js +15 -44
- package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
- package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
- package/dist/core/adapter/adapters/index.js +6 -6
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
- package/dist/core/adapter/adapters/okf-adapter.js +187 -19
- package/dist/core/adapter/adapters/shared.js +3 -19
- package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +6 -4
- package/dist/core/adapter/validate-context.js +214 -0
- package/dist/core/asset/akm-markdown.js +63 -0
- package/dist/core/asset/asset-placement.js +20 -6
- package/dist/core/asset/asset-ref.js +11 -9
- package/dist/core/asset/frontmatter-lint.js +30 -0
- package/dist/core/asset/frontmatter.js +37 -9
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +89 -18
- package/dist/core/asset/stash-meta.js +1 -1
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +152 -38
- package/dist/core/config/config-io.js +12 -1
- package/dist/core/config/config-schema.js +35 -8
- package/dist/core/config/config-sources.js +55 -11
- package/dist/core/config/config-walker.js +25 -9
- package/dist/core/config/config.js +9 -48
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +5 -1
- package/dist/core/config/schema/experimental.js +30 -0
- package/dist/core/config/schema/improve-processes.js +0 -6
- package/dist/core/config/schema/improve.js +21 -3
- package/dist/core/config/schema/index-config.js +8 -15
- package/dist/core/config/schema/output.js +4 -1
- package/dist/core/config/schema/setup.js +9 -18
- package/dist/core/config/schema/sources-bundles.js +49 -33
- package/dist/core/config/schema/workflow.js +3 -3
- package/dist/core/env-secret-ref.js +76 -46
- package/dist/core/errors.js +18 -12
- package/dist/core/events.js +46 -128
- package/dist/core/file-change.js +6 -5
- package/dist/core/fs-txn.js +83 -7
- package/dist/core/git-message.js +2 -2
- package/dist/core/improve-result.js +1 -100
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +2 -1
- package/dist/core/migration-operation.js +16 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/parse.js +4 -1
- package/dist/core/paths.js +17 -20
- package/dist/core/recognition-util.js +12 -14
- package/dist/core/redaction.js +34 -0
- package/dist/core/standards/resolve-standards-context.js +2 -14
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +2 -2
- package/dist/core/state/migrations.js +41 -18
- package/dist/core/state-db.js +5 -14
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +6 -4
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/type-presentation.js +3 -3
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +771 -95
- package/dist/indexer/bundle-identity-guard.js +3 -2
- package/dist/indexer/db/graph-db.js +0 -24
- package/dist/indexer/ensure-index.js +1 -0
- package/dist/indexer/graph/graph-boost.js +9 -34
- package/dist/indexer/graph/graph-extraction.js +8 -5
- package/dist/indexer/index-writer-lock.js +53 -17
- package/dist/indexer/index-written-assets.js +16 -22
- package/dist/indexer/indexer.js +497 -239
- package/dist/indexer/installations.js +14 -96
- package/dist/indexer/passes/dir-staleness.js +16 -9
- package/dist/indexer/passes/memory-inference.js +11 -9
- package/dist/indexer/passes/metadata.js +113 -47
- package/dist/indexer/scan/doc-to-entry.js +38 -1
- package/dist/indexer/scan/drain-dir.js +13 -23
- package/dist/indexer/search/db-search.js +99 -54
- package/dist/indexer/search/fts-query.js +47 -24
- package/dist/indexer/search/ranking-contributors.js +42 -20
- package/dist/indexer/search/ranking.js +18 -99
- package/dist/indexer/search/search-fields.js +7 -2
- package/dist/indexer/search/search-source.js +82 -93
- package/dist/indexer/usage/usage-events.js +0 -89
- package/dist/indexer/walk/file-context.js +2 -1
- package/dist/indexer/walk/matchers.js +30 -43
- package/dist/indexer/walk/path-resolver.js +7 -2
- package/dist/indexer/walk/walker.js +38 -12
- package/dist/integrations/agent/builders.js +0 -6
- package/dist/integrations/agent/config.js +2 -2
- package/dist/integrations/agent/detect.js +49 -19
- package/dist/integrations/agent/engine-fallback.js +76 -0
- package/dist/integrations/agent/profiles.js +14 -0
- package/dist/integrations/agent/prompts.js +12 -8
- package/dist/integrations/agent/runner-dispatch.js +4 -2
- package/dist/integrations/agent/runner.js +0 -1
- package/dist/integrations/agent/spawn.js +5 -6
- package/dist/integrations/github.js +1 -1
- package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
- package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
- package/dist/integrations/harnesses/claude/session-log.js +0 -10
- package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
- package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
- package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
- package/dist/integrations/harnesses/index.js +3 -7
- package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
- package/dist/integrations/harnesses/opencode/session-log.js +0 -15
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
- package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
- package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
- package/dist/integrations/lockfile.js +101 -6
- package/dist/integrations/session-logs/index.js +3 -28
- package/dist/llm/client.js +136 -100
- package/dist/llm/embedders/remote.js +13 -5
- package/dist/llm/feature-gate.js +4 -12
- package/dist/llm/graph-extract.js +5 -11
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +5 -7
- package/dist/llm/structured-call.js +1 -1
- package/dist/llm/usage-persist.js +26 -5
- package/dist/llm/usage-telemetry.js +25 -2
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +259 -0
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -36
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +56 -83
- package/dist/output/shapes/migrate.js +8 -0
- package/dist/output/shapes/passthrough.js +7 -41
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes.js +2 -9
- package/dist/output/text/{init.js → bundle-create.js} +3 -1
- package/dist/output/text/bundle-show.js +7 -0
- package/dist/output/text/command-format.js +164 -96
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/health-format.js +103 -0
- package/dist/output/text/health.js +7 -0
- package/dist/output/text/helpers.js +10 -8
- package/dist/output/text/lint-format.js +43 -0
- package/dist/output/text/{save.js → lint.js} +2 -2
- package/dist/output/text/migrate.js +88 -0
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +44 -72
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +15 -7
- package/dist/output/text/status-list.js +32 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +24 -203
- package/dist/output/text/workflow.js +1 -7
- package/dist/output/text.js +16 -17
- package/dist/registry/factory.js +4 -6
- package/dist/registry/origin-resolve.js +16 -27
- package/dist/registry/providers/skills-sh.js +3 -3
- package/dist/registry/providers/static-index.js +13 -23
- package/dist/registry/resolve.js +42 -7
- package/dist/registry/semver.js +34 -84
- package/dist/runtime.js +2 -23
- package/dist/scripts/akm-migrate-node.js +60290 -0
- package/dist/scripts/akm-migrate.js +59628 -0
- package/dist/setup/detect.js +42 -15
- package/dist/setup/registry-stash-loader.js +2 -2
- package/dist/setup/setup.js +236 -136
- package/dist/setup/steps/connection.js +7 -9
- package/dist/setup/steps/platforms.js +9 -9
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +12 -13
- package/dist/setup/steps/stashdir.js +2 -3
- package/dist/setup/steps/tasks.js +237 -120
- package/dist/sources/freshness.js +1 -1
- package/dist/sources/provider-factory.js +11 -17
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +278 -34
- package/dist/sources/providers/git-provider.js +25 -23
- package/dist/sources/providers/git-stash.js +395 -106
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +7 -4
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +6 -1
- package/dist/sources/resolve.js +6 -5
- package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
- package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
- package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
- package/dist/sources/snapshot-fetchers/github.js +100 -0
- package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
- package/dist/sources/snapshot-fetchers/registry.js +17 -1
- package/dist/sources/snapshot-fetchers/robots.js +348 -0
- package/dist/sources/snapshot-fetchers/rss.js +282 -0
- package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
- package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
- package/dist/sources/snapshot-fetchers/x.js +910 -0
- package/dist/storage/database.js +7 -0
- package/dist/storage/engines/sqlite-migrations.js +23 -111
- package/dist/storage/managed-db.js +2 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +27 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -12
- package/dist/storage/repositories/index-connection.js +17 -6
- package/dist/storage/repositories/index-entries-repository.js +151 -240
- package/dist/storage/repositories/index-entry-mapper.js +15 -11
- package/dist/storage/repositories/index-fts-repository.js +5 -2
- package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
- package/dist/storage/repositories/index-meta-repository.js +2 -3
- package/dist/storage/repositories/index-schema.js +10 -25
- package/dist/storage/repositories/index-utility-repository.js +15 -28
- package/dist/storage/repositories/index-vec-repository.js +6 -1
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +296 -59
- package/dist/storage/repositories/registry-cache.js +19 -0
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +15 -13
- package/dist/storage/repositories/workflow-runs-repository.js +52 -40
- package/dist/tasks/backends/cron.js +105 -15
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +85 -38
- package/dist/tasks/backends/schtasks.js +135 -15
- package/dist/tasks/embedded.js +56 -40
- package/dist/tasks/parser.js +7 -157
- package/dist/tasks/resolve-akm-bin.js +137 -59
- package/dist/tasks/runner.js +79 -42
- package/dist/tasks/scheduler-invocation.js +220 -10
- package/dist/tasks/schema.js +24 -1
- package/dist/tasks/task-id.js +1 -3
- package/dist/tasks/validator.js +20 -6
- package/dist/workflows/authoring/authoring.js +94 -143
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/exec/frozen-judge.js +28 -2
- package/dist/workflows/exec/native-executor.js +77 -57
- package/dist/workflows/exec/param-secrets.js +9 -9
- package/dist/workflows/exec/run-workflow.js +133 -79
- package/dist/workflows/exec/step-work.js +219 -346
- package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
- package/dist/workflows/ir/compile.js +141 -270
- package/dist/workflows/ir/freeze.js +40 -30
- package/dist/workflows/ir/params.js +135 -11
- package/dist/workflows/ir/plan-hash.js +1 -1
- package/dist/workflows/ir/schema.js +25 -26
- package/dist/workflows/parser.js +872 -307
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +95 -68
- package/dist/workflows/resource-limits.js +2 -0
- package/dist/workflows/runtime/checkin.js +3 -3
- package/dist/workflows/runtime/plan-classifier.js +16 -75
- package/dist/workflows/runtime/runs.js +186 -127
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +2 -2
- package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +30 -36
- package/dist/workflows/validator.js +21 -62
- package/docs/README.md +68 -0
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.7.0.md +11 -11
- package/docs/migration/release-notes/0.9.0.md +208 -27
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +564 -208
- package/docs/migration/v0.9.0-troubleshooting.md +561 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/cli.md +2253 -0
- package/docs/reference/configuration.md +358 -0
- package/docs/reference/data-and-telemetry.md +105 -42
- package/docs/reference/workflows.md +647 -0
- package/package.json +22 -11
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +81 -128
- package/schemas/akm-workflow.json +74 -73
- package/dist/assets/tasks/core/backup.yml +0 -5
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/cli/config-migrate.js +0 -1806
- package/dist/cli/config-validate.js +0 -41
- package/dist/commands/backup-cli.js +0 -56
- package/dist/commands/bundle/bundle-cli.js +0 -68
- package/dist/commands/bundle/bundle.js +0 -219
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -489
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/mv-cli.js +0 -1221
- package/dist/commands/sources/history.js +0 -201
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/core/migration-backup.js +0 -1234
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/migrate/legacy/config-source-migration.js +0 -223
- package/dist/migrate/legacy/content-migration.js +0 -305
- package/dist/migrate/legacy/legacy-layout.js +0 -779
- package/dist/migrate/legacy/legacy-paths.js +0 -25
- package/dist/migrate/legacy/legacy-stash-json.js +0 -72
- package/dist/migrate/legacy/proposal-fs-import.js +0 -168
- package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
- package/dist/migrate/legacy/three-db-cutover.js +0 -841
- package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
- package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
- package/dist/migrate/legacy-ref-grammar.js +0 -214
- package/dist/output/shapes/distill.js +0 -14
- package/dist/output/shapes/history.js +0 -11
- package/dist/output/text/distill.js +0 -6
- package/dist/output/text/enable-disable.js +0 -8
- package/dist/output/text/history.js +0 -6
- package/dist/registry/build-index.js +0 -382
- package/dist/schemas/akm-config.json +0 -4704
- package/dist/schemas/akm-task.json +0 -87
- package/dist/schemas/akm-workflow.json +0 -372
- package/dist/scripts/migrate-storage.js +0 -3816
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/cli.js +0 -53
- package/dist/workflows/exec/brief.js +0 -481
- package/dist/workflows/exec/report.js +0 -1460
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -813
- package/dist/workflows/program/project.js +0 -104
|
@@ -1,110 +1,20 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
const GRAMMAR_HINT = "allowed forms: params.<name>, steps.<id>.output(.<ident>|[<int>])*";
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* is literal text that passes through byte-exact.
|
|
8
|
-
*
|
|
9
|
-
* The grammar is CLOSED — exactly four roots, nothing else parses:
|
|
10
|
-
*
|
|
11
|
-
* params.<ident>
|
|
12
|
-
* steps.<ident>.output( .<ident> | [<non-negative int>] )*
|
|
13
|
-
* item
|
|
14
|
-
* item_index
|
|
15
|
-
*
|
|
16
|
-
* where <ident> is `[A-Za-z_][A-Za-z0-9_-]*`. No functions, no clock, no
|
|
17
|
-
* randomness, no ambient lookup — orchestration decisions stay pure
|
|
18
|
-
* functions of (frozen plan, params, journaled unit results).
|
|
19
|
-
*
|
|
20
|
-
* Templates are parsed ONCE into literal/reference segments; resolution is a
|
|
21
|
-
* single pass over that AST. Substituted content is data, never re-scanned,
|
|
22
|
-
* so a value containing `${{ params.x }}` is inserted literally — the P1
|
|
23
|
-
* re-scan injection bug class is structurally impossible.
|
|
24
|
-
*
|
|
25
|
-
* There is deliberately NO escape syntax in v1: a literal `${{` cannot
|
|
26
|
-
* appear in instructions. Authors who write one get a parse error from the
|
|
27
|
-
* validator (unterminated or invalid reference) telling them so.
|
|
28
|
-
*
|
|
29
|
-
* Pure module: no IO, no engine imports.
|
|
6
|
+
* Parse a bare reference string (a whole-value frontmatter field, already
|
|
7
|
+
* delimiter-free: `map.over`, `route.input`, or one entry of `inputs[]`).
|
|
30
8
|
*/
|
|
31
|
-
|
|
32
|
-
const CLOSE = "}}";
|
|
33
|
-
// ── Template parsing ─────────────────────────────────────────────────────────
|
|
34
|
-
/**
|
|
35
|
-
* Split a template into literal and reference segments. Literal text passes
|
|
36
|
-
* through byte-exact, including `$`, `{`, `}`, `${`, `{{`, and `}}` sequences
|
|
37
|
-
* that do not form the exact `${{` opener. Errors are returned, not thrown.
|
|
38
|
-
*/
|
|
39
|
-
export function parseTemplate(template) {
|
|
40
|
-
const segments = [];
|
|
41
|
-
const errors = [];
|
|
42
|
-
let cursor = 0;
|
|
43
|
-
while (cursor < template.length) {
|
|
44
|
-
const open = template.indexOf(OPEN, cursor);
|
|
45
|
-
if (open === -1)
|
|
46
|
-
break;
|
|
47
|
-
if (open > cursor)
|
|
48
|
-
segments.push({ kind: "literal", text: template.slice(cursor, open) });
|
|
49
|
-
const close = template.indexOf(CLOSE, open + OPEN.length);
|
|
50
|
-
const nested = template.indexOf(OPEN, open + OPEN.length);
|
|
51
|
-
if (close === -1) {
|
|
52
|
-
errors.push({
|
|
53
|
-
index: open,
|
|
54
|
-
message: `Unterminated ${OPEN} reference (no matching ${CLOSE}). ` +
|
|
55
|
-
`Note: there is no escape syntax — a literal ${OPEN} cannot appear in this text.`,
|
|
56
|
-
});
|
|
57
|
-
cursor = template.length;
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
if (nested !== -1 && nested < close) {
|
|
61
|
-
errors.push({
|
|
62
|
-
index: nested,
|
|
63
|
-
message: `Nested ${OPEN} inside a reference — references cannot contain other references.`,
|
|
64
|
-
});
|
|
65
|
-
cursor = close + CLOSE.length;
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
const inner = template.slice(open + OPEN.length, close);
|
|
69
|
-
const parsed = parseExpression(inner);
|
|
70
|
-
if (parsed.ok) {
|
|
71
|
-
segments.push({
|
|
72
|
-
kind: "reference",
|
|
73
|
-
expr: parsed.expr,
|
|
74
|
-
raw: template.slice(open, close + CLOSE.length),
|
|
75
|
-
index: open,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
errors.push({ index: open, message: parsed.message });
|
|
80
|
-
}
|
|
81
|
-
cursor = close + CLOSE.length;
|
|
82
|
-
}
|
|
83
|
-
if (cursor < template.length)
|
|
84
|
-
segments.push({ kind: "literal", text: template.slice(cursor) });
|
|
85
|
-
return errors.length > 0 ? { ok: false, errors } : { ok: true, segments };
|
|
86
|
-
}
|
|
87
|
-
const GRAMMAR_HINT = "allowed forms: params.<name>, steps.<id>.output[...], item, item_index";
|
|
88
|
-
/**
|
|
89
|
-
* Parse a single expression (the text between `${{` and `}}`, or a bare
|
|
90
|
-
* whole-value field such as `map.over` after delimiter stripping).
|
|
91
|
-
*/
|
|
92
|
-
export function parseExpression(source) {
|
|
9
|
+
export function parseReference(source) {
|
|
93
10
|
const text = source.trim();
|
|
94
11
|
if (text === "")
|
|
95
|
-
return { ok: false, message: `Empty
|
|
12
|
+
return { ok: false, message: `Empty reference; ${GRAMMAR_HINT}.` };
|
|
96
13
|
const root = readIdent(text, 0);
|
|
97
14
|
if (!root) {
|
|
98
|
-
return { ok: false, message: `Invalid
|
|
15
|
+
return { ok: false, message: `Invalid reference "${text}" — must start with an identifier; ${GRAMMAR_HINT}.` };
|
|
99
16
|
}
|
|
100
17
|
switch (root.name) {
|
|
101
|
-
case "item":
|
|
102
|
-
case "item_index": {
|
|
103
|
-
if (root.end !== text.length) {
|
|
104
|
-
return { ok: false, message: `"${root.name}" takes no path — found trailing "${text.slice(root.end)}".` };
|
|
105
|
-
}
|
|
106
|
-
return { ok: true, expr: root.name === "item" ? { kind: "item" } : { kind: "itemIndex" } };
|
|
107
|
-
}
|
|
108
18
|
case "params": {
|
|
109
19
|
if (text[root.end] !== ".") {
|
|
110
20
|
return { ok: false, message: `"params" requires a name: params.<name> (got "${text}").` };
|
|
@@ -188,78 +98,10 @@ function parsePath(text, start) {
|
|
|
188
98
|
return { ok: true, path };
|
|
189
99
|
}
|
|
190
100
|
// ── Resolution ───────────────────────────────────────────────────────────────
|
|
191
|
-
/**
|
|
192
|
-
* Resolve parsed segments against a scope in a SINGLE pass — resolved values
|
|
193
|
-
* are concatenated as data and never re-scanned for further references.
|
|
194
|
-
* Strings insert verbatim; numbers/booleans via String(); objects/arrays as
|
|
195
|
-
* canonical JSON (recursively sorted keys); null/undefined/missing paths are
|
|
196
|
-
* resolution errors naming the reference.
|
|
197
|
-
*/
|
|
198
|
-
export function resolveTemplate(segments, scope) {
|
|
199
|
-
const parts = [];
|
|
200
|
-
const errors = [];
|
|
201
|
-
for (const segment of segments) {
|
|
202
|
-
if (segment.kind === "literal") {
|
|
203
|
-
parts.push(segment.text);
|
|
204
|
-
continue;
|
|
205
|
-
}
|
|
206
|
-
const resolved = resolveReference(segment.expr, scope);
|
|
207
|
-
if (!resolved.ok) {
|
|
208
|
-
errors.push(resolved.error);
|
|
209
|
-
continue;
|
|
210
|
-
}
|
|
211
|
-
const value = resolved.value;
|
|
212
|
-
if (typeof value === "string") {
|
|
213
|
-
parts.push(value);
|
|
214
|
-
}
|
|
215
|
-
else if (typeof value === "number" || typeof value === "boolean") {
|
|
216
|
-
parts.push(String(value));
|
|
217
|
-
}
|
|
218
|
-
else if (typeof value === "object" && value !== null) {
|
|
219
|
-
parts.push(canonicalJson(value));
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
errors.push({
|
|
223
|
-
reference: formatReference(segment.expr),
|
|
224
|
-
message: `${formatReference(segment.expr)} resolved to an unsupported value type (${typeof value}).`,
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
return errors.length > 0 ? { ok: false, errors } : { ok: true, text: parts.join("") };
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Resolve a whole-value field (`map.over`, `route.input`) from its RAW
|
|
232
|
-
* template string: the text must be exactly one `${{ … }}` reference with no
|
|
233
|
-
* surrounding literal text (the compiler enforces this for YAML programs;
|
|
234
|
-
* frozen plans are re-checked here so a tampered/legacy plan fails loudly
|
|
235
|
-
* instead of string-splicing). The reference resolves to its RAW value —
|
|
236
|
-
* arrays stay arrays, objects stay objects.
|
|
237
|
-
*/
|
|
238
|
-
export function resolveWholeValue(template, scope) {
|
|
239
|
-
const parsed = parseTemplate(template);
|
|
240
|
-
if (!parsed.ok) {
|
|
241
|
-
return {
|
|
242
|
-
ok: false,
|
|
243
|
-
error: { reference: template, message: parsed.errors.map((e) => e.message).join(" ") },
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
const [first] = parsed.segments;
|
|
247
|
-
if (parsed.segments.length !== 1 || first?.kind !== "reference") {
|
|
248
|
-
return {
|
|
249
|
-
ok: false,
|
|
250
|
-
error: {
|
|
251
|
-
reference: template,
|
|
252
|
-
message: `expected a single whole-value \${{ … }} reference with no surrounding text ` +
|
|
253
|
-
`(e.g. "\${{ steps.discover.output.files }}"), got ${JSON.stringify(template)}.`,
|
|
254
|
-
},
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
return resolveReference(first.expr, scope);
|
|
258
|
-
}
|
|
259
101
|
/**
|
|
260
102
|
* Resolve a single reference to its RAW value for whole-value contexts
|
|
261
|
-
* (`map.over`, `route.input`): arrays stay arrays, objects stay
|
|
262
|
-
* null/undefined values and missing paths are errors
|
|
103
|
+
* (`map.over`, `route.input`, `inputs[]`): arrays stay arrays, objects stay
|
|
104
|
+
* objects. null/undefined values and missing paths are errors.
|
|
263
105
|
*/
|
|
264
106
|
export function resolveReference(expr, scope) {
|
|
265
107
|
const reference = formatReference(expr);
|
|
@@ -271,16 +113,6 @@ export function resolveReference(expr, scope) {
|
|
|
271
113
|
}
|
|
272
114
|
return finish(scope.params[expr.name], reference, fail);
|
|
273
115
|
}
|
|
274
|
-
case "item": {
|
|
275
|
-
if (scope.item === undefined)
|
|
276
|
-
return fail("item is only available inside a map unit.");
|
|
277
|
-
return finish(scope.item, reference, fail);
|
|
278
|
-
}
|
|
279
|
-
case "itemIndex": {
|
|
280
|
-
if (typeof scope.itemIndex !== "number")
|
|
281
|
-
return fail("item_index is only available inside a map unit.");
|
|
282
|
-
return { ok: true, value: scope.itemIndex };
|
|
283
|
-
}
|
|
284
116
|
case "stepOutput": {
|
|
285
117
|
if (!Object.hasOwn(scope.stepOutputs, expr.stepId)) {
|
|
286
118
|
return fail(`steps.${expr.stepId}.output is not available — step "${expr.stepId}" has no recorded output.`);
|
|
@@ -313,6 +145,18 @@ export function resolveReference(expr, scope) {
|
|
|
313
145
|
}
|
|
314
146
|
}
|
|
315
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Resolve a bare reference STRING directly (parse + resolve in one call) —
|
|
150
|
+
* the shape every whole-value frontmatter position (`map.over`, `route.input`,
|
|
151
|
+
* one entry of `inputs[]`) actually needs.
|
|
152
|
+
*/
|
|
153
|
+
export function resolveReferenceString(text, scope) {
|
|
154
|
+
const parsed = parseReference(text);
|
|
155
|
+
if (!parsed.ok) {
|
|
156
|
+
return { ok: false, error: { reference: text, message: parsed.message } };
|
|
157
|
+
}
|
|
158
|
+
return resolveReference(parsed.expr, scope);
|
|
159
|
+
}
|
|
316
160
|
function finish(value, reference, fail) {
|
|
317
161
|
if (value === undefined)
|
|
318
162
|
return fail(`${reference} resolved to undefined.`);
|
|
@@ -321,24 +165,11 @@ function finish(value, reference, fail) {
|
|
|
321
165
|
return { ok: true, value };
|
|
322
166
|
}
|
|
323
167
|
// ── Introspection helpers ────────────────────────────────────────────────────
|
|
324
|
-
/** The reference ASTs of a parsed template, in document order — for validator edge checking. */
|
|
325
|
-
export function listReferences(segments) {
|
|
326
|
-
const references = [];
|
|
327
|
-
for (const segment of segments) {
|
|
328
|
-
if (segment.kind === "reference")
|
|
329
|
-
references.push(segment.expr);
|
|
330
|
-
}
|
|
331
|
-
return references;
|
|
332
|
-
}
|
|
333
168
|
/** Canonical source spelling of a reference, e.g. `steps.review.output.files[2].name`. */
|
|
334
169
|
export function formatReference(expr) {
|
|
335
170
|
switch (expr.kind) {
|
|
336
171
|
case "param":
|
|
337
172
|
return `params.${expr.name}`;
|
|
338
|
-
case "item":
|
|
339
|
-
return "item";
|
|
340
|
-
case "itemIndex":
|
|
341
|
-
return "item_index";
|
|
342
173
|
case "stepOutput": {
|
|
343
174
|
let text = `steps.${expr.stepId}.output`;
|
|
344
175
|
for (const segment of expr.path) {
|
|
@@ -348,22 +179,3 @@ export function formatReference(expr) {
|
|
|
348
179
|
}
|
|
349
180
|
}
|
|
350
181
|
}
|
|
351
|
-
// ── Canonical JSON ───────────────────────────────────────────────────────────
|
|
352
|
-
/**
|
|
353
|
-
* Stable stringify with recursively sorted object keys, so equal values
|
|
354
|
-
* render identically regardless of key insertion order. Same pattern as the
|
|
355
|
-
* module-private helper in exec/native-executor.ts (not exported there).
|
|
356
|
-
*/
|
|
357
|
-
function canonicalJson(value) {
|
|
358
|
-
return JSON.stringify(sortKeys(value));
|
|
359
|
-
}
|
|
360
|
-
function sortKeys(value) {
|
|
361
|
-
if (Array.isArray(value))
|
|
362
|
-
return value.map(sortKeys);
|
|
363
|
-
if (value && typeof value === "object") {
|
|
364
|
-
return Object.fromEntries(Object.entries(value)
|
|
365
|
-
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
366
|
-
.map(([k, v]) => [k, sortKeys(v)]));
|
|
367
|
-
}
|
|
368
|
-
return value;
|
|
369
|
-
}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
export const WORKFLOW_PROGRAM_VERSION = 2;
|
|
5
|
-
/** @deprecated source v2 rejects runner; retained for TypeScript migration only. */
|
|
6
|
-
export const PROGRAM_RUNNER_KINDS = ["llm", "agent", "sdk", "inherit"];
|
|
7
4
|
/** How a map step folds its per-item unit results into the step artifact. */
|
|
8
5
|
export const PROGRAM_REDUCERS = ["collect", "vote"];
|
|
9
6
|
/** Failure policy: fail the step on first unit failure, or record and go on. */
|
|
10
7
|
export const PROGRAM_ON_ERROR = ["fail", "continue"];
|
|
11
|
-
/** Filesystem isolation for file-mutating units
|
|
8
|
+
/** Filesystem isolation for file-mutating units. */
|
|
12
9
|
export const PROGRAM_ISOLATION_KINDS = ["none", "worktree"];
|
|
13
10
|
/**
|
|
14
11
|
* `retry.on` vocabulary — exactly the persisted `AgentFailureReason` taxonomy
|
|
@@ -32,15 +29,15 @@ const RETRY_REASON_SET = {
|
|
|
32
29
|
};
|
|
33
30
|
export const PROGRAM_RETRY_REASONS = Object.keys(RETRY_REASON_SET);
|
|
34
31
|
/**
|
|
35
|
-
* Step ids: `[A-Za-z_][A-Za-z0-9_-]*` (also pinned in the JSON Schema)
|
|
36
|
-
*
|
|
37
|
-
* This is EXACTLY the `<ident>` grammar `readIdent` accepts in
|
|
38
|
-
* `program/expressions.ts` for
|
|
32
|
+
* Step ids: `[A-Za-z_][A-Za-z0-9_-]*` (also pinned in the JSON Schema) — the
|
|
33
|
+
* ONE id grammar for the unified format (workflow-format-unification, spec
|
|
34
|
+
* §2.2). This is EXACTLY the `<ident>` grammar `readIdent` accepts in
|
|
35
|
+
* `program/expressions.ts` for `steps.<id>.output` references: a
|
|
39
36
|
* letter/underscore first char, then letters/digits/underscores/dashes, and
|
|
40
37
|
* NO dots (the expression parser treats `.` as the `.output` path separator,
|
|
41
38
|
* so a dotted id could never be addressed). Keeping step ids inside the
|
|
42
39
|
* addressable grammar guarantees every step can be referenced from map
|
|
43
|
-
* inputs, routes, and
|
|
40
|
+
* inputs, routes, and `inputs:` without renaming.
|
|
44
41
|
*
|
|
45
42
|
* Forbidding dots additionally keeps the engine's internal gate-row node id
|
|
46
43
|
* `<stepId>.gate` collision-free: no user step id can contain a dot, so it can
|
|
@@ -48,7 +45,7 @@ export const PROGRAM_RETRY_REASONS = Object.keys(RETRY_REASON_SET);
|
|
|
48
45
|
*/
|
|
49
46
|
export const PROGRAM_STEP_ID_PATTERN = /^[A-Za-z_][A-Za-z0-9_-]*$/;
|
|
50
47
|
/**
|
|
51
|
-
* Param names must be
|
|
48
|
+
* Param names must be `params.<ident>`-addressable, so they are plain
|
|
52
49
|
* identifiers (no dots/dashes).
|
|
53
50
|
*/
|
|
54
51
|
export const PROGRAM_PARAM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
@@ -2,31 +2,21 @@
|
|
|
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
|
-
* Show + indexing
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* `ShowResponse` shape (which still uses the flat
|
|
12
|
-
* `WorkflowStepDefinition` type for backwards compatibility) and into
|
|
13
|
-
* search hints for the indexer.
|
|
14
|
-
* - `workflow-program-yaml` — reads a YAML workflow *program* (redesign
|
|
15
|
-
* addendum, R1) via `parseWorkflowProgram` and projects it through
|
|
16
|
-
* `program/project.ts`, including a compact orchestration summary per
|
|
17
|
-
* step (runner/model, `fanOut.over` expression, route table).
|
|
5
|
+
* Show + indexing renderer for the unified workflow asset (workflow-format-
|
|
6
|
+
* unification). One format now: reads the frontmatter+body document via
|
|
7
|
+
* `parseWorkflow` and projects the validated `WorkflowDocument` down to the
|
|
8
|
+
* public `ShowResponse` shape and into search hints for the indexer,
|
|
9
|
+
* including a compact per-step orchestration summary (engine/model,
|
|
10
|
+
* `map.over` reference, route table) when the step declares one.
|
|
18
11
|
*/
|
|
19
12
|
import { displayRef } from "../core/asset/resolve-ref.js";
|
|
20
13
|
import { UsageError } from "../core/errors.js";
|
|
21
14
|
import { parseWorkflow } from "./parser.js";
|
|
22
|
-
import { parseWorkflowProgram } from "./program/parser.js";
|
|
23
|
-
import { programStepInstructions, projectProgramParameters, summarizeProgramStepOrchestration, WORKFLOW_PROGRAM_RENDERER_NAME, } from "./program/project.js";
|
|
24
|
-
export { WORKFLOW_PROGRAM_RENDERER_NAME };
|
|
25
15
|
function shellQuote(value) {
|
|
26
16
|
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
27
17
|
}
|
|
28
18
|
export function buildWorkflowAction(ref) {
|
|
29
|
-
return `
|
|
19
|
+
return `Start or resume execution with \`akm workflow run ${shellQuote(ref)}\`.`;
|
|
30
20
|
}
|
|
31
21
|
function deriveName(ctx) {
|
|
32
22
|
const metaName = ctx.matchResult.meta?.name;
|
|
@@ -42,73 +32,110 @@ function loadDocument(ctx) {
|
|
|
42
32
|
const summary = result.errors.map((e) => `${ctx.relPath}:${e.line} — ${e.message}`).join("\n");
|
|
43
33
|
throw new UsageError(`Workflow has errors:\n${summary}`);
|
|
44
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* The instruction text a step contributes to the flat step projection. A
|
|
37
|
+
* route step has no body requirement, so a deterministic description of the
|
|
38
|
+
* routing table stands in when it declares no section (the spine still needs
|
|
39
|
+
* a non-empty instructions string).
|
|
40
|
+
*/
|
|
41
|
+
function stepInstructions(step) {
|
|
42
|
+
if (step.instructions)
|
|
43
|
+
return step.instructions.text;
|
|
44
|
+
if (step.route) {
|
|
45
|
+
const branches = step.route.branches.map((b) => `"${b.match}" -> ${b.stepId}`);
|
|
46
|
+
if (step.route.defaultStepId !== undefined)
|
|
47
|
+
branches.push(`default -> ${step.route.defaultStepId}`);
|
|
48
|
+
return `Route on ${step.route.input}: ${branches.join(", ")}.`;
|
|
49
|
+
}
|
|
50
|
+
return "";
|
|
51
|
+
}
|
|
52
|
+
/** Project the `params` block into the flat `WorkflowParameter` list. */
|
|
53
|
+
function projectParameters(document) {
|
|
54
|
+
if (!document.params)
|
|
55
|
+
return undefined;
|
|
56
|
+
const parameters = Object.entries(document.params).map(([name, schema]) => {
|
|
57
|
+
const description = schema.description;
|
|
58
|
+
return { name, ...(typeof description === "string" && description !== "" ? { description } : {}) };
|
|
59
|
+
});
|
|
60
|
+
return parameters.length > 0 ? parameters : undefined;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Compact, show-facing orchestration summary for one step. Field mapping:
|
|
64
|
+
* `engine`/`model`/`timeoutMs` merge the run-level `defaults` exactly like the
|
|
65
|
+
* compiler does (per-unit override wins), `fanOut.over` carries the raw
|
|
66
|
+
* reference string, and `route` carries the explicit input + branch table.
|
|
67
|
+
* Returns undefined when the step declares nothing worth summarizing.
|
|
68
|
+
*/
|
|
69
|
+
function summarizeStepOrchestration(step, defaults) {
|
|
70
|
+
const unit = step.unit ?? step.map?.unit;
|
|
71
|
+
const engine = unit?.engine ?? defaults?.engine;
|
|
72
|
+
const model = unit?.model ?? defaults?.model;
|
|
73
|
+
const timeoutMs = unit?.timeoutMs !== undefined ? unit.timeoutMs : defaults?.timeoutMs;
|
|
74
|
+
const summary = {
|
|
75
|
+
...(engine !== undefined ? { engine } : {}),
|
|
76
|
+
...(model !== undefined ? { model } : {}),
|
|
77
|
+
...(timeoutMs !== undefined ? { timeoutMs } : {}),
|
|
78
|
+
...(step.map
|
|
79
|
+
? {
|
|
80
|
+
fanOut: {
|
|
81
|
+
over: step.map.over,
|
|
82
|
+
...(step.map.concurrency !== undefined ? { concurrency: step.map.concurrency } : {}),
|
|
83
|
+
reducer: step.map.reducer ?? "collect",
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
: {}),
|
|
87
|
+
...(unit?.output !== undefined || step.output !== undefined ? { hasSchema: true } : {}),
|
|
88
|
+
...(unit?.env !== undefined ? { env: [...unit.env] } : {}),
|
|
89
|
+
...(step.route
|
|
90
|
+
? {
|
|
91
|
+
route: {
|
|
92
|
+
input: step.route.input,
|
|
93
|
+
branches: step.route.branches.map((b) => ({ match: b.match, stepId: b.stepId })),
|
|
94
|
+
...(step.route.defaultStepId !== undefined ? { defaultStepId: step.route.defaultStepId } : {}),
|
|
95
|
+
},
|
|
96
|
+
}
|
|
97
|
+
: {}),
|
|
98
|
+
};
|
|
99
|
+
return Object.keys(summary).length > 0 ? summary : undefined;
|
|
100
|
+
}
|
|
101
|
+
function projectStepDefinitions(document) {
|
|
102
|
+
return document.steps.map((step) => {
|
|
103
|
+
const orchestration = summarizeStepOrchestration(step, document.defaults);
|
|
104
|
+
return {
|
|
105
|
+
id: step.id,
|
|
106
|
+
// No titles anywhere in the unified format — a step IS its id.
|
|
107
|
+
title: step.id,
|
|
108
|
+
instructions: stepInstructions(step),
|
|
109
|
+
...(step.gateRubric?.text.trim() ? { completionCriteria: [step.gateRubric.text] } : {}),
|
|
110
|
+
sequenceIndex: step.sequenceIndex,
|
|
111
|
+
...(orchestration ? { orchestration } : {}),
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
}
|
|
45
115
|
export const workflowMdRenderer = {
|
|
46
116
|
name: "workflow-md",
|
|
47
117
|
buildShowResponse(ctx) {
|
|
48
118
|
const name = deriveName(ctx);
|
|
49
119
|
const doc = loadDocument(ctx);
|
|
50
|
-
// WI-8.5b (display flip): the `akm workflow
|
|
120
|
+
// WI-8.5b (display flip): the `akm workflow run <ref>` action is DISPLAY
|
|
51
121
|
// output — its spelling follows the D-R5 display rule (`displayRef`). A
|
|
52
122
|
// primary/default-bundle workflow renders the SHORT conceptId
|
|
53
123
|
// (`workflows/<name>`); a named source qualifies it as
|
|
54
124
|
// (`<bundle>//workflows/<name>`).
|
|
55
|
-
const ref = displayRef({ type: "workflow", name, bundleId: ctx.origin });
|
|
125
|
+
const ref = displayRef({ type: "workflow", name, bundleId: ctx.origin }, ctx.defaultBundle);
|
|
126
|
+
const parameters = projectParameters(doc);
|
|
56
127
|
return {
|
|
57
128
|
type: "workflow",
|
|
58
129
|
name,
|
|
59
130
|
path: ctx.absPath,
|
|
60
131
|
action: buildWorkflowAction(ref),
|
|
132
|
+
...(doc.preamble ? { content: doc.preamble } : {}),
|
|
61
133
|
description: doc.description,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
steps: doc.steps.map((s) => ({
|
|
66
|
-
id: s.id,
|
|
67
|
-
title: s.title,
|
|
68
|
-
instructions: s.instructions.text,
|
|
69
|
-
...(s.completionCriteria ? { completionCriteria: s.completionCriteria.map((c) => c.text) } : {}),
|
|
70
|
-
sequenceIndex: s.sequenceIndex,
|
|
71
|
-
})),
|
|
72
|
-
};
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
function loadProgram(ctx) {
|
|
76
|
-
const result = parseWorkflowProgram(ctx.content(), { path: ctx.relPath });
|
|
77
|
-
if (result.ok)
|
|
78
|
-
return result.program;
|
|
79
|
-
const summary = result.errors.map((e) => `${ctx.relPath}:${e.line} — ${e.message}`).join("\n");
|
|
80
|
-
throw new UsageError(`Workflow has errors:\n${summary}`);
|
|
81
|
-
}
|
|
82
|
-
/** Show renderer for YAML workflow programs — mirrors `workflowMdRenderer`. */
|
|
83
|
-
export const workflowProgramRenderer = {
|
|
84
|
-
name: WORKFLOW_PROGRAM_RENDERER_NAME,
|
|
85
|
-
buildShowResponse(ctx) {
|
|
86
|
-
const name = deriveName(ctx);
|
|
87
|
-
const program = loadProgram(ctx);
|
|
88
|
-
// WI-8.5b (display flip): the `akm workflow next <ref>` action is DISPLAY
|
|
89
|
-
// output — its spelling follows the D-R5 display rule (`displayRef`), mirroring
|
|
90
|
-
// workflowMdRenderer above.
|
|
91
|
-
const ref = displayRef({ type: "workflow", name, bundleId: ctx.origin });
|
|
92
|
-
const parameters = projectProgramParameters(program);
|
|
93
|
-
return {
|
|
94
|
-
type: "workflow",
|
|
95
|
-
name,
|
|
96
|
-
path: ctx.absPath,
|
|
97
|
-
action: buildWorkflowAction(ref),
|
|
98
|
-
description: program.description,
|
|
99
|
-
workflowTitle: program.name,
|
|
134
|
+
// No authored title in the unified format — the asset's human name is
|
|
135
|
+
// its `description`/H1 like any other asset; this is its canonical name.
|
|
136
|
+
workflowTitle: name,
|
|
100
137
|
...(parameters ? { parameters: parameters.map((p) => p.name), workflowParameters: parameters } : {}),
|
|
101
|
-
steps:
|
|
102
|
-
const orchestration = summarizeProgramStepOrchestration(step, program.defaults);
|
|
103
|
-
return {
|
|
104
|
-
id: step.id,
|
|
105
|
-
title: step.title ?? step.id,
|
|
106
|
-
instructions: programStepInstructions(step),
|
|
107
|
-
...(step.gate ? { completionCriteria: [...step.gate.criteria] } : {}),
|
|
108
|
-
sequenceIndex: index,
|
|
109
|
-
...(orchestration ? { orchestration } : {}),
|
|
110
|
-
};
|
|
111
|
-
}),
|
|
138
|
+
steps: projectStepDefinitions(doc),
|
|
112
139
|
};
|
|
113
140
|
},
|
|
114
141
|
};
|
|
@@ -12,6 +12,8 @@ export const WORKFLOW_MAX_SCHEMA_BYTES = 256 * 1024;
|
|
|
12
12
|
export const WORKFLOW_MAX_EXTRA_PARAMS_BYTES = 64 * 1024;
|
|
13
13
|
export const WORKFLOW_MAX_JSON_DEPTH = 64;
|
|
14
14
|
export const WORKFLOW_MAX_MAP_EXPANSION = 10_000;
|
|
15
|
+
/** Max declared `inputs:` reference strings on one unit/map step. */
|
|
16
|
+
export const WORKFLOW_MAX_INPUTS = 64;
|
|
15
17
|
export function utf8Bytes(value) {
|
|
16
18
|
return Buffer.byteLength(value, "utf8");
|
|
17
19
|
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* reconciles #506 (file/command-loop signal) with #501 (background thread) in
|
|
10
10
|
* favour of the former. There is intentionally NO timer or resident process
|
|
11
11
|
* here. Arming a check-in writes a timestamp (`checkin_armed_at`) on the run
|
|
12
|
-
* row; the next time the agent polls the engine via `workflow
|
|
12
|
+
* row; the next time the agent polls the engine via `workflow run`/`status`,
|
|
13
13
|
* {@link evaluateCheckin} is called to decide — purely from timestamps — whether
|
|
14
14
|
* the run looks stalled and a strong `continue` directive should be surfaced
|
|
15
15
|
* through the normal command output.
|
|
@@ -48,8 +48,8 @@ export function evaluateCheckin(run, now = Date.now(), stallMs = CHECKIN_STALL_M
|
|
|
48
48
|
return {
|
|
49
49
|
signal: "continue",
|
|
50
50
|
directive: "CONTINUE: this workflow run has stalled with no progress. Resume immediately — " +
|
|
51
|
-
"
|
|
52
|
-
"
|
|
51
|
+
"inspect its status, then call `akm workflow run` with the run id to finish the outstanding work. " +
|
|
52
|
+
"Do not stop until the run reaches a terminal state or reports a verification rejection.",
|
|
53
53
|
idleMs,
|
|
54
54
|
agentHarness: run.agentHarness ?? null,
|
|
55
55
|
agentSessionId: run.agentSessionId ?? null,
|