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,120 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* Gemini CLI agent command builder (P2, plan §"The adapter contract" step 2 /
|
|
6
|
+
* §"Capability matrix").
|
|
7
|
+
*
|
|
8
|
+
* Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
|
|
9
|
+
* headless argv the `gemini` CLI expects. Per the capability matrix the
|
|
10
|
+
* headless invocation is:
|
|
11
|
+
*
|
|
12
|
+
* gemini -p "<prompt>"
|
|
13
|
+
*
|
|
14
|
+
* with `--output-format json` for structured output, `--model <m>` for model
|
|
15
|
+
* selection, and `--resume <id>` for resume; resume is not built here because
|
|
16
|
+
* `AgentDispatchRequest` carries no session id. The `GEMINI_CLI=1` identity
|
|
17
|
+
* env marker is likewise registry-side (`AkmHarness.identityEnv` /
|
|
18
|
+
* `agent-identity.ts`), not a builder concern.
|
|
19
|
+
*
|
|
20
|
+
* Platform-specific mapping decisions (all localized here, per the adapter
|
|
21
|
+
* contract):
|
|
22
|
+
*
|
|
23
|
+
* - **systemPrompt** — Gemini CLI has no system-prompt flag in headless mode
|
|
24
|
+
* (system text comes from `GEMINI.md` context files / `GEMINI_SYSTEM_MD`),
|
|
25
|
+
* so the system prompt is folded into the `-p` payload ahead of the task
|
|
26
|
+
* prompt, separated by a blank line. `assertNotFlag` still guards it so a
|
|
27
|
+
* `--`-prefixed system prompt cannot turn the front of the `-p` value into
|
|
28
|
+
* a flag.
|
|
29
|
+
* - **schema** — the matrix places Gemini in the "via prompt+validate" tier
|
|
30
|
+
* (no native `--output-schema` equivalent, unlike Codex — so no temp-file
|
|
31
|
+
* plumbing here), so the JSON Schema is passed through the prompt: a
|
|
32
|
+
* directive matching the engine's wording (`step-work.ts`
|
|
33
|
+
* `buildUnitPrompt`) is appended to the `-p` payload, and
|
|
34
|
+
* `--output-format json` is emitted so stdout is the documented JSON
|
|
35
|
+
* envelope the gemini result extractor normalizes. The engine's shared
|
|
36
|
+
* retry-until-valid loop performs the actual validation.
|
|
37
|
+
* - **tools** — a string/array tool policy maps to repeated
|
|
38
|
+
* `--allowed-tools <t>` flags (Gemini's run-without-confirmation
|
|
39
|
+
* allowlist). A *structured* policy object is NOT expressible as Gemini
|
|
40
|
+
* flags; it is deliberately dropped without widening to an auto-approve
|
|
41
|
+
* flag (never silently widen a restriction). With no policy at all,
|
|
42
|
+
* NOTHING is emitted — the matrix's headless shape is the bare
|
|
43
|
+
* `gemini -p "<p>"`; autonomy flags (`--yolo`, `--approval-mode`) belong in
|
|
44
|
+
* `profile.args` where the operator opts in explicitly.
|
|
45
|
+
*
|
|
46
|
+
* Registered: `geminiBuilder` is `GeminiHarness.agentBuilder` (`./index.ts`),
|
|
47
|
+
* one of the ten harnesses `HARNESS_REGISTRY` constructs
|
|
48
|
+
* (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
|
|
49
|
+
* that registry, so this builder is reachable under the `"gemini"` platform
|
|
50
|
+
* name without any further wiring.
|
|
51
|
+
*/
|
|
52
|
+
import { assertNotFlag, resolveDispatchModel, } from "../../agent/builder-shared.js";
|
|
53
|
+
/** Canonical harness/platform id used for model-alias resolution. */
|
|
54
|
+
export const GEMINI_PLATFORM = "gemini";
|
|
55
|
+
/**
|
|
56
|
+
* Split a tool policy into individual tool names for `--allowed-tools`.
|
|
57
|
+
* Strings are comma-separated lists; arrays are taken as-is. Structured
|
|
58
|
+
* policy objects return `undefined` (not expressible as Gemini flags — see
|
|
59
|
+
* module doc).
|
|
60
|
+
*/
|
|
61
|
+
function toolPolicyEntries(tools) {
|
|
62
|
+
if (typeof tools === "string") {
|
|
63
|
+
return tools
|
|
64
|
+
.split(",")
|
|
65
|
+
.map((t) => t.trim())
|
|
66
|
+
.filter(Boolean);
|
|
67
|
+
}
|
|
68
|
+
if (Array.isArray(tools)) {
|
|
69
|
+
return tools.map((t) => t.trim()).filter(Boolean);
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Assemble the `-p` payload: optional system prompt, the task prompt, and —
|
|
75
|
+
* when a schema is requested — the same schema directive the workflow
|
|
76
|
+
* engine's prompt assembly uses, so both dispatch paths speak one dialect.
|
|
77
|
+
*/
|
|
78
|
+
function buildPromptPayload(req) {
|
|
79
|
+
const sections = [];
|
|
80
|
+
if (req.systemPrompt)
|
|
81
|
+
sections.push(req.systemPrompt);
|
|
82
|
+
sections.push(req.prompt);
|
|
83
|
+
if (req.schema) {
|
|
84
|
+
sections.push(`Respond with ONLY a JSON value matching this JSON Schema (no prose, no code fences):\n${JSON.stringify(req.schema)}`);
|
|
85
|
+
}
|
|
86
|
+
return sections.join("\n\n");
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Gemini CLI builder.
|
|
90
|
+
* Command shape:
|
|
91
|
+
* gemini [--model <m>] [--allowed-tools <t> ...]
|
|
92
|
+
* [--output-format json] -p "<systemPrompt?\n\nprompt\n\nschema?>"
|
|
93
|
+
*/
|
|
94
|
+
export const geminiBuilder = {
|
|
95
|
+
platform: GEMINI_PLATFORM,
|
|
96
|
+
build(profile, req) {
|
|
97
|
+
assertNotFlag(req.systemPrompt, "systemPrompt");
|
|
98
|
+
assertNotFlag(req.model, "model");
|
|
99
|
+
const args = [...profile.args];
|
|
100
|
+
if (req.model) {
|
|
101
|
+
const resolved = resolveDispatchModel(req, profile, GEMINI_PLATFORM);
|
|
102
|
+
args.push("--model", resolved);
|
|
103
|
+
}
|
|
104
|
+
if (req.tools) {
|
|
105
|
+
// Structured policy objects (entries === undefined) emit NO flags:
|
|
106
|
+
// dropping a restriction must never widen to auto-approval.
|
|
107
|
+
for (const tool of toolPolicyEntries(req.tools) ?? []) {
|
|
108
|
+
assertNotFlag(tool, "tools entry");
|
|
109
|
+
args.push("--allowed-tools", tool);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (req.schema) {
|
|
113
|
+
// Structured unit: ask for the documented JSON envelope so the result
|
|
114
|
+
// extractor can pull the final message + session id deterministically.
|
|
115
|
+
args.push("--output-format", "json");
|
|
116
|
+
}
|
|
117
|
+
args.push("-p", buildPromptPayload(req));
|
|
118
|
+
return { argv: [profile.bin, ...args] };
|
|
119
|
+
},
|
|
120
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* Gemini CLI harness (P2 integration, plan §"The adapter contract").
|
|
6
|
+
*
|
|
7
|
+
* Per-harness barrel gathering the Gemini CLI integration surfaces:
|
|
8
|
+
* - agent command builder → ./agent-builder.ts (geminiBuilder)
|
|
9
|
+
* - result extractor → ./result-extractor.ts (geminiResultExtractor)
|
|
10
|
+
*
|
|
11
|
+
* It also defines {@link GeminiHarness}, the {@link AkmHarness} descriptor
|
|
12
|
+
* that `HARNESS_REGISTRY` registers. Dispatch-only: no native session-log
|
|
13
|
+
* reader or config importer yet.
|
|
14
|
+
*/
|
|
15
|
+
import { caps } from "../shared.js";
|
|
16
|
+
import { BaseHarness } from "../types.js";
|
|
17
|
+
import { geminiBuilder } from "./agent-builder.js";
|
|
18
|
+
import { geminiResultExtractor } from "./result-extractor.js";
|
|
19
|
+
export { GEMINI_PLATFORM, geminiBuilder } from "./agent-builder.js";
|
|
20
|
+
export { geminiResultExtractor } from "./result-extractor.js";
|
|
21
|
+
/**
|
|
22
|
+
* Gemini CLI.
|
|
23
|
+
*
|
|
24
|
+
* Canonical id is `'gemini'`; no alias or distinct runtime identity.
|
|
25
|
+
*/
|
|
26
|
+
export class GeminiHarness extends BaseHarness {
|
|
27
|
+
id = "gemini";
|
|
28
|
+
displayName = "Gemini CLI";
|
|
29
|
+
aliases = [];
|
|
30
|
+
agentBuilder = geminiBuilder;
|
|
31
|
+
resultExtractor = geminiResultExtractor;
|
|
32
|
+
// ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
|
|
33
|
+
// akm spawns the `gemini` CLI locally per unit ⇒ local-runner.
|
|
34
|
+
pattern = "local-runner";
|
|
35
|
+
// `--output-format json` emits a documented JSON envelope akm parses, then
|
|
36
|
+
// validates against the node schema ⇒ native-json tier.
|
|
37
|
+
structuredOutput = "native-json";
|
|
38
|
+
// The matrix's identity marker: Gemini CLI stamps GEMINI_CLI=1 only on
|
|
39
|
+
// processes it spawns, so it genuinely means "running under gemini" (it is
|
|
40
|
+
// not a user-profile config var) — but its VALUE ("1") is a bare flag, not
|
|
41
|
+
// a session id, so it is registered as `presenceEnv` (harness inference
|
|
42
|
+
// only), never `identityEnv` (whose values persist as agent_session_id).
|
|
43
|
+
presenceEnv = ["GEMINI_CLI"];
|
|
44
|
+
capabilities = caps({
|
|
45
|
+
agentDispatch: true,
|
|
46
|
+
detection: true,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
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
|
+
function isRecord(value) {
|
|
5
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Keys that may carry the final answer, in precedence order. `response` is
|
|
9
|
+
* Gemini's documented `--output-format json` envelope key.
|
|
10
|
+
*/
|
|
11
|
+
const TEXT_KEYS = ["response", "result", "text", "output", "content", "message"];
|
|
12
|
+
/** Keys that may carry the harness-native session id, in precedence order. */
|
|
13
|
+
const SESSION_KEYS = ["session_id", "sessionId", "conversation_id", "conversationId", "chat_id", "chatId"];
|
|
14
|
+
/**
|
|
15
|
+
* Coerce a candidate value into text. Handles the shapes Gemini nests
|
|
16
|
+
* answers in: bare strings, `{content|text}` wrappers (assistant message
|
|
17
|
+
* objects), and arrays of `{type:"text",text}` content blocks (Gemini API
|
|
18
|
+
* `parts`-style lists). Depth-bounded: JSON.parse output is acyclic, but
|
|
19
|
+
* nesting is capped anyway so a pathological envelope cannot recurse
|
|
20
|
+
* unboundedly.
|
|
21
|
+
*/
|
|
22
|
+
function textOf(value, depth = 0) {
|
|
23
|
+
if (depth > 4)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (typeof value === "string")
|
|
26
|
+
return value;
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
const parts = [];
|
|
29
|
+
for (const block of value) {
|
|
30
|
+
const t = textOf(block, depth + 1);
|
|
31
|
+
if (t)
|
|
32
|
+
parts.push(t);
|
|
33
|
+
}
|
|
34
|
+
return parts.length > 0 ? parts.join("\n") : undefined;
|
|
35
|
+
}
|
|
36
|
+
if (isRecord(value)) {
|
|
37
|
+
return textOf(value.content ?? value.text, depth + 1);
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
/** Extract the final-answer text from one parsed JSON value, if any. */
|
|
42
|
+
function extractText(value) {
|
|
43
|
+
if (typeof value === "string")
|
|
44
|
+
return value;
|
|
45
|
+
if (!isRecord(value))
|
|
46
|
+
return undefined;
|
|
47
|
+
for (const key of TEXT_KEYS) {
|
|
48
|
+
if (!(key in value))
|
|
49
|
+
continue;
|
|
50
|
+
const text = textOf(value[key]);
|
|
51
|
+
if (text !== undefined)
|
|
52
|
+
return text;
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
/** Extract a harness-native session id from one parsed JSON value, if any. */
|
|
57
|
+
function extractSessionId(value) {
|
|
58
|
+
if (!isRecord(value))
|
|
59
|
+
return undefined;
|
|
60
|
+
for (const key of SESSION_KEYS) {
|
|
61
|
+
const candidate = value[key];
|
|
62
|
+
if (typeof candidate === "string" && candidate.length > 0)
|
|
63
|
+
return candidate;
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
/** JSON.parse that returns undefined instead of throwing. */
|
|
68
|
+
function tryParseJson(raw) {
|
|
69
|
+
try {
|
|
70
|
+
return JSON.parse(raw);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Normalize a raw gemini run result into `{ text, sessionId? }`.
|
|
78
|
+
* See the module doc for the three stdout shapes handled.
|
|
79
|
+
*/
|
|
80
|
+
export const geminiResultExtractor = (result) => {
|
|
81
|
+
// The raw result's own sessionId (SDK-style paths) is the fallback; an id
|
|
82
|
+
// found in the output stream wins because it is fresher.
|
|
83
|
+
const fallbackSessionId = result.sessionId;
|
|
84
|
+
const raw = result.stdout.trim();
|
|
85
|
+
// Shape 1 — whole stdout is one JSON document (spawn may have pre-parsed
|
|
86
|
+
// it when the profile requested parseOutput: "json").
|
|
87
|
+
const whole = result.parsed !== undefined ? result.parsed : raw.length > 0 ? tryParseJson(raw) : undefined;
|
|
88
|
+
if (whole !== undefined) {
|
|
89
|
+
const sessionId = extractSessionId(whole) ?? fallbackSessionId;
|
|
90
|
+
// Unknown envelope (no recognized text key — includes the error-only
|
|
91
|
+
// variant): fall back to raw stdout so downstream embedded-JSON parsing
|
|
92
|
+
// and failure handling still have the full material to work with.
|
|
93
|
+
const text = extractText(whole) ?? raw;
|
|
94
|
+
return { text, ...(sessionId ? { sessionId } : {}) };
|
|
95
|
+
}
|
|
96
|
+
// Shape 2 — JSONL event stream: last text-bearing event wins; first
|
|
97
|
+
// session-id-bearing event supplies the id. Non-JSON lines are banner
|
|
98
|
+
// noise and are skipped.
|
|
99
|
+
let lastText;
|
|
100
|
+
let streamSessionId;
|
|
101
|
+
let sawJsonLine = false;
|
|
102
|
+
for (const line of raw.split("\n")) {
|
|
103
|
+
const trimmed = line.trim();
|
|
104
|
+
if (trimmed.length === 0)
|
|
105
|
+
continue;
|
|
106
|
+
const event = tryParseJson(trimmed);
|
|
107
|
+
if (event === undefined)
|
|
108
|
+
continue;
|
|
109
|
+
sawJsonLine = true;
|
|
110
|
+
streamSessionId ??= extractSessionId(event);
|
|
111
|
+
const text = extractText(event);
|
|
112
|
+
if (text !== undefined)
|
|
113
|
+
lastText = text;
|
|
114
|
+
}
|
|
115
|
+
if (sawJsonLine) {
|
|
116
|
+
const sessionId = streamSessionId ?? fallbackSessionId;
|
|
117
|
+
return { text: lastText ?? raw, ...(sessionId ? { sessionId } : {}) };
|
|
118
|
+
}
|
|
119
|
+
// Shape 3 — plain text passthrough.
|
|
120
|
+
return { text: raw, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
|
|
121
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
export const HARNESS_ID_TABLE = [
|
|
5
|
+
{ id: "opencode", agentDispatch: true },
|
|
6
|
+
{ id: "claude", agentDispatch: true },
|
|
7
|
+
{ id: "opencode-sdk", agentDispatch: true },
|
|
8
|
+
{ id: "codex", agentDispatch: true },
|
|
9
|
+
{ id: "copilot", agentDispatch: true },
|
|
10
|
+
{ id: "pi", agentDispatch: true },
|
|
11
|
+
{ id: "gemini", agentDispatch: true },
|
|
12
|
+
{ id: "aider", agentDispatch: true },
|
|
13
|
+
{ id: "amazonq", agentDispatch: true },
|
|
14
|
+
{ id: "openhands", agentDispatch: true },
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Canonical, ordered list of valid harness / platform ids — the
|
|
18
|
+
* dependency-free counterpart of `./index.ts`'s `VALID_HARNESS_IDS` (which
|
|
19
|
+
* remains the barrel's own derivation for its own consumers). Both are
|
|
20
|
+
* asserted equal at `HARNESS_REGISTRY` construction time.
|
|
21
|
+
*/
|
|
22
|
+
export const VALID_HARNESS_IDS = Object.freeze(HARNESS_ID_TABLE.map((h) => h.id));
|
|
23
|
+
/** Harness ids whose `capabilities.agentDispatch` is `true`. */
|
|
24
|
+
export const HARNESS_AGENT_DISPATCH_IDS = new Set(HARNESS_ID_TABLE.filter((h) => h.agentDispatch).map((h) => h.id));
|
|
@@ -12,14 +12,26 @@
|
|
|
12
12
|
* This module is a dependency-graph LEAF: it imports nothing from
|
|
13
13
|
* `core/config`. `core/config/config-types.ts` derives `VALID_HARNESS_IDS`
|
|
14
14
|
* from here, which keeps the import direction acyclic (config ← harnesses).
|
|
15
|
-
*
|
|
16
|
-
* Implementations (session-log readers, agent profiles) are migrated under each
|
|
17
|
-
* harness in #563/#564; this step only owns ids + capability membership and
|
|
18
|
-
* wires the existing call sites to consult it (behaviour-preserving).
|
|
19
15
|
*/
|
|
16
|
+
import { AiderHarness } from "./aider/index.js";
|
|
17
|
+
import { AmazonqHarness } from "./amazonq/index.js";
|
|
20
18
|
import { ClaudeHarness } from "./claude/index.js";
|
|
19
|
+
import { CodexHarness } from "./codex/index.js";
|
|
20
|
+
import { CopilotHarness } from "./copilot/index.js";
|
|
21
|
+
import { GeminiHarness } from "./gemini/index.js";
|
|
22
|
+
import { HARNESS_ID_TABLE } from "./ids.js";
|
|
21
23
|
import { OpencodeHarness } from "./opencode/index.js";
|
|
22
|
-
|
|
24
|
+
// Import the descriptor from its LEAF module, not the per-harness barrel: the
|
|
25
|
+
// barrel re-exports `./sdk-runner` (which imports `core/config`, and
|
|
26
|
+
// `core/config/config-types` derives `VALID_HARNESS_IDS` back from this file).
|
|
27
|
+
// Importing the class through the barrel would form an initialization cycle
|
|
28
|
+
// that throws a TDZ error when the barrel is the first module loaded in a fresh
|
|
29
|
+
// graph (see ./opencode-sdk/harness.ts). This keeps the registry a config-leaf.
|
|
30
|
+
import { OpencodeSdkHarness } from "./opencode-sdk/harness.js";
|
|
31
|
+
import { OpenhandsHarness } from "./openhands/index.js";
|
|
32
|
+
import { PiHarness } from "./pi/index.js";
|
|
33
|
+
import { isSessionLogHarness } from "./types.js";
|
|
34
|
+
export { isSessionLogHarness } from "./types.js";
|
|
23
35
|
// Each harness descriptor (ClaudeHarness, OpencodeHarness, OpencodeSdkHarness)
|
|
24
36
|
// lives in its own per-harness directory alongside that harness's session-log
|
|
25
37
|
// reader, agent builder, config importer, and/or SDK runner (#563/#564). They
|
|
@@ -33,14 +45,40 @@ import { OpencodeSdkHarness } from "./opencode-sdk/index.js";
|
|
|
33
45
|
* `z.enum(...)`, and the `platform` union all need the literal types.
|
|
34
46
|
*/
|
|
35
47
|
// Order is significant: VALID_HARNESS_IDS derives from this array and feeds the
|
|
36
|
-
// committed JSON-schema enum order.
|
|
37
|
-
//
|
|
38
|
-
//
|
|
48
|
+
// committed JSON-schema enum order. The original [opencode, claude,
|
|
49
|
+
// opencode-sdk] prefix is preserved so the pre-unification portion of the
|
|
50
|
+
// generated schema enum does not reorder; the seven P2 harness adapters are
|
|
51
|
+
// appended after it, which extends the enum additively (schemas/akm-config.json
|
|
52
|
+
// is regenerated in lockstep).
|
|
39
53
|
export const HARNESS_REGISTRY = Object.freeze([
|
|
40
54
|
new OpencodeHarness(),
|
|
41
55
|
new ClaudeHarness(),
|
|
42
56
|
new OpencodeSdkHarness(),
|
|
57
|
+
new CodexHarness(),
|
|
58
|
+
new CopilotHarness(),
|
|
59
|
+
new PiHarness(),
|
|
60
|
+
new GeminiHarness(),
|
|
61
|
+
new AiderHarness(),
|
|
62
|
+
new AmazonqHarness(),
|
|
63
|
+
new OpenhandsHarness(),
|
|
43
64
|
]);
|
|
65
|
+
// Construction-time drift guard (WI-9.8 KILL 3, D.3 edge B): ./ids.ts's
|
|
66
|
+
// HARNESS_ID_TABLE is config's dependency-free mirror of (id, agentDispatch)
|
|
67
|
+
// for every registered harness, kept out of core/config's import graph so
|
|
68
|
+
// config doesn't have to import this (heavier) barrel. Assert they match so
|
|
69
|
+
// the mirror can never silently drift — a new/reordered/recapability'd
|
|
70
|
+
// harness that forgets to update ./ids.ts fails loudly here instead of
|
|
71
|
+
// quietly breaking config's platform validation.
|
|
72
|
+
if (HARNESS_REGISTRY.length !== HARNESS_ID_TABLE.length) {
|
|
73
|
+
throw new Error(`harnesses/ids.ts HARNESS_ID_TABLE has ${HARNESS_ID_TABLE.length} entries but HARNESS_REGISTRY has ${HARNESS_REGISTRY.length} — update ids.ts to match.`);
|
|
74
|
+
}
|
|
75
|
+
HARNESS_REGISTRY.forEach((h, i) => {
|
|
76
|
+
const expected = HARNESS_ID_TABLE[i];
|
|
77
|
+
if (!expected || expected.id !== h.id || expected.agentDispatch !== h.capabilities.agentDispatch) {
|
|
78
|
+
throw new Error(`harnesses/ids.ts HARNESS_ID_TABLE[${i}] (${expected?.id ?? "<missing>"}, agentDispatch=${expected?.agentDispatch}) ` +
|
|
79
|
+
`does not match HARNESS_REGISTRY[${i}] (${h.id}, agentDispatch=${h.capabilities.agentDispatch}) — update ids.ts to match.`);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
44
82
|
/** Lookup by canonical id. */
|
|
45
83
|
export const HARNESS_BY_ID = new Map(HARNESS_REGISTRY.map((h) => [h.id, h]));
|
|
46
84
|
/**
|
|
@@ -60,12 +98,17 @@ const HARNESS_BY_ANY_ID = (() => {
|
|
|
60
98
|
})();
|
|
61
99
|
/**
|
|
62
100
|
* Canonical, ordered list of valid harness / platform ids. The Zod
|
|
63
|
-
* `AgentPlatformSchema` enum, the
|
|
101
|
+
* `AgentPlatformSchema` enum, the agent-engine platform union, and
|
|
64
102
|
* setup's `DetectedHarness` union all derive from this so they cannot drift.
|
|
65
103
|
*/
|
|
66
104
|
export const VALID_HARNESS_IDS = Object.freeze(HARNESS_REGISTRY.map((h) => h.id));
|
|
67
|
-
/**
|
|
68
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Harnesses that expose readable native session logs. Narrowed via the
|
|
107
|
+
* {@link isSessionLogHarness} type-predicate (rather than a plain boolean
|
|
108
|
+
* callback) so `sessionLogProvider` is known-present on every element — see
|
|
109
|
+
* that function's doc comment for why a plain predicate doesn't narrow here.
|
|
110
|
+
*/
|
|
111
|
+
export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter(isSessionLogHarness);
|
|
69
112
|
/** Harnesses that can be dispatched as an agent CLI / SDK. */
|
|
70
113
|
export const AGENT_DISPATCH_HARNESSES = HARNESS_REGISTRY.filter((h) => h.capabilities.agentDispatch);
|
|
71
114
|
/** Harnesses that can import an existing harness config into akm. */
|
|
@@ -90,29 +133,6 @@ export function getHarness(id) {
|
|
|
90
133
|
export function normalizeHarnessId(id) {
|
|
91
134
|
return HARNESS_BY_ANY_ID.get(id)?.id ?? id;
|
|
92
135
|
}
|
|
93
|
-
/**
|
|
94
|
-
* Resolve a legacy v1 agent-profile name to its v2 platform id (#566).
|
|
95
|
-
*
|
|
96
|
-
* v1 agent profiles never carried an explicit `platform`; it had to be inferred
|
|
97
|
-
* from the profile name. This is the SINGLE registry-backed resolver that
|
|
98
|
-
* replaces both the old standalone `guessAgentPlatform()` in config-migration
|
|
99
|
-
* and the `name.includes("claude") ? "claude" : "opencode"` heuristic in setup.
|
|
100
|
-
* Each harness owns its own `matchesV1ProfileName()`; an unknown name matches no
|
|
101
|
-
* harness and returns `undefined`, so the caller drops it instead of silently
|
|
102
|
-
* defaulting to `'opencode'`.
|
|
103
|
-
*
|
|
104
|
-
* Harnesses are consulted most-specific-id-first (longest id wins) so a
|
|
105
|
-
* decorated name like `"opencode-sdk-fast"` resolves to `'opencode-sdk'` rather
|
|
106
|
-
* than being over-matched by OpenCode's `"opencode"` prefix.
|
|
107
|
-
*/
|
|
108
|
-
const V1_RESOLUTION_ORDER = [...HARNESS_REGISTRY].sort((a, b) => b.id.length - a.id.length);
|
|
109
|
-
export function v1ProfilePlatform(name) {
|
|
110
|
-
for (const h of V1_RESOLUTION_ORDER) {
|
|
111
|
-
if (h.matchesV1ProfileName(name))
|
|
112
|
-
return h.id;
|
|
113
|
-
}
|
|
114
|
-
return undefined;
|
|
115
|
-
}
|
|
116
136
|
/**
|
|
117
137
|
* Default agent-profile name for a detected harness id (#566).
|
|
118
138
|
*
|
|
@@ -14,8 +14,7 @@
|
|
|
14
14
|
* pre-migration `opencodeBuilder`. The builder's `platform` stays `'opencode'`
|
|
15
15
|
* (the canonical harness id).
|
|
16
16
|
*/
|
|
17
|
-
import { assertNotFlag } from "../../agent/builder-shared.js";
|
|
18
|
-
import { resolveModel } from "../../agent/model-aliases.js";
|
|
17
|
+
import { assertNotFlag, resolveDispatchModel } from "../../agent/builder-shared.js";
|
|
19
18
|
/**
|
|
20
19
|
* OpenCode builder.
|
|
21
20
|
* Command shape: opencode run [--system-prompt "..."] [--model <m>] "<prompt>"
|
|
@@ -28,13 +27,32 @@ export const opencodeBuilder = {
|
|
|
28
27
|
build(profile, req) {
|
|
29
28
|
assertNotFlag(req.systemPrompt, "systemPrompt");
|
|
30
29
|
assertNotFlag(req.model, "model");
|
|
31
|
-
|
|
30
|
+
let configuredModel;
|
|
31
|
+
const args = req.model ? [] : [...profile.args];
|
|
32
|
+
if (req.model) {
|
|
33
|
+
for (let index = 0; index < profile.args.length; index += 1) {
|
|
34
|
+
const arg = profile.args[index];
|
|
35
|
+
if (arg === undefined)
|
|
36
|
+
continue;
|
|
37
|
+
if (arg === "--model") {
|
|
38
|
+
configuredModel = profile.args[index + 1];
|
|
39
|
+
index += 1;
|
|
40
|
+
}
|
|
41
|
+
else if (arg.startsWith("--model=")) {
|
|
42
|
+
configuredModel = arg.slice("--model=".length);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
args.push(arg);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
32
49
|
if (req.systemPrompt) {
|
|
33
50
|
args.push("--system-prompt", req.systemPrompt);
|
|
34
51
|
}
|
|
35
52
|
if (req.model) {
|
|
36
|
-
const resolved =
|
|
37
|
-
|
|
53
|
+
const resolved = resolveDispatchModel(req, profile, "opencode");
|
|
54
|
+
const provider = configuredModel?.split("/", 1)[0];
|
|
55
|
+
args.push("--model", provider && !resolved.includes("/") ? `${provider}/${resolved}` : resolved);
|
|
38
56
|
}
|
|
39
57
|
args.push("--");
|
|
40
58
|
args.push(req.prompt);
|
|
@@ -15,9 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import fs from "node:fs";
|
|
17
17
|
import path from "node:path";
|
|
18
|
-
|
|
19
|
-
return process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
20
|
-
}
|
|
18
|
+
import { homeDir } from "../shared.js";
|
|
21
19
|
/**
|
|
22
20
|
* Imports LLM config from an OpenCode installation.
|
|
23
21
|
*
|
|
@@ -1,38 +1,13 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
|
|
5
|
-
* OpenCode harness (#564).
|
|
6
|
-
*
|
|
7
|
-
* Per-harness barrel that gathers the OpenCode integration surfaces previously
|
|
8
|
-
* scattered across the codebase:
|
|
9
|
-
* - session-log reader → ./session-log.ts (OpenCodeProvider)
|
|
10
|
-
* - agent command builder → ./agent-builder.ts (opencodeBuilder)
|
|
11
|
-
* - config importer → ./config-import.ts (openCodeImporter)
|
|
12
|
-
*
|
|
13
|
-
* It also defines {@link OpencodeHarness}, the {@link AkmHarness} descriptor
|
|
14
|
-
* that `HARNESS_REGISTRY` registers.
|
|
15
|
-
*
|
|
16
|
-
* id normalization: OpenCode's canonical id (`'opencode'`) is also its runtime
|
|
17
|
-
* identity and session-log provider name — there is no historical split (unlike
|
|
18
|
-
* Claude Code's 'claude' vs 'claude-code'), so no alias bridge is needed.
|
|
19
|
-
*/
|
|
4
|
+
import { caps } from "../shared.js";
|
|
20
5
|
import { BaseHarness } from "../types.js";
|
|
21
6
|
import { opencodeBuilder } from "./agent-builder.js";
|
|
7
|
+
import { OpenCodeProvider } from "./session-log.js";
|
|
22
8
|
export { opencodeBuilder } from "./agent-builder.js";
|
|
23
9
|
export { openCodeImporter } from "./config-import.js";
|
|
24
10
|
export { OpenCodeProvider } from "./session-log.js";
|
|
25
|
-
function caps(c) {
|
|
26
|
-
return {
|
|
27
|
-
sessionLogs: false,
|
|
28
|
-
agentDispatch: false,
|
|
29
|
-
detection: false,
|
|
30
|
-
configImport: false,
|
|
31
|
-
runtimeIdentity: false,
|
|
32
|
-
v1Migration: false,
|
|
33
|
-
...c,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
11
|
/**
|
|
37
12
|
* OpenCode.
|
|
38
13
|
*
|
|
@@ -45,17 +20,24 @@ export class OpencodeHarness extends BaseHarness {
|
|
|
45
20
|
// Home-relative config dir scanned by `akm setup` (#567). OpenCode has a
|
|
46
21
|
// session-log provider, so offering it as a stash source is functional.
|
|
47
22
|
setupDetectionDir = ".config/opencode";
|
|
48
|
-
// Decorated v1 profile names like "opencode-fast" still belong to OpenCode.
|
|
49
|
-
// `v1ProfilePlatform()` resolves most-specific-id-first, so "opencode-sdk-*"
|
|
50
|
-
// is claimed by OpencodeSdkHarness before this prefix can over-match it.
|
|
51
|
-
v1ProfilePrefixes = ["opencode"];
|
|
52
23
|
agentBuilder = opencodeBuilder;
|
|
24
|
+
// ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
|
|
25
|
+
// This entry is the CLI spawn path (`opencode run …`): akm launches the
|
|
26
|
+
// harness locally per unit ⇒ local-runner. (The SDK path is the separate
|
|
27
|
+
// `opencode-sdk` harness.)
|
|
28
|
+
pattern = "local-runner";
|
|
29
|
+
// The CLI path emits plain text — no JSON stream akm consumes — so the
|
|
30
|
+
// engine uses the prompt-injected schema + embedded-JSON extraction tier
|
|
31
|
+
// (the matrix's "via prompt+validate"). The SDK entry is native-json.
|
|
32
|
+
structuredOutput = "none";
|
|
33
|
+
// Session-id env marker for run attribution.
|
|
34
|
+
identityEnv = ["OPENCODE_SESSION_ID"];
|
|
35
|
+
sessionLogProvider = () => new OpenCodeProvider();
|
|
53
36
|
capabilities = caps({
|
|
54
37
|
sessionLogs: true,
|
|
55
38
|
agentDispatch: true,
|
|
56
39
|
detection: true,
|
|
57
40
|
configImport: true,
|
|
58
41
|
runtimeIdentity: true,
|
|
59
|
-
v1Migration: true,
|
|
60
42
|
});
|
|
61
43
|
}
|