@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
package/dist/core/search/eval.js
CHANGED
|
@@ -1,226 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module core/search/eval
|
|
3
|
-
*
|
|
4
|
-
* Search relevance evaluation primitives (pm-u8n5). Implements the standard
|
|
5
|
-
* offline ranking metrics — nDCG@k, MRR@k, precision@k, recall@k — over a
|
|
6
|
-
* human-curated golden-query set, plus the loader/validator for that set. The
|
|
7
|
-
* `pm eval` command (src/cli/commands/eval.ts) runs each golden query through
|
|
8
|
-
* the live retrieval path and feeds the ranked ids here, so relevance
|
|
9
|
-
* regressions from corpus changes, hybrid-weight changes, or provider swaps are
|
|
10
|
-
* measurable and gateable in CI.
|
|
11
|
-
*
|
|
12
|
-
* Relevance is binary: an id is either in a query's `relevant_ids` set or it is
|
|
13
|
-
* not. This keeps the golden set cheap to curate while still supporting the
|
|
14
|
-
* graded-discount behavior of DCG (earlier hits are worth more).
|
|
15
|
-
*/
|
|
16
|
-
/** Default cutoff (`@k`) used for every metric when the caller does not override it. */
|
|
17
|
-
|
|
18
|
-
!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]="70e06a73-6602-5384-a25b-fd3df5f6438e")}catch(e){}}();
|
|
19
|
-
export const DEFAULT_EVAL_K = 10;
|
|
20
|
-
/** Stable public schema identifier for versioned golden-query files. */
|
|
21
|
-
export const EVAL_QUERY_SET_SCHEMA_ID = "https://schema.unbrained.dev/pm/eval-query-set/v1";
|
|
22
|
-
/** Machine-readable input contract exposed by the SDK and CLI guidance. */
|
|
23
|
-
export const EVAL_QUERY_SET_CONTRACT = {
|
|
24
|
-
schema: EVAL_QUERY_SET_SCHEMA_ID,
|
|
25
|
-
accepted_top_level: ["array", "object"],
|
|
26
|
-
required_query_fields: ["query", "relevant_ids"],
|
|
27
|
-
optional_fields: ["mode", "description"],
|
|
28
|
-
modes: ["keyword", "semantic", "hybrid"],
|
|
29
|
-
};
|
|
30
|
-
/** Copy-ready minimal query set shared by help, diagnostics, and integrations. */
|
|
31
|
-
export const EVAL_QUERY_SET_EXAMPLE = {
|
|
32
|
-
schema: EVAL_QUERY_SET_SCHEMA_ID,
|
|
33
|
-
queries: [
|
|
34
|
-
{
|
|
35
|
-
query: "offline search",
|
|
36
|
-
relevant_ids: ["pm-75k9"],
|
|
37
|
-
mode: "keyword",
|
|
38
|
-
},
|
|
39
|
-
],
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Thrown by {@link parseEvalQuerySet} when the raw golden-query payload is
|
|
43
|
-
* structurally invalid. Carries a precise, human-actionable message naming the
|
|
44
|
-
* offending query index/field so an author can fix the JSON directly.
|
|
45
|
-
*/
|
|
46
|
-
export class EvalQuerySetError extends Error {
|
|
47
|
-
/** Construct an error describing why a golden-query set failed validation. */
|
|
48
|
-
constructor(message) {
|
|
49
|
-
super(message);
|
|
50
|
-
this.name = "EvalQuerySetError";
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
const VALID_EVAL_MODES = new Set([
|
|
54
|
-
"keyword",
|
|
55
|
-
"semantic",
|
|
56
|
-
"hybrid",
|
|
57
|
-
]);
|
|
58
|
-
/** Compute Discounted Cumulative Gain at cutoff `k` for an ordered list of binary relevance gains (`1` relevant, `0` not). Position `i` (1-based) contributes `gain / log2(i + 1)`, so a relevant hit ranked first is worth `1` and later hits are progressively discounted. Gains beyond `k` are ignored. */
|
|
59
|
-
export function dcgAtK(relevanceGains, k) {
|
|
60
|
-
let dcg = 0;
|
|
61
|
-
const limit = Math.min(k, relevanceGains.length);
|
|
62
|
-
for (let index = 0; index < limit; index += 1) {
|
|
63
|
-
dcg += relevanceGains[index] / Math.log2(index + 2);
|
|
64
|
-
}
|
|
65
|
-
return dcg;
|
|
66
|
-
}
|
|
67
|
-
/** Normalized DCG at cutoff `k`: the ranking's DCG divided by the DCG of the ideal ranking (all relevant ids first). Returns `0` when the query has no relevant ids (the ideal DCG is `0` and the score is undefined), giving a stable lower bound for aggregation. Result is in `[0, 1]`. */
|
|
68
|
-
export function ndcgAtK(rankedIds, relevantIds, k) {
|
|
69
|
-
if (relevantIds.size === 0) {
|
|
70
|
-
return 0;
|
|
71
|
-
}
|
|
72
|
-
const gains = rankedIds.map((id) => (relevantIds.has(id) ? 1 : 0));
|
|
73
|
-
const dcg = dcgAtK(gains, k);
|
|
74
|
-
const idealGains = Array.from({ length: relevantIds.size }, () => 1);
|
|
75
|
-
const idealDcg = dcgAtK(idealGains, k);
|
|
76
|
-
return idealDcg === 0 ? 0 : dcg / idealDcg;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Reciprocal rank of the first relevant id within the top `k` results: `1/rank`
|
|
80
|
-
* (rank is 1-based), or `0` when no relevant id appears in the cutoff. Averaged
|
|
81
|
-
* across queries this is Mean Reciprocal Rank (MRR@k).
|
|
82
|
-
*/
|
|
83
|
-
export function reciprocalRankAtK(rankedIds, relevantIds, k) {
|
|
84
|
-
const limit = Math.min(k, rankedIds.length);
|
|
85
|
-
for (let index = 0; index < limit; index += 1) {
|
|
86
|
-
if (relevantIds.has(rankedIds[index])) {
|
|
87
|
-
return 1 / (index + 1);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return 0;
|
|
91
|
-
}
|
|
92
|
-
/** Count relevant ids within the top `k` results (shared by precision and recall). */
|
|
93
|
-
function countRelevantInTopK(rankedIds, relevantIds, k) {
|
|
94
|
-
const limit = Math.min(k, rankedIds.length);
|
|
95
|
-
let hits = 0;
|
|
96
|
-
for (let index = 0; index < limit; index += 1) {
|
|
97
|
-
if (relevantIds.has(rankedIds[index])) {
|
|
98
|
-
hits += 1;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return hits;
|
|
102
|
-
}
|
|
103
|
-
/** Precision at cutoff `k`: relevant ids retrieved in the top `k` divided by `k`. Returns `0` for a non-positive `k`. */
|
|
104
|
-
export function precisionAtK(rankedIds, relevantIds, k) {
|
|
105
|
-
if (k <= 0) {
|
|
106
|
-
return 0;
|
|
107
|
-
}
|
|
108
|
-
return countRelevantInTopK(rankedIds, relevantIds, k) / k;
|
|
109
|
-
}
|
|
110
|
-
/** Recall at cutoff `k`: relevant ids retrieved in the top `k` divided by the total number of relevant ids. Returns `0` when the query has no relevant ids. */
|
|
111
|
-
export function recallAtK(rankedIds, relevantIds, k) {
|
|
112
|
-
if (relevantIds.size === 0) {
|
|
113
|
-
return 0;
|
|
114
|
-
}
|
|
115
|
-
return countRelevantInTopK(rankedIds, relevantIds, k) / relevantIds.size;
|
|
116
|
-
}
|
|
117
|
-
/** Evaluate one ranking against its relevant-id set at cutoff `k`, returning all four metrics together so callers compute the document ranking once and read every score off the result. */
|
|
118
|
-
export function evaluateRanking(rankedIds, relevantIds, k) {
|
|
119
|
-
return {
|
|
120
|
-
ndcg: ndcgAtK(rankedIds, relevantIds, k),
|
|
121
|
-
mrr: reciprocalRankAtK(rankedIds, relevantIds, k),
|
|
122
|
-
precision: precisionAtK(rankedIds, relevantIds, k),
|
|
123
|
-
recall: recallAtK(rankedIds, relevantIds, k),
|
|
124
|
-
relevant_total: relevantIds.size,
|
|
125
|
-
retrieved_relevant: countRelevantInTopK(rankedIds, relevantIds, k),
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
/** Macro-average per-query metrics (each query weighted equally). Returns all zeros with `query_count: 0` for an empty input so the gate path has a stable shape to compare against. */
|
|
129
|
-
export function aggregateEvalMetrics(perQuery) {
|
|
130
|
-
const queryCount = perQuery.length;
|
|
131
|
-
if (queryCount === 0) {
|
|
132
|
-
return { ndcg: 0, mrr: 0, precision: 0, recall: 0, query_count: 0 };
|
|
133
|
-
}
|
|
134
|
-
const sum = perQuery.reduce((accumulator, metrics) => ({
|
|
135
|
-
ndcg: accumulator.ndcg + metrics.ndcg,
|
|
136
|
-
mrr: accumulator.mrr + metrics.mrr,
|
|
137
|
-
precision: accumulator.precision + metrics.precision,
|
|
138
|
-
recall: accumulator.recall + metrics.recall,
|
|
139
|
-
}), { ndcg: 0, mrr: 0, precision: 0, recall: 0 });
|
|
140
|
-
return {
|
|
141
|
-
ndcg: sum.ndcg / queryCount,
|
|
142
|
-
mrr: sum.mrr / queryCount,
|
|
143
|
-
precision: sum.precision / queryCount,
|
|
144
|
-
recall: sum.recall / queryCount,
|
|
145
|
-
query_count: queryCount,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Validate one raw golden-query entry, returning a typed {@link EvalQuery}.
|
|
150
|
-
* Throws {@link EvalQuerySetError} (with the entry index) for a missing/empty
|
|
151
|
-
* `query`, a `relevant_ids` that is not a non-empty string array, or an invalid
|
|
152
|
-
* `mode`. `relevant_ids` are trimmed and de-duplicated; `description` is kept
|
|
153
|
-
* only when it is a non-empty string.
|
|
154
|
-
*/
|
|
155
|
-
function parseEvalQueryEntry(raw, index) {
|
|
156
|
-
if (typeof raw !== "object" || raw === null) {
|
|
157
|
-
throw new EvalQuerySetError(`Eval query at index ${index} must be an object`);
|
|
158
|
-
}
|
|
159
|
-
const entry = raw;
|
|
160
|
-
const query = typeof entry.query === "string" ? entry.query.trim() : "";
|
|
161
|
-
if (query.length === 0) {
|
|
162
|
-
throw new EvalQuerySetError(`Eval query at index ${index} must have a non-empty "query" string`);
|
|
163
|
-
}
|
|
164
|
-
if (!Array.isArray(entry.relevant_ids)) {
|
|
165
|
-
throw new EvalQuerySetError(`Eval query at index ${index} must have a "relevant_ids" array`);
|
|
166
|
-
}
|
|
167
|
-
if (entry.relevant_ids.some((value) => typeof value !== "string")) {
|
|
168
|
-
// Reject (rather than silently drop) non-string members: malformed golden
|
|
169
|
-
// data must fail loudly so it can never quietly change relevance judgments.
|
|
170
|
-
throw new EvalQuerySetError(`Eval query at index ${index} must have a "relevant_ids" array of strings`);
|
|
171
|
-
}
|
|
172
|
-
const relevantIds = [
|
|
173
|
-
...new Set(entry.relevant_ids
|
|
174
|
-
.map((value) => value.trim())
|
|
175
|
-
.filter((value) => value.length > 0)),
|
|
176
|
-
];
|
|
177
|
-
if (relevantIds.length === 0) {
|
|
178
|
-
throw new EvalQuerySetError(`Eval query at index ${index} must list at least one relevant id`);
|
|
179
|
-
}
|
|
180
|
-
if (entry.mode !== undefined &&
|
|
181
|
-
(typeof entry.mode !== "string" || !VALID_EVAL_MODES.has(entry.mode))) {
|
|
182
|
-
throw new EvalQuerySetError(`Eval query at index ${index} has an invalid mode (expected keyword|semantic|hybrid)`);
|
|
183
|
-
}
|
|
184
|
-
return {
|
|
185
|
-
query,
|
|
186
|
-
relevant_ids: relevantIds,
|
|
187
|
-
...(entry.mode !== undefined ? { mode: entry.mode } : {}),
|
|
188
|
-
...(typeof entry.description === "string" &&
|
|
189
|
-
entry.description.trim().length > 0
|
|
190
|
-
? { description: entry.description.trim() }
|
|
191
|
-
: {}),
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Parse and validate a raw golden-query payload (typically `JSON.parse` of
|
|
196
|
-
* `.agents/pm/search/eval-queries.json`). Accepts either a bare array of query
|
|
197
|
-
* entries or an object with a `queries` array. Throws {@link EvalQuerySetError}
|
|
198
|
-
* with a precise message when the payload is not an array/object, when
|
|
199
|
-
* `queries` is missing/not an array, when the set is empty, or when any entry
|
|
200
|
-
* fails {@link parseEvalQueryEntry}.
|
|
201
|
-
*/
|
|
202
|
-
export function parseEvalQuerySet(raw) {
|
|
203
|
-
const rawSchema = typeof raw === "object" && raw !== null && !Array.isArray(raw)
|
|
204
|
-
? raw.schema
|
|
205
|
-
: undefined;
|
|
206
|
-
if (rawSchema !== undefined && rawSchema !== EVAL_QUERY_SET_SCHEMA_ID) {
|
|
207
|
-
throw new EvalQuerySetError(`Unsupported eval query set schema; expected "${EVAL_QUERY_SET_SCHEMA_ID}"`);
|
|
208
|
-
}
|
|
209
|
-
const rawQueries = Array.isArray(raw)
|
|
210
|
-
? raw
|
|
211
|
-
: typeof raw === "object" && raw !== null
|
|
212
|
-
? raw.queries
|
|
213
|
-
: undefined;
|
|
214
|
-
if (!Array.isArray(rawQueries)) {
|
|
215
|
-
throw new EvalQuerySetError('Eval query set must be an array of queries or an object with a "queries" array');
|
|
216
|
-
}
|
|
217
|
-
if (rawQueries.length === 0) {
|
|
218
|
-
throw new EvalQuerySetError("Eval query set must contain at least one query");
|
|
219
|
-
}
|
|
220
|
-
return {
|
|
221
|
-
schema: EVAL_QUERY_SET_SCHEMA_ID,
|
|
222
|
-
queries: rawQueries.map((entry, index) => parseEvalQueryEntry(entry, index)),
|
|
223
|
-
};
|
|
224
|
-
}
|
|
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]="7b09736a-499b-57f6-b688-0458b487786b")}catch(e2){}})();const DEFAULT_EVAL_K=10;const EVAL_QUERY_SET_SCHEMA_ID="https://schema.unbrained.dev/pm/eval-query-set/v1";const EVAL_QUERY_SET_CONTRACT={schema:EVAL_QUERY_SET_SCHEMA_ID,accepted_top_level:["array","object"],required_query_fields:["query","relevant_ids"],optional_fields:["mode","description"],modes:["keyword","semantic","hybrid"]};const EVAL_QUERY_SET_EXAMPLE={schema:EVAL_QUERY_SET_SCHEMA_ID,queries:[{query:"offline search",relevant_ids:["pm-75k9"],mode:"keyword"}]};class EvalQuerySetError extends Error{constructor(message){super(message);this.name="EvalQuerySetError"}}const VALID_EVAL_MODES=new Set(["keyword","semantic","hybrid"]);function dcgAtK(relevanceGains,k){let dcg=0;const limit=Math.min(k,relevanceGains.length);for(let index=0;index<limit;index+=1){dcg+=relevanceGains[index]/Math.log2(index+2)}return dcg}function ndcgAtK(rankedIds,relevantIds,k){if(relevantIds.size===0){return 0}const gains=rankedIds.map(id=>relevantIds.has(id)?1:0);const dcg=dcgAtK(gains,k);const idealGains=Array.from({length:relevantIds.size},()=>1);const idealDcg=dcgAtK(idealGains,k);return idealDcg===0?0:dcg/idealDcg}function reciprocalRankAtK(rankedIds,relevantIds,k){const limit=Math.min(k,rankedIds.length);for(let index=0;index<limit;index+=1){if(relevantIds.has(rankedIds[index])){return 1/(index+1)}}return 0}function countRelevantInTopK(rankedIds,relevantIds,k){const limit=Math.min(k,rankedIds.length);let hits=0;for(let index=0;index<limit;index+=1){if(relevantIds.has(rankedIds[index])){hits+=1}}return hits}function precisionAtK(rankedIds,relevantIds,k){if(k<=0){return 0}return countRelevantInTopK(rankedIds,relevantIds,k)/k}function recallAtK(rankedIds,relevantIds,k){if(relevantIds.size===0){return 0}return countRelevantInTopK(rankedIds,relevantIds,k)/relevantIds.size}function evaluateRanking(rankedIds,relevantIds,k){return{ndcg:ndcgAtK(rankedIds,relevantIds,k),mrr:reciprocalRankAtK(rankedIds,relevantIds,k),precision:precisionAtK(rankedIds,relevantIds,k),recall:recallAtK(rankedIds,relevantIds,k),relevant_total:relevantIds.size,retrieved_relevant:countRelevantInTopK(rankedIds,relevantIds,k)}}function aggregateEvalMetrics(perQuery){const queryCount=perQuery.length;if(queryCount===0){return{ndcg:0,mrr:0,precision:0,recall:0,query_count:0}}const sum=perQuery.reduce((accumulator,metrics)=>({ndcg:accumulator.ndcg+metrics.ndcg,mrr:accumulator.mrr+metrics.mrr,precision:accumulator.precision+metrics.precision,recall:accumulator.recall+metrics.recall}),{ndcg:0,mrr:0,precision:0,recall:0});return{ndcg:sum.ndcg/queryCount,mrr:sum.mrr/queryCount,precision:sum.precision/queryCount,recall:sum.recall/queryCount,query_count:queryCount}}function parseEvalQueryEntry(raw,index){if(typeof raw!=="object"||raw===null){throw new EvalQuerySetError(`Eval query at index ${index} must be an object`)}const entry=raw;const query=typeof entry.query==="string"?entry.query.trim():"";if(query.length===0){throw new EvalQuerySetError(`Eval query at index ${index} must have a non-empty "query" string`)}if(!Array.isArray(entry.relevant_ids)){throw new EvalQuerySetError(`Eval query at index ${index} must have a "relevant_ids" array`)}if(entry.relevant_ids.some(value=>typeof value!=="string")){throw new EvalQuerySetError(`Eval query at index ${index} must have a "relevant_ids" array of strings`)}const relevantIds=[...new Set(entry.relevant_ids.map(value=>value.trim()).filter(value=>value.length>0))];if(relevantIds.length===0){throw new EvalQuerySetError(`Eval query at index ${index} must list at least one relevant id`)}if(entry.mode!==void 0&&(typeof entry.mode!=="string"||!VALID_EVAL_MODES.has(entry.mode))){throw new EvalQuerySetError(`Eval query at index ${index} has an invalid mode (expected keyword|semantic|hybrid)`)}return{query,relevant_ids:relevantIds,...entry.mode!==void 0?{mode:entry.mode}:{},...typeof entry.description==="string"&&entry.description.trim().length>0?{description:entry.description.trim()}:{}}}function parseEvalQuerySet(raw){const rawSchema=typeof raw==="object"&&raw!==null&&!Array.isArray(raw)?raw.schema:void 0;if(rawSchema!==void 0&&rawSchema!==EVAL_QUERY_SET_SCHEMA_ID){throw new EvalQuerySetError(`Unsupported eval query set schema; expected "${EVAL_QUERY_SET_SCHEMA_ID}"`)}const rawQueries=Array.isArray(raw)?raw:typeof raw==="object"&&raw!==null?raw.queries:void 0;if(!Array.isArray(rawQueries)){throw new EvalQuerySetError('Eval query set must be an array of queries or an object with a "queries" array')}if(rawQueries.length===0){throw new EvalQuerySetError("Eval query set must contain at least one query")}return{schema:EVAL_QUERY_SET_SCHEMA_ID,queries:rawQueries.map((entry,index)=>parseEvalQueryEntry(entry,index))}}export{DEFAULT_EVAL_K,EVAL_QUERY_SET_CONTRACT,EVAL_QUERY_SET_EXAMPLE,EVAL_QUERY_SET_SCHEMA_ID,EvalQuerySetError,aggregateEvalMetrics,dcgAtK,evaluateRanking,ndcgAtK,parseEvalQuerySet,precisionAtK,recallAtK,reciprocalRankAtK};
|
|
225
2
|
//# sourceMappingURL=eval.js.map
|
|
226
|
-
//# debugId=70e06a73-6602-5384-a25b-fd3df5f6438e
|
|
@@ -1,76 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module core/search/http-client
|
|
3
|
-
*
|
|
4
|
-
* Powers search, embeddings, and semantic retrieval behavior for Http Client.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
!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]="b5ce7132-0024-5d42-9cb8-585933beb7c7")}catch(e){}}();
|
|
8
|
-
import { toErrorMessage } from "../shared/primitives.js";
|
|
9
|
-
const DEFAULT_SEARCH_HTTP_TIMEOUT_MS = 30_000;
|
|
10
|
-
/** Implements normalize search http timeout ms for the public runtime surface of this module. */
|
|
11
|
-
export function normalizeSearchHttpTimeoutMs(timeoutMs, requestLabel, defaultTimeoutMs = DEFAULT_SEARCH_HTTP_TIMEOUT_MS) {
|
|
12
|
-
const resolved = timeoutMs ?? defaultTimeoutMs;
|
|
13
|
-
if (!Number.isFinite(resolved) || resolved <= 0) {
|
|
14
|
-
throw new Error(`${requestLabel} timeout must be a positive finite number`);
|
|
15
|
-
}
|
|
16
|
-
return Math.floor(resolved);
|
|
17
|
-
}
|
|
18
|
-
/** Implements resolve search http fetcher for the public runtime surface of this module. */
|
|
19
|
-
export function resolveSearchHttpFetcher(fetcher, requestLabel) {
|
|
20
|
-
if (fetcher) {
|
|
21
|
-
return fetcher;
|
|
22
|
-
}
|
|
23
|
-
if (typeof globalThis.fetch === "function") {
|
|
24
|
-
return globalThis.fetch.bind(globalThis);
|
|
25
|
-
}
|
|
26
|
-
throw new Error(`${requestLabel} execution requires a fetch implementation`);
|
|
27
|
-
}
|
|
28
|
-
/** Implements read failed search http response body for the public runtime surface of this module. */
|
|
29
|
-
export async function readFailedSearchHttpResponseBody(response) {
|
|
30
|
-
try {
|
|
31
|
-
return (await response.text()).replaceAll(/\s+/g, " ").trim();
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
return `(failed to read response body: ${toErrorMessage(error)})`;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/** Implements execute search json request for the public runtime surface of this module. */
|
|
38
|
-
export async function executeSearchJsonRequest(options) {
|
|
39
|
-
const controller = new AbortController();
|
|
40
|
-
const timeoutHandle = setTimeout(() => {
|
|
41
|
-
controller.abort();
|
|
42
|
-
}, options.timeoutMs);
|
|
43
|
-
try {
|
|
44
|
-
let response;
|
|
45
|
-
try {
|
|
46
|
-
response = await options.fetcher(options.endpoint, {
|
|
47
|
-
method: options.method,
|
|
48
|
-
headers: options.headers,
|
|
49
|
-
body: JSON.stringify(options.body),
|
|
50
|
-
signal: controller.signal,
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
55
|
-
throw new Error(`${options.requestLabel} timed out after ${options.timeoutMs}ms`);
|
|
56
|
-
}
|
|
57
|
-
throw new Error(`${options.requestLabel} execution failed: ${toErrorMessage(error)}`);
|
|
58
|
-
}
|
|
59
|
-
if (!response.ok) {
|
|
60
|
-
const responseBody = await readFailedSearchHttpResponseBody(response);
|
|
61
|
-
const detail = responseBody.length > 0 ? `: ${responseBody}` : "";
|
|
62
|
-
throw new Error(`${options.requestLabel} failed with status ${response.status} ${response.statusText}${detail}`);
|
|
63
|
-
}
|
|
64
|
-
try {
|
|
65
|
-
return await response.json();
|
|
66
|
-
}
|
|
67
|
-
catch (error) {
|
|
68
|
-
throw new Error(`${options.responseLabel} JSON parse failed: ${toErrorMessage(error)}`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
finally {
|
|
72
|
-
clearTimeout(timeoutHandle);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
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]="74cee8e6-1785-50f4-94d8-fc0b29055dc2")}catch(e2){}})();import{toErrorMessage}from"../shared/primitives.js";const DEFAULT_SEARCH_HTTP_TIMEOUT_MS=3e4;function normalizeSearchHttpTimeoutMs(timeoutMs,requestLabel,defaultTimeoutMs=DEFAULT_SEARCH_HTTP_TIMEOUT_MS){const resolved=timeoutMs??defaultTimeoutMs;if(!Number.isFinite(resolved)||resolved<=0){throw new Error(`${requestLabel} timeout must be a positive finite number`)}return Math.floor(resolved)}function resolveSearchHttpFetcher(fetcher,requestLabel){if(fetcher){return fetcher}if(typeof globalThis.fetch==="function"){return globalThis.fetch.bind(globalThis)}throw new Error(`${requestLabel} execution requires a fetch implementation`)}async function readFailedSearchHttpResponseBody(response){try{return(await response.text()).replaceAll(/\s+/g," ").trim()}catch(error){return`(failed to read response body: ${toErrorMessage(error)})`}}async function executeSearchJsonRequest(options){const controller=new AbortController;const timeoutHandle=setTimeout(()=>{controller.abort()},options.timeoutMs);try{let response;try{response=await options.fetcher(options.endpoint,{method:options.method,headers:options.headers,body:JSON.stringify(options.body),signal:controller.signal})}catch(error){if(error instanceof Error&&error.name==="AbortError"){throw new Error(`${options.requestLabel} timed out after ${options.timeoutMs}ms`)}throw new Error(`${options.requestLabel} execution failed: ${toErrorMessage(error)}`)}if(!response.ok){const responseBody=await readFailedSearchHttpResponseBody(response);const detail=responseBody.length>0?`: ${responseBody}`:"";throw new Error(`${options.requestLabel} failed with status ${response.status} ${response.statusText}${detail}`)}try{return await response.json()}catch(error){throw new Error(`${options.responseLabel} JSON parse failed: ${toErrorMessage(error)}`)}}finally{clearTimeout(timeoutHandle)}}export{executeSearchJsonRequest,normalizeSearchHttpTimeoutMs,readFailedSearchHttpResponseBody,resolveSearchHttpFetcher};
|
|
75
2
|
//# sourceMappingURL=http-client.js.map
|
|
76
|
-
//# debugId=b5ce7132-0024-5d42-9cb8-585933beb7c7
|
|
@@ -1,243 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
!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]="af754be6-8026-530a-8a20-b03d4ed742e1")}catch(e){}}();
|
|
3
|
-
import { executeSearchJsonRequest, normalizeSearchHttpTimeoutMs, resolveSearchHttpFetcher, } from "./http-client.js";
|
|
4
|
-
import { isFiniteNumberArray, toNonEmptyString, trimTrailingSlashes, } from "../shared/primitives.js";
|
|
5
|
-
/** Classifies the resolution source for an active provider/adapter given the persisted (possibly empty) configured value. Pure and adapter-agnostic so it serves both the embedding provider and the vector-store adapter. "configured" requires the persisted value to actually MATCH the active resolution (case-insensitively): a configured-but-unhonored value (typo or unsupported name that the runtime fell back from) is reported as "auto-detected", not falsely "configured". */
|
|
6
|
-
export function resolveProviderConfigSource(activeName, configured) {
|
|
7
|
-
const active = toNonEmptyString(activeName);
|
|
8
|
-
if (!active) {
|
|
9
|
-
return "unconfigured";
|
|
10
|
-
}
|
|
11
|
-
const configuredValue = toNonEmptyString(configured);
|
|
12
|
-
return configuredValue &&
|
|
13
|
-
configuredValue.toLowerCase() === active.toLowerCase()
|
|
14
|
-
? "configured"
|
|
15
|
-
: "auto-detected";
|
|
16
|
-
}
|
|
17
|
-
function normalizeOpenAiEmbeddingsEndpoint(baseUrl) {
|
|
18
|
-
const normalizedBaseUrl = trimTrailingSlashes(baseUrl);
|
|
19
|
-
const normalizedLower = normalizedBaseUrl.toLowerCase();
|
|
20
|
-
if (normalizedLower.endsWith("/embeddings")) {
|
|
21
|
-
return normalizedBaseUrl;
|
|
22
|
-
}
|
|
23
|
-
if (normalizedLower.endsWith("/v1")) {
|
|
24
|
-
return `${normalizedBaseUrl}/embeddings`;
|
|
25
|
-
}
|
|
26
|
-
return `${normalizedBaseUrl}/v1/embeddings`;
|
|
27
|
-
}
|
|
28
|
-
function resolveSearchEmbeddingModelOverride(settings) {
|
|
29
|
-
// `settings.search.embedding_model` is documented as overriding the
|
|
30
|
-
// provider-specific model when set (see CONFIG_KEY_ALIASES for
|
|
31
|
-
// `search_embedding_model` in src/core/config/nested-settings.ts). Each
|
|
32
|
-
// provider resolver picks this up after its own model is read so the
|
|
33
|
-
// override applies to whichever built-in is selected.
|
|
34
|
-
const candidate = settings
|
|
35
|
-
.search?.embedding_model;
|
|
36
|
-
return toNonEmptyString(candidate) || null;
|
|
37
|
-
}
|
|
38
|
-
function resolveOpenAiProvider(settings) {
|
|
39
|
-
const baseUrl = toNonEmptyString(settings.providers?.openai?.base_url);
|
|
40
|
-
const model = toNonEmptyString(settings.providers?.openai?.model);
|
|
41
|
-
if (!baseUrl || !model) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
const override = resolveSearchEmbeddingModelOverride(settings);
|
|
45
|
-
const apiKey = toNonEmptyString(settings.providers?.openai?.api_key);
|
|
46
|
-
return {
|
|
47
|
-
name: "openai",
|
|
48
|
-
base_url: baseUrl,
|
|
49
|
-
model: override ?? model,
|
|
50
|
-
...(apiKey ? { api_key: apiKey } : {}),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
function resolveOllamaProvider(settings) {
|
|
54
|
-
const baseUrl = toNonEmptyString(settings.providers?.ollama?.base_url);
|
|
55
|
-
const model = toNonEmptyString(settings.providers?.ollama?.model);
|
|
56
|
-
if (!baseUrl || !model) {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
const override = resolveSearchEmbeddingModelOverride(settings);
|
|
60
|
-
return {
|
|
61
|
-
name: "ollama",
|
|
62
|
-
base_url: baseUrl,
|
|
63
|
-
model: override ?? model,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
function normalizeEmbeddingInputs(input) {
|
|
67
|
-
const inputs = (Array.isArray(input) ? input : [input])
|
|
68
|
-
.map((entry) => entry.trim())
|
|
69
|
-
.filter((entry) => entry.length > 0);
|
|
70
|
-
if (inputs.length === 0) {
|
|
71
|
-
throw new Error("Embedding input must include at least one non-empty string");
|
|
72
|
-
}
|
|
73
|
-
return inputs;
|
|
74
|
-
}
|
|
75
|
-
function dedupeEmbeddingInputs(inputs) {
|
|
76
|
-
const uniqueInputs = [];
|
|
77
|
-
const originalToUniqueIndex = [];
|
|
78
|
-
const uniqueIndexByInput = new Map();
|
|
79
|
-
for (const entry of inputs) {
|
|
80
|
-
const existingUniqueIndex = uniqueIndexByInput.get(entry);
|
|
81
|
-
if (existingUniqueIndex === undefined) {
|
|
82
|
-
const nextUniqueIndex = uniqueInputs.length;
|
|
83
|
-
uniqueInputs.push(entry);
|
|
84
|
-
uniqueIndexByInput.set(entry, nextUniqueIndex);
|
|
85
|
-
originalToUniqueIndex.push(nextUniqueIndex);
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
originalToUniqueIndex.push(existingUniqueIndex);
|
|
89
|
-
}
|
|
90
|
-
return {
|
|
91
|
-
uniqueInputs,
|
|
92
|
-
originalToUniqueIndex,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
function buildOrderedOpenAiEntries(data) {
|
|
96
|
-
const openAiEntries = data.map((entry, position) => ({
|
|
97
|
-
embedding: entry.embedding,
|
|
98
|
-
index: entry.index,
|
|
99
|
-
position,
|
|
100
|
-
}));
|
|
101
|
-
const hasExplicitIndex = openAiEntries.some((entry) => entry.index !== undefined);
|
|
102
|
-
if (hasExplicitIndex) {
|
|
103
|
-
for (const entry of openAiEntries) {
|
|
104
|
-
if (!Number.isInteger(entry.index)) {
|
|
105
|
-
throw new TypeError(`OpenAI embedding response entry at position ${entry.position} is missing a valid integer index`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return [...openAiEntries].sort((a, b) => {
|
|
109
|
-
const byIndex = a.index - b.index;
|
|
110
|
-
if (byIndex !== 0) {
|
|
111
|
-
return byIndex;
|
|
112
|
-
}
|
|
113
|
-
return a.position - b.position;
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
return openAiEntries;
|
|
117
|
-
}
|
|
118
|
-
/** Implements resolve embedding providers for the public runtime surface of this module. */
|
|
119
|
-
export function resolveEmbeddingProviders(settings) {
|
|
120
|
-
const openAi = resolveOpenAiProvider(settings);
|
|
121
|
-
const ollama = resolveOllamaProvider(settings);
|
|
122
|
-
const available = [openAi, ollama].filter((entry) => entry !== null);
|
|
123
|
-
// Honor `settings.search.provider` when set: if both built-in providers are
|
|
124
|
-
// configured, the preferred name wins; otherwise fall back to the first
|
|
125
|
-
// available entry (preserves the previous tie-break: openai > ollama).
|
|
126
|
-
// Match case-insensitively so "OpenAI" / "Ollama" / "OLLAMA" all work.
|
|
127
|
-
const preferredName = toNonEmptyString(settings.search?.provider);
|
|
128
|
-
const preferredKey = preferredName ? preferredName.toLowerCase() : null;
|
|
129
|
-
const preferred = preferredKey
|
|
130
|
-
? available.find((entry) => entry.name === preferredKey)
|
|
131
|
-
: undefined;
|
|
132
|
-
return {
|
|
133
|
-
active: preferred ?? available[0] ?? null,
|
|
134
|
-
available,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
/** Implements resolve embedding request target for the public runtime surface of this module. */
|
|
138
|
-
export function resolveEmbeddingRequestTarget(provider) {
|
|
139
|
-
const baseUrl = trimTrailingSlashes(provider.base_url);
|
|
140
|
-
if (provider.name === "openai") {
|
|
141
|
-
return {
|
|
142
|
-
provider: "openai",
|
|
143
|
-
endpoint: normalizeOpenAiEmbeddingsEndpoint(baseUrl),
|
|
144
|
-
model: provider.model,
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
return {
|
|
148
|
-
provider: "ollama",
|
|
149
|
-
endpoint: `${baseUrl}/api/embed`,
|
|
150
|
-
model: provider.model,
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
/** Implements build embedding request plan for the public runtime surface of this module. */
|
|
154
|
-
export function buildEmbeddingRequestPlan(provider, input) {
|
|
155
|
-
const normalizedInputs = normalizeEmbeddingInputs(input);
|
|
156
|
-
if (provider.name === "openai") {
|
|
157
|
-
return {
|
|
158
|
-
target: resolveEmbeddingRequestTarget(provider),
|
|
159
|
-
method: "POST",
|
|
160
|
-
headers: {
|
|
161
|
-
"content-type": "application/json",
|
|
162
|
-
...(provider.api_key
|
|
163
|
-
? { authorization: `Bearer ${provider.api_key}` }
|
|
164
|
-
: {}),
|
|
165
|
-
},
|
|
166
|
-
body: {
|
|
167
|
-
model: provider.model,
|
|
168
|
-
input: normalizedInputs.length === 1
|
|
169
|
-
? normalizedInputs[0]
|
|
170
|
-
: normalizedInputs,
|
|
171
|
-
},
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
return {
|
|
175
|
-
target: resolveEmbeddingRequestTarget(provider),
|
|
176
|
-
method: "POST",
|
|
177
|
-
headers: {
|
|
178
|
-
"content-type": "application/json",
|
|
179
|
-
},
|
|
180
|
-
body: {
|
|
181
|
-
model: provider.model,
|
|
182
|
-
input: normalizedInputs,
|
|
183
|
-
},
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
/** Implements normalize embedding response for the public runtime surface of this module. */
|
|
187
|
-
export function normalizeEmbeddingResponse(provider, response) {
|
|
188
|
-
if (provider.name === "openai") {
|
|
189
|
-
const data = response.data;
|
|
190
|
-
if (!Array.isArray(data) || data.length === 0) {
|
|
191
|
-
throw new Error("OpenAI embedding response must include a non-empty data array");
|
|
192
|
-
}
|
|
193
|
-
const orderedEntries = buildOrderedOpenAiEntries(data);
|
|
194
|
-
return orderedEntries.map((entry, index) => {
|
|
195
|
-
const embedding = entry.embedding;
|
|
196
|
-
if (!isFiniteNumberArray(embedding)) {
|
|
197
|
-
throw new Error(`OpenAI embedding response entry at index ${index} is missing a numeric embedding vector`);
|
|
198
|
-
}
|
|
199
|
-
return [...embedding];
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
const singleEmbedding = response.embedding;
|
|
203
|
-
if (isFiniteNumberArray(singleEmbedding)) {
|
|
204
|
-
return [[...singleEmbedding]];
|
|
205
|
-
}
|
|
206
|
-
const multipleEmbeddings = response.embeddings;
|
|
207
|
-
if (Array.isArray(multipleEmbeddings) && multipleEmbeddings.length > 0) {
|
|
208
|
-
return multipleEmbeddings.map((entry, index) => {
|
|
209
|
-
if (!isFiniteNumberArray(entry)) {
|
|
210
|
-
throw new Error(`Ollama embedding response entry at index ${index} is missing a numeric embedding vector`);
|
|
211
|
-
}
|
|
212
|
-
return [...entry];
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
throw new Error("Ollama embedding response must include embedding or embeddings vectors");
|
|
216
|
-
}
|
|
217
|
-
/** Implements execute embedding request for the public runtime surface of this module. */
|
|
218
|
-
export async function executeEmbeddingRequest(provider, input, options = {}) {
|
|
219
|
-
const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, "Embedding request");
|
|
220
|
-
const fetcher = resolveSearchHttpFetcher(options.fetcher, "Embedding request");
|
|
221
|
-
const normalizedInputs = normalizeEmbeddingInputs(input);
|
|
222
|
-
const dedupedInputs = dedupeEmbeddingInputs(normalizedInputs);
|
|
223
|
-
const requestPlan = buildEmbeddingRequestPlan(provider, dedupedInputs.uniqueInputs);
|
|
224
|
-
const payload = await executeSearchJsonRequest({
|
|
225
|
-
endpoint: requestPlan.target.endpoint,
|
|
226
|
-
method: requestPlan.method,
|
|
227
|
-
headers: requestPlan.headers,
|
|
228
|
-
body: requestPlan.body,
|
|
229
|
-
timeoutMs,
|
|
230
|
-
fetcher,
|
|
231
|
-
requestLabel: "Embedding request",
|
|
232
|
-
responseLabel: "Embedding response",
|
|
233
|
-
});
|
|
234
|
-
const vectors = normalizeEmbeddingResponse(provider, payload);
|
|
235
|
-
if (vectors.length !== dedupedInputs.uniqueInputs.length) {
|
|
236
|
-
throw new Error(`Embedding response cardinality mismatch: expected ${dedupedInputs.uniqueInputs.length} vector(s), received ${vectors.length}`);
|
|
237
|
-
}
|
|
238
|
-
return dedupedInputs.originalToUniqueIndex.map((uniqueIndex) => [
|
|
239
|
-
...vectors[uniqueIndex],
|
|
240
|
-
]);
|
|
241
|
-
}
|
|
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]="2c36f008-53c4-5ee7-bc87-6bfb7aeb8f42")}catch(e2){}})();import{executeSearchJsonRequest,normalizeSearchHttpTimeoutMs,resolveSearchHttpFetcher}from"./http-client.js";import{isFiniteNumberArray,toNonEmptyString,trimTrailingSlashes}from"../shared/primitives.js";function resolveProviderConfigSource(activeName,configured){const active=toNonEmptyString(activeName);if(!active){return"unconfigured"}const configuredValue=toNonEmptyString(configured);return configuredValue&&configuredValue.toLowerCase()===active.toLowerCase()?"configured":"auto-detected"}function normalizeOpenAiEmbeddingsEndpoint(baseUrl){const normalizedBaseUrl=trimTrailingSlashes(baseUrl);const normalizedLower=normalizedBaseUrl.toLowerCase();if(normalizedLower.endsWith("/embeddings")){return normalizedBaseUrl}if(normalizedLower.endsWith("/v1")){return`${normalizedBaseUrl}/embeddings`}return`${normalizedBaseUrl}/v1/embeddings`}function resolveSearchEmbeddingModelOverride(settings){const candidate=settings.search?.embedding_model;return toNonEmptyString(candidate)||null}function resolveOpenAiProvider(settings){const baseUrl=toNonEmptyString(settings.providers?.openai?.base_url);const model=toNonEmptyString(settings.providers?.openai?.model);if(!baseUrl||!model){return null}const override=resolveSearchEmbeddingModelOverride(settings);const apiKey=toNonEmptyString(settings.providers?.openai?.api_key);return{name:"openai",base_url:baseUrl,model:override??model,...apiKey?{api_key:apiKey}:{}}}function resolveOllamaProvider(settings){const baseUrl=toNonEmptyString(settings.providers?.ollama?.base_url);const model=toNonEmptyString(settings.providers?.ollama?.model);if(!baseUrl||!model){return null}const override=resolveSearchEmbeddingModelOverride(settings);return{name:"ollama",base_url:baseUrl,model:override??model}}function normalizeEmbeddingInputs(input){const inputs=(Array.isArray(input)?input:[input]).map(entry=>entry.trim()).filter(entry=>entry.length>0);if(inputs.length===0){throw new Error("Embedding input must include at least one non-empty string")}return inputs}function dedupeEmbeddingInputs(inputs){const uniqueInputs=[];const originalToUniqueIndex=[];const uniqueIndexByInput=new Map;for(const entry of inputs){const existingUniqueIndex=uniqueIndexByInput.get(entry);if(existingUniqueIndex===void 0){const nextUniqueIndex=uniqueInputs.length;uniqueInputs.push(entry);uniqueIndexByInput.set(entry,nextUniqueIndex);originalToUniqueIndex.push(nextUniqueIndex);continue}originalToUniqueIndex.push(existingUniqueIndex)}return{uniqueInputs,originalToUniqueIndex}}function buildOrderedOpenAiEntries(data){const openAiEntries=data.map((entry,position)=>({embedding:entry.embedding,index:entry.index,position}));const hasExplicitIndex=openAiEntries.some(entry=>entry.index!==void 0);if(hasExplicitIndex){for(const entry of openAiEntries){if(!Number.isInteger(entry.index)){throw new TypeError(`OpenAI embedding response entry at position ${entry.position} is missing a valid integer index`)}}return[...openAiEntries].sort((a,b)=>{const byIndex=a.index-b.index;if(byIndex!==0){return byIndex}return a.position-b.position})}return openAiEntries}function resolveEmbeddingProviders(settings){const openAi=resolveOpenAiProvider(settings);const ollama=resolveOllamaProvider(settings);const available=[openAi,ollama].filter(entry=>entry!==null);const preferredName=toNonEmptyString(settings.search?.provider);const preferredKey=preferredName?preferredName.toLowerCase():null;const preferred=preferredKey?available.find(entry=>entry.name===preferredKey):void 0;return{active:preferred??available[0]??null,available}}function resolveEmbeddingRequestTarget(provider){const baseUrl=trimTrailingSlashes(provider.base_url);if(provider.name==="openai"){return{provider:"openai",endpoint:normalizeOpenAiEmbeddingsEndpoint(baseUrl),model:provider.model}}return{provider:"ollama",endpoint:`${baseUrl}/api/embed`,model:provider.model}}function buildEmbeddingRequestPlan(provider,input){const normalizedInputs=normalizeEmbeddingInputs(input);if(provider.name==="openai"){return{target:resolveEmbeddingRequestTarget(provider),method:"POST",headers:{"content-type":"application/json",...provider.api_key?{authorization:`Bearer ${provider.api_key}`}:{}},body:{model:provider.model,input:normalizedInputs.length===1?normalizedInputs[0]:normalizedInputs}}}return{target:resolveEmbeddingRequestTarget(provider),method:"POST",headers:{"content-type":"application/json"},body:{model:provider.model,input:normalizedInputs}}}function normalizeEmbeddingResponse(provider,response){if(provider.name==="openai"){const data=response.data;if(!Array.isArray(data)||data.length===0){throw new Error("OpenAI embedding response must include a non-empty data array")}const orderedEntries=buildOrderedOpenAiEntries(data);return orderedEntries.map((entry,index)=>{const embedding=entry.embedding;if(!isFiniteNumberArray(embedding)){throw new Error(`OpenAI embedding response entry at index ${index} is missing a numeric embedding vector`)}return[...embedding]})}const singleEmbedding=response.embedding;if(isFiniteNumberArray(singleEmbedding)){return[[...singleEmbedding]]}const multipleEmbeddings=response.embeddings;if(Array.isArray(multipleEmbeddings)&&multipleEmbeddings.length>0){return multipleEmbeddings.map((entry,index)=>{if(!isFiniteNumberArray(entry)){throw new Error(`Ollama embedding response entry at index ${index} is missing a numeric embedding vector`)}return[...entry]})}throw new Error("Ollama embedding response must include embedding or embeddings vectors")}async function executeEmbeddingRequest(provider,input,options={}){const timeoutMs=normalizeSearchHttpTimeoutMs(options.timeout_ms,"Embedding request");const fetcher=resolveSearchHttpFetcher(options.fetcher,"Embedding request");const normalizedInputs=normalizeEmbeddingInputs(input);const dedupedInputs=dedupeEmbeddingInputs(normalizedInputs);const requestPlan=buildEmbeddingRequestPlan(provider,dedupedInputs.uniqueInputs);const payload=await executeSearchJsonRequest({endpoint:requestPlan.target.endpoint,method:requestPlan.method,headers:requestPlan.headers,body:requestPlan.body,timeoutMs,fetcher,requestLabel:"Embedding request",responseLabel:"Embedding response"});const vectors=normalizeEmbeddingResponse(provider,payload);if(vectors.length!==dedupedInputs.uniqueInputs.length){throw new Error(`Embedding response cardinality mismatch: expected ${dedupedInputs.uniqueInputs.length} vector(s), received ${vectors.length}`)}return dedupedInputs.originalToUniqueIndex.map(uniqueIndex=>[...vectors[uniqueIndex]])}export{buildEmbeddingRequestPlan,executeEmbeddingRequest,normalizeEmbeddingResponse,resolveEmbeddingProviders,resolveEmbeddingRequestTarget,resolveProviderConfigSource};
|
|
242
2
|
//# sourceMappingURL=providers.js.map
|
|
243
|
-
//# debugId=af754be6-8026-530a-8a20-b03d4ed742e1
|