akm-cli 0.9.0-rc.0 → 0.9.0-rc.13
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 +1283 -22
- package/README.md +62 -37
- package/SECURITY.md +46 -31
- package/dist/akm +162 -38
- package/dist/akm-migrate +44 -0
- package/dist/assets/backends/schtasks-template.xml +2 -1
- package/dist/assets/hints/cli-hints-full.md +268 -118
- package/dist/assets/hints/cli-hints-short.md +87 -24
- package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
- package/dist/assets/improve-strategies/frequent.json +15 -0
- package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
- package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
- package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
- package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
- package/dist/assets/improve-strategies/reflect-distill.json +30 -0
- package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
- package/dist/assets/prompts/consolidate-system.md +5 -5
- package/dist/assets/prompts/extract-session.md +2 -6
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
- package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
- package/dist/assets/prompts/reflect-output-repair.md +3 -0
- package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
- package/dist/assets/stash-skeleton/README.md +38 -10
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
- package/dist/assets/tasks/core/extract.yml +3 -2
- package/dist/assets/tasks/core/improve.yml +2 -1
- package/dist/assets/tasks/core/index-refresh.yml +1 -0
- package/dist/assets/tasks/core/sync.yml +1 -0
- package/dist/assets/tasks/core/version-check.yml +2 -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 +5 -4
- package/dist/assets/workflows/workflow-template.md +31 -15
- package/dist/cli/invocation.js +279 -0
- package/dist/cli/parse-args.js +5 -90
- package/dist/cli/retired-commands.js +78 -0
- package/dist/cli/shared.js +158 -48
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +747 -293
- package/dist/commands/agent/agent-dispatch.js +19 -18
- package/dist/commands/agent/agent-support.js +0 -24
- package/dist/commands/agent/contribute-cli.js +43 -97
- package/dist/commands/completions.js +80 -23
- package/dist/commands/config-cli.js +44 -281
- package/dist/commands/env/env-binding.js +99 -0
- package/dist/commands/env/env-cli.js +84 -224
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +45 -61
- package/dist/commands/env/secret.js +32 -62
- package/dist/commands/feedback-cli.js +179 -85
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +7 -8
- package/dist/commands/health/checks.js +279 -94
- package/dist/commands/health/html-report.js +197 -578
- package/dist/commands/health/improve-metrics.js +277 -246
- package/dist/commands/health/llm-usage.js +19 -19
- package/dist/commands/health/md-report.js +16 -7
- package/dist/commands/health/metrics.js +67 -32
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +508 -0
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +16 -56
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
- package/dist/commands/health/types-improve.js +29 -0
- package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
- package/dist/commands/health/types-result.js +7 -0
- package/dist/commands/health/types-runs.js +4 -0
- package/dist/commands/health/types-session-log.js +4 -0
- package/dist/commands/health/types-windows.js +4 -0
- package/dist/commands/health/types.js +26 -21
- package/dist/commands/health/windows.js +2 -3
- package/dist/commands/health.js +296 -167
- package/dist/commands/improve/anti-collapse.js +5 -5
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +65 -52
- package/dist/commands/improve/consolidate/chunking.js +9 -7
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +454 -1354
- package/dist/commands/improve/content-hash.js +39 -0
- package/dist/commands/improve/distill/content-repair.js +4 -10
- package/dist/commands/improve/distill/promote-memory.js +89 -64
- package/dist/commands/improve/distill/quality-gate.js +118 -42
- package/dist/commands/improve/distill-guards.js +1 -1
- package/dist/commands/improve/distill-promotion-policy.js +33 -888
- package/dist/commands/improve/distill.js +607 -363
- package/dist/commands/improve/eligibility.js +165 -79
- package/dist/commands/improve/extract-cli.js +35 -126
- package/dist/commands/improve/extract-prompt.js +6 -35
- package/dist/commands/improve/extract.js +640 -391
- package/dist/commands/improve/feedback-valence.js +2 -12
- package/dist/commands/improve/improve-cli.js +134 -135
- package/dist/commands/improve/improve-result-file.js +30 -50
- package/dist/commands/improve/improve-run-types.js +4 -0
- package/dist/commands/improve/improve-strategies.js +135 -0
- package/dist/commands/improve/improve.js +904 -701
- package/dist/commands/improve/locks.js +64 -111
- package/dist/commands/improve/loop-stages.js +1110 -923
- package/dist/commands/improve/memory/derived-ref.js +124 -0
- package/dist/commands/improve/memory/memory-belief.js +79 -7
- package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
- package/dist/commands/improve/memory/memory-improve.js +25 -37
- package/dist/commands/improve/outcome-loop.js +25 -88
- package/dist/commands/improve/preparation.js +1034 -813
- package/dist/commands/improve/proactive-maintenance.js +34 -9
- package/dist/commands/improve/proposal-envelope.js +31 -0
- package/dist/commands/improve/reflect.js +983 -794
- package/dist/commands/improve/run-context.js +119 -0
- package/dist/commands/improve/salience.js +24 -127
- package/dist/commands/improve/session-asset.js +7 -3
- package/dist/commands/improve/shared.js +14 -34
- package/dist/commands/improve/source-identity.js +28 -0
- package/dist/commands/improve/triage.js +20 -17
- package/dist/commands/lint/base-linter.js +340 -313
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +185 -30
- package/dist/commands/{events.js → log.js} +28 -38
- package/dist/commands/migrate-cli.js +54 -0
- package/dist/commands/migration-tool.js +55 -0
- package/dist/commands/observability-cli.js +70 -208
- package/dist/commands/proposal/diff-format.js +50 -0
- package/dist/commands/proposal/drain-policies.js +0 -6
- package/dist/commands/proposal/drain.js +91 -40
- package/dist/commands/proposal/proposal-cli.js +134 -132
- package/dist/commands/proposal/proposal-types.js +56 -0
- package/dist/commands/proposal/proposal.js +83 -65
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +105 -88
- package/dist/commands/proposal/repository.js +1303 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
- package/dist/commands/proposal/validators/proposal-validators.js +61 -12
- package/dist/commands/proposal/validators/proposals.js +6 -8
- package/dist/commands/read/curate.js +78 -73
- package/dist/commands/read/knowledge.js +510 -13
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +84 -15
- package/dist/commands/read/search-cli.js +203 -96
- package/dist/commands/read/search.js +126 -94
- package/dist/commands/read/show.js +226 -250
- package/dist/commands/registry-cli.js +34 -60
- package/dist/commands/remember.js +18 -57
- package/dist/commands/sources/add-cli.js +104 -49
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +63 -0
- package/dist/commands/sources/info.js +27 -15
- package/dist/commands/sources/init.js +30 -40
- package/dist/commands/sources/installed-stashes.js +469 -172
- package/dist/commands/sources/migration-help.js +7 -4
- package/dist/commands/sources/schema-repair.js +10 -9
- package/dist/commands/sources/self-update.js +182 -121
- package/dist/commands/sources/source-add.js +169 -178
- package/dist/commands/sources/source-clone.js +144 -41
- package/dist/commands/sources/source-manage.js +94 -59
- package/dist/commands/sources/sources-cli.js +64 -205
- package/dist/commands/sources/stash-cli.js +91 -54
- package/dist/commands/sources/stash-skeleton.js +1 -1
- package/dist/commands/tasks/tasks-cli.js +106 -104
- package/dist/commands/tasks/tasks.js +445 -262
- package/dist/commands/workflow-cli.js +232 -121
- package/dist/core/action-contributors.js +1 -1
- package/dist/core/activation-policy.js +49 -0
- package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
- package/dist/core/adapter/adapters/akm-adapter.js +528 -0
- package/dist/core/adapter/adapters/akm-lint.js +392 -0
- package/dist/core/adapter/adapters/akm-metadata.js +387 -0
- package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
- package/dist/core/adapter/adapters/claude-adapter.js +61 -0
- package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
- package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
- package/dist/core/adapter/adapters/index.js +80 -0
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
- package/dist/core/adapter/adapters/okf-adapter.js +391 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
- package/dist/core/adapter/adapters/shared.js +286 -0
- package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
- package/dist/core/adapter/bundle-adapter.js +4 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +44 -0
- package/dist/core/adapter/registry.js +56 -0
- package/dist/core/adapter/types.js +4 -0
- package/dist/core/asset/akm-markdown.js +30 -0
- package/dist/core/asset/asset-placement.js +243 -0
- package/dist/core/asset/asset-ref.js +110 -79
- package/dist/core/asset/asset-serialize.js +20 -0
- package/dist/core/asset/frontmatter.js +28 -12
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +274 -0
- package/dist/core/asset/stash-meta.js +2 -2
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +281 -86
- package/dist/core/config/config-io.js +42 -128
- package/dist/core/config/config-schema.js +233 -834
- package/dist/core/config/config-sources.js +162 -39
- package/dist/core/config/config-types.js +16 -11
- package/dist/core/config/config-version.js +29 -0
- package/dist/core/config/config-walker.js +126 -37
- package/dist/core/config/config.js +154 -331
- package/dist/core/config/deep-merge.js +41 -0
- package/dist/core/config/engine-semantics.js +28 -0
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +38 -0
- package/dist/core/config/schema/engines.js +116 -0
- package/dist/core/config/schema/experimental.js +47 -0
- package/dist/core/config/schema/feedback.js +31 -0
- package/dist/core/config/schema/improve-processes.js +389 -0
- package/dist/core/config/schema/improve.js +94 -0
- package/dist/core/config/schema/index-config.js +176 -0
- package/dist/core/config/schema/output.js +18 -0
- package/dist/core/config/schema/primitives.js +94 -0
- package/dist/core/config/schema/search.js +30 -0
- package/dist/core/config/schema/setup.js +18 -0
- package/dist/core/config/schema/sources-bundles.js +169 -0
- package/dist/core/config/schema/workflow.js +29 -0
- package/dist/core/env-secret-ref.js +155 -20
- package/dist/core/errors.js +17 -15
- package/dist/core/events-types.js +4 -0
- package/dist/core/events.js +46 -128
- package/dist/core/extra-params.js +62 -0
- package/dist/core/file-change.js +17 -0
- package/dist/core/file-lock.js +202 -57
- package/dist/core/fs-txn.js +392 -0
- package/dist/core/git-message.js +59 -0
- package/dist/core/improve-result.js +167 -0
- package/dist/core/json-schema.js +142 -0
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +1 -1
- package/dist/core/maintenance-barrier.js +135 -0
- package/dist/core/migration-operation.js +44 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/paths.js +22 -25
- package/dist/core/platform.js +10 -0
- package/dist/core/recognition-util.js +128 -0
- package/dist/core/redaction.js +392 -0
- package/dist/core/standards/resolve-standards-context.js +36 -65
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +5 -5
- package/dist/core/state/migrations.js +242 -11
- package/dist/core/state-db.js +98 -10
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +303 -0
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/time.js +20 -0
- package/dist/core/type-presentation.js +130 -0
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +834 -118
- package/dist/indexer/bundle-identity-guard.js +92 -0
- package/dist/indexer/db/graph-db.js +1 -25
- package/dist/indexer/db/llm-cache.js +1 -1
- package/dist/indexer/ensure-index.js +30 -9
- package/dist/indexer/graph/graph-boost.js +9 -30
- package/dist/indexer/graph/graph-extraction.js +41 -27
- package/dist/indexer/graph/graph-types.js +4 -0
- package/dist/indexer/index-writer-lock.js +93 -49
- package/dist/indexer/index-written-assets.js +100 -53
- package/dist/indexer/indexer.js +746 -329
- package/dist/indexer/init.js +18 -25
- package/dist/indexer/installations.js +142 -0
- package/dist/indexer/passes/dir-staleness.js +18 -10
- package/dist/indexer/passes/memory-inference.js +25 -15
- package/dist/indexer/passes/metadata.js +412 -243
- package/dist/indexer/scan/doc-to-entry.js +160 -0
- package/dist/indexer/scan/drain-dir.js +134 -0
- package/dist/indexer/search/db-search.js +292 -108
- package/dist/indexer/search/fts-query.js +64 -0
- package/dist/indexer/search/ranking-contributors.js +145 -25
- package/dist/indexer/search/ranking-types.js +4 -0
- package/dist/indexer/search/ranking.js +28 -71
- package/dist/indexer/search/search-attribution.js +67 -0
- package/dist/indexer/search/search-fields.js +18 -3
- package/dist/indexer/search/search-hit-enrichers.js +30 -40
- package/dist/indexer/search/search-source.js +157 -111
- package/dist/indexer/search/semantic-status.js +4 -1
- package/dist/indexer/usage/usage-events.js +10 -30
- package/dist/indexer/walk/file-context.js +3 -45
- package/dist/indexer/walk/matchers.js +42 -34
- package/dist/indexer/walk/path-resolver.js +11 -5
- package/dist/indexer/walk/walker.js +42 -14
- package/dist/integrations/agent/builder-shared.js +7 -0
- package/dist/integrations/agent/builders.js +5 -56
- package/dist/integrations/agent/config.js +3 -143
- package/dist/integrations/agent/detect.js +17 -2
- package/dist/integrations/agent/engine-resolution.js +231 -0
- package/dist/integrations/agent/index.js +1 -2
- package/dist/integrations/agent/model-aliases.js +16 -2
- package/dist/integrations/agent/profiles.js +36 -62
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +93 -4
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +88 -196
- package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
- package/dist/integrations/harnesses/aider/index.js +48 -0
- package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
- package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
- package/dist/integrations/harnesses/amazonq/index.js +45 -0
- package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
- package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +24 -35
- package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
- package/dist/integrations/harnesses/codex/index.js +52 -0
- package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
- package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
- package/dist/integrations/harnesses/copilot/index.js +48 -0
- package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
- package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
- package/dist/integrations/harnesses/gemini/index.js +48 -0
- package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +54 -34
- package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
- package/dist/integrations/harnesses/opencode/config-import.js +1 -3
- package/dist/integrations/harnesses/opencode/index.js +14 -32
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
- package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
- package/dist/integrations/harnesses/openhands/index.js +48 -0
- package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
- package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
- package/dist/integrations/harnesses/pi/index.js +45 -0
- package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +43 -32
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +36 -39
- package/dist/integrations/session-logs/provider-base.js +113 -0
- package/dist/llm/client.js +182 -110
- package/dist/llm/embedders/deterministic.js +2 -2
- package/dist/llm/embedders/remote.js +21 -9
- package/dist/llm/feature-gate.js +17 -57
- package/dist/llm/graph-extract.js +12 -13
- package/dist/llm/index-passes.js +8 -42
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +45 -30
- package/dist/llm/structured-call.js +16 -8
- package/dist/llm/usage-persist.js +30 -5
- package/dist/llm/usage-telemetry.js +59 -6
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/command-registry.js +27 -0
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +251 -0
- package/dist/output/html-render.js +11 -16
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -279
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +58 -84
- package/dist/output/shapes/passthrough.js +11 -39
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes/registry.js +12 -6
- package/dist/output/shapes.js +0 -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 +562 -0
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/helpers.js +15 -1164
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +202 -0
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/registry.js +12 -6
- package/dist/output/text/show-directives.js +117 -0
- package/dist/output/text/show-format.js +103 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +332 -0
- package/dist/output/text/workflow.js +3 -2
- package/dist/output/text.js +10 -19
- 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 +15 -25
- package/dist/registry/resolve.js +43 -94
- package/dist/registry/semver.js +43 -0
- package/dist/runtime.js +81 -12
- package/dist/scripts/akm-migrate.js +35529 -0
- package/dist/setup/detect.js +5 -7
- package/dist/setup/detected-engines.js +136 -0
- package/dist/setup/engine-config.js +100 -0
- package/dist/setup/registry-stash-loader.js +3 -3
- package/dist/setup/semantic-assets.js +12 -9
- package/dist/setup/setup.js +444 -208
- package/dist/setup/steps/connection-shared.js +120 -0
- package/dist/setup/steps/connection.js +108 -305
- package/dist/setup/steps/platforms.js +13 -12
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +21 -15
- package/dist/setup/steps/stashdir.js +6 -4
- package/dist/setup/steps/tasks.js +236 -119
- package/dist/setup/steps.js +3 -2
- package/dist/sources/freshness.js +39 -0
- 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 +54 -56
- package/dist/sources/providers/git-stash.js +420 -91
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +47 -22
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +2 -2
- package/dist/sources/resolve.js +11 -10
- package/dist/sources/snapshot-fetchers/types.js +4 -0
- package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
- package/dist/storage/database.js +60 -4
- package/dist/storage/engines/sqlite-migrations.js +156 -5
- package/dist/storage/locations.js +1 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +51 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -32
- package/dist/storage/repositories/index-connection.js +79 -0
- package/dist/storage/repositories/index-db.js +4 -3
- package/dist/storage/repositories/index-entries-repository.js +863 -0
- package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
- package/dist/storage/repositories/index-entry-types.js +4 -0
- package/dist/storage/repositories/index-fts-repository.js +167 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
- package/dist/storage/repositories/index-meta-repository.js +49 -0
- package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
- package/dist/storage/repositories/index-sql.js +12 -0
- package/dist/storage/repositories/index-utility-repository.js +356 -0
- package/dist/storage/repositories/index-vec-repository.js +250 -0
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +317 -75
- package/dist/storage/repositories/registry-cache.js +1 -1
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +110 -3
- package/dist/storage/repositories/workflow-runs-repository.js +240 -19
- package/dist/tasks/backends/cron.js +169 -46
- package/dist/tasks/backends/exec-utils.js +76 -3
- package/dist/tasks/backends/index.js +6 -9
- package/dist/tasks/backends/launchd.js +292 -55
- package/dist/tasks/backends/schtasks.js +557 -70
- package/dist/tasks/backends/types.js +4 -0
- package/dist/tasks/command-executable.js +93 -0
- package/dist/tasks/embedded.js +56 -38
- package/dist/tasks/parser.js +156 -64
- package/dist/tasks/resolve-akm-bin.js +144 -51
- package/dist/tasks/runner.js +377 -209
- package/dist/tasks/schedule.js +108 -19
- package/dist/tasks/scheduler-invocation.js +296 -0
- package/dist/tasks/schema.js +1 -1
- package/dist/tasks/task-id.js +35 -0
- package/dist/tasks/validator.js +30 -16
- package/dist/text-import-hook.mjs +1 -1
- package/dist/workflows/authoring/authoring.js +104 -43
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -16
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +450 -0
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +1038 -0
- package/dist/workflows/exec/param-secrets.js +115 -0
- package/dist/workflows/exec/report.js +1460 -0
- package/dist/workflows/exec/run-workflow.js +602 -0
- package/dist/workflows/exec/scheduler.js +71 -0
- package/dist/workflows/exec/step-work.js +1190 -0
- package/dist/workflows/exec/unit-writer.js +23 -0
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/exec/worktree.js +171 -0
- package/dist/workflows/ir/compile.js +246 -0
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/params.js +54 -0
- package/dist/workflows/ir/plan-hash.js +68 -0
- package/dist/workflows/ir/schema.js +540 -0
- package/dist/workflows/parser.js +878 -304
- package/dist/workflows/program/expressions.js +181 -0
- package/dist/workflows/program/schema.js +51 -0
- package/dist/workflows/renderer.js +100 -45
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/agent-identity.js +59 -14
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +376 -119
- package/dist/workflows/runtime/unit-checkin.js +45 -0
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +2 -3
- package/dist/workflows/validator.js +52 -30
- package/docs/README.md +42 -78
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +9 -8
- package/docs/migration/release-notes/0.9.0.md +158 -14
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +844 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/data-and-telemetry.md +333 -0
- package/package.json +21 -17
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +4636 -0
- package/schemas/akm-task.json +87 -0
- package/schemas/akm-workflow.json +373 -0
- package/dist/akm-migrate-storage +0 -38
- package/dist/assets/help/help-accept.md +0 -12
- package/dist/assets/help/help-improve.md +0 -84
- package/dist/assets/help/help-proposals.md +0 -17
- package/dist/assets/help/help-propose.md +0 -17
- package/dist/assets/help/help-reject.md +0 -11
- package/dist/assets/profiles/frequent.json +0 -13
- package/dist/assets/profiles/recombine-only.json +0 -21
- package/dist/assets/profiles/reflect-distill.json +0 -30
- package/dist/assets/profiles/synthesize.json +0 -15
- package/dist/assets/prompts/procedural-system.md +0 -44
- package/dist/assets/prompts/recombine-system.md +0 -40
- package/dist/assets/prompts/staleness-detect-system.md +0 -6
- package/dist/assets/tasks/core/backup.yml +0 -4
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/assets/templates/html/default.html +0 -78
- package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
- package/dist/assets/wiki/index-template.md +0 -12
- package/dist/assets/wiki/ingest-workflow-template.md +0 -83
- package/dist/assets/wiki/log-template.md +0 -8
- package/dist/assets/wiki/schema-template.md +0 -61
- package/dist/cli/config-migrate.js +0 -150
- package/dist/cli/config-validate.js +0 -39
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -487
- package/dist/commands/improve/calibration.js +0 -161
- package/dist/commands/improve/dedup.js +0 -482
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/improve/hot-probation.js +0 -45
- package/dist/commands/improve/improve-auto-accept.js +0 -276
- package/dist/commands/improve/improve-profiles.js +0 -168
- package/dist/commands/improve/procedural.js +0 -398
- package/dist/commands/improve/recombine.js +0 -818
- package/dist/commands/improve/schema-similarity-gate.js +0 -168
- package/dist/commands/lint/agent-linter.js +0 -44
- package/dist/commands/lint/command-linter.js +0 -44
- package/dist/commands/lint/default-linter.js +0 -16
- package/dist/commands/lint/fact-linter.js +0 -39
- package/dist/commands/lint/knowledge-linter.js +0 -16
- package/dist/commands/lint/memory-linter.js +0 -61
- package/dist/commands/lint/registry.js +0 -41
- package/dist/commands/lint/skill-linter.js +0 -45
- package/dist/commands/lint/task-linter.js +0 -50
- package/dist/commands/lint/workflow-linter.js +0 -81
- package/dist/commands/proposal/legacy-import.js +0 -115
- package/dist/commands/sources/history.js +0 -196
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/commands/wiki-cli.js +0 -292
- package/dist/core/asset/asset-registry.js +0 -76
- package/dist/core/asset/asset-spec.js +0 -259
- package/dist/core/config/config-migration.js +0 -602
- package/dist/core/deep-merge.js +0 -38
- package/dist/core/eval/rank-metrics.js +0 -113
- package/dist/core/ripgrep/install.js +0 -163
- package/dist/core/ripgrep/resolve.js +0 -81
- package/dist/indexer/db/db.js +0 -1413
- package/dist/indexer/manifest.js +0 -170
- package/dist/indexer/passes/metadata-contributors.js +0 -31
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
- package/dist/llm/call-ai.js +0 -62
- package/dist/llm/memory-infer-impl.js +0 -138
- 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/output/text/wiki.js +0 -16
- package/dist/registry/build-index.js +0 -386
- package/dist/scripts/migrate-storage.js +0 -19108
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
- package/dist/scripts/migrations/v16-to-v17.js +0 -141
- package/dist/setup/legacy-config.js +0 -106
- package/dist/storage/repositories/consolidation-repository.js +0 -38
- package/dist/storage/repositories/recombine-repository.js +0 -213
- package/dist/wiki/wiki-templates.js +0 -15
- package/dist/wiki/wiki.js +0 -1012
- package/dist/workflows/db.js +0 -215
- package/docs/data-and-telemetry.md +0 -226
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { deepMergeConfig } from "../../core/config/deep-merge.js";
|
|
6
|
+
import { ConfigError } from "../../core/errors.js";
|
|
7
|
+
import { formatExtraParamsIssue, validateExtraParams } from "../../core/extra-params.js";
|
|
8
|
+
import { collectSensitiveValues } from "../../core/redaction.js";
|
|
9
|
+
import { getHarness } from "../harnesses/index.js";
|
|
10
|
+
import { DEFAULT_AGENT_TIMEOUT_MS, DEFAULT_LLM_TIMEOUT_MS } from "./config.js";
|
|
11
|
+
import { resolveLlmModel, resolveModel } from "./model-aliases.js";
|
|
12
|
+
import { getBuiltinAgentProfile } from "./profiles.js";
|
|
13
|
+
function hasOwn(value, key) {
|
|
14
|
+
return Object.hasOwn(value, key);
|
|
15
|
+
}
|
|
16
|
+
function envName(reference) {
|
|
17
|
+
const match = /^\$(?:\{)?([A-Za-z_][A-Za-z0-9_]*)(?:\})?$/.exec(reference);
|
|
18
|
+
return match?.[1];
|
|
19
|
+
}
|
|
20
|
+
function selectedEngineName(config, layers, llmOnly) {
|
|
21
|
+
for (let index = layers.length - 1; index >= 0; index--) {
|
|
22
|
+
if (layers[index]?.engine !== undefined)
|
|
23
|
+
return layers[index]?.engine;
|
|
24
|
+
}
|
|
25
|
+
return llmOnly ? config.defaults?.llmEngine : config.defaults?.engine;
|
|
26
|
+
}
|
|
27
|
+
function resolveEngineConfig(name, config) {
|
|
28
|
+
const engine = config.engines?.[name];
|
|
29
|
+
if (!engine) {
|
|
30
|
+
throw new ConfigError(`Engine "${name}" is not configured.`, "INVALID_CONFIG_FILE");
|
|
31
|
+
}
|
|
32
|
+
return engine;
|
|
33
|
+
}
|
|
34
|
+
function resolveCredential(name, engine, config) {
|
|
35
|
+
if (engine.apiKey !== undefined) {
|
|
36
|
+
const explicit = envName(engine.apiKey);
|
|
37
|
+
if (!explicit)
|
|
38
|
+
throw new ConfigError(`Engine "${name}" has an invalid symbolic apiKey reference.`, "INVALID_CONFIG_FILE");
|
|
39
|
+
return { names: [explicit], required: true };
|
|
40
|
+
}
|
|
41
|
+
const specific = `AKM_ENGINE_${name.toUpperCase().replaceAll("-", "_")}_API_KEY`;
|
|
42
|
+
return config.defaults?.llmEngine === name
|
|
43
|
+
? { names: [specific, "AKM_LLM_API_KEY"], required: false }
|
|
44
|
+
: { names: [specific], required: false };
|
|
45
|
+
}
|
|
46
|
+
/** Collect materialized engine credentials for output and persistence redaction. */
|
|
47
|
+
export function collectEngineCredentialValues(config, envSource = process.env) {
|
|
48
|
+
const values = new Set();
|
|
49
|
+
for (const [name, engine] of Object.entries(config.engines ?? {})) {
|
|
50
|
+
if (engine.kind !== "llm")
|
|
51
|
+
continue;
|
|
52
|
+
for (const envVar of resolveCredential(name, engine, config)?.names ?? []) {
|
|
53
|
+
const value = envSource[envVar]?.trim();
|
|
54
|
+
if (value)
|
|
55
|
+
values.add(value);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return collectSensitiveValues(values);
|
|
59
|
+
}
|
|
60
|
+
function effectiveTimeout(engine, layers, fallback) {
|
|
61
|
+
for (let index = layers.length - 1; index >= 0; index--) {
|
|
62
|
+
if (hasOwn(layers[index] ?? {}, "timeoutMs"))
|
|
63
|
+
return layers[index]?.timeoutMs ?? null;
|
|
64
|
+
}
|
|
65
|
+
return hasOwn(engine, "timeoutMs") ? (engine.timeoutMs ?? null) : fallback;
|
|
66
|
+
}
|
|
67
|
+
export function resolveLlmEngineUse(config, layers, options = {}) {
|
|
68
|
+
const name = selectedEngineName(config, layers, true);
|
|
69
|
+
if (!name) {
|
|
70
|
+
if (options.optional)
|
|
71
|
+
return undefined;
|
|
72
|
+
throw new ConfigError("No LLM engine is selected. Set defaults.llmEngine or specify engine.", "LLM_NOT_CONFIGURED");
|
|
73
|
+
}
|
|
74
|
+
const engine = resolveEngineConfig(name, config);
|
|
75
|
+
if (engine.kind !== "llm") {
|
|
76
|
+
throw new ConfigError(`Engine "${name}" is not an LLM engine.`, "INVALID_CONFIG_FILE");
|
|
77
|
+
}
|
|
78
|
+
let connection = {
|
|
79
|
+
provider: engine.provider,
|
|
80
|
+
endpoint: engine.endpoint,
|
|
81
|
+
model: engine.model,
|
|
82
|
+
temperature: engine.temperature,
|
|
83
|
+
maxTokens: engine.maxTokens,
|
|
84
|
+
supportsJsonSchema: engine.supportsJsonSchema,
|
|
85
|
+
extraParams: engine.extraParams,
|
|
86
|
+
contextLength: engine.contextLength,
|
|
87
|
+
enableThinking: engine.enableThinking,
|
|
88
|
+
};
|
|
89
|
+
for (const layer of layers) {
|
|
90
|
+
if (layer.llm)
|
|
91
|
+
connection = deepMergeConfig(connection, layer.llm);
|
|
92
|
+
if (layer.model !== undefined)
|
|
93
|
+
connection.model = layer.model;
|
|
94
|
+
}
|
|
95
|
+
for (const key of Object.keys(connection)) {
|
|
96
|
+
if (connection[key] === undefined)
|
|
97
|
+
delete connection[key];
|
|
98
|
+
}
|
|
99
|
+
connection.model = resolveLlmModel(connection.model, name, config.modelAliases);
|
|
100
|
+
return {
|
|
101
|
+
engine: name,
|
|
102
|
+
connection: connection,
|
|
103
|
+
credential: resolveCredential(name, engine, config),
|
|
104
|
+
timeoutMs: effectiveTimeout(engine, layers, DEFAULT_LLM_TIMEOUT_MS),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Read a resolved symbolic credential only at the runtime dispatch boundary. */
|
|
108
|
+
export function materializeLlmConnection(resolved) {
|
|
109
|
+
if (resolved.connection.extraParams !== undefined) {
|
|
110
|
+
const issue = validateExtraParams(resolved.connection.extraParams)[0];
|
|
111
|
+
if (issue) {
|
|
112
|
+
throw new ConfigError(formatExtraParamsIssue(`Engine "${resolved.engine}" extraParams`, issue), "INVALID_CONFIG_FILE");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
let apiKey;
|
|
116
|
+
for (const name of resolved.credential?.names ?? []) {
|
|
117
|
+
const candidate = process.env[name]?.trim();
|
|
118
|
+
if (candidate) {
|
|
119
|
+
apiKey = candidate;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (resolved.credential?.required && !apiKey) {
|
|
124
|
+
throw new ConfigError(`Required engine credential ${resolved.credential.names[0]} is not set.`, "INVALID_CONFIG_FILE");
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
...resolved.connection,
|
|
128
|
+
...(apiKey ? { apiKey } : {}),
|
|
129
|
+
timeoutMs: resolved.timeoutMs,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function lowerAgentEngine(name, engine, config) {
|
|
133
|
+
const harness = getHarness(engine.platform);
|
|
134
|
+
if (!harness?.capabilities.agentDispatch) {
|
|
135
|
+
throw new ConfigError(`Engine "${name}" names a platform that cannot dispatch agents: ${engine.platform}.`, "INVALID_CONFIG_FILE");
|
|
136
|
+
}
|
|
137
|
+
const platform = harness.id;
|
|
138
|
+
const sdk = platform === "opencode-sdk";
|
|
139
|
+
const builtin = getBuiltinAgentProfile(platform);
|
|
140
|
+
const profile = {
|
|
141
|
+
name,
|
|
142
|
+
platform,
|
|
143
|
+
bin: engine.bin ?? builtin?.bin ?? (sdk ? "opencode" : platform),
|
|
144
|
+
args: engine.args ?? builtin?.args ?? [],
|
|
145
|
+
stdio: "captured",
|
|
146
|
+
...(builtin?.env ? { env: builtin.env } : {}),
|
|
147
|
+
envPassthrough: builtin?.envPassthrough ?? [],
|
|
148
|
+
parseOutput: "text",
|
|
149
|
+
...(engine.workspace ? { workspace: path.resolve(engine.workspace) } : {}),
|
|
150
|
+
...(engine.model
|
|
151
|
+
? {
|
|
152
|
+
model: resolveModel(engine.model, platform, engine.modelAliases, config.modelAliases),
|
|
153
|
+
modelIsExact: true,
|
|
154
|
+
}
|
|
155
|
+
: {}),
|
|
156
|
+
...(engine.modelAliases ? { modelAliases: engine.modelAliases } : {}),
|
|
157
|
+
...(config.modelAliases ? { globalModelAliases: config.modelAliases } : {}),
|
|
158
|
+
};
|
|
159
|
+
if (!sdk) {
|
|
160
|
+
return {
|
|
161
|
+
kind: "agent",
|
|
162
|
+
engine: name,
|
|
163
|
+
profile,
|
|
164
|
+
timeoutMs: hasOwn(engine, "timeoutMs") ? (engine.timeoutMs ?? null) : DEFAULT_AGENT_TIMEOUT_MS,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const fallbackName = engine.llmEngine ?? config.defaults?.llmEngine;
|
|
168
|
+
const fallback = fallbackName
|
|
169
|
+
? resolveLlmEngineUse(config, [{ engine: fallbackName }], { optional: true })
|
|
170
|
+
: undefined;
|
|
171
|
+
return {
|
|
172
|
+
kind: "sdk",
|
|
173
|
+
engine: name,
|
|
174
|
+
profile,
|
|
175
|
+
...(fallback
|
|
176
|
+
? {
|
|
177
|
+
fallbackConnection: fallback.connection,
|
|
178
|
+
...(fallback.credential ? { fallbackCredential: fallback.credential } : {}),
|
|
179
|
+
fallbackTimeoutMs: fallback.timeoutMs,
|
|
180
|
+
}
|
|
181
|
+
: {}),
|
|
182
|
+
timeoutMs: hasOwn(engine, "timeoutMs")
|
|
183
|
+
? (engine.timeoutMs ?? null)
|
|
184
|
+
: (fallback?.timeoutMs ?? DEFAULT_AGENT_TIMEOUT_MS),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/** Lower a named engine through the canonical harness platform. */
|
|
188
|
+
export function resolveEngine(name, config) {
|
|
189
|
+
const engine = resolveEngineConfig(name, config);
|
|
190
|
+
if (engine.kind === "llm") {
|
|
191
|
+
const resolved = resolveLlmEngineUse(config, [{ engine: name }]);
|
|
192
|
+
if (!resolved)
|
|
193
|
+
throw new ConfigError(`LLM engine "${name}" could not be resolved.`, "LLM_NOT_CONFIGURED");
|
|
194
|
+
return {
|
|
195
|
+
kind: "llm",
|
|
196
|
+
engine: name,
|
|
197
|
+
connection: resolved.connection,
|
|
198
|
+
...(resolved.credential ? { credential: resolved.credential } : {}),
|
|
199
|
+
timeoutMs: resolved.timeoutMs,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
return lowerAgentEngine(name, engine, config);
|
|
203
|
+
}
|
|
204
|
+
export function resolveDefaultEngine(config) {
|
|
205
|
+
const name = config.defaults?.engine;
|
|
206
|
+
if (!name)
|
|
207
|
+
throw new ConfigError("No default engine is configured.", "INVALID_CONFIG_FILE");
|
|
208
|
+
return resolveEngine(name, config);
|
|
209
|
+
}
|
|
210
|
+
// ── AkmConfig convenience wrappers (moved from core/config/config.ts, WI-9.8
|
|
211
|
+
// KILL 3, D.3 edge A) ────────────────────────────────────────────────────────
|
|
212
|
+
//
|
|
213
|
+
// Moved verbatim: `config.ts` previously called `materializeLlmConnection` +
|
|
214
|
+
// `resolveLlmEngineUse` directly for these two wrappers, which is what made
|
|
215
|
+
// config.ts import this module — and this module imported `LlmConnectionConfig`
|
|
216
|
+
// back from config.ts, closing a 2-file cycle. config.ts CANNOT re-export
|
|
217
|
+
// these (a re-export is still a graph edge to this file), so the small number
|
|
218
|
+
// of call sites that used to import them from "core/config/config" now import
|
|
219
|
+
// them from here instead (see D.3 edge A "callers compose instead").
|
|
220
|
+
/** Resolve and materialize the configured default LLM engine at dispatch time. */
|
|
221
|
+
export function requireLlmConfig(config) {
|
|
222
|
+
return materializeLlmConnection(resolveLlmEngineUse(config, []));
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Like {@link requireLlmConfig} but returns `undefined` instead of throwing
|
|
226
|
+
* when no LLM is configured. Use in code paths where the LLM is optional.
|
|
227
|
+
*/
|
|
228
|
+
export function getDefaultLlmConfig(config) {
|
|
229
|
+
const resolved = resolveLlmEngineUse(config, [], { optional: true });
|
|
230
|
+
return resolved ? materializeLlmConnection(resolved) : undefined;
|
|
231
|
+
}
|
|
@@ -2,9 +2,8 @@
|
|
|
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
|
export { getCommandBuilder } from "./builders.js";
|
|
5
|
-
export { DEFAULT_AGENT_TIMEOUT_MS
|
|
5
|
+
export { DEFAULT_AGENT_TIMEOUT_MS } from "./config.js";
|
|
6
6
|
export { _setAgentDetectForTests, defaultWhich, detectAgentCliProfiles, pickDefaultAgentProfile } from "./detect.js";
|
|
7
7
|
export { listBuiltinModelAliases, resolveModel } from "./model-aliases.js";
|
|
8
8
|
export { BUILTIN_AGENT_PROFILE_NAMES, getBuiltinAgentProfile, listBuiltinAgentProfiles, } from "./profiles.js";
|
|
9
9
|
export { buildProposePrompt, buildReflectPrompt, buildSchemaRepairPrompt, extractDraftConfidence, parseAgentProposalPayload, } from "./prompts.js";
|
|
10
|
-
export { runAgent } from "./spawn.js";
|
|
@@ -11,6 +11,15 @@
|
|
|
11
11
|
* always resolve to the full name for determinism)
|
|
12
12
|
*/
|
|
13
13
|
const BUILTIN_ALIASES = [
|
|
14
|
+
{
|
|
15
|
+
// Anthropic's Mythos-class tier above Opus — the recommended resolution
|
|
16
|
+
// target for the `deep` workflow tier (see docs/reference/workflows.md).
|
|
17
|
+
alias: "fable",
|
|
18
|
+
platforms: {
|
|
19
|
+
claude: "claude-fable-5",
|
|
20
|
+
opencode: "opencode/claude-fable-5",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
14
23
|
{
|
|
15
24
|
alias: "opus",
|
|
16
25
|
platforms: {
|
|
@@ -41,19 +50,24 @@ const BUILTIN_ALIASES = [
|
|
|
41
50
|
* @param platform Builder platform name ("claude", "opencode", ...).
|
|
42
51
|
* @param custom Profile-level aliases from config.json — take priority over globals and builtins.
|
|
43
52
|
* @param global Config-root `modelAliases` tier table (alias → platform → model, `"*"` fallback).
|
|
53
|
+
* @param fallbackPlatforms Additional global tier columns checked after `platform` and before `"*"`.
|
|
44
54
|
* @returns Resolved model string, or `model` verbatim when no alias matches.
|
|
45
55
|
*/
|
|
46
|
-
export function resolveModel(model, platform, custom, global) {
|
|
56
|
+
export function resolveModel(model, platform, custom, global, fallbackPlatforms = []) {
|
|
47
57
|
const key = model.toLowerCase();
|
|
48
58
|
if (custom?.[key])
|
|
49
59
|
return custom[key];
|
|
50
60
|
const tier = global?.[key];
|
|
51
|
-
const fromGlobal = tier?.[platform] ?? tier?.["*"];
|
|
61
|
+
const fromGlobal = tier?.[platform] ?? fallbackPlatforms.map((fallback) => tier?.[fallback]).find(Boolean) ?? tier?.["*"];
|
|
52
62
|
if (fromGlobal)
|
|
53
63
|
return fromGlobal;
|
|
54
64
|
const entry = BUILTIN_ALIASES.find((a) => a.alias === key);
|
|
55
65
|
return entry?.platforms[platform] ?? model;
|
|
56
66
|
}
|
|
67
|
+
/** Resolve a direct/fallback LLM model through engine-specific, `llm`, then `*` tiers. */
|
|
68
|
+
export function resolveLlmModel(model, engine, global) {
|
|
69
|
+
return resolveModel(model, engine, undefined, global, ["llm"]);
|
|
70
|
+
}
|
|
57
71
|
/** Return all built-in alias entries (for tests and documentation). */
|
|
58
72
|
export function listBuiltinModelAliases() {
|
|
59
73
|
return BUILTIN_ALIASES;
|
|
@@ -9,11 +9,12 @@
|
|
|
9
9
|
// every lane's read-back (GRR). It is a provenance tag, never a secret.
|
|
10
10
|
const COMMON_PASSTHROUGH = ["HOME", "PATH", "USER", "LANG", "LC_ALL", "TERM", "TMPDIR", "AKM_EVENT_SOURCE"];
|
|
11
11
|
/**
|
|
12
|
-
* Built-in profiles for the
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* Built-in profiles for the agent CLIs akm knows out of the box: the five the
|
|
13
|
+
* v1 spec calls out explicitly, plus the P2 harness adapters (copilot, pi,
|
|
14
|
+
* amazonq, openhands — plan §"Capability matrix"). The fields here are
|
|
15
|
+
* conservative defaults — every value is overridable from user config.
|
|
15
16
|
*
|
|
16
|
-
*
|
|
17
|
+
* Engine lowering selects captured stdio for unattended dispatch.
|
|
17
18
|
*/
|
|
18
19
|
const BUILTINS = {
|
|
19
20
|
opencode: {
|
|
@@ -56,76 +57,49 @@ const BUILTINS = {
|
|
|
56
57
|
envPassthrough: [...COMMON_PASSTHROUGH, "OPENAI_API_KEY", "ANTHROPIC_API_KEY"],
|
|
57
58
|
parseOutput: "text",
|
|
58
59
|
},
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* These profiles use `stdio: "captured"` and `parseOutput: "json"` so the
|
|
64
|
-
* agent's response can be read from stdout. They share the same `bin` and
|
|
65
|
-
* `envPassthrough` as the corresponding base profile but are intentionally
|
|
66
|
-
* kept out of `BUILTIN_AGENT_PROFILE_NAMES` (and therefore out of CLI
|
|
67
|
-
* detection/enumeration) to avoid showing up as separate installable profiles.
|
|
68
|
-
*
|
|
69
|
-
* Users may reference them by name via `--profile opencode-headless` or by
|
|
70
|
-
* setting `agent.default: "opencode-headless"` in config.json.
|
|
71
|
-
*/
|
|
72
|
-
const HEADLESS_BUILTINS = {
|
|
73
|
-
"opencode-headless": {
|
|
74
|
-
name: "opencode-headless",
|
|
75
|
-
bin: "opencode",
|
|
76
|
-
args: ["run"],
|
|
77
|
-
stdio: "captured",
|
|
78
|
-
envPassthrough: [...COMMON_PASSTHROUGH, "OPENCODE_API_KEY", "OPENCODE_CONFIG"],
|
|
79
|
-
parseOutput: "json",
|
|
80
|
-
},
|
|
81
|
-
"claude-headless": {
|
|
82
|
-
name: "claude-headless",
|
|
83
|
-
bin: "claude",
|
|
60
|
+
// ── P2 harness-adapter profiles (plan §"Capability matrix") ────────────────
|
|
61
|
+
copilot: {
|
|
62
|
+
name: "copilot",
|
|
63
|
+
bin: "copilot",
|
|
84
64
|
args: [],
|
|
85
|
-
stdio: "
|
|
86
|
-
envPassthrough: [...COMMON_PASSTHROUGH, "
|
|
87
|
-
parseOutput: "
|
|
65
|
+
stdio: "interactive",
|
|
66
|
+
envPassthrough: [...COMMON_PASSTHROUGH, "GH_TOKEN", "GITHUB_TOKEN"],
|
|
67
|
+
parseOutput: "text",
|
|
88
68
|
},
|
|
89
|
-
|
|
90
|
-
name: "
|
|
91
|
-
bin: "
|
|
69
|
+
pi: {
|
|
70
|
+
name: "pi",
|
|
71
|
+
bin: "pi",
|
|
92
72
|
args: [],
|
|
93
|
-
stdio: "
|
|
94
|
-
envPassthrough: [...COMMON_PASSTHROUGH, "
|
|
95
|
-
parseOutput: "
|
|
73
|
+
stdio: "interactive",
|
|
74
|
+
envPassthrough: [...COMMON_PASSTHROUGH, "PI_API_KEY", "ANTHROPIC_API_KEY", "OPENAI_API_KEY"],
|
|
75
|
+
parseOutput: "text",
|
|
96
76
|
},
|
|
97
|
-
|
|
98
|
-
name: "
|
|
99
|
-
bin: "
|
|
77
|
+
amazonq: {
|
|
78
|
+
name: "amazonq",
|
|
79
|
+
bin: "q",
|
|
100
80
|
args: [],
|
|
101
|
-
stdio: "
|
|
102
|
-
envPassthrough: [...COMMON_PASSTHROUGH, "
|
|
103
|
-
parseOutput: "
|
|
81
|
+
stdio: "interactive",
|
|
82
|
+
envPassthrough: [...COMMON_PASSTHROUGH, "AWS_PROFILE", "AWS_REGION"],
|
|
83
|
+
parseOutput: "text",
|
|
104
84
|
},
|
|
105
|
-
|
|
106
|
-
name: "
|
|
107
|
-
bin: "
|
|
108
|
-
args: [
|
|
109
|
-
stdio: "
|
|
110
|
-
envPassthrough: [...COMMON_PASSTHROUGH, "
|
|
111
|
-
parseOutput: "
|
|
85
|
+
openhands: {
|
|
86
|
+
name: "openhands",
|
|
87
|
+
bin: "openhands",
|
|
88
|
+
args: [],
|
|
89
|
+
stdio: "interactive",
|
|
90
|
+
envPassthrough: [...COMMON_PASSTHROUGH, "LLM_MODEL", "LLM_API_KEY", "LLM_BASE_URL"],
|
|
91
|
+
parseOutput: "text",
|
|
112
92
|
},
|
|
113
93
|
};
|
|
114
|
-
/**
|
|
115
|
-
* Names of the five primary built-in profiles. Stable, sorted. Does NOT
|
|
116
|
-
* include the `-headless` variants (those are resolvable by name but are
|
|
117
|
-
* excluded from detection/enumeration flows).
|
|
118
|
-
*/
|
|
94
|
+
/** Names of the canonical built-in harness descriptors. Stable, sorted. */
|
|
119
95
|
export const BUILTIN_AGENT_PROFILE_NAMES = Object.freeze(Object.keys(BUILTINS).sort());
|
|
120
|
-
/** Returns the built-in
|
|
96
|
+
/** Returns the built-in descriptor for a canonical harness id. */
|
|
121
97
|
export function getBuiltinAgentProfile(name) {
|
|
122
|
-
return BUILTINS[name]
|
|
98
|
+
return BUILTINS[name];
|
|
123
99
|
}
|
|
124
100
|
/**
|
|
125
|
-
* Return a
|
|
126
|
-
*
|
|
127
|
-
* to look them up by name. Callers should not assume reference equality with
|
|
128
|
-
* subsequent calls.
|
|
101
|
+
* Return a copy of every canonical built-in descriptor keyed by harness id.
|
|
102
|
+
* Callers should not assume reference equality with subsequent calls.
|
|
129
103
|
*/
|
|
130
104
|
export function listBuiltinAgentProfiles() {
|
|
131
105
|
const out = {};
|
|
@@ -6,17 +6,17 @@
|
|
|
6
6
|
*
|
|
7
7
|
* `akm reflect` and `akm propose` both shell out to the configured agent CLI
|
|
8
8
|
* (via {@link runAgent}) and ask it for a structured proposal payload. The
|
|
9
|
-
* prompts are intentionally similar
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* prompts are intentionally similar and share their construction here. Agent
|
|
10
|
+
* and SDK stdout keeps the JSON/file-write contracts; direct LLM reflect adds
|
|
11
|
+
* native-schema and framed-markdown contracts. Keeping the prompt builders in
|
|
12
12
|
* `src/integrations/agent/` rather than `src/llm/` is deliberate: these are
|
|
13
13
|
* shell-out prompts targeting an agent CLI, not in-tree LLM API calls.
|
|
14
14
|
*
|
|
15
|
-
* The output
|
|
15
|
+
* The stdout output an agent must produce is a strict JSON object:
|
|
16
16
|
*
|
|
17
17
|
* ```json
|
|
18
18
|
* {
|
|
19
|
-
* "ref": "
|
|
19
|
+
* "ref": "lessons/my-lesson",
|
|
20
20
|
* "content": "---\ndescription: ...\nwhen_to_use: ...\n---\n\nbody",
|
|
21
21
|
* "frontmatter": { "description": "...", "when_to_use": "..." }
|
|
22
22
|
* }
|
|
@@ -25,7 +25,11 @@
|
|
|
25
25
|
* `frontmatter` is optional — the proposal queue parses it from `content`
|
|
26
26
|
* during validation. We carry it through if the agent supplies it.
|
|
27
27
|
*/
|
|
28
|
-
import
|
|
28
|
+
import reflectLlmFramedContract from "../../assets/prompts/reflect-llm-framed-contract.md" with { type: "text" };
|
|
29
|
+
import reflectLlmSchemaContract from "../../assets/prompts/reflect-llm-schema-contract.md" with { type: "text" };
|
|
30
|
+
import reflectOutputRepair from "../../assets/prompts/reflect-output-repair.md" with { type: "text" };
|
|
31
|
+
import { placementTypes } from "../../core/asset/asset-placement.js";
|
|
32
|
+
import { parseRefInput } from "../../core/asset/resolve-ref.js";
|
|
29
33
|
import { authoringRulesForType, DESCRIPTION_MAX_CHARS, DESCRIPTION_MIN_CHARS, requiresDescription, } from "../../core/authoring-rules.js";
|
|
30
34
|
import { parseEmbeddedJsonResponse, stripCodeFences, stripThinkBlocks } from "../../core/parse.js";
|
|
31
35
|
/**
|
|
@@ -42,7 +46,7 @@ const TYPE_HINTS = {
|
|
|
42
46
|
memory: "memory assets are short factual notes the user wants persisted across sessions. Frontmatter usually includes `description`.",
|
|
43
47
|
workflow: "workflow assets are markdown describing a multi-step process. Include `# <Title>` and ordered `## Step N` sections.",
|
|
44
48
|
script: "script assets are executable text files. Include a shebang and minimal usage comment.",
|
|
45
|
-
env: "env assets are `.env` files holding a group of related CONFIGURATION for an app/service (KEY=VALUE pairs, `#` comments) — URLs, flags, and any credentials it needs. Values may or may not be sensitive; all are protected (key names discoverable, values stay on disk). Inject with `akm env run env
|
|
49
|
+
env: "env assets are `.env` files holding a group of related CONFIGURATION for an app/service (KEY=VALUE pairs, `#` comments) — URLs, flags, and any credentials it needs. Values may or may not be sensitive; all are protected (key names discoverable, values stay on disk). Inject with `akm env run env/<name> -- <cmd>`; prefer `--clean` in agent contexts so the child starts from a minimal inherited environment. AKM itself does not print values, but the child command can print its environment, so do not run `env`, `printenv`, shell tracing, or similar diagnostics when secrets are in scope. For a single sensitive value used on its own for authentication (token, key, cert) use a `secret` instead. Never echo values back to the user.",
|
|
46
50
|
wiki: "wiki assets are markdown reference pages with `# Title` and structured headings.",
|
|
47
51
|
fact: "fact assets are durable stash-level facts (personal/team/project details, coding conventions, stash-meta). Frontmatter SHOULD include `description` and a `category` (personal|team|project|convention|meta); set `pinned: true` only for the small always-injected core. Keep each fact short, high-signal, and self-contained — it is durable context, not an episodic note.",
|
|
48
52
|
};
|
|
@@ -50,7 +54,7 @@ function hintForType(type) {
|
|
|
50
54
|
return TYPE_HINTS[type] ?? `assets of type "${type}" — produce sensible markdown with optional frontmatter.`;
|
|
51
55
|
}
|
|
52
56
|
function knownTypeList() {
|
|
53
|
-
return
|
|
57
|
+
return [...placementTypes()].sort().join(", ");
|
|
54
58
|
}
|
|
55
59
|
/**
|
|
56
60
|
* Common envelope every prompt asks the agent to honour when NO draft file
|
|
@@ -60,7 +64,10 @@ function knownTypeList() {
|
|
|
60
64
|
*/
|
|
61
65
|
const RESPONSE_CONTRACT_JSON = [
|
|
62
66
|
"Respond ONLY with a single JSON object. No prose before or after.",
|
|
63
|
-
|
|
67
|
+
// Slash conceptId, not the retired `<type>:<name>` colon grammar (Q-02/Q-08).
|
|
68
|
+
// This contract is the schema an agent copies from, so a stale spelling here
|
|
69
|
+
// teaches every proposal to use a ref form the CLI now rejects outright.
|
|
70
|
+
'Shape: {"ref": "<type>/<name>", "content": "<full file contents>", "frontmatter": {...}, "confidence": <number 0..1>}',
|
|
64
71
|
"`content` is the full file body that will be written if accepted.",
|
|
65
72
|
"`frontmatter` is optional — include it if `content` starts with `---` so reviewers can sanity-check the keys.",
|
|
66
73
|
"`confidence` is REQUIRED. Self-rate this proposal on [0, 1] by how certain you are it materially improves the source asset. Calibrate honestly:",
|
|
@@ -68,7 +75,7 @@ const RESPONSE_CONTRACT_JSON = [
|
|
|
68
75
|
" • 0.70–0.89 — clear improvement, but a reviewer might reasonably prefer different framing or scope.",
|
|
69
76
|
" • 0.50–0.69 — marginal / judgment call; might help, might not be worth the churn.",
|
|
70
77
|
" • Below 0.50 — you are not confident this improves on the source. Prefer returning the source body roughly unchanged with a low score over inventing changes.",
|
|
71
|
-
"
|
|
78
|
+
"Reviewers and the triage judge read this score when adjudicating the proposal queue. Overclaiming erodes trust in your proposals; underclaiming buries good ones. Be honest.",
|
|
72
79
|
].join("\n");
|
|
73
80
|
/**
|
|
74
81
|
* Response contract used when a draft file path is available. Instructs the
|
|
@@ -86,14 +93,14 @@ function fileWriteContract(draftFilePath) {
|
|
|
86
93
|
" • 0.70–0.89 — clear improvement, but a reviewer might prefer different framing.",
|
|
87
94
|
" • 0.50–0.69 — marginal / judgment call.",
|
|
88
95
|
" • Below 0.50 — not confident; prefer not writing changes at all.",
|
|
89
|
-
"
|
|
96
|
+
"Reviewers and the triage judge read this score during adjudication. Overclaim → trust erodes; underclaim → good changes buried.",
|
|
90
97
|
].join("\n");
|
|
91
98
|
}
|
|
92
99
|
/**
|
|
93
100
|
* Extract a confidence score from a `DRAFT_WRITTEN confidence=<n>` line emitted
|
|
94
101
|
* by an agent following {@link fileWriteContract}. Tolerates trailing prose,
|
|
95
102
|
* surrounding log lines, and missing/invalid confidence (returns `undefined`
|
|
96
|
-
* so callers can keep the proposal
|
|
103
|
+
* so callers can keep the proposal without a score).
|
|
97
104
|
*
|
|
98
105
|
* Matched forms (case-insensitive, anywhere in stdout):
|
|
99
106
|
* - `DRAFT_WRITTEN confidence=0.85`
|
|
@@ -111,6 +118,27 @@ export function extractDraftConfidence(stdout) {
|
|
|
111
118
|
return undefined;
|
|
112
119
|
return value;
|
|
113
120
|
}
|
|
121
|
+
export function reflectLlmResponseContract(mode, targetScoped) {
|
|
122
|
+
if (mode === "json_schema") {
|
|
123
|
+
return reflectLlmSchemaContract
|
|
124
|
+
.replace("{{FIELD_RULE}}", targetScoped
|
|
125
|
+
? "The response has exactly the required fields `content`, `confidence`, and `frontmatterPatch`; do not echo `ref` or arbitrary `frontmatter`."
|
|
126
|
+
: "The response has exactly the required fields `ref`, `content`, `confidence`, and `frontmatterPatch`; `ref` must identify the selected asset.")
|
|
127
|
+
.trim();
|
|
128
|
+
}
|
|
129
|
+
const refLine = targetScoped ? "" : "AKM_REFLECT_REF: <selected asset ref>\n";
|
|
130
|
+
return reflectLlmFramedContract.replace("{{REF_LINE}}", refLine).trim();
|
|
131
|
+
}
|
|
132
|
+
export function buildReflectOutputRepairPrompt(mode, targetScoped) {
|
|
133
|
+
return reflectOutputRepair.replace("{{OUTPUT_CONTRACT}}", reflectLlmResponseContract(mode, targetScoped)).trim();
|
|
134
|
+
}
|
|
135
|
+
function reflectResponseContract(input) {
|
|
136
|
+
if (input.draftFilePath)
|
|
137
|
+
return fileWriteContract(input.draftFilePath);
|
|
138
|
+
if (input.outputMode)
|
|
139
|
+
return reflectLlmResponseContract(input.outputMode, input.ref !== undefined);
|
|
140
|
+
return RESPONSE_CONTRACT_JSON;
|
|
141
|
+
}
|
|
114
142
|
/**
|
|
115
143
|
* Whether the source asset content has a non-empty `description:` key in its
|
|
116
144
|
* YAML frontmatter. Used by {@link buildReflectPrompt} (#636) to decide whether
|
|
@@ -150,7 +178,7 @@ export function buildReflectPrompt(input) {
|
|
|
150
178
|
const goalSentence = isLesson
|
|
151
179
|
? `Your task is to distill what usage signals reveal about this ${input.type} asset — when to reach for it, what goes wrong without it, and what real use has revealed that the asset itself does not say. Do not reproduce the source content; your proposal must add information the source does not contain.`
|
|
152
180
|
: isSkill
|
|
153
|
-
? "Your task is to review this skill asset, identify what the feedback and related distilled lessons show is broken, missing, unclear, or durable enough to promote into long-term documentation, and produce a single improved proposal. If the strongest evidence points to companion reference material rather than the main SKILL.md, you may instead propose a skill-adjacent knowledge doc such as `knowledge
|
|
181
|
+
? "Your task is to review this skill asset, identify what the feedback and related distilled lessons show is broken, missing, unclear, or durable enough to promote into long-term documentation, and produce a single improved proposal. If the strongest evidence points to companion reference material rather than the main SKILL.md, you may instead propose a skill-adjacent knowledge doc such as `knowledge/skills/<skill>/references/<topic>`."
|
|
154
182
|
: `Your task is to review this ${input.type} asset, identify what the feedback signals as broken, missing, or unclear, and produce an improved version. Do not reproduce the source content unchanged; your proposal must correct or add something the source lacks.`;
|
|
155
183
|
sections.push(goalSentence);
|
|
156
184
|
sections.push(`Target ref: ${input.ref}`);
|
|
@@ -186,7 +214,7 @@ export function buildReflectPrompt(input) {
|
|
|
186
214
|
sections.push(input.standardsContext.trim());
|
|
187
215
|
}
|
|
188
216
|
{
|
|
189
|
-
const resolvedType = input.type ?? (input.ref
|
|
217
|
+
const resolvedType = input.type ?? (input.ref ? parseRefInput(input.ref).type : "");
|
|
190
218
|
const authoringRules = resolvedType ? authoringRulesForType(resolvedType) : "";
|
|
191
219
|
if (authoringRules) {
|
|
192
220
|
sections.push(authoringRules);
|
|
@@ -244,7 +272,7 @@ export function buildReflectPrompt(input) {
|
|
|
244
272
|
}
|
|
245
273
|
sections.push("Evaluate whether these lessons contain strong evidence of factual, repeatable guidance that should be promoted into long-term skill documentation.");
|
|
246
274
|
sections.push("Promote only guidance that is durable, generally applicable, and supported by repeated evidence. Do not copy anecdotal details, one-off incidents, or duplicate wording verbatim.");
|
|
247
|
-
sections.push("If the guidance belongs in the main skill instructions, update the skill proposal. If it belongs in a companion reference document, return a `knowledge
|
|
275
|
+
sections.push("If the guidance belongs in the main skill instructions, update the skill proposal. If it belongs in a companion reference document, return a `knowledge/skills/<skill>/references/<topic>` proposal instead.");
|
|
248
276
|
}
|
|
249
277
|
if (input.rejectedProposals && input.rejectedProposals.length > 0) {
|
|
250
278
|
const lines = ["## Previously Rejected Proposals"];
|
|
@@ -319,12 +347,12 @@ export function buildReflectPrompt(input) {
|
|
|
319
347
|
"5. Improve clarity of surrounding prose, fix structural issues, add missing required frontmatter fields. Do NOT rewrite a runbook into an essay.",
|
|
320
348
|
].join("\n"));
|
|
321
349
|
}
|
|
322
|
-
if (!input.draftFilePath && input.ref) {
|
|
350
|
+
if (!input.draftFilePath && !input.outputMode && input.ref) {
|
|
323
351
|
// Reinforce that the `ref` field is mandatory and must exactly match the target.
|
|
324
352
|
// Small models frequently omit `ref` from the response JSON, causing parse errors.
|
|
325
353
|
sections.push(`IMPORTANT: The JSON "ref" field is REQUIRED. It MUST be exactly: "${input.ref}"`);
|
|
326
354
|
}
|
|
327
|
-
sections.push(
|
|
355
|
+
sections.push(reflectResponseContract(input));
|
|
328
356
|
return { prompt: sections.join("\n\n"), ...(maxOutputChars !== undefined ? { maxOutputChars } : {}) };
|
|
329
357
|
}
|
|
330
358
|
/**
|
|
@@ -399,7 +427,7 @@ export function buildSchemaRepairPrompt(input) {
|
|
|
399
427
|
* can map to {@link AgentFailureReason} `parse_error`.
|
|
400
428
|
*
|
|
401
429
|
* Resilient to two common local-LLM failure modes:
|
|
402
|
-
* 1. `<think>…</think>` blocks emitted before the JSON (stripped
|
|
430
|
+
* 1. `<think>…</think>` blocks emitted before the JSON (stripped before parsing).
|
|
403
431
|
* 2. Prose preamble / postamble around the JSON object (handled by `extractEmbeddedJson`).
|
|
404
432
|
*/
|
|
405
433
|
export function parseAgentProposalPayload(stdout) {
|