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
|
@@ -9,17 +9,14 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Resolution order:
|
|
11
11
|
*
|
|
12
|
-
* 1.
|
|
13
|
-
* 2.
|
|
14
|
-
* 3.
|
|
15
|
-
*
|
|
16
|
-
* compiled install (`bun /opt/akm/dist/cli.js`).
|
|
17
|
-
* 4. `which akm` / `where akm` — last resort when the binary is on PATH
|
|
18
|
-
* but neither override applies.
|
|
12
|
+
* 1. `process.execPath` alone for a Bun standalone executable.
|
|
13
|
+
* 2. Absolute Node plus the public `dist/akm` package launcher.
|
|
14
|
+
* 3. Absolute runtime plus the source/build CLI entry, classified as a
|
|
15
|
+
* checkout that requires explicit `--rebind` for scheduler writes.
|
|
19
16
|
*
|
|
20
17
|
* Returns the argv array the scheduler should execute (e.g.
|
|
21
|
-
* `["/usr/local/bin/
|
|
22
|
-
* subcommand args (`"
|
|
18
|
+
* `["/usr/local/bin/node", "/repo/dist/cli-node.mjs"]`). The caller appends
|
|
19
|
+
* subcommand args (`"task", "run", "<id>"`).
|
|
23
20
|
*/
|
|
24
21
|
import { spawnSync } from "node:child_process";
|
|
25
22
|
import fs from "node:fs";
|
|
@@ -29,74 +26,155 @@ import { ConfigError } from "../core/errors.js";
|
|
|
29
26
|
import { mainPath as runtimeMainPath } from "../runtime.js";
|
|
30
27
|
export function resolveAkmInvocation(options = {}) {
|
|
31
28
|
const env = options.env ?? process.env;
|
|
32
|
-
const override = env.AKM_BIN?.trim();
|
|
33
|
-
if (override) {
|
|
34
|
-
return { argv: [override], via: "AKM_BIN" };
|
|
35
|
-
}
|
|
36
29
|
const runtime = options.runtime ?? (process.versions.bun ? "bun" : "node");
|
|
37
30
|
const execPath = options.execPath ?? process.execPath;
|
|
38
31
|
const mainPath = options.mainPath ?? runtimeMainPath;
|
|
39
32
|
const isStandaloneMain = mainPath?.startsWith("/$bunfs/") || (mainPath !== undefined && /^[A-Za-z]:[\\/]~BUN[\\/]/i.test(mainPath));
|
|
40
33
|
if (runtime === "bun" && isStandaloneMain && execPath) {
|
|
41
|
-
return { argv: [execPath], via: "
|
|
34
|
+
return { argv: [absoluteInvocationPath(execPath)], via: "standalone", kind: "standalone", eligible: true };
|
|
35
|
+
}
|
|
36
|
+
const launcherPath = options.launcherPath ?? env.AKM_LAUNCHER_PATH?.trim();
|
|
37
|
+
const nodePath = options.nodePath ?? env.AKM_LAUNCHER_NODE?.trim() ?? (runtime === "node" ? execPath : undefined);
|
|
38
|
+
if (launcherPath && nodePath && isPublicPackageLauncher(launcherPath)) {
|
|
39
|
+
const checkout = isCheckoutLauncher(launcherPath);
|
|
40
|
+
let npmGlobalRoot;
|
|
41
|
+
if (!checkout) {
|
|
42
|
+
try {
|
|
43
|
+
npmGlobalRoot = (options.resolveNpmGlobalRoot ?? ((node) => resolveNpmGlobalRoot(node, env)))(nodePath);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// An unprovable package installation is intentionally ineligible.
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const npmGlobal = !checkout && packageBelongsToNpmGlobalRoot(launcherPath, npmGlobalRoot);
|
|
50
|
+
const kind = checkout ? "checkout" : npmGlobal ? "npm" : "package-local";
|
|
51
|
+
return {
|
|
52
|
+
argv: [absoluteInvocationPath(nodePath), absoluteInvocationPath(launcherPath)],
|
|
53
|
+
via: kind,
|
|
54
|
+
kind,
|
|
55
|
+
eligible: npmGlobal,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const checkoutEntry = resolveCheckoutEntry(options.cliEntryUrl ?? import.meta.url, runtime, mainPath);
|
|
59
|
+
if (checkoutEntry && execPath) {
|
|
60
|
+
return {
|
|
61
|
+
argv: [absoluteInvocationPath(execPath), absoluteInvocationPath(checkoutEntry)],
|
|
62
|
+
via: "checkout",
|
|
63
|
+
kind: "checkout",
|
|
64
|
+
eligible: false,
|
|
65
|
+
};
|
|
42
66
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
67
|
+
throw new ConfigError("Cannot resolve absolute path to the akm binary for scheduler registration.", "INVALID_CONFIG_FILE", "Run the npm-global launcher or a standalone akm executable.");
|
|
68
|
+
}
|
|
69
|
+
function resolveCheckoutEntry(moduleUrl, runtime, mainPath) {
|
|
70
|
+
try {
|
|
71
|
+
const modulePath = fileURLToPath(moduleUrl);
|
|
72
|
+
const parent = path.dirname(path.dirname(modulePath));
|
|
73
|
+
if (runtime === "node") {
|
|
74
|
+
const wrapper = path.join(parent, "cli-node.mjs");
|
|
75
|
+
if (fs.existsSync(wrapper))
|
|
76
|
+
return wrapper;
|
|
77
|
+
if (mainPath) {
|
|
78
|
+
if (path.basename(mainPath) === "cli-node.mjs" && fs.existsSync(mainPath))
|
|
79
|
+
return mainPath;
|
|
80
|
+
const siblingWrapper = path.join(path.dirname(mainPath), "cli-node.mjs");
|
|
81
|
+
if (fs.existsSync(siblingWrapper))
|
|
82
|
+
return siblingWrapper;
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
const extension = path.extname(modulePath);
|
|
87
|
+
const candidate = path.join(parent, `cli${extension}`);
|
|
88
|
+
if (fs.existsSync(candidate))
|
|
89
|
+
return candidate;
|
|
90
|
+
const alternate = path.join(parent, extension === ".ts" ? "cli.js" : "cli.ts");
|
|
91
|
+
return fs.existsSync(alternate) ? alternate : undefined;
|
|
48
92
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return { argv: [whichBin], via: "which" };
|
|
93
|
+
catch {
|
|
94
|
+
return runtime === "bun" ? mainPath : undefined;
|
|
52
95
|
}
|
|
53
|
-
throw new ConfigError("Cannot resolve absolute path to the akm binary for scheduler registration.", "INVALID_CONFIG_FILE", "Set AKM_BIN to the absolute path of the akm binary, or ensure `akm` is on PATH.");
|
|
54
96
|
}
|
|
55
|
-
function
|
|
56
|
-
|
|
57
|
-
return fs.existsSync(wrapper) ? wrapper : undefined;
|
|
97
|
+
function absoluteInvocationPath(value) {
|
|
98
|
+
return path.win32.isAbsolute(value) || path.posix.isAbsolute(value) ? value : path.resolve(value);
|
|
58
99
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
let modulePath;
|
|
100
|
+
function isPublicPackageLauncher(file) {
|
|
101
|
+
return (path.basename(file).toLowerCase() === "akm" &&
|
|
102
|
+
path.basename(path.dirname(file)).toLowerCase() === "dist" &&
|
|
103
|
+
fs.existsSync(file));
|
|
104
|
+
}
|
|
105
|
+
function isCheckoutLauncher(file) {
|
|
106
|
+
let launcher = path.resolve(file);
|
|
67
107
|
try {
|
|
68
|
-
|
|
108
|
+
launcher = fs.realpathSync(file);
|
|
69
109
|
}
|
|
70
110
|
catch {
|
|
71
|
-
|
|
111
|
+
// The caller gets a missing-path diagnostic from doctor.
|
|
72
112
|
}
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
const ext = path.extname(modulePath); // .ts | .js
|
|
76
|
-
const candidate = path.join(parent, `cli${ext}`);
|
|
77
|
-
if (fs.existsSync(candidate))
|
|
78
|
-
return candidate;
|
|
79
|
-
// Fallback: try the other extension.
|
|
80
|
-
const alt = path.join(parent, ext === ".ts" ? "cli.js" : "cli.ts");
|
|
81
|
-
if (fs.existsSync(alt))
|
|
82
|
-
return alt;
|
|
83
|
-
return undefined;
|
|
113
|
+
const packageRoot = path.dirname(path.dirname(launcher));
|
|
114
|
+
return fs.existsSync(path.join(packageRoot, ".git"));
|
|
84
115
|
}
|
|
85
|
-
function
|
|
86
|
-
|
|
116
|
+
function packageBelongsToNpmGlobalRoot(launcherPath, npmGlobalRoot) {
|
|
117
|
+
if (!npmGlobalRoot)
|
|
118
|
+
return false;
|
|
87
119
|
try {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
.map((s) => s.trim())
|
|
93
|
-
.find(Boolean);
|
|
94
|
-
if (first && fs.existsSync(first))
|
|
95
|
-
return first;
|
|
96
|
-
}
|
|
120
|
+
const packageRoot = path.dirname(path.dirname(fs.realpathSync(launcherPath)));
|
|
121
|
+
const globalRoot = fs.realpathSync(npmGlobalRoot);
|
|
122
|
+
const metadata = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
|
|
123
|
+
return metadata.name === "akm-cli" && samePath(path.dirname(packageRoot), globalRoot);
|
|
97
124
|
}
|
|
98
125
|
catch {
|
|
99
|
-
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function samePath(left, right) {
|
|
130
|
+
const normalize = (value) => {
|
|
131
|
+
const resolved = path.resolve(value);
|
|
132
|
+
return process.platform === "win32" ? resolved.toLowerCase() : resolved;
|
|
133
|
+
};
|
|
134
|
+
return normalize(left) === normalize(right);
|
|
135
|
+
}
|
|
136
|
+
function resolveNpmGlobalRoot(nodePath, env) {
|
|
137
|
+
const npmCli = resolveAssociatedNpmCli(nodePath);
|
|
138
|
+
if (!npmCli)
|
|
139
|
+
return undefined;
|
|
140
|
+
const result = spawnSync(absoluteInvocationPath(nodePath), [npmCli, "root", "--global"], {
|
|
141
|
+
encoding: "utf8",
|
|
142
|
+
env,
|
|
143
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
144
|
+
timeout: 5_000,
|
|
145
|
+
windowsHide: true,
|
|
146
|
+
});
|
|
147
|
+
if (result.status !== 0)
|
|
148
|
+
return undefined;
|
|
149
|
+
const lines = result.stdout.trim().split(/\r?\n/);
|
|
150
|
+
if (lines.length !== 1 || !lines[0] || !path.isAbsolute(lines[0]))
|
|
151
|
+
return undefined;
|
|
152
|
+
return lines[0];
|
|
153
|
+
}
|
|
154
|
+
function resolveAssociatedNpmCli(nodePath) {
|
|
155
|
+
const nodeDirs = new Set([path.dirname(absoluteInvocationPath(nodePath))]);
|
|
156
|
+
try {
|
|
157
|
+
nodeDirs.add(path.dirname(fs.realpathSync(nodePath)));
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// The scheduler binding will separately report a missing Node path.
|
|
161
|
+
}
|
|
162
|
+
for (const binDir of nodeDirs) {
|
|
163
|
+
const candidates = [
|
|
164
|
+
...(process.platform === "win32" ? [] : [path.join(binDir, "npm")]),
|
|
165
|
+
path.join(binDir, "node_modules", "npm", "bin", "npm-cli.js"),
|
|
166
|
+
path.join(path.dirname(binDir), "lib", "node_modules", "npm", "bin", "npm-cli.js"),
|
|
167
|
+
];
|
|
168
|
+
for (const candidate of candidates) {
|
|
169
|
+
try {
|
|
170
|
+
const resolved = fs.realpathSync(candidate);
|
|
171
|
+
if (fs.statSync(resolved).isFile())
|
|
172
|
+
return resolved;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Try the next layout associated with this Node installation.
|
|
176
|
+
}
|
|
177
|
+
}
|
|
100
178
|
}
|
|
101
179
|
return undefined;
|
|
102
180
|
}
|
package/dist/tasks/runner.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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
|
-
* `akm
|
|
5
|
+
* `akm task run <id>` — what cron / launchd / schtasks invoke at the
|
|
6
6
|
* scheduled moment.
|
|
7
7
|
*
|
|
8
8
|
* Responsibilities:
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* 3. Skip disabled tasks only when the invocation is scheduler-generated;
|
|
16
16
|
* explicit manual runs are allowed for catch-up and testing.
|
|
17
17
|
* 4. Dispatch by target kind:
|
|
18
|
-
* • workflow → `
|
|
18
|
+
* • workflow → `runWorkflowSteps({ target: ref, params })`
|
|
19
19
|
* • prompt → `executeRunner(engine, prompt, { stdio: "captured" })`
|
|
20
20
|
* 5. Capture stdout / stderr as structured rows in logs.db (task_logs) and,
|
|
21
21
|
* transitionally, as a flat text tail at `<cacheDir>/tasks/logs/<id>/<ts>.log`
|
|
@@ -30,20 +30,23 @@ import os from "node:os";
|
|
|
30
30
|
import path from "node:path";
|
|
31
31
|
import { shouldSkipUnactivatedTask } from "../core/activation-policy.js";
|
|
32
32
|
import { assertNever } from "../core/assert.js";
|
|
33
|
+
import { placementSpecFor } from "../core/asset/asset-placement.js";
|
|
33
34
|
import { parseRefInput } from "../core/asset/resolve-ref.js";
|
|
34
35
|
import { loadConfig } from "../core/config/config.js";
|
|
35
36
|
import { AkmError, NotFoundError, rethrowIfTestIsolationError } from "../core/errors.js";
|
|
36
37
|
import { buildTaskRunId, insertTaskLogLines, openLogsDatabase, } from "../core/logs-db.js";
|
|
37
38
|
import { getTaskLogDir } from "../core/paths.js";
|
|
39
|
+
import { redactCredentialPatterns } from "../core/redaction.js";
|
|
38
40
|
import { withStateDb } from "../core/state-db.js";
|
|
39
41
|
import { runManagedSubprocess } from "../core/subprocess.js";
|
|
42
|
+
import { fallbackAnnouncement, NO_ENGINE_MESSAGE_SUFFIX, NO_ENGINE_REMEDY, withEngineFallback, } from "../integrations/agent/engine-fallback.js";
|
|
40
43
|
import { resolveEngine, resolveLlmEngineUse } from "../integrations/agent/engine-resolution.js";
|
|
41
44
|
import { resolveModel } from "../integrations/agent/model-aliases.js";
|
|
42
45
|
import { executeRunner } from "../integrations/agent/runner-dispatch.js";
|
|
43
46
|
import { chatCompletion } from "../llm/client.js";
|
|
44
47
|
import { resolveAssetPath } from "../sources/resolve.js";
|
|
45
48
|
import { decodeTaskHistoryMetadata, finalizeTaskHistoryAttempt, getTaskHistory, queryTaskHistory, reserveTaskHistoryAttempt, upsertTaskHistory, } from "../storage/repositories/task-history-repository.js";
|
|
46
|
-
import {
|
|
49
|
+
import { runWorkflowSteps } from "../workflows/exec/run-workflow.js";
|
|
47
50
|
import { findBareAkmExecutableIndex } from "./command-executable.js";
|
|
48
51
|
import { parseTaskDocument } from "./parser.js";
|
|
49
52
|
import { resolveAkmInvocation } from "./resolve-akm-bin.js";
|
|
@@ -51,7 +54,7 @@ import { validateTaskId } from "./task-id.js";
|
|
|
51
54
|
export const INVALID_TASK_ATTEMPT_ID = "_invalid-task-id";
|
|
52
55
|
export async function runTask(id, options) {
|
|
53
56
|
const runAgentImpl = options.runAgentImpl;
|
|
54
|
-
const
|
|
57
|
+
const runWorkflowStepsImpl = options.runWorkflowStepsImpl ?? runWorkflowSteps;
|
|
55
58
|
const now = options.now ?? (() => new Date());
|
|
56
59
|
const requestedStartedAt = now();
|
|
57
60
|
try {
|
|
@@ -98,7 +101,7 @@ export async function runTask(id, options) {
|
|
|
98
101
|
log: logPath,
|
|
99
102
|
target: disabledTarget,
|
|
100
103
|
};
|
|
101
|
-
const disabledLine = `[akm
|
|
104
|
+
const disabledLine = `[akm task] task "${id}" is disabled — skipping run.`;
|
|
102
105
|
persistRunLog({
|
|
103
106
|
taskId: id,
|
|
104
107
|
startedAtIso: startedIso,
|
|
@@ -116,7 +119,7 @@ export async function runTask(id, options) {
|
|
|
116
119
|
logPath,
|
|
117
120
|
startedAt,
|
|
118
121
|
now,
|
|
119
|
-
|
|
122
|
+
runWorkflowStepsImpl,
|
|
120
123
|
historyReserved: attempt.historyReserved,
|
|
121
124
|
});
|
|
122
125
|
}
|
|
@@ -165,7 +168,7 @@ async function runCommandTask(input) {
|
|
|
165
168
|
const { cmd } = task.target;
|
|
166
169
|
const spawnCmd = resolveNestedAkmCommand(cmd);
|
|
167
170
|
const timeoutMs = task.timeoutMs !== undefined ? task.timeoutMs : null;
|
|
168
|
-
const header = `[akm
|
|
171
|
+
const header = `[akm task] task=${task.id} kind=command cmd=${cmd.join(" ")}`;
|
|
169
172
|
const logLines = [header];
|
|
170
173
|
const dbLines = [{ line: header }];
|
|
171
174
|
let exitCode = null;
|
|
@@ -246,7 +249,7 @@ function resolveNestedAkmCommand(cmd) {
|
|
|
246
249
|
}
|
|
247
250
|
// ── workflow target ─────────────────────────────────────────────────────────
|
|
248
251
|
async function runWorkflowTask(input) {
|
|
249
|
-
const { task, logPath, startedAt, now,
|
|
252
|
+
const { task, logPath, startedAt, now, runWorkflowStepsImpl, historyReserved } = input;
|
|
250
253
|
if (task.target.kind !== "workflow")
|
|
251
254
|
throw new Error("invariant: workflow target");
|
|
252
255
|
const ref = parseRefInput(task.target.ref);
|
|
@@ -254,9 +257,18 @@ async function runWorkflowTask(input) {
|
|
|
254
257
|
throw new NotFoundError(`Task "${task.id}" workflow target must be a workflow ref (got "${task.target.ref}").`, "WORKFLOW_NOT_FOUND");
|
|
255
258
|
}
|
|
256
259
|
let detail;
|
|
260
|
+
let gateError;
|
|
257
261
|
let error;
|
|
262
|
+
// The prompt path logs the engine-fallback announcement; a workflow-backed
|
|
263
|
+
// task must leave the same trace rather than silently using a chosen engine.
|
|
264
|
+
let runWarnings = [];
|
|
258
265
|
try {
|
|
259
|
-
|
|
266
|
+
const execution = await runWorkflowStepsImpl({ target: task.target.ref, params: task.target.params });
|
|
267
|
+
detail = execution.run;
|
|
268
|
+
runWarnings = execution.warnings ?? [];
|
|
269
|
+
if (execution.gateRejection) {
|
|
270
|
+
gateError = `Verification rejected step "${execution.gateRejection.stepId}": ${execution.gateRejection.feedback}`;
|
|
271
|
+
}
|
|
260
272
|
}
|
|
261
273
|
catch (e) {
|
|
262
274
|
if (e instanceof AkmError && e.kind === "config")
|
|
@@ -264,8 +276,13 @@ async function runWorkflowTask(input) {
|
|
|
264
276
|
error = e instanceof Error ? e : new Error(String(e));
|
|
265
277
|
}
|
|
266
278
|
const finishedAt = finishAttempt(startedAt, now());
|
|
267
|
-
const status = error ? "failed" : mapWorkflowStatus(detail?.
|
|
268
|
-
const log = renderWorkflowLog({
|
|
279
|
+
const status = error || gateError ? "failed" : mapWorkflowStatus(detail?.status);
|
|
280
|
+
const log = renderWorkflowLog({
|
|
281
|
+
task,
|
|
282
|
+
detail,
|
|
283
|
+
error: error ?? (gateError ? new Error(gateError) : undefined),
|
|
284
|
+
warnings: runWarnings,
|
|
285
|
+
});
|
|
269
286
|
persistRunLog({
|
|
270
287
|
taskId: task.id,
|
|
271
288
|
startedAtIso: startedAt.toISOString(),
|
|
@@ -283,8 +300,8 @@ async function runWorkflowTask(input) {
|
|
|
283
300
|
log: logPath,
|
|
284
301
|
target: { kind: "workflow", ref: task.target.ref },
|
|
285
302
|
detail: {
|
|
286
|
-
runId: detail?.
|
|
287
|
-
...(error ? { error: error.message } : {}),
|
|
303
|
+
runId: detail?.id,
|
|
304
|
+
...(error ? { error: error.message } : gateError ? { error: gateError } : {}),
|
|
288
305
|
},
|
|
289
306
|
};
|
|
290
307
|
appendHistory(result, historyReserved);
|
|
@@ -297,10 +314,8 @@ async function runWorkflowTask(input) {
|
|
|
297
314
|
}
|
|
298
315
|
/**
|
|
299
316
|
* Map the workflow runtime's status into the task-runner status space.
|
|
300
|
-
*
|
|
301
|
-
*
|
|
302
|
-
* "completed" would be misleading. We preserve "active" as a first-class
|
|
303
|
-
* task status with exit code 0 — the OS scheduler treats it as success.
|
|
317
|
+
* A workflow normally reaches completed or failed in one orchestration call.
|
|
318
|
+
* Active remains representable for explicit engine stops such as a gate.
|
|
304
319
|
*
|
|
305
320
|
* The parameter is typed as the runtime's `WorkflowRunStatus` union (plus the
|
|
306
321
|
* `undefined` that `detail?.run.status` can produce when no detail is present).
|
|
@@ -326,11 +341,13 @@ function mapWorkflowStatus(status) {
|
|
|
326
341
|
}
|
|
327
342
|
function renderWorkflowLog(input) {
|
|
328
343
|
const dbLines = [
|
|
329
|
-
{ line: `[akm
|
|
344
|
+
{ line: `[akm task] task=${input.task.id} kind=workflow ref=${input.task.target.ref}` },
|
|
330
345
|
];
|
|
346
|
+
for (const warning of input.warnings ?? [])
|
|
347
|
+
dbLines.push({ level: "warn", line: warning });
|
|
331
348
|
if (input.detail) {
|
|
332
|
-
dbLines.push({ line: `run_id=${input.detail.
|
|
333
|
-
dbLines.push({ line: `workflow_title=${input.detail.
|
|
349
|
+
dbLines.push({ line: `run_id=${input.detail.id} status=${input.detail.status}` });
|
|
350
|
+
dbLines.push({ line: `workflow_title=${input.detail.workflowTitle}` });
|
|
334
351
|
}
|
|
335
352
|
if (input.error) {
|
|
336
353
|
dbLines.push({ level: "error", line: `error=${input.error.message}` });
|
|
@@ -343,10 +360,15 @@ async function runPromptTask(input) {
|
|
|
343
360
|
if (task.target.kind !== "prompt")
|
|
344
361
|
throw new Error("invariant: prompt target");
|
|
345
362
|
const promptTarget = task.target;
|
|
346
|
-
|
|
363
|
+
// Same implicit opencode-sdk fallback the workflow freeze boundary applies,
|
|
364
|
+
// so a scheduled prompt task on an engine-less install behaves identically.
|
|
365
|
+
const { config, fallbackEngineName } = withEngineFallback(loadConfig());
|
|
347
366
|
const engineName = promptTarget.engine ?? config.defaults?.engine;
|
|
367
|
+
// `promptTarget.engine` outranks `defaults.engine`, so the fallback is only
|
|
368
|
+
// reportable when it is the engine actually selected.
|
|
369
|
+
const engineAnnouncement = fallbackAnnouncement(fallbackEngineName, engineName);
|
|
348
370
|
if (!engineName)
|
|
349
|
-
throw new NotFoundError(`Task "${task.id}"
|
|
371
|
+
throw new NotFoundError(`Task "${task.id}" ${NO_ENGINE_MESSAGE_SUFFIX} ${NO_ENGINE_REMEDY}`, "ASSET_NOT_FOUND");
|
|
350
372
|
let runner = resolveEngine(engineName, config);
|
|
351
373
|
if (runner.kind === "llm") {
|
|
352
374
|
const resolved = resolveLlmEngineUse(config, [
|
|
@@ -402,7 +424,7 @@ async function runPromptTask(input) {
|
|
|
402
424
|
},
|
|
403
425
|
});
|
|
404
426
|
const finishedAt = finishAttempt(startedAt, now());
|
|
405
|
-
const log = renderPromptLog({ task, engineName, result });
|
|
427
|
+
const log = renderPromptLog({ task, engineName, result, engineAnnouncement });
|
|
406
428
|
persistRunLog({
|
|
407
429
|
taskId: task.id,
|
|
408
430
|
startedAtIso: startedAt.toISOString(),
|
|
@@ -443,16 +465,26 @@ async function resolvePromptText(task, stashDir) {
|
|
|
443
465
|
}
|
|
444
466
|
// asset
|
|
445
467
|
const ref = parseRefInput(src.ref);
|
|
468
|
+
// D11 — see the matching guard in validator.ts: `resolveAssetPath`
|
|
469
|
+
// (src/sources/resolve.ts) is placement-dir-only and cannot route an
|
|
470
|
+
// opaque adapter conceptId, which `parseRefInput` now otherwise accepts.
|
|
471
|
+
if (placementSpecFor(ref.type) === undefined) {
|
|
472
|
+
throw new NotFoundError(`Task "${task.id}" prompt asset ref "${src.ref}" is not an AKM-placed asset — adapter-owned (opaque) prompt sources are not resolvable as task inputs yet.`, "ASSET_NOT_FOUND");
|
|
473
|
+
}
|
|
446
474
|
const assetPath = await resolveAssetPath(stashDir, ref.type, ref.name);
|
|
447
475
|
return fs.readFileSync(assetPath, "utf8");
|
|
448
476
|
}
|
|
449
477
|
function renderPromptLog(input) {
|
|
450
478
|
const lines = [];
|
|
451
479
|
const dbLines = [];
|
|
452
|
-
const header = `[akm
|
|
480
|
+
const header = `[akm task] task=${input.task.id} kind=prompt engine=${input.engineName}`;
|
|
453
481
|
const summary = `ok=${input.result.ok} exit_code=${input.result.exitCode ?? "null"} duration_ms=${input.result.durationMs}`;
|
|
454
482
|
lines.push(header, summary);
|
|
455
483
|
dbLines.push({ line: header }, { level: input.result.ok ? "info" : "error", line: summary });
|
|
484
|
+
if (input.engineAnnouncement) {
|
|
485
|
+
lines.push(input.engineAnnouncement);
|
|
486
|
+
dbLines.push({ level: "warn", line: input.engineAnnouncement });
|
|
487
|
+
}
|
|
456
488
|
if (!input.result.ok) {
|
|
457
489
|
const failure = `reason=${input.result.reason ?? ""} error=${input.result.error ?? ""}`;
|
|
458
490
|
lines.push(failure);
|
|
@@ -495,14 +527,21 @@ function streamLines(text, stream, level) {
|
|
|
495
527
|
* task_history keeps resolving for humans and older consumers) plus
|
|
496
528
|
* structured rows in logs.db keyed by `buildTaskRunId(taskId, startedAt)`.
|
|
497
529
|
*
|
|
530
|
+
* Both sinks are pattern-redacted (`redactCredentialPatterns`) before being
|
|
531
|
+
* written — task output is raw command/agent/LLM text that can echo a
|
|
532
|
+
* credential-bearing URL (e.g. a Discord webhook) nothing upstream expects to
|
|
533
|
+
* scrub.
|
|
534
|
+
*
|
|
498
535
|
* The DB write is best-effort, mirroring {@link appendHistory}: an unwritable
|
|
499
536
|
* logs.db must never fail a task run.
|
|
500
537
|
*/
|
|
501
538
|
function persistRunLog(input) {
|
|
539
|
+
const fileText = redactCredentialPatterns(input.fileText);
|
|
540
|
+
const dbLines = input.dbLines.map((entry) => ({ ...entry, line: redactCredentialPatterns(entry.line) }));
|
|
502
541
|
if (input.logPath) {
|
|
503
542
|
try {
|
|
504
543
|
fs.mkdirSync(path.dirname(input.logPath), { recursive: true });
|
|
505
|
-
fs.writeFileSync(input.logPath,
|
|
544
|
+
fs.writeFileSync(input.logPath, fileText);
|
|
506
545
|
}
|
|
507
546
|
catch (error) {
|
|
508
547
|
rethrowIfTestIsolationError(error);
|
|
@@ -516,7 +555,7 @@ function persistRunLog(input) {
|
|
|
516
555
|
taskId: input.taskId,
|
|
517
556
|
runId: buildTaskRunId(input.taskId, input.startedAtIso),
|
|
518
557
|
ts: input.finishedAtIso,
|
|
519
|
-
lines:
|
|
558
|
+
lines: dbLines,
|
|
520
559
|
});
|
|
521
560
|
}
|
|
522
561
|
finally {
|
|
@@ -597,7 +636,7 @@ export function recordTaskAttemptFailure(input) {
|
|
|
597
636
|
const finishedAtIso = finishedAt.toISOString();
|
|
598
637
|
const errorCode = safeTaskAttemptErrorCode(input.failure);
|
|
599
638
|
const logPath = resolveTaskLogPath(input.logDir, taskId, startedAtIso);
|
|
600
|
-
const line = `[akm
|
|
639
|
+
const line = `[akm task] status=failed reason=${input.reason} code=${errorCode}`;
|
|
601
640
|
const result = {
|
|
602
641
|
id: taskId,
|
|
603
642
|
status: "failed",
|
|
@@ -650,19 +689,13 @@ function appendHistory(result, historyReserved = false) {
|
|
|
650
689
|
}
|
|
651
690
|
export function readTaskHistory(options = {}) {
|
|
652
691
|
return withStateDb((db) => {
|
|
653
|
-
|
|
692
|
+
if (options.limit === 0)
|
|
693
|
+
return [];
|
|
654
694
|
if (options.id) {
|
|
655
695
|
const row = getTaskHistory(db, options.id);
|
|
656
|
-
|
|
657
|
-
}
|
|
658
|
-
else {
|
|
659
|
-
rows = queryTaskHistory(db, {}).map(taskHistoryRowToResult);
|
|
660
|
-
}
|
|
661
|
-
rows.sort((a, b) => (a.startedAt < b.startedAt ? 1 : -1));
|
|
662
|
-
if (options.limit !== undefined && options.limit >= 0) {
|
|
663
|
-
return rows.slice(0, options.limit);
|
|
696
|
+
return row ? [taskHistoryRowToResult(row)] : [];
|
|
664
697
|
}
|
|
665
|
-
return
|
|
698
|
+
return queryTaskHistory(db, options.limit !== undefined && options.limit > 0 ? { limit: options.limit } : {}).map(taskHistoryRowToResult);
|
|
666
699
|
});
|
|
667
700
|
}
|
|
668
701
|
/**
|
|
@@ -676,19 +709,23 @@ function taskHistoryRowToResult(row) {
|
|
|
676
709
|
: row.target_kind === "command"
|
|
677
710
|
? { kind: "command" }
|
|
678
711
|
: row.target_kind === "prompt"
|
|
679
|
-
? meta.metadataVersion ===
|
|
680
|
-
? {
|
|
681
|
-
|
|
712
|
+
? meta.metadataVersion === 1
|
|
713
|
+
? {
|
|
714
|
+
kind: "prompt",
|
|
715
|
+
engine: null,
|
|
716
|
+
...(meta.legacyProfile !== undefined ? { legacyProfile: meta.legacyProfile } : {}),
|
|
717
|
+
}
|
|
718
|
+
: { kind: "prompt", engine: meta.engine ?? null }
|
|
682
719
|
: { kind: "unknown" };
|
|
683
720
|
return {
|
|
684
721
|
id: row.task_id,
|
|
685
722
|
status: row.status,
|
|
686
723
|
startedAt: row.started_at,
|
|
687
724
|
finishedAt: row.completed_at ?? row.failed_at ?? row.started_at,
|
|
688
|
-
durationMs: meta.durationMs
|
|
725
|
+
durationMs: meta.durationMs,
|
|
689
726
|
log: row.log_path ?? "",
|
|
690
727
|
target,
|
|
691
|
-
...(meta.detail
|
|
728
|
+
...(meta.detail ? { detail: meta.detail } : {}),
|
|
692
729
|
};
|
|
693
730
|
}
|
|
694
731
|
/**
|