@unbrained/pm-cli 2026.9.7 → 2026.9.8
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/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +5 -0
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +211 -181
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
- package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
- package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
- package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
- package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
- package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +29 -29
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +157 -837
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +1 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -0
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +3 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +23 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,504 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module sdk/context-relevance
|
|
3
|
-
*
|
|
4
|
-
* Public, deterministic context-ranking and evaluation primitives. The scorer
|
|
5
|
-
* accepts already-derived signals so package authors can reuse the same model
|
|
6
|
-
* with core, extension, or project-specific feature stores.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="80a03884-711e-5170-a3c1-f05ccb065702")}catch(e){}}();
|
|
10
|
-
import { runActiveServiceOverride } from "../core/extensions/index.js";
|
|
11
|
-
import { normalizeStatusForRegistry, normalizeStatusInput, } from "../core/item/status.js";
|
|
12
|
-
import { compareTimestampStrings } from "../core/shared/time.js";
|
|
13
|
-
import { canonicalizeContextRecencyCoordinate, CONTEXT_RECENCY_EPOCH, } from "./context/recency.js";
|
|
14
|
-
/** Canonical signal keys understood by the built-in relevance model. */
|
|
15
|
-
export const CONTEXT_RELEVANCE_SIGNAL_NAMES = [
|
|
16
|
-
"structural",
|
|
17
|
-
"recency",
|
|
18
|
-
"activity_density",
|
|
19
|
-
"graph_proximity",
|
|
20
|
-
"claim_focus",
|
|
21
|
-
"priority_pressure",
|
|
22
|
-
"risk_pressure",
|
|
23
|
-
"deadline_pressure",
|
|
24
|
-
"knowledge_density",
|
|
25
|
-
"author_affinity",
|
|
26
|
-
"usage_affinity",
|
|
27
|
-
"semantic_similarity",
|
|
28
|
-
];
|
|
29
|
-
const NO_CONTEXT_AUTHOR = Symbol("no-context-author");
|
|
30
|
-
const NO_ITEM_ASSIGNEE = Symbol("no-item-assignee");
|
|
31
|
-
function normalizeContextActor(value, missingValue) {
|
|
32
|
-
if (typeof value !== "string")
|
|
33
|
-
return missingValue;
|
|
34
|
-
const normalized = value.trim().toLowerCase();
|
|
35
|
-
return normalized.length > 0 ? normalized : missingValue;
|
|
36
|
-
}
|
|
37
|
-
function releaseCohortCoordinate(value) {
|
|
38
|
-
if (typeof value !== "string")
|
|
39
|
-
return undefined;
|
|
40
|
-
const match = /^v?(\d{4})\.(\d{1,2})\.(\d{1,2})(?:$|[-+])/u.exec(value.trim());
|
|
41
|
-
if (!match)
|
|
42
|
-
return undefined;
|
|
43
|
-
const year = Number(match[1]);
|
|
44
|
-
const month = Number(match[2]);
|
|
45
|
-
const day = Number(match[3]);
|
|
46
|
-
const date = new Date(Date.UTC(year, month - 1, day));
|
|
47
|
-
return date.getUTCFullYear() === year &&
|
|
48
|
-
date.getUTCMonth() === month - 1 &&
|
|
49
|
-
date.getUTCDate() === day
|
|
50
|
-
? date.toISOString()
|
|
51
|
-
: undefined;
|
|
52
|
-
}
|
|
53
|
-
function fallbackRecencyEvidence(item) {
|
|
54
|
-
const releaseCoordinate = releaseCohortCoordinate(item.release);
|
|
55
|
-
if (releaseCoordinate !== undefined) {
|
|
56
|
-
return { source: "release_cohort", coordinate: releaseCoordinate };
|
|
57
|
-
}
|
|
58
|
-
return {
|
|
59
|
-
source: "created_at",
|
|
60
|
-
coordinate: canonicalizeContextRecencyCoordinate(item.created_at) ??
|
|
61
|
-
CONTEXT_RECENCY_EPOCH,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
function canonicalizeRecencyEvidence(evidence) {
|
|
65
|
-
if (!["substantive_history", "release_cohort", "created_at"].includes(evidence.source) ||
|
|
66
|
-
(evidence.source === "substantive_history"
|
|
67
|
-
? (evidence.history_op !== undefined &&
|
|
68
|
-
typeof evidence.history_op !== "string") ||
|
|
69
|
-
(evidence.event_class !== undefined &&
|
|
70
|
-
evidence.event_class !== "substantive")
|
|
71
|
-
: evidence.history_op !== undefined || evidence.event_class !== undefined)) {
|
|
72
|
-
throw new TypeError("Context signal recency provenance must match its source");
|
|
73
|
-
}
|
|
74
|
-
const coordinate = canonicalizeContextRecencyCoordinate(evidence.coordinate);
|
|
75
|
-
if (coordinate === null) {
|
|
76
|
-
throw new TypeError("Context signal recency coordinate must be a valid absolute timestamp with millisecond precision");
|
|
77
|
-
}
|
|
78
|
-
return { ...evidence, coordinate };
|
|
79
|
-
}
|
|
80
|
-
function normalizedPressure(value, maximum) {
|
|
81
|
-
const parsed = typeof value === "number"
|
|
82
|
-
? value
|
|
83
|
-
: typeof value === "string"
|
|
84
|
-
? Number.parseFloat(value)
|
|
85
|
-
: Number.NaN;
|
|
86
|
-
return Number.isFinite(parsed)
|
|
87
|
-
? 1 - Math.min(Math.max(parsed, 0), maximum) / maximum
|
|
88
|
-
: 0;
|
|
89
|
-
}
|
|
90
|
-
function deadlinePressure(deadline, nowMs) {
|
|
91
|
-
const deadlineMs = typeof deadline === "string"
|
|
92
|
-
? Date.parse(deadline)
|
|
93
|
-
: deadline instanceof Date
|
|
94
|
-
? deadline.getTime()
|
|
95
|
-
: typeof deadline === "number"
|
|
96
|
-
? deadline
|
|
97
|
-
: Number.NaN;
|
|
98
|
-
if (!Number.isFinite(deadlineMs) || !Number.isFinite(nowMs))
|
|
99
|
-
return 0;
|
|
100
|
-
const days = (deadlineMs - nowMs) / 86_400_000;
|
|
101
|
-
return days <= 0 ? 1 : 1 / (1 + days / 30);
|
|
102
|
-
}
|
|
103
|
-
function riskPressure(risk) {
|
|
104
|
-
const normalized = typeof risk === "string" ? risk.trim().toLowerCase() : undefined;
|
|
105
|
-
if (normalized === "critical" || normalized === "high")
|
|
106
|
-
return 1;
|
|
107
|
-
if (normalized === "medium")
|
|
108
|
-
return 0.5;
|
|
109
|
-
return normalized === "low" ? 0.1 : 0;
|
|
110
|
-
}
|
|
111
|
-
function derivedSignalOrFallback(values, id, fallback) {
|
|
112
|
-
return values?.[id] ?? fallback;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Derive the canonical metadata signals consumed by `pm context` and `pm next`.
|
|
116
|
-
* Extensions can pair this with {@link scoreContextCandidatesWithActiveExtensions}
|
|
117
|
-
* to reproduce built-in ranking without private imports or subprocesses.
|
|
118
|
-
*/
|
|
119
|
-
export function buildItemContextRelevanceCandidates(items, options) {
|
|
120
|
-
const recencyEvidence = new Map(items.map((item) => {
|
|
121
|
-
const suppliedEvidence = options.recencyEvidence?.[item.id];
|
|
122
|
-
return [
|
|
123
|
-
item.id,
|
|
124
|
-
suppliedEvidence === undefined
|
|
125
|
-
? fallbackRecencyEvidence(item)
|
|
126
|
-
: canonicalizeRecencyEvidence(suppliedEvidence),
|
|
127
|
-
];
|
|
128
|
-
}));
|
|
129
|
-
const recencyOrder = [...items].sort((left, right) => {
|
|
130
|
-
const leftTime = recencyEvidence.get(left.id)
|
|
131
|
-
.coordinate;
|
|
132
|
-
const rightTime = recencyEvidence.get(right.id)
|
|
133
|
-
.coordinate;
|
|
134
|
-
return (compareTimestampStrings(rightTime, leftTime) ||
|
|
135
|
-
left.id.localeCompare(right.id));
|
|
136
|
-
});
|
|
137
|
-
const recencyRank = new Map(recencyOrder.map((item, index) => [item.id, index]));
|
|
138
|
-
const denominator = Math.max(items.length - 1, 1);
|
|
139
|
-
const normalizedAuthor = normalizeContextActor(options.author, NO_CONTEXT_AUTHOR);
|
|
140
|
-
const inProgressStatus = normalizeStatusInput("in_progress", options.statusRegistry);
|
|
141
|
-
const nowMs = Date.parse(options.now);
|
|
142
|
-
return items.map((item) => {
|
|
143
|
-
const assigned = normalizeContextActor(item.assignee, NO_ITEM_ASSIGNEE) ===
|
|
144
|
-
normalizedAuthor;
|
|
145
|
-
const knowledgeEntries = (item.comments?.length ?? 0) +
|
|
146
|
-
(item.notes?.length ?? 0) +
|
|
147
|
-
(item.learnings?.length ?? 0);
|
|
148
|
-
return {
|
|
149
|
-
id: item.id,
|
|
150
|
-
item,
|
|
151
|
-
signal_provenance: {
|
|
152
|
-
recency: recencyEvidence.get(item.id),
|
|
153
|
-
},
|
|
154
|
-
signals: {
|
|
155
|
-
recency: items.length === 1
|
|
156
|
-
? 1
|
|
157
|
-
: 1 - recencyRank.get(item.id) / denominator,
|
|
158
|
-
activity_density: options.activityDensity?.[item.id],
|
|
159
|
-
graph_proximity: derivedSignalOrFallback(options.graphProximity, item.id, item.parent ? 0.3 : 0),
|
|
160
|
-
claim_focus: derivedSignalOrFallback(options.claimFocus, item.id, normalizeStatusForRegistry(item.status, options.statusRegistry) ===
|
|
161
|
-
inProgressStatus
|
|
162
|
-
? 1
|
|
163
|
-
: assigned
|
|
164
|
-
? 0.75
|
|
165
|
-
: 0),
|
|
166
|
-
priority_pressure: normalizedPressure(item.priority, 4),
|
|
167
|
-
risk_pressure: riskPressure(item.risk),
|
|
168
|
-
deadline_pressure: deadlinePressure(item.deadline, nowMs),
|
|
169
|
-
knowledge_density: derivedSignalOrFallback(options.knowledgeDensity, item.id, Math.min(knowledgeEntries / 5, 1)),
|
|
170
|
-
author_affinity: derivedSignalOrFallback(options.authorAffinity, item.id, assigned ? 1 : 0),
|
|
171
|
-
usage_affinity: options.usageAffinity?.[item.id],
|
|
172
|
-
semantic_similarity: options.semanticSimilarity?.[item.id],
|
|
173
|
-
},
|
|
174
|
-
};
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
/** Governed extension service used to replace or wrap context ranking. */
|
|
178
|
-
export const CONTEXT_RELEVANCE_SERVICE = "context_relevance";
|
|
179
|
-
const DEFAULT_CONTEXT_RELEVANCE_WEIGHTS = {
|
|
180
|
-
structural: 0.4,
|
|
181
|
-
recency: 0.35,
|
|
182
|
-
activity_density: 0.25,
|
|
183
|
-
graph_proximity: 0.15,
|
|
184
|
-
claim_focus: 0.6,
|
|
185
|
-
priority_pressure: 0.35,
|
|
186
|
-
risk_pressure: 0.2,
|
|
187
|
-
deadline_pressure: 0.45,
|
|
188
|
-
knowledge_density: 0.25,
|
|
189
|
-
author_affinity: 0.2,
|
|
190
|
-
usage_affinity: 0.3,
|
|
191
|
-
semantic_similarity: 0.5,
|
|
192
|
-
};
|
|
193
|
-
const JSON_TOKEN_ENCODER = new TextEncoder();
|
|
194
|
-
function assertCandidates(candidates) {
|
|
195
|
-
const ids = new Set();
|
|
196
|
-
for (const candidate of candidates) {
|
|
197
|
-
if (typeof candidate.id !== "string" ||
|
|
198
|
-
candidate.id.trim().length === 0 ||
|
|
199
|
-
ids.has(candidate.id)) {
|
|
200
|
-
throw new TypeError("Context relevance candidates require unique non-empty ids");
|
|
201
|
-
}
|
|
202
|
-
ids.add(candidate.id);
|
|
203
|
-
for (const [signal, value] of Object.entries(candidate.signals ?? {})) {
|
|
204
|
-
if (signal === "structural" ||
|
|
205
|
-
!CONTEXT_RELEVANCE_SIGNAL_NAMES.includes(signal)) {
|
|
206
|
-
throw new TypeError(`Unknown context relevance signal: ${signal}`);
|
|
207
|
-
}
|
|
208
|
-
if (value === undefined)
|
|
209
|
-
continue;
|
|
210
|
-
if (!Number.isFinite(value) || value < 0 || value > 1) {
|
|
211
|
-
throw new TypeError(`Context relevance signal ${signal} must be a finite number from 0 to 1`);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
function resolveWeights(overrides) {
|
|
217
|
-
const weights = { ...DEFAULT_CONTEXT_RELEVANCE_WEIGHTS };
|
|
218
|
-
for (const [signal, weight] of Object.entries(overrides ?? {})) {
|
|
219
|
-
if (weight !== undefined &&
|
|
220
|
-
CONTEXT_RELEVANCE_SIGNAL_NAMES.includes(signal)) {
|
|
221
|
-
weights[signal] = weight;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
for (const [signal, weight] of Object.entries(weights)) {
|
|
225
|
-
if (!Number.isFinite(weight) || weight < 0) {
|
|
226
|
-
throw new TypeError(`Context relevance weight ${signal} must be a finite non-negative number`);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return weights;
|
|
230
|
-
}
|
|
231
|
-
/** Score candidates with pm's deterministic weighted model. Candidate order is the structural baseline and remains unchanged when no advanced signals exist. */
|
|
232
|
-
export function defaultScoreContextCandidates(candidates, options = {}) {
|
|
233
|
-
assertCandidates(candidates);
|
|
234
|
-
const weights = resolveWeights(options.weights);
|
|
235
|
-
const denominator = Math.max(candidates.length - 1, 1);
|
|
236
|
-
const available = new Set(["structural"]);
|
|
237
|
-
for (const candidate of candidates) {
|
|
238
|
-
for (const [signal, value] of Object.entries(candidate.signals ?? {})) {
|
|
239
|
-
if (value !== undefined)
|
|
240
|
-
available.add(signal);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
const availableSignals = CONTEXT_RELEVANCE_SIGNAL_NAMES.filter((signal) => available.has(signal));
|
|
244
|
-
const scored = candidates.map((candidate, index) => {
|
|
245
|
-
const signalValues = {
|
|
246
|
-
structural: candidates.length === 1 ? 1 : 1 - index / denominator,
|
|
247
|
-
...candidate.signals,
|
|
248
|
-
};
|
|
249
|
-
const contributions = {};
|
|
250
|
-
let weightedScore = 0;
|
|
251
|
-
let totalWeight = 0;
|
|
252
|
-
for (const signal of availableSignals) {
|
|
253
|
-
const value = signalValues[signal];
|
|
254
|
-
if (value === undefined)
|
|
255
|
-
continue;
|
|
256
|
-
const contribution = value * weights[signal];
|
|
257
|
-
contributions[signal] = contribution;
|
|
258
|
-
weightedScore += contribution;
|
|
259
|
-
totalWeight += weights[signal];
|
|
260
|
-
}
|
|
261
|
-
return {
|
|
262
|
-
...candidate,
|
|
263
|
-
baseline_rank: index + 1,
|
|
264
|
-
rank: 0,
|
|
265
|
-
score: totalWeight === 0 ? 0 : weightedScore / totalWeight,
|
|
266
|
-
contributions,
|
|
267
|
-
};
|
|
268
|
-
});
|
|
269
|
-
scored.sort((left, right) => right.score - left.score || left.baseline_rank - right.baseline_rank);
|
|
270
|
-
scored.forEach((entry, index) => {
|
|
271
|
-
entry.rank = index + 1;
|
|
272
|
-
});
|
|
273
|
-
return {
|
|
274
|
-
model: "default-weighted-v1",
|
|
275
|
-
available_signals: availableSignals,
|
|
276
|
-
ranked: scored,
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
/** Score candidates with the default model or a validated replacement/wrapper. */
|
|
280
|
-
export async function scoreContextCandidates(candidates, options = {}) {
|
|
281
|
-
const defaultReport = defaultScoreContextCandidates(candidates, options);
|
|
282
|
-
if (!options.scorer)
|
|
283
|
-
return defaultReport;
|
|
284
|
-
const customScores = await options.scorer({
|
|
285
|
-
candidates,
|
|
286
|
-
default_report: defaultReport,
|
|
287
|
-
});
|
|
288
|
-
const scoreById = new Map();
|
|
289
|
-
for (const entry of customScores) {
|
|
290
|
-
if (scoreById.has(entry.id) || !Number.isFinite(entry.score)) {
|
|
291
|
-
throw new TypeError("Context relevance scorer must return one finite score for every candidate");
|
|
292
|
-
}
|
|
293
|
-
scoreById.set(entry.id, entry.score);
|
|
294
|
-
}
|
|
295
|
-
if (scoreById.size !== candidates.length ||
|
|
296
|
-
candidates.some((candidate) => !scoreById.has(candidate.id))) {
|
|
297
|
-
throw new TypeError("Context relevance scorer must return one finite score for every candidate");
|
|
298
|
-
}
|
|
299
|
-
const ranked = defaultReport.ranked.map((entry) => {
|
|
300
|
-
const score = scoreById.get(entry.id);
|
|
301
|
-
return { ...entry, score, contributions: { custom: score } };
|
|
302
|
-
});
|
|
303
|
-
ranked.sort((left, right) => right.score - left.score || left.baseline_rank - right.baseline_rank);
|
|
304
|
-
ranked.forEach((entry, index) => {
|
|
305
|
-
entry.rank = index + 1;
|
|
306
|
-
});
|
|
307
|
-
return {
|
|
308
|
-
model: "custom",
|
|
309
|
-
available_signals: defaultReport.available_signals,
|
|
310
|
-
ranked,
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
/** Score command candidates through the public default model and then the active governed `context_relevance` service override, when one is registered. */
|
|
314
|
-
export async function scoreContextCandidatesWithActiveExtensions(surface, candidates, options = {}) {
|
|
315
|
-
const defaultReport = defaultScoreContextCandidates(candidates, options);
|
|
316
|
-
const override = await runActiveServiceOverride(CONTEXT_RELEVANCE_SERVICE, {
|
|
317
|
-
surface,
|
|
318
|
-
candidates,
|
|
319
|
-
default_report: defaultReport,
|
|
320
|
-
});
|
|
321
|
-
if (!override.handled) {
|
|
322
|
-
return override.warnings.length > 0
|
|
323
|
-
? { ...defaultReport, warnings: override.warnings }
|
|
324
|
-
: defaultReport;
|
|
325
|
-
}
|
|
326
|
-
if (!Array.isArray(override.result) ||
|
|
327
|
-
!override.result.every((entry) => typeof entry === "object" &&
|
|
328
|
-
entry !== null &&
|
|
329
|
-
typeof entry.id === "string" &&
|
|
330
|
-
typeof entry.score === "number" &&
|
|
331
|
-
Number.isFinite(entry.score))) {
|
|
332
|
-
return {
|
|
333
|
-
...defaultReport,
|
|
334
|
-
warnings: [
|
|
335
|
-
...override.warnings,
|
|
336
|
-
"extension_context_relevance_invalid_result",
|
|
337
|
-
],
|
|
338
|
-
};
|
|
339
|
-
}
|
|
340
|
-
try {
|
|
341
|
-
const report = await scoreContextCandidates(candidates, {
|
|
342
|
-
...options,
|
|
343
|
-
scorer: () => override.result,
|
|
344
|
-
});
|
|
345
|
-
return override.warnings.length > 0
|
|
346
|
-
? { ...report, warnings: override.warnings }
|
|
347
|
-
: report;
|
|
348
|
-
}
|
|
349
|
-
catch {
|
|
350
|
-
return {
|
|
351
|
-
...defaultReport,
|
|
352
|
-
warnings: [
|
|
353
|
-
...override.warnings,
|
|
354
|
-
"extension_context_relevance_invalid_result",
|
|
355
|
-
],
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
/** Canonical aggregate metrics required by every context evaluation corpus. */
|
|
360
|
-
export const CONTEXT_EVALUATION_METRIC_NAMES = [
|
|
361
|
-
"ndcg",
|
|
362
|
-
"reciprocal_rank",
|
|
363
|
-
"required_recall",
|
|
364
|
-
"continuity_coverage",
|
|
365
|
-
"token_budget_adherence",
|
|
366
|
-
];
|
|
367
|
-
function ratioOfPresent(expected, actual) {
|
|
368
|
-
if (expected.length === 0)
|
|
369
|
-
return 1;
|
|
370
|
-
return expected.filter((id) => actual.has(id)).length / expected.length;
|
|
371
|
-
}
|
|
372
|
-
/** Evaluate one ranked context packet against graded human judgments. */
|
|
373
|
-
export function evaluateContextRanking(input) {
|
|
374
|
-
if (!Number.isFinite(input.actual_tokens) ||
|
|
375
|
-
input.actual_tokens < 0 ||
|
|
376
|
-
!Number.isFinite(input.token_budget) ||
|
|
377
|
-
input.token_budget <= 0) {
|
|
378
|
-
throw new TypeError("Context ranking token counts require actual_tokens >= 0 and token_budget > 0");
|
|
379
|
-
}
|
|
380
|
-
const judgments = input.judgments ?? {};
|
|
381
|
-
const gains = input.ranked_ids.map((id) => Math.max(0, judgments[id] ?? 0));
|
|
382
|
-
const idealGains = Object.values(judgments)
|
|
383
|
-
.map((grade) => Math.max(0, grade))
|
|
384
|
-
.sort((left, right) => right - left)
|
|
385
|
-
.slice(0, gains.length || 1);
|
|
386
|
-
const discountedGain = (values) => values.reduce((total, grade, index) => total + (2 ** grade - 1) / Math.log2(index + 2), 0);
|
|
387
|
-
const ideal = discountedGain(idealGains);
|
|
388
|
-
const firstRelevant = gains.findIndex((grade) => grade > 0);
|
|
389
|
-
const actualIds = new Set(input.ranked_ids);
|
|
390
|
-
const withinBudget = input.actual_tokens <= input.token_budget;
|
|
391
|
-
return {
|
|
392
|
-
ndcg: ideal === 0 ? 1 : discountedGain(gains) / ideal,
|
|
393
|
-
reciprocal_rank: firstRelevant < 0 ? 0 : 1 / (firstRelevant + 1),
|
|
394
|
-
required_recall: ratioOfPresent(input.required_ids ?? [], actualIds),
|
|
395
|
-
continuity_coverage: ratioOfPresent(input.continuity_ids ?? [], actualIds),
|
|
396
|
-
token_budget_adherence: withinBudget
|
|
397
|
-
? 1
|
|
398
|
-
: input.token_budget / input.actual_tokens,
|
|
399
|
-
within_token_budget: withinBudget,
|
|
400
|
-
};
|
|
401
|
-
}
|
|
402
|
-
function estimateJsonTokens(value) {
|
|
403
|
-
return Math.ceil(JSON_TOKEN_ENCODER.encode(JSON.stringify(value)).byteLength / 4);
|
|
404
|
-
}
|
|
405
|
-
function roundEvaluationMetric(value) {
|
|
406
|
-
return Math.round(value * 10_000) / 10_000;
|
|
407
|
-
}
|
|
408
|
-
function rankingPayloadForScenario(result, surface) {
|
|
409
|
-
const rankedIds = surface === "context"
|
|
410
|
-
? [
|
|
411
|
-
...(result.high_level ?? []),
|
|
412
|
-
...(result.low_level ?? []),
|
|
413
|
-
...(result.blocked_fallback ??
|
|
414
|
-
[]),
|
|
415
|
-
].map((item) => item.id)
|
|
416
|
-
: [
|
|
417
|
-
...(result.recommended
|
|
418
|
-
? [
|
|
419
|
-
result
|
|
420
|
-
.recommended,
|
|
421
|
-
]
|
|
422
|
-
: []),
|
|
423
|
-
...(result.ready ?? []),
|
|
424
|
-
].map((item) => item.id);
|
|
425
|
-
const servedIds = new Set(rankedIds);
|
|
426
|
-
const attribution = (result.ranking?.items ?? [])
|
|
427
|
-
.filter((item) => servedIds.has(item.id))
|
|
428
|
-
.map((item) => ({ id: item.id, contributions: item.contributions }));
|
|
429
|
-
return { rankedIds, attribution };
|
|
430
|
-
}
|
|
431
|
-
/** Execute one graded scenario through public SDK context/next read primitives. */
|
|
432
|
-
export async function runContextEvaluationScenario(scenario, reader) {
|
|
433
|
-
if (scenario.id.trim().length === 0 ||
|
|
434
|
-
scenario.rationale.trim().length === 0) {
|
|
435
|
-
throw new TypeError("Context evaluation scenarios require non-empty id and rationale values");
|
|
436
|
-
}
|
|
437
|
-
const result = scenario.surface === "context"
|
|
438
|
-
? await reader.context({
|
|
439
|
-
...scenario.options,
|
|
440
|
-
explainRanking: true,
|
|
441
|
-
outputBudget: "unbounded",
|
|
442
|
-
})
|
|
443
|
-
: await reader.next({
|
|
444
|
-
...scenario.options,
|
|
445
|
-
explainRanking: true,
|
|
446
|
-
outputBudget: "unbounded",
|
|
447
|
-
});
|
|
448
|
-
const { rankedIds, attribution } = rankingPayloadForScenario(result, scenario.surface);
|
|
449
|
-
const packet = { ...result, ranking: undefined };
|
|
450
|
-
const actualTokens = estimateJsonTokens(packet);
|
|
451
|
-
return {
|
|
452
|
-
id: scenario.id,
|
|
453
|
-
surface: scenario.surface,
|
|
454
|
-
rationale: scenario.rationale,
|
|
455
|
-
ranked_ids: rankedIds,
|
|
456
|
-
actual_tokens: actualTokens,
|
|
457
|
-
metrics: evaluateContextRanking({
|
|
458
|
-
ranked_ids: rankedIds,
|
|
459
|
-
judgments: scenario.judgments,
|
|
460
|
-
required_ids: scenario.required_ids,
|
|
461
|
-
continuity_ids: scenario.continuity_ids,
|
|
462
|
-
actual_tokens: actualTokens,
|
|
463
|
-
token_budget: scenario.token_budget,
|
|
464
|
-
}),
|
|
465
|
-
attribution,
|
|
466
|
-
};
|
|
467
|
-
}
|
|
468
|
-
/** Aggregate scenario reports and evaluate every metric against explicit thresholds. */
|
|
469
|
-
export function summarizeContextEvaluationReports(reports, thresholds) {
|
|
470
|
-
if (reports.length === 0) {
|
|
471
|
-
throw new TypeError("Context evaluation requires at least one scenario report");
|
|
472
|
-
}
|
|
473
|
-
const metrics = CONTEXT_EVALUATION_METRIC_NAMES;
|
|
474
|
-
for (const metric of metrics) {
|
|
475
|
-
if (!Number.isFinite(thresholds[metric])) {
|
|
476
|
-
throw new TypeError(`Context evaluation threshold ${metric} must be a finite number`);
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
const aggregate = Object.fromEntries(metrics.map((metric) => [
|
|
480
|
-
metric,
|
|
481
|
-
roundEvaluationMetric(reports.reduce((total, report) => total + report.metrics[metric], 0) /
|
|
482
|
-
reports.length),
|
|
483
|
-
]));
|
|
484
|
-
const failures = metrics
|
|
485
|
-
.filter((metric) => aggregate[metric] < thresholds[metric])
|
|
486
|
-
.map((metric) => `${metric}:${aggregate[metric]}<${thresholds[metric]}`);
|
|
487
|
-
return {
|
|
488
|
-
scenario_count: reports.length,
|
|
489
|
-
aggregate,
|
|
490
|
-
scenarios: [...reports],
|
|
491
|
-
passed: failures.length === 0,
|
|
492
|
-
failures,
|
|
493
|
-
};
|
|
494
|
-
}
|
|
495
|
-
/** Execute a same-workspace scenario corpus through public SDK read primitives. */
|
|
496
|
-
export async function runContextEvaluationCorpus(scenarios, reader, thresholds) {
|
|
497
|
-
const reports = [];
|
|
498
|
-
for (const scenario of scenarios) {
|
|
499
|
-
reports.push(await runContextEvaluationScenario(scenario, reader));
|
|
500
|
-
}
|
|
501
|
-
return summarizeContextEvaluationReports(reports, thresholds);
|
|
502
|
-
}
|
|
1
|
+
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="dffb5f26-d8b4-5861-a7ea-0436bd4a22a6")}catch(e2){}})();import{runActiveServiceOverride}from"../core/extensions/index.js";import{normalizeStatusForRegistry,normalizeStatusInput}from"../core/item/status.js";import{compareTimestampStrings}from"../core/shared/time.js";import{canonicalizeContextRecencyCoordinate,CONTEXT_RECENCY_EPOCH}from"./context/recency.js";const CONTEXT_RELEVANCE_SIGNAL_NAMES=["structural","recency","activity_density","graph_proximity","claim_focus","priority_pressure","risk_pressure","deadline_pressure","knowledge_density","author_affinity","usage_affinity","semantic_similarity"];const NO_CONTEXT_AUTHOR=Symbol("no-context-author");const NO_ITEM_ASSIGNEE=Symbol("no-item-assignee");function normalizeContextActor(value,missingValue){if(typeof value!=="string")return missingValue;const normalized=value.trim().toLowerCase();return normalized.length>0?normalized:missingValue}function releaseCohortCoordinate(value){if(typeof value!=="string")return void 0;const match=/^v?(\d{4})\.(\d{1,2})\.(\d{1,2})(?:$|[-+])/u.exec(value.trim());if(!match)return void 0;const year=Number(match[1]);const month=Number(match[2]);const day=Number(match[3]);const date=new Date(Date.UTC(year,month-1,day));return date.getUTCFullYear()===year&&date.getUTCMonth()===month-1&&date.getUTCDate()===day?date.toISOString():void 0}function fallbackRecencyEvidence(item){const releaseCoordinate=releaseCohortCoordinate(item.release);if(releaseCoordinate!==void 0){return{source:"release_cohort",coordinate:releaseCoordinate}}return{source:"created_at",coordinate:canonicalizeContextRecencyCoordinate(item.created_at)??CONTEXT_RECENCY_EPOCH}}function canonicalizeRecencyEvidence(evidence){if(!["substantive_history","release_cohort","created_at"].includes(evidence.source)||(evidence.source==="substantive_history"?evidence.history_op!==void 0&&typeof evidence.history_op!=="string"||evidence.event_class!==void 0&&evidence.event_class!=="substantive":evidence.history_op!==void 0||evidence.event_class!==void 0)){throw new TypeError("Context signal recency provenance must match its source")}const coordinate=canonicalizeContextRecencyCoordinate(evidence.coordinate);if(coordinate===null){throw new TypeError("Context signal recency coordinate must be a valid absolute timestamp with millisecond precision")}return{...evidence,coordinate}}function normalizedPressure(value,maximum){const parsed=typeof value==="number"?value:typeof value==="string"?Number.parseFloat(value):Number.NaN;return Number.isFinite(parsed)?1-Math.min(Math.max(parsed,0),maximum)/maximum:0}function deadlinePressure(deadline,nowMs){const deadlineMs=typeof deadline==="string"?Date.parse(deadline):deadline instanceof Date?deadline.getTime():typeof deadline==="number"?deadline:Number.NaN;if(!Number.isFinite(deadlineMs)||!Number.isFinite(nowMs))return 0;const days=(deadlineMs-nowMs)/864e5;return days<=0?1:1/(1+days/30)}function riskPressure(risk){const normalized=typeof risk==="string"?risk.trim().toLowerCase():void 0;if(normalized==="critical"||normalized==="high")return 1;if(normalized==="medium")return .5;return normalized==="low"?.1:0}function derivedSignalOrFallback(values,id,fallback){return values?.[id]??fallback}function buildItemContextRelevanceCandidates(items,options){const recencyEvidence=new Map(items.map(item=>{const suppliedEvidence=options.recencyEvidence?.[item.id];return[item.id,suppliedEvidence===void 0?fallbackRecencyEvidence(item):canonicalizeRecencyEvidence(suppliedEvidence)]}));const recencyOrder=[...items].sort((left,right)=>{const leftTime=recencyEvidence.get(left.id).coordinate;const rightTime=recencyEvidence.get(right.id).coordinate;return compareTimestampStrings(rightTime,leftTime)||left.id.localeCompare(right.id)});const recencyRank=new Map(recencyOrder.map((item,index)=>[item.id,index]));const denominator=Math.max(items.length-1,1);const normalizedAuthor=normalizeContextActor(options.author,NO_CONTEXT_AUTHOR);const inProgressStatus=normalizeStatusInput("in_progress",options.statusRegistry);const nowMs=Date.parse(options.now);return items.map(item=>{const assigned=normalizeContextActor(item.assignee,NO_ITEM_ASSIGNEE)===normalizedAuthor;const knowledgeEntries=(item.comments?.length??0)+(item.notes?.length??0)+(item.learnings?.length??0);return{id:item.id,item,signal_provenance:{recency:recencyEvidence.get(item.id)},signals:{recency:items.length===1?1:1-recencyRank.get(item.id)/denominator,activity_density:options.activityDensity?.[item.id],graph_proximity:derivedSignalOrFallback(options.graphProximity,item.id,item.parent?.3:0),claim_focus:derivedSignalOrFallback(options.claimFocus,item.id,normalizeStatusForRegistry(item.status,options.statusRegistry)===inProgressStatus?1:assigned?.75:0),priority_pressure:normalizedPressure(item.priority,4),risk_pressure:riskPressure(item.risk),deadline_pressure:deadlinePressure(item.deadline,nowMs),knowledge_density:derivedSignalOrFallback(options.knowledgeDensity,item.id,Math.min(knowledgeEntries/5,1)),author_affinity:derivedSignalOrFallback(options.authorAffinity,item.id,assigned?1:0),usage_affinity:options.usageAffinity?.[item.id],semantic_similarity:options.semanticSimilarity?.[item.id]}}})}const CONTEXT_RELEVANCE_SERVICE="context_relevance";const DEFAULT_CONTEXT_RELEVANCE_WEIGHTS={structural:.4,recency:.35,activity_density:.25,graph_proximity:.15,claim_focus:.6,priority_pressure:.35,risk_pressure:.2,deadline_pressure:.45,knowledge_density:.25,author_affinity:.2,usage_affinity:.3,semantic_similarity:.5};const JSON_TOKEN_ENCODER=new TextEncoder;function assertCandidates(candidates){const ids=new Set;for(const candidate of candidates){if(typeof candidate.id!=="string"||candidate.id.trim().length===0||ids.has(candidate.id)){throw new TypeError("Context relevance candidates require unique non-empty ids")}ids.add(candidate.id);for(const[signal,value]of Object.entries(candidate.signals??{})){if(signal==="structural"||!CONTEXT_RELEVANCE_SIGNAL_NAMES.includes(signal)){throw new TypeError(`Unknown context relevance signal: ${signal}`)}if(value===void 0)continue;if(!Number.isFinite(value)||value<0||value>1){throw new TypeError(`Context relevance signal ${signal} must be a finite number from 0 to 1`)}}}}function resolveWeights(overrides){const weights={...DEFAULT_CONTEXT_RELEVANCE_WEIGHTS};for(const[signal,weight]of Object.entries(overrides??{})){if(weight!==void 0&&CONTEXT_RELEVANCE_SIGNAL_NAMES.includes(signal)){weights[signal]=weight}}for(const[signal,weight]of Object.entries(weights)){if(!Number.isFinite(weight)||weight<0){throw new TypeError(`Context relevance weight ${signal} must be a finite non-negative number`)}}return weights}function defaultScoreContextCandidates(candidates,options={}){assertCandidates(candidates);const weights=resolveWeights(options.weights);const denominator=Math.max(candidates.length-1,1);const available=new Set(["structural"]);for(const candidate of candidates){for(const[signal,value]of Object.entries(candidate.signals??{})){if(value!==void 0)available.add(signal)}}const availableSignals=CONTEXT_RELEVANCE_SIGNAL_NAMES.filter(signal=>available.has(signal));const scored=candidates.map((candidate,index)=>{const signalValues={structural:candidates.length===1?1:1-index/denominator,...candidate.signals};const contributions={};let weightedScore=0;let totalWeight=0;for(const signal of availableSignals){const value=signalValues[signal];if(value===void 0)continue;const contribution=value*weights[signal];contributions[signal]=contribution;weightedScore+=contribution;totalWeight+=weights[signal]}return{...candidate,baseline_rank:index+1,rank:0,score:totalWeight===0?0:weightedScore/totalWeight,contributions}});scored.sort((left,right)=>right.score-left.score||left.baseline_rank-right.baseline_rank);scored.forEach((entry,index)=>{entry.rank=index+1});return{model:"default-weighted-v1",available_signals:availableSignals,ranked:scored}}async function scoreContextCandidates(candidates,options={}){const defaultReport=defaultScoreContextCandidates(candidates,options);if(!options.scorer)return defaultReport;const customScores=await options.scorer({candidates,default_report:defaultReport});const scoreById=new Map;for(const entry of customScores){if(scoreById.has(entry.id)||!Number.isFinite(entry.score)){throw new TypeError("Context relevance scorer must return one finite score for every candidate")}scoreById.set(entry.id,entry.score)}if(scoreById.size!==candidates.length||candidates.some(candidate=>!scoreById.has(candidate.id))){throw new TypeError("Context relevance scorer must return one finite score for every candidate")}const ranked=defaultReport.ranked.map(entry=>{const score=scoreById.get(entry.id);return{...entry,score,contributions:{custom:score}}});ranked.sort((left,right)=>right.score-left.score||left.baseline_rank-right.baseline_rank);ranked.forEach((entry,index)=>{entry.rank=index+1});return{model:"custom",available_signals:defaultReport.available_signals,ranked}}async function scoreContextCandidatesWithActiveExtensions(surface,candidates,options={}){const defaultReport=defaultScoreContextCandidates(candidates,options);const override=await runActiveServiceOverride(CONTEXT_RELEVANCE_SERVICE,{surface,candidates,default_report:defaultReport});if(!override.handled){return override.warnings.length>0?{...defaultReport,warnings:override.warnings}:defaultReport}if(!Array.isArray(override.result)||!override.result.every(entry=>typeof entry==="object"&&entry!==null&&typeof entry.id==="string"&&typeof entry.score==="number"&&Number.isFinite(entry.score))){return{...defaultReport,warnings:[...override.warnings,"extension_context_relevance_invalid_result"]}}try{const report=await scoreContextCandidates(candidates,{...options,scorer:()=>override.result});return override.warnings.length>0?{...report,warnings:override.warnings}:report}catch{return{...defaultReport,warnings:[...override.warnings,"extension_context_relevance_invalid_result"]}}}const CONTEXT_EVALUATION_METRIC_NAMES=["ndcg","reciprocal_rank","required_recall","continuity_coverage","token_budget_adherence"];function ratioOfPresent(expected,actual){if(expected.length===0)return 1;return expected.filter(id=>actual.has(id)).length/expected.length}function evaluateContextRanking(input){if(!Number.isFinite(input.actual_tokens)||input.actual_tokens<0||!Number.isFinite(input.token_budget)||input.token_budget<=0){throw new TypeError("Context ranking token counts require actual_tokens >= 0 and token_budget > 0")}const judgments=input.judgments??{};const gains=input.ranked_ids.map(id=>Math.max(0,judgments[id]??0));const idealGains=Object.values(judgments).map(grade=>Math.max(0,grade)).sort((left,right)=>right-left).slice(0,gains.length||1);const discountedGain=values=>values.reduce((total,grade,index)=>total+(2**grade-1)/Math.log2(index+2),0);const ideal=discountedGain(idealGains);const firstRelevant=gains.findIndex(grade=>grade>0);const actualIds=new Set(input.ranked_ids);const withinBudget=input.actual_tokens<=input.token_budget;return{ndcg:ideal===0?1:discountedGain(gains)/ideal,reciprocal_rank:firstRelevant<0?0:1/(firstRelevant+1),required_recall:ratioOfPresent(input.required_ids??[],actualIds),continuity_coverage:ratioOfPresent(input.continuity_ids??[],actualIds),token_budget_adherence:withinBudget?1:input.token_budget/input.actual_tokens,within_token_budget:withinBudget}}function estimateJsonTokens(value){return Math.ceil(JSON_TOKEN_ENCODER.encode(JSON.stringify(value)).byteLength/4)}function roundEvaluationMetric(value){return Math.round(value*1e4)/1e4}function rankingPayloadForScenario(result,surface){const rankedIds=surface==="context"?[...result.high_level??[],...result.low_level??[],...result.blocked_fallback??[]].map(item=>item.id):[...result.recommended?[result.recommended]:[],...result.ready??[]].map(item=>item.id);const servedIds=new Set(rankedIds);const attribution=(result.ranking?.items??[]).filter(item=>servedIds.has(item.id)).map(item=>({id:item.id,contributions:item.contributions}));return{rankedIds,attribution}}async function runContextEvaluationScenario(scenario,reader){if(scenario.id.trim().length===0||scenario.rationale.trim().length===0){throw new TypeError("Context evaluation scenarios require non-empty id and rationale values")}const result=scenario.surface==="context"?await reader.context({...scenario.options,explainRanking:true,outputBudget:"unbounded"}):await reader.next({...scenario.options,explainRanking:true,outputBudget:"unbounded"});const{rankedIds,attribution}=rankingPayloadForScenario(result,scenario.surface);const packet={...result,ranking:void 0};const actualTokens=estimateJsonTokens(packet);return{id:scenario.id,surface:scenario.surface,rationale:scenario.rationale,ranked_ids:rankedIds,actual_tokens:actualTokens,metrics:evaluateContextRanking({ranked_ids:rankedIds,judgments:scenario.judgments,required_ids:scenario.required_ids,continuity_ids:scenario.continuity_ids,actual_tokens:actualTokens,token_budget:scenario.token_budget}),attribution}}function summarizeContextEvaluationReports(reports,thresholds){if(reports.length===0){throw new TypeError("Context evaluation requires at least one scenario report")}const metrics=CONTEXT_EVALUATION_METRIC_NAMES;for(const metric of metrics){if(!Number.isFinite(thresholds[metric])){throw new TypeError(`Context evaluation threshold ${metric} must be a finite number`)}}const aggregate=Object.fromEntries(metrics.map(metric=>[metric,roundEvaluationMetric(reports.reduce((total,report)=>total+report.metrics[metric],0)/reports.length)]));const failures=metrics.filter(metric=>aggregate[metric]<thresholds[metric]).map(metric=>`${metric}:${aggregate[metric]}<${thresholds[metric]}`);return{scenario_count:reports.length,aggregate,scenarios:[...reports],passed:failures.length===0,failures}}async function runContextEvaluationCorpus(scenarios,reader,thresholds){const reports=[];for(const scenario of scenarios){reports.push(await runContextEvaluationScenario(scenario,reader))}return summarizeContextEvaluationReports(reports,thresholds)}export{CONTEXT_EVALUATION_METRIC_NAMES,CONTEXT_RELEVANCE_SERVICE,CONTEXT_RELEVANCE_SIGNAL_NAMES,buildItemContextRelevanceCandidates,defaultScoreContextCandidates,evaluateContextRanking,runContextEvaluationCorpus,runContextEvaluationScenario,scoreContextCandidates,scoreContextCandidatesWithActiveExtensions,summarizeContextEvaluationReports};
|
|
503
2
|
//# sourceMappingURL=context-relevance.js.map
|
|
504
|
-
//# debugId=80a03884-711e-5170-a3c1-f05ccb065702
|