akm-cli 0.9.17-alpha.2 → 0.9.17-alpha.4
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 +756 -0
- package/dist/akm +94 -196
- package/dist/cli/shared.js +6 -2
- package/dist/cli.js +22 -9
- 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 +2 -2
- package/dist/commands/health/checks.js +30 -75
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +0 -38
- package/dist/commands/health/improve-metrics.js +123 -562
- 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 +11 -106
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -73
- package/dist/commands/health.js +122 -143
- package/dist/commands/improve/consolidate/chunking.js +25 -100
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +538 -1075
- 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 -1075
- package/dist/commands/improve/eligibility.js +126 -400
- package/dist/commands/improve/execution.js +3 -5
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +29 -166
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +12 -7
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +443 -1063
- package/dist/commands/improve/ledger.js +114 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +459 -1172
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +14 -118
- package/dist/commands/improve/memory/memory-improve.js +4 -3
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -10
- package/dist/commands/improve/preparation.js +851 -2339
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +621 -1367
- package/dist/commands/improve/salience.js +46 -232
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +323 -0
- package/dist/commands/proposal/drain.js +251 -644
- package/dist/commands/proposal/proposal-cli.js +3 -18
- package/dist/commands/proposal/proposal-types.js +20 -41
- package/dist/commands/proposal/proposal.js +1 -2
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +502 -1487
- 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 +13 -89
- package/dist/commands/read/curate.js +63 -413
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +2 -13
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +7 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +2 -11
- 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/stash-cli.js +1 -1
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +9 -8
- package/dist/commands/tasks/tasks.js +326 -930
- package/dist/commands/tasks/validate.js +42 -21
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +0 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +11 -12
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +291 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +1 -33
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +163 -68
- 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 +21 -95
- package/dist/core/config/schema/improve.js +4 -42
- 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-lock.js +76 -173
- package/dist/core/logs-db.js +2 -2
- package/dist/core/paths.js +0 -27
- 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 +108 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +293 -1012
- 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/graph-db.js +106 -46
- package/dist/indexer/ensure-index.js +44 -85
- package/dist/indexer/graph/graph-extraction.js +340 -562
- package/dist/indexer/graph/graph-related.js +130 -0
- 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 +139 -151
- package/dist/indexer/indexer.js +524 -846
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +81 -90
- package/dist/indexer/passes/metadata.js +132 -200
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +1 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +181 -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 +2 -7
- 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/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +10 -15
- package/dist/llm/graph-extract.js +3 -12
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/metadata-enhance.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 +2 -34
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/search/ranking-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +60 -23
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +1 -2
- 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 +43937 -93313
- package/dist/scripts/akm-migrate.js +43697 -93071
- 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/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 +0 -17
- 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 +168 -0
- package/dist/storage/repositories/index-connection.js +34 -70
- package/dist/storage/repositories/index-entries-repository.js +69 -111
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +83 -269
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-llm-cache-repository.js +17 -0
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +192 -220
- 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 +35 -0
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- 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 +34 -27
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +129 -277
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +125 -745
- package/dist/tasks/backends/schtasks.js +101 -620
- 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/scheduler-binding.js +18 -238
- package/dist/tasks/scheduler-invocation.js +52 -52
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +363 -679
- package/dist/tasks/source/parse-task-source.js +160 -10
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +2 -2
- 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 +41 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +19 -7
- package/docs/reference/cli.md +182 -125
- package/docs/reference/configuration.md +49 -56
- package/docs/reference/data-and-telemetry.md +19 -20
- package/docs/reference/tasks.md +86 -38
- 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 +87 -406
- 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 -146
- package/dist/commands/improve/distill/promote-memory.js +0 -329
- package/dist/commands/improve/distill/quality-gate.js +0 -500
- 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 -21
- 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/config/retired-experimental-keys-shim.js +0 -62
- 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/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- 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/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/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 -78
- 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,107 +1,55 @@
|
|
|
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
|
-
* Layer 2 of the `akm improve` redesign — the PROACTIVE MAINTENANCE SELECTOR.
|
|
6
|
-
*
|
|
7
|
-
* The signal-delta gate (Layer 1) only surfaces assets that have *fresh*
|
|
8
|
-
* feedback. It never revisits a stable, useful asset on a schedule. On a quiet
|
|
9
|
-
* stash with no new feedback the improve loop can therefore go indefinitely
|
|
10
|
-
* without touching high-value assets that have simply gone stale.
|
|
11
|
-
*
|
|
12
|
-
* This selector is a SECOND eligibility SOURCE. It runs only on whole-stash /
|
|
13
|
-
* type scope, enumerates the eligible asset population, computes a composite
|
|
14
|
-
* maintenance priority per asset, gates on staleness (the "due" gate), bounds
|
|
15
|
-
* the result to top-N by priority, and feeds the winners into the SAME
|
|
16
|
-
* reflect/distill candidate set as the signal-delta gate — so they flow through
|
|
17
|
-
* the existing #580 empty-diff/cosmetic suppression and additive-distill gates.
|
|
18
|
-
* It adds NO new mutation or suppression logic of its own.
|
|
19
|
-
*
|
|
20
|
-
* The selector is intentionally pure: it takes pre-built staleness maps and
|
|
21
|
-
* retrieval counts (the planner already builds these for the signal-delta gate)
|
|
22
|
-
* plus an injectable `now`, and returns a deterministic selection.
|
|
23
|
-
* All DB access happens in the caller through the existing storage abstractions;
|
|
24
|
-
* this module never opens a database.
|
|
25
|
-
*/
|
|
26
|
-
import { typeNameFromConceptId } from "../../core/asset/resolve-ref.js";
|
|
4
|
+
import { assetTypeOf } from "./eligibility.js";
|
|
27
5
|
import { computeSalience } from "./salience.js";
|
|
28
|
-
/** One day in milliseconds. */
|
|
29
6
|
const DAY_MS = 86_400_000;
|
|
30
|
-
/**
|
|
7
|
+
/** An asset is due when last reflected/distilled more than this many days ago (or never). */
|
|
31
8
|
export const DEFAULT_DUE_DAYS = 30;
|
|
32
9
|
/** Default bound on how many assets the selector surfaces per run. */
|
|
33
10
|
export const DEFAULT_MAX_PER_RUN = 25;
|
|
34
|
-
/**
|
|
11
|
+
/** Size floor for the cost term, so tiny files don't divide by ~0. */
|
|
35
12
|
const SIZE_FLOOR_BYTES = 200;
|
|
36
13
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* "" when the leading segment is not a known stash subdir.
|
|
14
|
+
* The due gate, shared by selection and the post-lock re-filter: never touched,
|
|
15
|
+
* or last touched more than `dueDays` ago. It doubles as the rotation cooldown.
|
|
40
16
|
*/
|
|
41
|
-
function
|
|
42
|
-
const
|
|
43
|
-
|
|
17
|
+
function staleness(ref, lastReflectTs, lastDistillTs, dueDays, now) {
|
|
18
|
+
const lastTouchMs = Math.max(0, Date.parse(lastReflectTs.get(ref) ?? "") || 0, Date.parse(lastDistillTs.get(ref) ?? "") || 0);
|
|
19
|
+
const neverReflected = lastTouchMs === 0;
|
|
20
|
+
const staleDays = neverReflected ? Number.POSITIVE_INFINITY : (now - lastTouchMs) / DAY_MS;
|
|
21
|
+
return { staleDays, neverReflected, due: neverReflected || staleDays > dueDays };
|
|
44
22
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Score and select due assets for proactive maintenance.
|
|
47
|
-
*
|
|
48
|
-
* Priority: delegates to `computeSalience(...).rankScore` (WS-1 unified salience
|
|
49
|
-
* vector). The ranking key is therefore identical to every other selector that
|
|
50
|
-
* uses salience — a single formula governs attention across the whole improve loop.
|
|
51
|
-
*
|
|
52
|
-
* DUE gate: an asset is eligible only if it was never reflected OR last
|
|
53
|
-
* reflected/distilled more than `dueDays` ago. The same gate doubles as the
|
|
54
|
-
* ROTATION cooldown — a freshly-reflected asset is excluded until it ages back
|
|
55
|
-
* past `dueDays`, so successive runs rotate through the due pool rather than
|
|
56
|
-
* re-selecting the same heads. Non-due assets never enter the selection.
|
|
57
|
-
*/
|
|
23
|
+
/** Rank due assets by salience (then staleness, then ref) and keep the top N. */
|
|
58
24
|
export function selectProactiveMaintenanceRefs(params) {
|
|
59
25
|
const now = params.now ?? Date.now();
|
|
60
26
|
const dueDays = params.dueDays ?? DEFAULT_DUE_DAYS;
|
|
61
27
|
const maxPerRun = params.maxPerRun ?? DEFAULT_MAX_PER_RUN;
|
|
62
|
-
const scored =
|
|
63
|
-
for (const candidate of params.candidates) {
|
|
28
|
+
const scored = params.candidates.map((candidate) => {
|
|
64
29
|
const ref = candidate.ref;
|
|
65
|
-
const type =
|
|
66
|
-
// Staleness from the most recent of reflect/distill — either one touching
|
|
67
|
-
// the asset resets its maintenance clock.
|
|
68
|
-
const reflectIso = params.lastReflectTs.get(ref);
|
|
69
|
-
const distillIso = params.lastDistillTs.get(ref);
|
|
70
|
-
let lastTouchMs = 0;
|
|
71
|
-
if (reflectIso)
|
|
72
|
-
lastTouchMs = Math.max(lastTouchMs, Date.parse(reflectIso) || 0);
|
|
73
|
-
if (distillIso)
|
|
74
|
-
lastTouchMs = Math.max(lastTouchMs, Date.parse(distillIso) || 0);
|
|
75
|
-
const neverReflected = lastTouchMs === 0;
|
|
76
|
-
const staleDays = neverReflected ? Number.POSITIVE_INFINITY : (now - lastTouchMs) / DAY_MS;
|
|
77
|
-
// DUE / rotation gate.
|
|
78
|
-
const due = neverReflected || staleDays > dueDays;
|
|
79
|
-
// Retrieval frequency (for salience inputs).
|
|
30
|
+
const type = assetTypeOf(ref);
|
|
80
31
|
const retrievalFreq = params.retrievalCounts.get(ref) ?? 0;
|
|
81
|
-
const lastUse = params.lastUseMs?.get(ref) ?? 0;
|
|
82
|
-
// Size proxy (cost): kept for salience input — computeSalience applies
|
|
83
|
-
// the log10 denominator internally.
|
|
84
32
|
let sizeBytes = params.sizeBytesOf?.(candidate) ?? 0;
|
|
85
33
|
if (!sizeBytes || sizeBytes < 0)
|
|
86
34
|
sizeBytes = SIZE_FLOOR_BYTES;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
35
|
+
const priority = computeSalience({
|
|
36
|
+
ref,
|
|
37
|
+
type,
|
|
38
|
+
retrievalFreq,
|
|
39
|
+
lastUseMs: params.lastUseMs?.get(ref) ?? 0,
|
|
40
|
+
sizeBytes,
|
|
41
|
+
now,
|
|
42
|
+
}).rankScore;
|
|
43
|
+
return {
|
|
90
44
|
ref: candidate,
|
|
91
45
|
type,
|
|
92
|
-
|
|
93
|
-
neverReflected,
|
|
46
|
+
...staleness(ref, params.lastReflectTs, params.lastDistillTs, dueDays, now),
|
|
94
47
|
retrievalFreq,
|
|
95
48
|
sizeBytes,
|
|
96
49
|
priority,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
50
|
+
};
|
|
51
|
+
});
|
|
100
52
|
const dueScored = scored.filter((s) => s.due);
|
|
101
|
-
const dueTotal = dueScored.length;
|
|
102
|
-
const neverReflected = dueScored.filter((s) => s.neverReflected).length;
|
|
103
|
-
// Rank due assets by composite priority (desc). Ties broken by staleness
|
|
104
|
-
// (older first) then ref string for deterministic ordering.
|
|
105
53
|
const ranked = dueScored.slice().sort((a, b) => {
|
|
106
54
|
if (b.priority !== a.priority)
|
|
107
55
|
return b.priority - a.priority;
|
|
@@ -109,32 +57,17 @@ export function selectProactiveMaintenanceRefs(params) {
|
|
|
109
57
|
return b.staleDays - a.staleDays;
|
|
110
58
|
return a.ref.ref < b.ref.ref ? -1 : a.ref.ref > b.ref.ref ? 1 : 0;
|
|
111
59
|
});
|
|
112
|
-
|
|
113
|
-
|
|
60
|
+
return {
|
|
61
|
+
selected: ranked.slice(0, Math.max(0, maxPerRun)).map((s) => s.ref),
|
|
62
|
+
dueTotal: dueScored.length,
|
|
63
|
+
neverReflected: dueScored.filter((s) => s.neverReflected).length,
|
|
64
|
+
scored,
|
|
65
|
+
};
|
|
114
66
|
}
|
|
115
67
|
/**
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
* Called under the whole-run lock with freshly-read timestamp maps. Refs that
|
|
119
|
-
* became non-due before this run acquired the lock are dropped before execution,
|
|
120
|
-
* closing the SELECT-time cooldown race.
|
|
121
|
-
*
|
|
122
|
-
* The logic mirrors the DUE gate in `selectProactiveMaintenanceRefs` — an
|
|
123
|
-
* asset is due only when never touched OR last touched more than `dueDays`
|
|
124
|
-
* ago. The selector and this filter must always agree on the gate predicate.
|
|
68
|
+
* Re-apply the due gate under the run lock with fresh timestamps, dropping refs
|
|
69
|
+
* another run attempted after this one planned.
|
|
125
70
|
*/
|
|
126
71
|
export function filterProactiveDue(selected, lastReflectTs, lastDistillTs, dueDays, now) {
|
|
127
|
-
return selected.filter((
|
|
128
|
-
const ref = candidate.ref;
|
|
129
|
-
const reflectIso = lastReflectTs.get(ref);
|
|
130
|
-
const distillIso = lastDistillTs.get(ref);
|
|
131
|
-
let lastTouchMs = 0;
|
|
132
|
-
if (reflectIso)
|
|
133
|
-
lastTouchMs = Math.max(lastTouchMs, Date.parse(reflectIso) || 0);
|
|
134
|
-
if (distillIso)
|
|
135
|
-
lastTouchMs = Math.max(lastTouchMs, Date.parse(distillIso) || 0);
|
|
136
|
-
const neverReflected = lastTouchMs === 0;
|
|
137
|
-
const staleDays = neverReflected ? Number.POSITIVE_INFINITY : (now - lastTouchMs) / DAY_MS;
|
|
138
|
-
return neverReflected || staleDays > dueDays;
|
|
139
|
-
});
|
|
72
|
+
return selected.filter((c) => staleness(c.ref, lastReflectTs, lastDistillTs, dueDays, now).due);
|
|
140
73
|
}
|