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
|
@@ -8,10 +8,8 @@
|
|
|
8
8
|
* one heuristic. The public `*Matcher` exports compose those facts into the
|
|
9
9
|
* `MatchResult` shape expected by the rest of the indexer.
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { looksLikeWorkflow } from "../../workflows/parser.js";
|
|
14
|
-
import { registerMatcher } from "./file-context.js";
|
|
11
|
+
import { SCRIPT_EXTENSIONS } from "../../core/recognition-util.js";
|
|
12
|
+
import { presentationFor } from "../../core/type-presentation.js";
|
|
15
13
|
// ---------------------------------------------------------------------------
|
|
16
14
|
// Private data
|
|
17
15
|
// ---------------------------------------------------------------------------
|
|
@@ -36,6 +34,18 @@ const DIR_TYPE_MAP = [
|
|
|
36
34
|
type: "knowledge",
|
|
37
35
|
test: (ext) => ext === ".md",
|
|
38
36
|
},
|
|
37
|
+
{
|
|
38
|
+
// R-045 / Q-18 second half (owner ruling 11) — stash-resident `instruction`
|
|
39
|
+
// assets live under `instructions/`, mirroring the `knowledge` rule. This
|
|
40
|
+
// is a walker discovery rule for FILES ON DISK under a stash's
|
|
41
|
+
// `instructions/` dir; it is unrelated to the adapter-emitted root
|
|
42
|
+
// CLAUDE.md/AGENTS.md instruction docs (`tool-dir-shared.ts`), which are
|
|
43
|
+
// synthesized by format-family adapters, carry `ownsPresentation: true`,
|
|
44
|
+
// and never pass through this matcher at all.
|
|
45
|
+
dir: "instructions",
|
|
46
|
+
type: "instruction",
|
|
47
|
+
test: (ext) => ext === ".md",
|
|
48
|
+
},
|
|
39
49
|
{
|
|
40
50
|
dir: "workflows",
|
|
41
51
|
type: "workflow",
|
|
@@ -67,7 +77,10 @@ const DIR_TYPE_MAP = [
|
|
|
67
77
|
{
|
|
68
78
|
dir: "tasks",
|
|
69
79
|
type: "task",
|
|
70
|
-
|
|
80
|
+
// Tasks migrated from `.md` to `.yml` in 0.8.0 (commit 031c659f updated
|
|
81
|
+
// the placement specs, renderers, and the task-linter, but missed this
|
|
82
|
+
// matcher — tasks/*.yml were unrecognized until this fix).
|
|
83
|
+
test: (ext) => ext === ".yml",
|
|
71
84
|
},
|
|
72
85
|
{
|
|
73
86
|
// #561 — agent session assets live under `sessions/<harness>/<id>.md`.
|
|
@@ -98,6 +111,9 @@ const TYPED_DIR_DOC_FILES = new Set(["readme.md"]);
|
|
|
98
111
|
function isTypedDirDocFile(fileName) {
|
|
99
112
|
return TYPED_DIR_DOC_FILES.has(fileName.toLowerCase());
|
|
100
113
|
}
|
|
114
|
+
function isNestedSkillResource(ctx) {
|
|
115
|
+
return ctx.ancestorDirs[0] === "skills" && ctx.ancestorDirs.length > 1 && ctx.fileName !== "SKILL.md";
|
|
116
|
+
}
|
|
101
117
|
// ---------------------------------------------------------------------------
|
|
102
118
|
// Private helpers
|
|
103
119
|
// ---------------------------------------------------------------------------
|
|
@@ -119,7 +135,7 @@ function matchDirectoryHint(dirName, ctx, specificity) {
|
|
|
119
135
|
return null;
|
|
120
136
|
}
|
|
121
137
|
function classifyByExtension(ctx) {
|
|
122
|
-
if (ctx.fileName === "SKILL.md"
|
|
138
|
+
if (ctx.fileName === "SKILL.md") {
|
|
123
139
|
return { type: "skill", specificity: 25 };
|
|
124
140
|
}
|
|
125
141
|
if (SCRIPT_EXTENSIONS.has(ctx.ext)) {
|
|
@@ -128,6 +144,8 @@ function classifyByExtension(ctx) {
|
|
|
128
144
|
return null;
|
|
129
145
|
}
|
|
130
146
|
function classifyByDirectory(ctx) {
|
|
147
|
+
if (isNestedSkillResource(ctx))
|
|
148
|
+
return null;
|
|
131
149
|
for (const dir of ctx.ancestorDirs) {
|
|
132
150
|
const result = matchDirectoryHint(dir, ctx, 10);
|
|
133
151
|
if (result)
|
|
@@ -137,6 +155,8 @@ function classifyByDirectory(ctx) {
|
|
|
137
155
|
}
|
|
138
156
|
function classifyByParentDirHint(ctx) {
|
|
139
157
|
const { parentDir, ext, fileName } = ctx;
|
|
158
|
+
if (isNestedSkillResource(ctx))
|
|
159
|
+
return null;
|
|
140
160
|
if (parentDir === "skills" && (fileName === "SKILL.md" || ext === ".md")) {
|
|
141
161
|
return { type: "skill", specificity: 15 };
|
|
142
162
|
}
|
|
@@ -158,10 +178,15 @@ function classifyBySmartMd(ctx) {
|
|
|
158
178
|
return { type: "knowledge", specificity: 5 };
|
|
159
179
|
}
|
|
160
180
|
const body = ctx.content();
|
|
161
|
-
|
|
181
|
+
const fm = ctx.frontmatter();
|
|
182
|
+
// Recognition is frontmatter `type: workflow` or residence under `workflows/`
|
|
183
|
+
// (workflow-format-unification, spec §2.5) — no content sniffing. The
|
|
184
|
+
// directory rule is `classifyByDirectory`/`classifyByParentDirHint`'s job;
|
|
185
|
+
// this only catches a workflow living OUTSIDE `workflows/` that still
|
|
186
|
+
// declares its type explicitly.
|
|
187
|
+
if (fm && fm.type === "workflow") {
|
|
162
188
|
return { type: "workflow", specificity: 19 };
|
|
163
189
|
}
|
|
164
|
-
const fm = ctx.frontmatter();
|
|
165
190
|
if (fm) {
|
|
166
191
|
if ("toolPolicy" in fm || "tools" in fm) {
|
|
167
192
|
return { type: "agent", specificity: 20 };
|
|
@@ -178,16 +203,6 @@ function classifyBySmartMd(ctx) {
|
|
|
178
203
|
}
|
|
179
204
|
return { type: "knowledge", specificity: 5 };
|
|
180
205
|
}
|
|
181
|
-
function classifyByWiki(ctx) {
|
|
182
|
-
if (ctx.ext !== ".md")
|
|
183
|
-
return null;
|
|
184
|
-
const idx = ctx.ancestorDirs.indexOf("wikis");
|
|
185
|
-
if (idx < 0)
|
|
186
|
-
return null;
|
|
187
|
-
if (idx + 1 >= ctx.ancestorDirs.length)
|
|
188
|
-
return null;
|
|
189
|
-
return { type: "wiki", specificity: 20 };
|
|
190
|
-
}
|
|
191
206
|
// ---------------------------------------------------------------------------
|
|
192
207
|
// Adapter: MatchFact → MatchResult
|
|
193
208
|
// ---------------------------------------------------------------------------
|
|
@@ -195,7 +210,10 @@ function toMatchResult(ctx, classify) {
|
|
|
195
210
|
const fact = classify(ctx);
|
|
196
211
|
if (!fact)
|
|
197
212
|
return null;
|
|
198
|
-
|
|
213
|
+
// Renderer name resolved via TYPE_PRESENTATION (core leaf), so matchers.ts
|
|
214
|
+
// carries no edge into the taxonomy SCC (chunk-3 cutover enabler).
|
|
215
|
+
// TYPE_PRESENTATION.renderer is the single source of truth for renderer names.
|
|
216
|
+
const renderer = presentationFor(fact.type).renderer;
|
|
199
217
|
if (!renderer)
|
|
200
218
|
return null;
|
|
201
219
|
return {
|
|
@@ -220,18 +238,8 @@ export function parentDirHintMatcher(ctx) {
|
|
|
220
238
|
export function smartMdMatcher(ctx) {
|
|
221
239
|
return toMatchResult(ctx, classifyBySmartMd);
|
|
222
240
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
directoryMatcher,
|
|
229
|
-
parentDirHintMatcher,
|
|
230
|
-
smartMdMatcher,
|
|
231
|
-
wikiMatcher,
|
|
232
|
-
];
|
|
233
|
-
export function registerBuiltinMatchers() {
|
|
234
|
-
for (const matcher of builtinMatchers) {
|
|
235
|
-
registerMatcher(matcher);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
241
|
+
// The four matcher functions above are consumed directly by the akm adapter's
|
|
242
|
+
// synchronous `recognizeMatch()` (`core/adapter/adapters/akm-adapter.ts`, which
|
|
243
|
+
// holds the same registration-order array for tie-breaking). The chunk-3 cutover
|
|
244
|
+
// removed the file-context matcher registry, so there is no `registerBuiltinMatchers`
|
|
245
|
+
// glue any more — recognition is adapter-driven, not registry-driven.
|
|
@@ -3,19 +3,25 @@
|
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { assetPathForName, stashDirFor } from "../../core/asset/asset-placement.js";
|
|
7
|
+
import { parseRefInput } from "../../core/asset/resolve-ref.js";
|
|
8
8
|
import { isWithin } from "../../core/common.js";
|
|
9
9
|
import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
|
|
10
10
|
import { lookup } from "../indexer.js";
|
|
11
11
|
import { resolveSourceEntries } from "../search/search-source.js";
|
|
12
12
|
function normalizeRef(ref) {
|
|
13
|
-
|
|
13
|
+
// String inputs use the current `[bundle//]conceptId` grammar.
|
|
14
|
+
return typeof ref === "string" ? parseRefInput(ref) : ref;
|
|
14
15
|
}
|
|
15
16
|
function buildDiskCandidates(sourcePath, ref, preserveDirectNameFallback) {
|
|
16
|
-
const
|
|
17
|
+
const placementStashDir = stashDirFor(ref.type);
|
|
18
|
+
// Opaque adapter conceptIds are index-resolved. Core cannot infer their
|
|
19
|
+
// adapter-owned serialization or path extension before indexing.
|
|
20
|
+
if (placementStashDir === undefined)
|
|
21
|
+
return [];
|
|
22
|
+
const typeDir = path.join(sourcePath, placementStashDir);
|
|
17
23
|
const candidates = [
|
|
18
|
-
|
|
24
|
+
assetPathForName(ref.type, typeDir, ref.name),
|
|
19
25
|
path.join(sourcePath, ref.type, `${ref.name}.md`),
|
|
20
26
|
path.join(sourcePath, ref.type, ref.name),
|
|
21
27
|
];
|
|
@@ -10,10 +10,11 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import fs from "node:fs";
|
|
12
12
|
import path from "node:path";
|
|
13
|
-
import { isRelevantAssetFile } from "../../core/asset/asset-
|
|
13
|
+
import { isRelevantAssetFile } from "../../core/asset/asset-placement.js";
|
|
14
14
|
import { spawnSync } from "../../runtime.js";
|
|
15
15
|
import { buildFileContext } from "./file-context.js";
|
|
16
|
-
const
|
|
16
|
+
const ALWAYS_SKIP_DIRS = new Set([".git"]);
|
|
17
|
+
const AKM_SKIP_DIRS = new Set(["node_modules", "bin", ".cache"]);
|
|
17
18
|
/**
|
|
18
19
|
* Walk a type root directory and return files grouped by their parent directory.
|
|
19
20
|
*
|
|
@@ -60,23 +61,26 @@ export function walkStash(typeRoot, assetType) {
|
|
|
60
61
|
*
|
|
61
62
|
* If the directory is a git repo, uses `git ls-files` to respect .gitignore.
|
|
62
63
|
* Otherwise falls back to a manual walk that skips .git, node_modules, bin,
|
|
63
|
-
* .cache, dot-directories, and
|
|
64
|
+
* .cache, dot-directories, and the legacy metadata sidecar.
|
|
64
65
|
*/
|
|
65
|
-
export function walkStashFlat(stashRoot) {
|
|
66
|
+
export function walkStashFlat(stashRoot, options = {}) {
|
|
67
|
+
return walkStashFlatWithStatus(stashRoot, options).files;
|
|
68
|
+
}
|
|
69
|
+
export function walkStashFlatWithStatus(stashRoot, options = {}) {
|
|
66
70
|
if (!fs.existsSync(stashRoot))
|
|
67
|
-
return [];
|
|
71
|
+
return { files: [], complete: false };
|
|
68
72
|
// Try git-based walk first (respects .gitignore)
|
|
69
|
-
const gitResult = walkStashGit(stashRoot);
|
|
73
|
+
const gitResult = walkStashGit(stashRoot, options);
|
|
70
74
|
if (gitResult)
|
|
71
75
|
return gitResult;
|
|
72
76
|
// Fallback: manual walk
|
|
73
|
-
return walkStashManual(stashRoot);
|
|
77
|
+
return walkStashManual(stashRoot, options);
|
|
74
78
|
}
|
|
75
79
|
/**
|
|
76
80
|
* Walk using `git ls-files` to respect .gitignore.
|
|
77
81
|
* Returns null if the directory is not a git repo or git fails.
|
|
78
82
|
*/
|
|
79
|
-
function walkStashGit(stashRoot) {
|
|
83
|
+
function walkStashGit(stashRoot, options) {
|
|
80
84
|
// Quick check: is this a git repo? Look for .git in this dir or parents.
|
|
81
85
|
if (!isInsideGitRepo(stashRoot))
|
|
82
86
|
return null;
|
|
@@ -87,21 +91,35 @@ function walkStashGit(stashRoot) {
|
|
|
87
91
|
// result.success is false if the process exited non-zero OR git was not found
|
|
88
92
|
if (!result.success)
|
|
89
93
|
return null;
|
|
94
|
+
// `--cached` includes tracked files deleted from the worktree. They are not
|
|
95
|
+
// scan failures and must not make an otherwise complete snapshot look stale.
|
|
96
|
+
const deletedResult = spawnSync(["git", "ls-files", "--deleted", "-z", "--", "."], { cwd: stashRoot });
|
|
97
|
+
if (!deletedResult.success)
|
|
98
|
+
return null;
|
|
99
|
+
const deletedStdout = Buffer.isBuffer(deletedResult.stdout)
|
|
100
|
+
? deletedResult.stdout.toString("utf8")
|
|
101
|
+
: String(deletedResult.stdout ?? "");
|
|
102
|
+
const deletedFiles = new Set(deletedStdout.split("\0").filter(Boolean));
|
|
103
|
+
// Data-hygiene filename skips: the legacy metadata sidecar (never indexed as
|
|
104
|
+
// content — Chunk-8 folds it into the bundle format) plus git dot-files.
|
|
90
105
|
const SKIP_FILES = new Set([".stash.json", ".gitignore", ".gitattributes"]);
|
|
91
106
|
const stdout = Buffer.isBuffer(result.stdout) ? result.stdout.toString("utf8") : String(result.stdout ?? "");
|
|
92
107
|
const files = stdout
|
|
93
108
|
.split("\0")
|
|
94
109
|
.filter((f) => f.length > 0)
|
|
110
|
+
.filter((f) => !deletedFiles.has(f))
|
|
95
111
|
.filter((f) => !f.startsWith("..") && !path.isAbsolute(f))
|
|
96
112
|
.filter((f) => {
|
|
97
113
|
const dirParts = path
|
|
98
114
|
.dirname(f)
|
|
99
115
|
.split(/[\\/]+/)
|
|
100
116
|
.filter(Boolean);
|
|
101
|
-
return !dirParts.some((part) =>
|
|
117
|
+
return !dirParts.some((part) => ALWAYS_SKIP_DIRS.has(part) ||
|
|
118
|
+
(!options.includeAllDirectories && (AKM_SKIP_DIRS.has(part) || part.startsWith("."))));
|
|
102
119
|
})
|
|
103
120
|
.filter((f) => !SKIP_FILES.has(path.basename(f)));
|
|
104
121
|
const results = [];
|
|
122
|
+
let complete = true;
|
|
105
123
|
for (const relFile of files) {
|
|
106
124
|
const absPath = path.join(stashRoot, relFile);
|
|
107
125
|
try {
|
|
@@ -111,9 +129,10 @@ function walkStashGit(stashRoot) {
|
|
|
111
129
|
}
|
|
112
130
|
catch {
|
|
113
131
|
// File may have been deleted since git ls-files ran
|
|
132
|
+
complete = false;
|
|
114
133
|
}
|
|
115
134
|
}
|
|
116
|
-
return results;
|
|
135
|
+
return { files: results, complete };
|
|
117
136
|
}
|
|
118
137
|
/**
|
|
119
138
|
* Check if a directory is inside a git repository by walking up to find .git.
|
|
@@ -174,14 +193,22 @@ export function* walkMarkdownFiles(root) {
|
|
|
174
193
|
}
|
|
175
194
|
}
|
|
176
195
|
/** Manual walk for non-git directories. */
|
|
177
|
-
function walkStashManual(stashRoot) {
|
|
196
|
+
function walkStashManual(stashRoot, options) {
|
|
178
197
|
const results = [];
|
|
198
|
+
let complete = true;
|
|
179
199
|
const stack = [stashRoot];
|
|
180
200
|
while (stack.length > 0) {
|
|
181
201
|
const current = stack.pop();
|
|
182
202
|
if (!current)
|
|
183
203
|
continue;
|
|
184
|
-
|
|
204
|
+
let entries;
|
|
205
|
+
try {
|
|
206
|
+
entries = fs.readdirSync(current, { withFileTypes: true });
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
complete = false;
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
185
212
|
for (const entry of entries) {
|
|
186
213
|
if (entry.name === ".stash.json")
|
|
187
214
|
continue;
|
|
@@ -191,7 +218,8 @@ function walkStashManual(stashRoot) {
|
|
|
191
218
|
continue;
|
|
192
219
|
}
|
|
193
220
|
if (entry.isDirectory()) {
|
|
194
|
-
if (
|
|
221
|
+
if (ALWAYS_SKIP_DIRS.has(entry.name) ||
|
|
222
|
+
(!options.includeAllDirectories && (AKM_SKIP_DIRS.has(entry.name) || entry.name.startsWith("."))))
|
|
195
223
|
continue;
|
|
196
224
|
stack.push(fullPath);
|
|
197
225
|
}
|
|
@@ -200,5 +228,5 @@ function walkStashManual(stashRoot) {
|
|
|
200
228
|
}
|
|
201
229
|
}
|
|
202
230
|
}
|
|
203
|
-
return results;
|
|
231
|
+
return { files: results, complete };
|
|
204
232
|
}
|
|
@@ -14,6 +14,13 @@
|
|
|
14
14
|
* their previous home in `builders.ts`.
|
|
15
15
|
*/
|
|
16
16
|
import { UsageError } from "../../core/errors.js";
|
|
17
|
+
import { resolveModel } from "./model-aliases.js";
|
|
18
|
+
/** Resolve a raw dispatch model once, while preserving frozen/lowered models verbatim. */
|
|
19
|
+
export function resolveDispatchModel(request, profile, platform) {
|
|
20
|
+
if (!request.model || request.modelIsExact)
|
|
21
|
+
return request.model;
|
|
22
|
+
return resolveModel(request.model, platform, profile.modelAliases, profile.globalModelAliases);
|
|
23
|
+
}
|
|
17
24
|
/**
|
|
18
25
|
* Guard against values that start with `--`, which would be mis-interpreted as
|
|
19
26
|
* CLI flags by the spawned process when used as flag values (model, systemPrompt).
|
|
@@ -14,50 +14,11 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { ConfigError } from "../../core/errors.js";
|
|
16
16
|
import { HARNESS_REGISTRY } from "../harnesses/index.js";
|
|
17
|
-
// Types + shared validation helpers live in the leaf module `builder-shared.ts`
|
|
18
|
-
// so per-harness builders (harnesses/claude/agent-builder.ts) can depend on them
|
|
19
|
-
// without importing this file back — avoiding an init-order cycle through
|
|
20
|
-
// BUILTIN_BUILDERS (#563). Re-exported here so existing `agent/builders` import
|
|
21
|
-
// sites keep working.
|
|
22
|
-
import { assertNotFlag } from "./builder-shared.js";
|
|
23
|
-
import { resolveModel } from "./model-aliases.js";
|
|
24
|
-
import { getBuiltinAgentProfile } from "./profiles.js";
|
|
25
|
-
export { assertNotFlag, normalizeTools } from "./builder-shared.js";
|
|
26
|
-
// ── Platform builders ─────────────────────────────────────────────────────────
|
|
27
|
-
// The OpenCode builder was migrated to its harness directory in #564
|
|
28
|
-
// (`harnesses/opencode/agent-builder.ts`) and the Claude Code builder in #563
|
|
29
|
-
// (`harnesses/claude/agent-builder.ts`). Both are imported back into
|
|
30
|
-
// BUILTIN_BUILDERS below so platform routing is unchanged.
|
|
31
|
-
/**
|
|
32
|
-
* Default builder — used for custom profiles and any platform without a
|
|
33
|
-
* dedicated builder. Passes systemPrompt and model via the same flags as
|
|
34
|
-
* the builtin builders so custom profiles benefit from agent asset metadata.
|
|
35
|
-
* Tools are omitted — no standard cross-platform flag exists.
|
|
36
|
-
*/
|
|
37
|
-
const defaultBuilder = {
|
|
38
|
-
platform: "default",
|
|
39
|
-
build(profile, req) {
|
|
40
|
-
assertNotFlag(req.systemPrompt, "systemPrompt");
|
|
41
|
-
assertNotFlag(req.model, "model");
|
|
42
|
-
const args = [...profile.args];
|
|
43
|
-
if (req.systemPrompt) {
|
|
44
|
-
args.push("--system-prompt", req.systemPrompt);
|
|
45
|
-
}
|
|
46
|
-
if (req.model) {
|
|
47
|
-
const resolved = resolveModel(req.model, profile.name, profile.modelAliases, profile.globalModelAliases);
|
|
48
|
-
args.push("--model", resolved);
|
|
49
|
-
}
|
|
50
|
-
args.push("--");
|
|
51
|
-
args.push(req.prompt);
|
|
52
|
-
return { argv: [profile.bin, ...args] };
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
17
|
// ── Registry ──────────────────────────────────────────────────────────────────
|
|
56
18
|
/**
|
|
57
19
|
* DERIVED from `HARNESS_REGISTRY` (P0.5 registry-drift fix): each harness that
|
|
58
|
-
* owns an `agentBuilder` is registered under its canonical id
|
|
59
|
-
*
|
|
60
|
-
* hand-maintained map that could (and did) drift from the harness registry.
|
|
20
|
+
* owns an `agentBuilder` is registered under its canonical id. Named engines
|
|
21
|
+
* are schema-validated to canonical harness ids before reaching this boundary.
|
|
61
22
|
*/
|
|
62
23
|
const BUILTIN_BUILDERS = (() => {
|
|
63
24
|
const registry = {};
|
|
@@ -65,30 +26,18 @@ const BUILTIN_BUILDERS = (() => {
|
|
|
65
26
|
if (!harness.agentBuilder)
|
|
66
27
|
continue;
|
|
67
28
|
registry[harness.id] = harness.agentBuilder;
|
|
68
|
-
registry[`${harness.id}-headless`] = harness.agentBuilder;
|
|
69
|
-
for (const alias of harness.aliases)
|
|
70
|
-
registry[alias] = harness.agentBuilder;
|
|
71
29
|
}
|
|
72
30
|
return Object.freeze(registry);
|
|
73
31
|
})();
|
|
74
32
|
/**
|
|
75
33
|
* Return the builder for the given platform name.
|
|
76
34
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* contract for user-defined wrappers. A *known built-in agent CLI* with no
|
|
80
|
-
* dedicated builder (codex, gemini, aider + their `-headless` variants) is a
|
|
81
|
-
* loud `ConfigError` instead: the default flag shape is wrong for those CLIs
|
|
82
|
-
* (aider, for one, treats positionals as file names), so the old silent
|
|
83
|
-
* fallback produced a broken command that "ran" and failed downstream.
|
|
84
|
-
* Custom builders injected via tests can be passed as `registry`.
|
|
35
|
+
* Unknown platforms are rejected: there is no safe generic CLI flag shape.
|
|
36
|
+
* Custom builders injected by tests can be passed as `registry`.
|
|
85
37
|
*/
|
|
86
38
|
export function getCommandBuilder(platform, registry = BUILTIN_BUILDERS) {
|
|
87
39
|
const found = registry[platform];
|
|
88
40
|
if (found)
|
|
89
41
|
return found;
|
|
90
|
-
|
|
91
|
-
throw new ConfigError(`agent dispatch for "${platform}" is not supported yet: no command builder exists for this CLI, and the generic flag shape would produce a broken command.`, "INVALID_CONFIG_FILE", 'Use an "opencode" or "claude" profile, or — if your CLI is flag-compatible with one of those — set `profiles.agent.<name>.commandBuilder` to "opencode" or "claude".');
|
|
92
|
-
}
|
|
93
|
-
return defaultBuilder;
|
|
42
|
+
throw new ConfigError(`Agent platform "${platform}" has no registered command builder.`, "INVALID_CONFIG_FILE", "Select a canonical agent platform in engines.<name>.platform.");
|
|
94
43
|
}
|
|
@@ -1,147 +1,7 @@
|
|
|
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
|
-
import { BUILTIN_AGENT_PROFILE_NAMES, getBuiltinAgentProfile, listBuiltinAgentProfiles, } from "./profiles.js";
|
|
6
|
-
/**
|
|
7
|
-
* Default hard timeout for an agent CLI (60s — matches the value used in
|
|
8
|
-
* `docs/configuration.md`).
|
|
9
|
-
*/
|
|
4
|
+
/** Default hard timeout for an agent CLI when neither engine nor call overrides it. */
|
|
10
5
|
export const DEFAULT_AGENT_TIMEOUT_MS = 60_000;
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
* user override (`profiles.agent[name]`) on top of the built-in profile (if
|
|
14
|
-
* any). Returns `undefined` when neither yields a usable profile.
|
|
15
|
-
*/
|
|
16
|
-
export function resolveAgentProfile(name, overrides, globalModelAliases) {
|
|
17
|
-
const builtin = getBuiltinAgentProfile(name);
|
|
18
|
-
const platform = overrides?.platform;
|
|
19
|
-
// For opencode-sdk profiles, allow synthesizing without a built-in.
|
|
20
|
-
const sdkMode = platform === "opencode-sdk";
|
|
21
|
-
if (!builtin && !overrides?.bin && !sdkMode)
|
|
22
|
-
return undefined;
|
|
23
|
-
const base = builtin ??
|
|
24
|
-
{
|
|
25
|
-
name,
|
|
26
|
-
bin: overrides?.bin ?? name,
|
|
27
|
-
args: [],
|
|
28
|
-
stdio: "captured",
|
|
29
|
-
envPassthrough: [],
|
|
30
|
-
parseOutput: "text",
|
|
31
|
-
...(sdkMode ? { sdkMode: true } : {}),
|
|
32
|
-
};
|
|
33
|
-
if (!overrides) {
|
|
34
|
-
return globalModelAliases ? { ...base, globalModelAliases } : base;
|
|
35
|
-
}
|
|
36
|
-
// Per-profile aliases from config extend (and shadow) the built-in
|
|
37
|
-
// profile's own entries. (Previously always used base.modelAliases, so the
|
|
38
|
-
// documented `profiles.agent.<name>.modelAliases` config was silently
|
|
39
|
-
// dropped — same bug class as the timeoutMs override below.)
|
|
40
|
-
const modelAliases = overrides.modelAliases || base.modelAliases ? { ...base.modelAliases, ...overrides.modelAliases } : undefined;
|
|
41
|
-
return {
|
|
42
|
-
name,
|
|
43
|
-
bin: overrides.bin ?? base.bin,
|
|
44
|
-
args: overrides.args ?? base.args,
|
|
45
|
-
stdio: base.stdio,
|
|
46
|
-
env: base.env,
|
|
47
|
-
envPassthrough: base.envPassthrough,
|
|
48
|
-
// Honor a user-configured `profiles.agent.<name>.timeoutMs` override; fall
|
|
49
|
-
// back to the built-in profile's value. (Previously always used base, so
|
|
50
|
-
// the documented config override was silently ignored — callers had to pass
|
|
51
|
-
// a CLI flag like `--timeout-ms`.) runAgent (spawn.ts) reads profile.timeoutMs
|
|
52
|
-
// when no per-call timeout is supplied, so this makes the config knob work.
|
|
53
|
-
timeoutMs: overrides.timeoutMs ?? base.timeoutMs,
|
|
54
|
-
parseOutput: base.parseOutput,
|
|
55
|
-
...(sdkMode ? { sdkMode: true } : {}),
|
|
56
|
-
model: overrides.model ?? base.model,
|
|
57
|
-
endpoint: base.endpoint,
|
|
58
|
-
apiKey: base.apiKey,
|
|
59
|
-
commandBuilder: base.commandBuilder,
|
|
60
|
-
modelAliases,
|
|
61
|
-
...(globalModelAliases ? { globalModelAliases } : {}),
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Resolve the runnable profile for `name`, or `undefined` if none is
|
|
66
|
-
* available (no built-in and no user override). Threads the config-root
|
|
67
|
-
* `modelAliases` tier table onto the resolved profile.
|
|
68
|
-
*/
|
|
69
|
-
export function resolveProfileFromConfig(name, config) {
|
|
70
|
-
return resolveAgentProfile(name, config?.profiles?.agent?.[name], config?.modelAliases);
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Return the names of every agent profile available in `config` — built-ins
|
|
74
|
-
* plus any user-defined entries under `profiles.agent`. Sorted, deduplicated.
|
|
75
|
-
*/
|
|
76
|
-
export function listAgentProfileNames(config) {
|
|
77
|
-
const seen = new Set(BUILTIN_AGENT_PROFILE_NAMES);
|
|
78
|
-
for (const name of Object.keys(config?.profiles?.agent ?? {}))
|
|
79
|
-
seen.add(name);
|
|
80
|
-
return [...seen].sort();
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Resolve the default agent profile name. Order: explicit `requested` arg →
|
|
84
|
-
* `config.defaults.agent` → undefined.
|
|
85
|
-
*/
|
|
86
|
-
export function resolveDefaultProfileName(config, requested) {
|
|
87
|
-
if (requested?.trim())
|
|
88
|
-
return requested.trim();
|
|
89
|
-
const def = config?.defaults?.agent;
|
|
90
|
-
if (typeof def === "string" && def.trim())
|
|
91
|
-
return def.trim();
|
|
92
|
-
return undefined;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Throw a stable `ConfigError` when the caller needs an agent profile but
|
|
96
|
-
* none can be resolved.
|
|
97
|
-
*/
|
|
98
|
-
export function requireAgentProfile(config, requested) {
|
|
99
|
-
if (!config) {
|
|
100
|
-
throw new ConfigError("agent commands are disabled: no agent configuration in config.json.", "INVALID_CONFIG_FILE", "Run `akm setup` to detect and configure an agent CLI, or add an entry under `profiles.agent` and set `defaults.agent`.");
|
|
101
|
-
}
|
|
102
|
-
const name = resolveDefaultProfileName(config, requested);
|
|
103
|
-
if (!name) {
|
|
104
|
-
throw new ConfigError("agent commands require a profile: pass --profile or set `defaults.agent` in config.json.", "INVALID_CONFIG_FILE", `Available profiles: ${listAgentProfileNames(config).join(", ")}.`);
|
|
105
|
-
}
|
|
106
|
-
const profile = resolveProfileFromConfig(name, config);
|
|
107
|
-
if (!profile) {
|
|
108
|
-
throw new ConfigError(`agent profile "${name}" is not built-in and has no \`bin\` override.`, "INVALID_CONFIG_FILE", `Define profiles.agent."${name}".bin in config.json, or pick one of: ${listAgentProfileNames(config).join(", ")}.`);
|
|
109
|
-
}
|
|
110
|
-
return profile;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Resolve the agent profile bound to a named improve process. Reads from
|
|
114
|
-
* `profiles.improve.default.processes.<processName>` for the profile binding,
|
|
115
|
-
* then falls back to `defaults.agent`.
|
|
116
|
-
*/
|
|
117
|
-
export function resolveProcessAgentProfile(processName, config) {
|
|
118
|
-
const processEntry = config?.profiles?.improve?.default?.processes;
|
|
119
|
-
const entry = processEntry?.[processName];
|
|
120
|
-
const profileName = entry?.profile;
|
|
121
|
-
const profile = requireAgentProfile(config, profileName);
|
|
122
|
-
let resolvedTimeoutMs;
|
|
123
|
-
if (entry?.timeoutMs === null) {
|
|
124
|
-
resolvedTimeoutMs = null;
|
|
125
|
-
}
|
|
126
|
-
else if (typeof entry?.timeoutMs === "number") {
|
|
127
|
-
resolvedTimeoutMs = entry.timeoutMs;
|
|
128
|
-
}
|
|
129
|
-
else if (profile.timeoutMs !== undefined) {
|
|
130
|
-
resolvedTimeoutMs = profile.timeoutMs;
|
|
131
|
-
}
|
|
132
|
-
return { profile, timeoutMs: resolvedTimeoutMs };
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Convenience: list every fully-resolved profile (built-ins merged with
|
|
136
|
-
* user overrides). Used by setup detection to enumerate candidates.
|
|
137
|
-
*/
|
|
138
|
-
export function listResolvedAgentProfiles(config) {
|
|
139
|
-
const resolved = [];
|
|
140
|
-
const builtins = listBuiltinAgentProfiles();
|
|
141
|
-
for (const name of listAgentProfileNames(config)) {
|
|
142
|
-
const profile = resolveProfileFromConfig(name, config) ?? builtins[name];
|
|
143
|
-
if (profile)
|
|
144
|
-
resolved.push(profile);
|
|
145
|
-
}
|
|
146
|
-
return resolved;
|
|
147
|
-
}
|
|
6
|
+
/** Default hard timeout for direct LLM calls when no engine/use override exists. */
|
|
7
|
+
export const DEFAULT_LLM_TIMEOUT_MS = 600_000;
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import fs from "node:fs";
|
|
17
17
|
import path from "node:path";
|
|
18
|
-
import {
|
|
18
|
+
import { getBuiltinAgentProfile, listBuiltinAgentProfiles } from "./profiles.js";
|
|
19
19
|
/**
|
|
20
20
|
* Default PATH lookup. Walks `process.env.PATH` and returns the first
|
|
21
21
|
* existing executable file. Returns `undefined` when the bin is not on
|
|
@@ -71,7 +71,22 @@ export function _setAgentDetectForTests(fakes) {
|
|
|
71
71
|
export function detectAgentCliProfiles(agent, whichFn = defaultWhich) {
|
|
72
72
|
if (detectOverrides?.detectAgentCliProfiles)
|
|
73
73
|
return detectOverrides.detectAgentCliProfiles(agent, whichFn);
|
|
74
|
-
const
|
|
74
|
+
const profilesByName = new Map(Object.values(listBuiltinAgentProfiles()).map((profile) => [profile.name, profile]));
|
|
75
|
+
for (const [name, engine] of Object.entries(agent?.engines ?? {})) {
|
|
76
|
+
if (engine.kind !== "agent")
|
|
77
|
+
continue;
|
|
78
|
+
const builtin = getBuiltinAgentProfile(engine.platform);
|
|
79
|
+
profilesByName.set(name, {
|
|
80
|
+
name,
|
|
81
|
+
platform: engine.platform,
|
|
82
|
+
bin: engine.bin ?? builtin?.bin ?? (engine.platform === "opencode-sdk" ? "opencode" : engine.platform),
|
|
83
|
+
args: engine.args ?? builtin?.args ?? [],
|
|
84
|
+
stdio: "captured",
|
|
85
|
+
envPassthrough: builtin?.envPassthrough ?? [],
|
|
86
|
+
parseOutput: "text",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const profiles = [...profilesByName.values()];
|
|
75
90
|
return profiles.map((profile) => probeProfile(profile, whichFn));
|
|
76
91
|
}
|
|
77
92
|
function probeProfile(profile, whichFn) {
|