akm-cli 0.9.16 → 0.9.17-alpha.10
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 +2101 -0
- package/STABILITY.md +11 -10
- package/dist/akm +124 -193
- package/dist/akm-migrate +38 -19
- package/dist/assets/hints/cli-hints-full.md +6 -7
- package/dist/assets/improve-strategies/catchup.json +0 -3
- package/dist/assets/improve-strategies/consolidate.json +0 -1
- package/dist/assets/improve-strategies/default.json +1 -2
- package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
- package/dist/assets/improve-strategies/quick.json +1 -2
- package/dist/assets/improve-strategies/reflect-distill.json +1 -2
- package/dist/assets/improve-strategies/thorough.json +0 -3
- package/dist/assets/prompts/consolidate-pair.md +20 -0
- package/dist/assets/prompts/consolidate-system.md +4 -11
- package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
- package/dist/assets/templates/html/health.html +3 -5
- package/dist/cli/retired-commands.js +1 -1
- package/dist/cli/shared.js +6 -2
- package/dist/cli/unknown-flags.js +24 -1
- package/dist/cli.js +68 -10
- package/dist/commands/agent/agent-dispatch.js +1 -1
- package/dist/commands/command/command-execution.js +24 -62
- package/dist/commands/feedback-cli.js +0 -1
- package/dist/commands/health/accept-rate.js +6 -0
- package/dist/commands/health/archive-usage.js +92 -0
- package/dist/commands/health/checks.js +83 -74
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/data-dir-usage.js +25 -13
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +1 -42
- package/dist/commands/health/improve-metrics.js +136 -591
- package/dist/commands/health/md-report.js +1 -6
- package/dist/commands/health/plugin-staleness.js +53 -3
- package/dist/commands/health/renderers.js +12 -4
- package/dist/commands/health/report-view-model.js +14 -120
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -74
- package/dist/commands/health.js +145 -143
- package/dist/commands/improve/consolidate/chunking.js +26 -117
- package/dist/commands/improve/consolidate/continuity-check.js +137 -0
- package/dist/commands/improve/consolidate/pair-pass.js +791 -0
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +589 -1127
- package/dist/commands/improve/content-hash.js +16 -24
- package/dist/commands/improve/distill/content-repair.js +18 -100
- package/dist/commands/improve/distill-guards.js +20 -81
- package/dist/commands/improve/distill-promotion-policy.js +23 -243
- package/dist/commands/improve/distill.js +608 -1041
- package/dist/commands/improve/eligibility.js +126 -390
- package/dist/commands/improve/execution.js +8 -10
- package/dist/commands/improve/extract-prompt.js +1 -2
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +75 -169
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +52 -4
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +480 -1074
- package/dist/commands/improve/ledger.js +119 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +415 -1073
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +16 -118
- package/dist/commands/improve/memory/memory-improve.js +266 -14
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -15
- package/dist/commands/improve/preparation.js +779 -2319
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +642 -1353
- package/dist/commands/improve/retrieval-gate.js +127 -0
- package/dist/commands/improve/retrieval-scope.js +92 -0
- package/dist/commands/improve/salience.js +41 -240
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +322 -0
- package/dist/commands/lint/base-linter.js +37 -15
- package/dist/commands/proposal/drain.js +261 -578
- package/dist/commands/proposal/proposal-cli.js +19 -20
- package/dist/commands/proposal/proposal-types.js +31 -24
- package/dist/commands/proposal/proposal.js +38 -8
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +1097 -1394
- package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
- package/dist/commands/proposal/validators/proposal-validators.js +1 -1
- package/dist/commands/proposal/validators/proposals.js +22 -89
- package/dist/commands/read/curate.js +105 -462
- package/dist/commands/read/knowledge.js +3 -2
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +57 -108
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +4 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +127 -29
- package/dist/commands/sources/installed-stashes.js +197 -746
- package/dist/commands/sources/schema-repair.js +98 -129
- package/dist/commands/sources/source-add.js +62 -12
- package/dist/commands/sources/source-manage.js +9 -2
- package/dist/commands/sources/stash-cli.js +24 -4
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +12 -13
- package/dist/commands/tasks/tasks.js +350 -936
- package/dist/commands/tasks/validate.js +26 -24
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +2 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +42 -12
- package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/asset-placement.js +4 -13
- package/dist/core/asset/frontmatter.js +106 -1
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +285 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +9 -34
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +184 -111
- package/dist/core/config/engine-semantics.js +0 -2
- package/dist/core/config/legacy-source-shape-shim.js +38 -9
- package/dist/core/config/schema/embedding.js +20 -5
- package/dist/core/config/schema/engines.js +5 -0
- package/dist/core/config/schema/execution.js +1 -1
- package/dist/core/config/schema/experimental.js +1 -1
- package/dist/core/config/schema/improve-processes.js +54 -125
- package/dist/core/config/schema/improve.js +4 -42
- package/dist/core/config/schema/index-config.js +9 -48
- package/dist/core/config/schema/scheduler.js +12 -12
- package/dist/core/config/schema/search.js +6 -22
- package/dist/core/env-secret-ref.js +0 -1
- package/dist/core/errors.js +8 -9
- package/dist/core/file-change.js +13 -5
- package/dist/core/file-lock.js +76 -173
- package/dist/core/improve-result.js +35 -7
- package/dist/core/improve-types.js +0 -1
- package/dist/core/logs-db.js +2 -2
- package/dist/core/loopback.js +7 -12
- package/dist/core/non-task-input.js +20 -0
- package/dist/core/parse.js +13 -16
- package/dist/core/paths.js +0 -24
- package/dist/core/redaction.js +109 -2
- package/dist/core/run-lock.js +2 -5
- package/dist/core/spawn-env.js +1 -1
- package/dist/core/state/migrations.js +123 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/time.js +0 -20
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +294 -1005
- package/dist/execution/input-contract.js +1 -1
- package/dist/execution/resolved-request.js +135 -689
- package/dist/execution/source.js +63 -257
- package/dist/execution/target-ref.js +1 -1
- package/dist/indexer/bundle-identity-guard.js +2 -2
- package/dist/indexer/db/llm-cache.js +2 -2
- package/dist/indexer/ensure-index.js +77 -73
- package/dist/indexer/index-rebuild-lock.js +3 -11
- package/dist/indexer/index-writer-lock.js +8 -17
- package/dist/indexer/index-written-assets.js +141 -154
- package/dist/indexer/indexer.js +400 -1124
- package/dist/indexer/links/declared-links.js +90 -0
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +96 -90
- package/dist/indexer/passes/metadata.js +132 -219
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +2 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +190 -590
- package/dist/indexer/search/fts-query.js +30 -41
- package/dist/indexer/search/ranking.js +28 -154
- package/dist/indexer/search/search-attribution.js +12 -32
- package/dist/indexer/search/search-fields.js +11 -15
- package/dist/indexer/search/search-hit-enrichers.js +54 -85
- package/dist/indexer/search/search-source.js +1 -4
- package/dist/indexer/usage/usage-events.js +36 -7
- package/dist/indexer/walk/walker.js +3 -4
- package/dist/integrations/agent/engine-fallback.js +23 -40
- package/dist/integrations/agent/engine-resolution.js +93 -183
- package/dist/integrations/agent/execution.js +507 -0
- package/dist/integrations/agent/model-map.js +28 -156
- package/dist/integrations/agent/request-lowering.js +66 -141
- package/dist/integrations/agent/runner-dispatch.js +143 -321
- package/dist/integrations/agent/runner.js +54 -14
- package/dist/integrations/lockfile.js +53 -101
- package/dist/llm/client.js +18 -6
- package/dist/llm/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +11 -17
- package/dist/llm/feature-gate.js +0 -8
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/structured-call.js +5 -24
- package/dist/output/generic-render.js +23 -11
- package/dist/output/html-render.js +13 -10
- package/dist/output/render-registry.js +3 -32
- package/dist/output/shapes/helpers.js +25 -38
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +69 -31
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +48 -3
- package/dist/output/text/show-format.js +13 -17
- package/dist/output/text/workflow-format.js +0 -32
- package/dist/output/text.js +2 -0
- package/dist/registry/factory.js +4 -19
- package/dist/registry/network.js +66 -220
- package/dist/registry/providers/index.js +0 -2
- package/dist/registry/providers/skills-sh.js +3 -14
- package/dist/registry/providers/static-index.js +24 -26
- package/dist/registry/resolve.js +55 -131
- package/dist/scripts/akm-migrate-node.js +42948 -92369
- package/dist/scripts/akm-migrate.js +42935 -92354
- package/dist/setup/registry-stash-loader.js +4 -13
- package/dist/setup/semantic-assets.js +3 -44
- package/dist/setup/setup.js +1 -1
- package/dist/setup/steps/connection.js +5 -6
- package/dist/setup/steps/platforms.js +2 -2
- package/dist/setup/steps/tasks.js +25 -15
- package/dist/sources/provider-factory.js +17 -18
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +7 -1
- package/dist/sources/providers/git-provider.js +0 -3
- package/dist/sources/providers/git-stash.js +83 -21
- package/dist/sources/providers/npm.js +2 -4
- package/dist/sources/providers/provider-utils.js +5 -10
- package/dist/sources/providers/website.js +0 -2
- package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
- package/dist/sources/website-url.js +2 -2
- package/dist/storage/database.js +9 -35
- package/dist/storage/repositories/improve-ledger-repository.js +209 -0
- package/dist/storage/repositories/index-connection.js +39 -72
- package/dist/storage/repositories/index-entries-repository.js +131 -129
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +101 -268
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-links-repository.js +143 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +257 -325
- package/dist/storage/repositories/index-utility-repository.js +8 -29
- package/dist/storage/repositories/index-vec-repository.js +133 -414
- package/dist/storage/repositories/outcome-repository.js +2 -1
- package/dist/storage/repositories/proposals-repository.js +104 -1
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- package/dist/storage/repositories/salience-repository.js +1 -19
- package/dist/storage/repositories/task-history-repository.js +26 -4
- package/dist/storage/repositories/workflow-runs-repository.js +53 -244
- package/dist/storage/sqlite-migrations.js +136 -0
- package/dist/storage/sqlite-pragmas.js +11 -9
- package/dist/storage/sqlite-transaction.js +170 -0
- package/dist/storage/state-db-integrity.js +130 -0
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +191 -302
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +141 -748
- package/dist/tasks/backends/schtasks.js +119 -623
- package/dist/tasks/prepare/prepare-support.js +5 -15
- package/dist/tasks/prepare/prepare.js +0 -2
- package/dist/tasks/resolve-akm-bin.js +20 -79
- package/dist/tasks/run/attempt-lifecycle.js +0 -1
- package/dist/tasks/run/load-task.js +1 -1
- package/dist/tasks/scheduler-binding.js +20 -238
- package/dist/tasks/scheduler-invocation.js +136 -244
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +368 -679
- package/dist/tasks/source/parse-task-source.js +55 -9
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +464 -88
- package/dist/workflows/authoring/authoring.js +3 -12
- package/dist/workflows/compile.js +211 -0
- package/dist/workflows/concurrency-policy.js +13 -74
- package/dist/workflows/exec/child-invocation.js +3 -17
- package/dist/workflows/exec/child-workflow.js +32 -141
- package/dist/workflows/exec/dispatch-redaction.js +13 -53
- package/dist/workflows/exec/environment.js +98 -0
- package/dist/workflows/exec/exec-unit.js +33 -140
- package/dist/workflows/exec/frozen-judge.js +7 -59
- package/dist/workflows/exec/native-executor.js +82 -341
- package/dist/workflows/exec/param-secrets.js +29 -47
- package/dist/workflows/exec/run-workflow.js +154 -387
- package/dist/workflows/exec/scheduler.js +9 -36
- package/dist/workflows/exec/step-work.js +127 -430
- package/dist/workflows/exec/unit-dispatch.js +11 -63
- package/dist/workflows/exec/unit-writer.js +8 -52
- package/dist/workflows/exec/worktree.js +39 -273
- package/dist/workflows/freeze/child-output-references.js +4 -15
- package/dist/workflows/freeze/environment.js +99 -92
- package/dist/workflows/freeze/freeze.js +172 -0
- package/dist/workflows/freeze/step-values.js +19 -21
- package/dist/workflows/freeze/targets/child-workflow.js +23 -92
- package/dist/workflows/freeze/targets/command.js +10 -33
- package/dist/workflows/freeze/targets/script.js +5 -12
- package/dist/workflows/freeze/targets/shell.js +3 -6
- package/dist/workflows/freeze/targets/task.js +25 -80
- package/dist/workflows/freeze/task-bindings.js +20 -67
- package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
- package/dist/workflows/ir/params.js +6 -51
- package/dist/workflows/ir/plan-hash.js +2 -34
- package/dist/workflows/parser.js +140 -43
- package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
- package/dist/workflows/renderer.js +36 -69
- package/dist/workflows/resource-limits.js +12 -120
- package/dist/workflows/runtime/agent-identity.js +8 -40
- package/dist/workflows/runtime/run-outputs.js +3 -6
- package/dist/workflows/runtime/run-plan.js +316 -0
- package/dist/workflows/runtime/runs.js +48 -200
- package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
- package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
- package/dist/workflows/validate-summary.js +2 -7
- package/docs/integration/bundling-akm.md +49 -42
- package/docs/migration/README.md +1 -0
- package/docs/migration/release-notes/0.9.17.md +43 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
- package/docs/reference/cli.md +232 -135
- package/docs/reference/configuration.md +71 -57
- package/docs/reference/data-and-telemetry.md +20 -21
- package/docs/reference/tasks.md +105 -39
- package/docs/reference/workflow-schema.md +14 -18
- package/docs/reference/workflows.md +6 -9
- package/package.json +1 -1
- package/schemas/akm-config.json +115 -738
- package/schemas/akm-workflow.json +1 -0
- package/dist/assets/improve-strategies/graph-refresh.json +0 -15
- package/dist/assets/prompts/contradiction-judge.md +0 -33
- package/dist/assets/prompts/graph-extract-system.md +0 -1
- package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
- package/dist/assets/prompts/metadata-enhance-system.md +0 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
- package/dist/commands/health/advisories.js +0 -150
- package/dist/commands/health/metrics.js +0 -329
- package/dist/commands/health/surfaces.js +0 -102
- package/dist/commands/improve/anti-collapse.js +0 -83
- package/dist/commands/improve/collapse-detector.js +0 -432
- package/dist/commands/improve/consolidate/eligibility.js +0 -48
- package/dist/commands/improve/consolidate/merge.js +0 -149
- package/dist/commands/improve/distill/promote-memory.js +0 -291
- package/dist/commands/improve/distill/quality-gate.js +0 -337
- package/dist/commands/improve/eval-cases.js +0 -52
- package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
- package/dist/commands/improve/proposal-envelope.js +0 -31
- package/dist/commands/improve/run-context.js +0 -123
- package/dist/commands/improve/shared.js +0 -31
- package/dist/commands/improve/source-identity.js +0 -28
- package/dist/commands/improve/triage.js +0 -96
- package/dist/commands/proposal/drain-policies.js +0 -151
- package/dist/commands/sources/update-transaction.js +0 -220
- package/dist/core/action-contributors.js +0 -28
- package/dist/core/config/config-version-shim.js +0 -101
- package/dist/core/fs-txn.js +0 -405
- package/dist/core/lexical-score.js +0 -25
- package/dist/core/maintenance-barrier.js +0 -167
- package/dist/execution/executable-identity.js +0 -105
- package/dist/execution/guarded-source.js +0 -427
- package/dist/indexer/db/graph-db.js +0 -444
- package/dist/indexer/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/graph/graph-extraction.js +0 -1108
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- package/dist/indexer/search/ranking-types.js +0 -4
- package/dist/indexer/walk/project-context.js +0 -192
- package/dist/integrations/agent/execution-cascade.js +0 -566
- package/dist/integrations/agent/execution-definitions.js +0 -202
- package/dist/integrations/agent/execution-lowering.js +0 -841
- package/dist/integrations/agent/execution-preparation.js +0 -98
- package/dist/integrations/agent/inline-execution.js +0 -74
- package/dist/llm/graph-extract.js +0 -728
- package/dist/llm/metadata-enhance.js +0 -96
- package/dist/registry/create-provider-registry.js +0 -29
- package/dist/registry/pinned-request-helper.js +0 -247
- package/dist/registry/pinned-transport.js +0 -717
- package/dist/sources/providers/index.js +0 -14
- package/dist/storage/engines/sqlite-migrations.js +0 -271
- package/dist/storage/repositories/canaries-repository.js +0 -107
- package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
- package/dist/storage/repositories/registry-cache.js +0 -113
- package/dist/tasks/scheduler-sync-preview.js +0 -52
- package/dist/tasks/source/task-to-v3.js +0 -507
- package/dist/workflows/freeze/resolve-steps.js +0 -86
- package/dist/workflows/freeze/source-freeze.js +0 -64
- package/dist/workflows/ir/compile.js +0 -321
- package/dist/workflows/ir/environment-v4.js +0 -330
- package/dist/workflows/ir/freeze-v4.js +0 -153
- package/dist/workflows/ir/schema-v4.js +0 -745
- package/dist/workflows/ir/schema.js +0 -354
- package/dist/workflows/program/schema.js +0 -77
- package/dist/workflows/runtime/checkin.js +0 -57
- package/dist/workflows/runtime/plan-classifier.js +0 -196
- package/dist/workflows/runtime/unit-checkin.js +0 -45
- package/dist/workflows/runtime/unit-phases.js +0 -20
- package/dist/workflows/schema.js +0 -4
- package/dist/workflows/source-ir/compile.js +0 -200
- package/dist/workflows/source-ir/program.js +0 -50
- package/dist/workflows/source-ir/result.js +0 -26
- package/dist/workflows/source-ir/schema.js +0 -786
- package/dist/workflows/source-ir/triggers.js +0 -79
- package/dist/workflows/source-ir/uses.js +0 -40
- package/dist/workflows/validator.js +0 -60
|
@@ -1,96 +0,0 @@
|
|
|
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
|
-
* LLM-driven metadata enhancement for stash entries.
|
|
6
|
-
*
|
|
7
|
-
* Keeps the higher-level workflow for improving descriptions, tags, and search
|
|
8
|
-
* hints separate from the low-level transport client.
|
|
9
|
-
*/
|
|
10
|
-
import metadataEnhanceSystemPrompt from "../assets/prompts/metadata-enhance-system.md" with { type: "text" };
|
|
11
|
-
import { parseJsonResponse } from "../core/parse.js";
|
|
12
|
-
import { callStructured } from "./structured-call.js";
|
|
13
|
-
const SYSTEM_PROMPT = metadataEnhanceSystemPrompt;
|
|
14
|
-
/**
|
|
15
|
-
* Use an LLM to enhance a stash entry's metadata: improve description,
|
|
16
|
-
* generate searchHints, and suggest tags.
|
|
17
|
-
*
|
|
18
|
-
* When `akmConfig` is provided, routes through
|
|
19
|
-
* `tryLlmFeature("metadata_enhance", ...)` so the feature gate is honoured: a
|
|
20
|
-
* closed gate yields `{ status: "skipped" }` and a thrown/timed-out call yields
|
|
21
|
-
* `{ status: "failed" }` — neither is reported as an enrichment. When
|
|
22
|
-
* `akmConfig` is `undefined` the gate is bypassed entirely: the LLM call runs
|
|
23
|
-
* unconditionally and errors propagate to direct callers such as tests.
|
|
24
|
-
*/
|
|
25
|
-
export async function enhanceMetadata(runner, entry, fileContent, signal, akmConfig, onNotices, lease) {
|
|
26
|
-
const contextParts = [`Name: ${entry.name}`, `Type: ${entry.type}`];
|
|
27
|
-
if (entry.description)
|
|
28
|
-
contextParts.push(`Current description: ${entry.description}`);
|
|
29
|
-
if (entry.tags?.length)
|
|
30
|
-
contextParts.push(`Current tags: ${entry.tags.join(", ")}`);
|
|
31
|
-
if (fileContent) {
|
|
32
|
-
// Limit content to first 4000 chars to stay within token limits (matches other modules)
|
|
33
|
-
const truncated = fileContent.length > 4000 ? `${fileContent.slice(0, 4000)}\n... (truncated)` : fileContent;
|
|
34
|
-
contextParts.push(`File content:\n${truncated}`);
|
|
35
|
-
}
|
|
36
|
-
const userPrompt = `${contextParts.join("\n")}
|
|
37
|
-
|
|
38
|
-
Generate improved metadata for this ${entry.type}. Return JSON with these fields:
|
|
39
|
-
- "description": a clear, concise one-sentence description of what this does
|
|
40
|
-
- "searchHints": an array of 3-6 natural language task phrases an agent might use to find this (e.g. "deploy a docker container", "run database migrations")
|
|
41
|
-
- "tags": an array of 3-8 relevant keyword tags
|
|
42
|
-
|
|
43
|
-
Return ONLY the JSON object, no explanation.`;
|
|
44
|
-
// `parse` owns the raw response: the `!raw`/unparseable case ⇒ empty metadata
|
|
45
|
-
// (still a genuine success), plus the description/searchHints/tags shaping.
|
|
46
|
-
// `enhanceMetadata` never warns and never bumps telemetry — `onError` (gated
|
|
47
|
-
// path only) reports `failed` WITHOUT warning, carrying the message so the
|
|
48
|
-
// caller can surface it. The ungated path (akmConfig === undefined) propagates
|
|
49
|
-
// errors via callStructured.
|
|
50
|
-
let timedOut = false;
|
|
51
|
-
const outcome = await callStructured({
|
|
52
|
-
feature: "metadata_enhance",
|
|
53
|
-
akmConfig,
|
|
54
|
-
runner,
|
|
55
|
-
...(lease ? { lease } : {}),
|
|
56
|
-
messages: [
|
|
57
|
-
{ role: "system", content: SYSTEM_PROMPT },
|
|
58
|
-
{ role: "user", content: userPrompt },
|
|
59
|
-
],
|
|
60
|
-
request: { signal, timeoutMs: runner.timeoutMs },
|
|
61
|
-
onNotices,
|
|
62
|
-
parse: (raw) => {
|
|
63
|
-
const parsed = raw ? parseJsonResponse(raw) : undefined;
|
|
64
|
-
const metadata = {};
|
|
65
|
-
if (parsed) {
|
|
66
|
-
if (typeof parsed.description === "string" && parsed.description) {
|
|
67
|
-
metadata.description = parsed.description;
|
|
68
|
-
}
|
|
69
|
-
if (Array.isArray(parsed.searchHints)) {
|
|
70
|
-
metadata.searchHints = parsed.searchHints
|
|
71
|
-
.filter((s) => typeof s === "string" && s.trim().length > 0)
|
|
72
|
-
.slice(0, 8);
|
|
73
|
-
}
|
|
74
|
-
if (Array.isArray(parsed.tags)) {
|
|
75
|
-
metadata.tags = parsed.tags
|
|
76
|
-
.filter((s) => typeof s === "string" && s.trim().length > 0)
|
|
77
|
-
.slice(0, 10);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return { status: "enriched", metadata };
|
|
81
|
-
},
|
|
82
|
-
onError: (_cls, err) => ({ status: "failed", error: err instanceof Error ? err.message : String(err) }),
|
|
83
|
-
fallback: { status: "skipped" },
|
|
84
|
-
// The seam returns the `skipped` fallback for a closed gate AND for a
|
|
85
|
-
// wrapper-level timeout. Record the timeout so we can reclassify it below —
|
|
86
|
-
// a timed-out call is a failure, not a silent skip.
|
|
87
|
-
onFallback: (event) => {
|
|
88
|
-
if (event.reason === "timeout")
|
|
89
|
-
timedOut = true;
|
|
90
|
-
},
|
|
91
|
-
});
|
|
92
|
-
if (outcome.status === "skipped" && timedOut) {
|
|
93
|
-
return { status: "failed", error: "metadata_enhance timed out" };
|
|
94
|
-
}
|
|
95
|
-
return outcome;
|
|
96
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
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
|
-
* Generic factory-map utility.
|
|
6
|
-
*
|
|
7
|
-
* Creates a lightweight registry that maps string keys to factory functions.
|
|
8
|
-
* Both registry/factory.ts (registry discovery) and sources/provider-factory.ts
|
|
9
|
-
* (source providers) are built on this utility.
|
|
10
|
-
*/
|
|
11
|
-
export function createProviderRegistry() {
|
|
12
|
-
const map = new Map();
|
|
13
|
-
return {
|
|
14
|
-
register(type, factory) {
|
|
15
|
-
map.set(type, factory);
|
|
16
|
-
},
|
|
17
|
-
resolve(type) {
|
|
18
|
-
return map.get(type) ?? null;
|
|
19
|
-
},
|
|
20
|
-
/** Removes a registration. No-op if `type` was never registered. */
|
|
21
|
-
unregister(type) {
|
|
22
|
-
map.delete(type);
|
|
23
|
-
},
|
|
24
|
-
/** Snapshot of all registered keys. Iteration order matches insertion order. */
|
|
25
|
-
list() {
|
|
26
|
-
return [...map.keys()];
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
}
|
|
@@ -1,247 +0,0 @@
|
|
|
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
|
-
/** Parse and validate the private stdin request before any socket is opened. */
|
|
5
|
-
async function readNodePinnedHelperRequest(isIP) {
|
|
6
|
-
const MAX_PRELUDE_BYTES = 64 * 1024;
|
|
7
|
-
const iterator = process.stdin[Symbol.asyncIterator]();
|
|
8
|
-
let buffered = Buffer.alloc(0);
|
|
9
|
-
const readExact = async (length) => {
|
|
10
|
-
while (buffered.byteLength < length) {
|
|
11
|
-
const next = await iterator.next();
|
|
12
|
-
if (next.done)
|
|
13
|
-
throw new Error("Registry helper input ended before the request prelude was complete");
|
|
14
|
-
buffered = Buffer.concat([buffered, Buffer.from(next.value)]);
|
|
15
|
-
}
|
|
16
|
-
const result = buffered.subarray(0, length);
|
|
17
|
-
buffered = buffered.subarray(length);
|
|
18
|
-
return result;
|
|
19
|
-
};
|
|
20
|
-
const preludeLength = (await readExact(4)).readUInt32BE(0);
|
|
21
|
-
if (preludeLength === 0 || preludeLength > MAX_PRELUDE_BYTES) {
|
|
22
|
-
throw new Error("Registry helper request prelude exceeds its protocol limit");
|
|
23
|
-
}
|
|
24
|
-
const raw = JSON.parse((await readExact(preludeLength)).toString("utf8"));
|
|
25
|
-
if (typeof raw.url !== "string" || typeof raw.address !== "string") {
|
|
26
|
-
throw new Error("Registry helper request prelude is invalid");
|
|
27
|
-
}
|
|
28
|
-
const url = new URL(raw.url);
|
|
29
|
-
if ((url.protocol !== "http:" && url.protocol !== "https:") || url.username || url.password) {
|
|
30
|
-
throw new Error("Registry helper accepts only credential-free HTTP(S) URLs");
|
|
31
|
-
}
|
|
32
|
-
const addressFamily = isIP(raw.address);
|
|
33
|
-
if (addressFamily === 0)
|
|
34
|
-
throw new Error("Registry helper requires a numeric pinned address");
|
|
35
|
-
if (typeof raw.timeoutMs !== "number" || !Number.isSafeInteger(raw.timeoutMs) || raw.timeoutMs <= 0) {
|
|
36
|
-
throw new Error("Registry helper timeout is invalid");
|
|
37
|
-
}
|
|
38
|
-
if (!Array.isArray(raw.headers) || raw.headers.length > 256) {
|
|
39
|
-
throw new Error("Registry helper headers are invalid");
|
|
40
|
-
}
|
|
41
|
-
const headers = {};
|
|
42
|
-
for (const pair of raw.headers) {
|
|
43
|
-
if (!Array.isArray(pair) ||
|
|
44
|
-
pair.length !== 2 ||
|
|
45
|
-
typeof pair[0] !== "string" ||
|
|
46
|
-
typeof pair[1] !== "string" ||
|
|
47
|
-
pair[0].length > 256 ||
|
|
48
|
-
pair[1].length > 16_384) {
|
|
49
|
-
throw new Error("Registry helper header entry is invalid");
|
|
50
|
-
}
|
|
51
|
-
headers[pair[0].toLowerCase()] = pair[1];
|
|
52
|
-
}
|
|
53
|
-
for (const name of [
|
|
54
|
-
"connection",
|
|
55
|
-
"keep-alive",
|
|
56
|
-
"proxy-authorization",
|
|
57
|
-
"proxy-connection",
|
|
58
|
-
"te",
|
|
59
|
-
"trailer",
|
|
60
|
-
"transfer-encoding",
|
|
61
|
-
"upgrade",
|
|
62
|
-
]) {
|
|
63
|
-
delete headers[name];
|
|
64
|
-
}
|
|
65
|
-
headers.host = url.host;
|
|
66
|
-
return {
|
|
67
|
-
addressFamily: addressFamily,
|
|
68
|
-
bodyPresent: raw.bodyPresent === true,
|
|
69
|
-
headers,
|
|
70
|
-
initialBody: buffered,
|
|
71
|
-
iterator,
|
|
72
|
-
method: typeof raw.method === "string" ? raw.method.toUpperCase() : "GET",
|
|
73
|
-
pinnedAddress: raw.address,
|
|
74
|
-
timeoutMs: raw.timeoutMs,
|
|
75
|
-
url,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* The body of the one-request Node helper used by Bun's registry transport.
|
|
80
|
-
* Its parser is passed explicitly when the parent serializes both functions.
|
|
81
|
-
*/
|
|
82
|
-
export async function nodePinnedRequestHelperMain(readRequest, http, https, isIP) {
|
|
83
|
-
const MAX_FRAME_BYTES = 1024 * 1024;
|
|
84
|
-
const FRAME_PRELUDE = 0;
|
|
85
|
-
const FRAME_BODY = 1;
|
|
86
|
-
const FRAME_END = 2;
|
|
87
|
-
const FRAME_ERROR = 3;
|
|
88
|
-
const writeBuffer = async (value) => {
|
|
89
|
-
await new Promise((resolve, reject) => {
|
|
90
|
-
process.stdout.write(value, (error) => (error ? reject(error) : resolve()));
|
|
91
|
-
});
|
|
92
|
-
};
|
|
93
|
-
const writeFrame = async (type, payload = new Uint8Array()) => {
|
|
94
|
-
if (payload.byteLength > MAX_FRAME_BYTES && type !== FRAME_BODY) {
|
|
95
|
-
throw new Error("Registry helper frame exceeds its protocol limit");
|
|
96
|
-
}
|
|
97
|
-
if (type === FRAME_BODY && payload.byteLength > MAX_FRAME_BYTES) {
|
|
98
|
-
for (let offset = 0; offset < payload.byteLength; offset += MAX_FRAME_BYTES) {
|
|
99
|
-
await writeFrame(type, payload.subarray(offset, Math.min(payload.byteLength, offset + MAX_FRAME_BYTES)));
|
|
100
|
-
}
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
const header = Buffer.allocUnsafe(5);
|
|
104
|
-
header[0] = type;
|
|
105
|
-
header.writeUInt32BE(payload.byteLength, 1);
|
|
106
|
-
await writeBuffer(header);
|
|
107
|
-
if (payload.byteLength > 0)
|
|
108
|
-
await writeBuffer(payload);
|
|
109
|
-
};
|
|
110
|
-
const errorPayload = (error) => {
|
|
111
|
-
const candidate = error;
|
|
112
|
-
return Buffer.from(JSON.stringify({
|
|
113
|
-
name: typeof candidate?.name === "string" ? candidate.name.slice(0, 128) : "Error",
|
|
114
|
-
message: typeof candidate?.message === "string" ? candidate.message.slice(0, 8_192) : String(error).slice(0, 8_192),
|
|
115
|
-
code: typeof candidate?.code === "string" ? candidate.code.slice(0, 128) : undefined,
|
|
116
|
-
}));
|
|
117
|
-
};
|
|
118
|
-
try {
|
|
119
|
-
const nodeMajor = Number.parseInt(process.versions.node.split(".")[0] ?? "0", 10);
|
|
120
|
-
if (!Number.isInteger(nodeMajor) || nodeMajor < 22) {
|
|
121
|
-
throw new Error(`The pinned registry helper requires Node.js >= 22; found ${process.versions.node}`);
|
|
122
|
-
}
|
|
123
|
-
const { addressFamily, bodyPresent, headers, initialBody, iterator, method, pinnedAddress, timeoutMs, url } = await readRequest(isIP);
|
|
124
|
-
const hostname = url.hostname.startsWith("[") && url.hostname.endsWith("]") ? url.hostname.slice(1, -1) : url.hostname;
|
|
125
|
-
const lookup = (_hostname, options, callback) => {
|
|
126
|
-
if (typeof options === "object" && options !== null && "all" in options && options.all === true) {
|
|
127
|
-
callback(null, [{ address: pinnedAddress, family: addressFamily }]);
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
callback(null, pinnedAddress, addressFamily);
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
const requestOptions = {
|
|
134
|
-
protocol: url.protocol,
|
|
135
|
-
hostname,
|
|
136
|
-
port: url.port || undefined,
|
|
137
|
-
path: `${url.pathname}${url.search}`,
|
|
138
|
-
method,
|
|
139
|
-
headers,
|
|
140
|
-
lookup,
|
|
141
|
-
// One helper owns exactly one fresh connection. It never pools a socket
|
|
142
|
-
// selected for an earlier DNS answer.
|
|
143
|
-
agent: false,
|
|
144
|
-
...(url.protocol === "https:" && isIP(hostname) === 0 ? { servername: hostname } : {}),
|
|
145
|
-
};
|
|
146
|
-
let responseStarted = false;
|
|
147
|
-
let requestFinished = false;
|
|
148
|
-
let request;
|
|
149
|
-
const responseDone = new Promise((resolve, reject) => {
|
|
150
|
-
const requestFn = url.protocol === "https:" ? https.request : http.request;
|
|
151
|
-
request = requestFn(requestOptions, async (response) => {
|
|
152
|
-
responseStarted = true;
|
|
153
|
-
try {
|
|
154
|
-
await writeFrame(FRAME_PRELUDE, Buffer.from(JSON.stringify({
|
|
155
|
-
status: response.statusCode ?? 500,
|
|
156
|
-
statusText: response.statusMessage ?? "",
|
|
157
|
-
rawHeaders: response.rawHeaders,
|
|
158
|
-
})));
|
|
159
|
-
for await (const chunk of response) {
|
|
160
|
-
await writeFrame(FRAME_BODY, Buffer.from(chunk));
|
|
161
|
-
}
|
|
162
|
-
await writeFrame(FRAME_END);
|
|
163
|
-
resolve();
|
|
164
|
-
}
|
|
165
|
-
catch (error) {
|
|
166
|
-
reject(error);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
const headerTimer = setTimeout(() => {
|
|
170
|
-
request?.destroy(new Error(`Registry request timed out after ${timeoutMs}ms while awaiting response headers`));
|
|
171
|
-
}, timeoutMs);
|
|
172
|
-
request.once("response", () => clearTimeout(headerTimer));
|
|
173
|
-
request.once("error", (error) => {
|
|
174
|
-
clearTimeout(headerTimer);
|
|
175
|
-
if (!responseStarted)
|
|
176
|
-
reject(error);
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
const writeRequestChunk = async (chunk) => {
|
|
180
|
-
if (!request || request.destroyed)
|
|
181
|
-
throw new Error("Registry helper request closed while streaming its body");
|
|
182
|
-
const activeRequest = request;
|
|
183
|
-
if (activeRequest.write(chunk))
|
|
184
|
-
return;
|
|
185
|
-
await new Promise((resolve, reject) => {
|
|
186
|
-
const onDrain = () => {
|
|
187
|
-
cleanup();
|
|
188
|
-
resolve();
|
|
189
|
-
};
|
|
190
|
-
const onError = (error) => {
|
|
191
|
-
cleanup();
|
|
192
|
-
reject(error);
|
|
193
|
-
};
|
|
194
|
-
const cleanup = () => {
|
|
195
|
-
activeRequest.off("drain", onDrain);
|
|
196
|
-
activeRequest.off("error", onError);
|
|
197
|
-
};
|
|
198
|
-
activeRequest.once("drain", onDrain);
|
|
199
|
-
activeRequest.once("error", onError);
|
|
200
|
-
});
|
|
201
|
-
};
|
|
202
|
-
const bodyDone = (async () => {
|
|
203
|
-
if (!request)
|
|
204
|
-
throw new Error("Registry helper request was not initialized");
|
|
205
|
-
if (bodyPresent) {
|
|
206
|
-
if (initialBody.byteLength > 0) {
|
|
207
|
-
await writeRequestChunk(initialBody);
|
|
208
|
-
}
|
|
209
|
-
while (true) {
|
|
210
|
-
const next = await iterator.next();
|
|
211
|
-
if (next.done)
|
|
212
|
-
break;
|
|
213
|
-
await writeRequestChunk(Buffer.from(next.value));
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
requestFinished = true;
|
|
217
|
-
request.end();
|
|
218
|
-
})();
|
|
219
|
-
try {
|
|
220
|
-
await Promise.all([responseDone, bodyDone]);
|
|
221
|
-
}
|
|
222
|
-
catch (error) {
|
|
223
|
-
if (!requestFinished && !responseStarted)
|
|
224
|
-
request?.destroy(error);
|
|
225
|
-
throw error;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
catch (error) {
|
|
229
|
-
try {
|
|
230
|
-
await writeFrame(FRAME_ERROR, errorPayload(error));
|
|
231
|
-
}
|
|
232
|
-
catch {
|
|
233
|
-
// The parent also treats an unframed EOF as a transport failure.
|
|
234
|
-
}
|
|
235
|
-
process.exitCode = 1;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
/** Materialize both self-contained passes into a one-request Node program. */
|
|
239
|
-
export function nodePinnedRequestHelperSource() {
|
|
240
|
-
return (`import * as http from "node:http";\n` +
|
|
241
|
-
`import * as https from "node:https";\n` +
|
|
242
|
-
`import { isIP } from "node:net";\n` +
|
|
243
|
-
`(${nodePinnedRequestHelperMain.toString()})(${readNodePinnedHelperRequest.toString()}, http, https, isIP).catch((error) => {\n` +
|
|
244
|
-
` console.error(error instanceof Error ? error.message : String(error));\n` +
|
|
245
|
-
` process.exitCode = 1;\n` +
|
|
246
|
-
`});\n`);
|
|
247
|
-
}
|