@unbrained/pm-cli 2026.9.6 → 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 +218 -182
- 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/RELEASING.md +1 -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,762 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
* @module cli/commands/reindex
|
|
3
|
-
|
|
4
|
-
|
|
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]="1bcd20e1-2995-56ef-8d04-f265b8282c19")}catch(e){}}();
|
|
8
|
-
import { assertInitializedTracker } from "../environment/tracker-preflight.js";
|
|
9
|
-
import fs from "node:fs/promises";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import { toNonEmptyStringOrUndefined, getActiveExtensionRegistrations, runActiveOnIndexHooks, runActiveOnWriteHooks, collectRegisteredItemFieldNames, resolveRegisteredSearchProvider, resolveRegisteredVectorStoreAdapter, writeFileAtomic, resolveItemTypeRegistry, parseItemDocument, acquireLock, buildSearchCorpus, buildSemanticCorpusInput, resolveSearchCorpusFields, resolveSemanticCorpusCharacterLimit, executeEmbeddingBatchesWithRetry, readVectorizationStatusLedger, writeVectorizationStatusLedger, REINDEX_LOCK_ID, resolveEmbeddingProviders, resolveSettingsWithSemanticRuntimeDefaults, executeVectorDelete, executeVectorReset, executeVectorUpsert, resolveVectorStores, buildVectorizationEmbeddingIdentity, buildVectorizationEmbeddingMetadata, hasVectorizationEmbeddingIdentityChanged, hasVectorizationVectorDimensionChanged, inferConsistentVectorDimension, EXIT_CODE, PmCliError, nowIso, listAllDocumentCandidatesCached, resolvePmRoot, readSettings, resolveAuthor, } from "../runtime-primitives.js";
|
|
12
|
-
const MANIFEST_PATH = "index/manifest.json";
|
|
13
|
-
const EMBEDDINGS_PATH = "search/embeddings.jsonl";
|
|
14
|
-
const EMBEDDING_MIGRATION_REINDEX_HINT = "Provider or model has changed since last index. Run pm reindex --mode semantic to rebuild.";
|
|
15
|
-
function shouldEmitReindexProgress(options) {
|
|
16
|
-
return options.progress === true || process.stderr.isTTY === true;
|
|
17
|
-
}
|
|
18
|
-
function emitReindexProgress(enabled, message) {
|
|
19
|
-
if (!enabled) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
try {
|
|
23
|
-
process.stderr.write(`[pm reindex] ${message}\n`);
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
// Ignore transient stderr write failures.
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
function parseMode(raw) {
|
|
30
|
-
const normalized = (raw ?? "keyword").trim().toLowerCase();
|
|
31
|
-
if (normalized === "keyword") {
|
|
32
|
-
return "keyword";
|
|
33
|
-
}
|
|
34
|
-
if (normalized === "semantic" || normalized === "hybrid") {
|
|
35
|
-
return normalized;
|
|
36
|
-
}
|
|
37
|
-
throw new PmCliError("Reindex mode must be one of keyword|semantic|hybrid", EXIT_CODE.USAGE);
|
|
38
|
-
}
|
|
39
|
-
async function loadDocumentCandidates(pmRoot, itemFormat, typeToFolder, schema) {
|
|
40
|
-
const warnings = [];
|
|
41
|
-
const candidates = await listAllDocumentCandidatesCached(pmRoot, itemFormat, typeToFolder, warnings, schema);
|
|
42
|
-
return {
|
|
43
|
-
candidates,
|
|
44
|
-
warnings,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
async function hydrateDocuments(pmRoot, candidates, schema, warnings, itemIds) {
|
|
48
|
-
const extensionFieldNames = collectRegisteredItemFieldNames(getActiveExtensionRegistrations());
|
|
49
|
-
const hydrated = [];
|
|
50
|
-
for (const candidate of candidates) {
|
|
51
|
-
if (itemIds && !itemIds.has(candidate.metadata.id)) {
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
if (typeof candidate.body === "string") {
|
|
55
|
-
hydrated.push({
|
|
56
|
-
metadata: candidate.metadata,
|
|
57
|
-
body: candidate.body,
|
|
58
|
-
});
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
try {
|
|
62
|
-
const raw = await fs.readFile(candidate.item_path, "utf8");
|
|
63
|
-
const parsed = parseItemDocument(raw, {
|
|
64
|
-
format: candidate.item_format,
|
|
65
|
-
schema,
|
|
66
|
-
extensionFieldNames,
|
|
67
|
-
onWarning: (warning) => warnings.push(warning),
|
|
68
|
-
});
|
|
69
|
-
hydrated.push({
|
|
70
|
-
metadata: candidate.metadata,
|
|
71
|
-
body: parsed.body,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
warnings.push(`item_list_item_read_failed:${path.relative(pmRoot, candidate.item_path)}`);
|
|
76
|
-
hydrated.push({
|
|
77
|
-
metadata: candidate.metadata,
|
|
78
|
-
body: "",
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return hydrated;
|
|
83
|
-
}
|
|
84
|
-
function buildKeywordRecord(document, mode, corpusFields) {
|
|
85
|
-
const item = document.metadata;
|
|
86
|
-
return {
|
|
87
|
-
id: item.id,
|
|
88
|
-
mode,
|
|
89
|
-
updated_at: item.updated_at,
|
|
90
|
-
corpus: buildSearchCorpus(document, { fields: corpusFields }),
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
const toOptionalNonEmptyString = toNonEmptyStringOrUndefined;
|
|
94
|
-
/** Public contract for test only, shared by SDK and presentation-layer consumers. */
|
|
95
|
-
export const _testOnly = {
|
|
96
|
-
shouldEmitReindexProgress,
|
|
97
|
-
emitReindexProgress,
|
|
98
|
-
parseMode,
|
|
99
|
-
hydrateDocuments,
|
|
100
|
-
buildKeywordRecord,
|
|
101
|
-
resolveExtensionSearchEmbedding,
|
|
102
|
-
resolveExtensionVectorAdapter,
|
|
103
|
-
assertVector,
|
|
104
|
-
executeExtensionEmbedding,
|
|
105
|
-
resolveExtensionEmbeddingModel,
|
|
106
|
-
resolveReindexEmbeddingIdentity,
|
|
107
|
-
executeReindexEmbedding,
|
|
108
|
-
collectLedgerOrphanIds,
|
|
109
|
-
resetVectorStoreForReindex,
|
|
110
|
-
pruneReindexOrphanVectors,
|
|
111
|
-
upsertReindexVectors,
|
|
112
|
-
};
|
|
113
|
-
function resolveExtensionSearchEmbedding(settings) {
|
|
114
|
-
const registrations = getActiveExtensionRegistrations();
|
|
115
|
-
const providerName = toOptionalNonEmptyString(settings.search?.provider);
|
|
116
|
-
if (!providerName) {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
const registration = resolveRegisteredSearchProvider(registrations, providerName);
|
|
120
|
-
if (!registration) {
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
const runtimeDefinition = registration.runtime_definition ?? registration.definition;
|
|
124
|
-
const name = toOptionalNonEmptyString(runtimeDefinition.name) ??
|
|
125
|
-
toOptionalNonEmptyString(registration.definition.name);
|
|
126
|
-
// resolveRegisteredSearchProvider only matches a registration whose normalized
|
|
127
|
-
// runtime/registered definition name equals providerName, so `name` here is always
|
|
128
|
-
// that non-empty value; the guard exists solely to narrow string | undefined.
|
|
129
|
-
/* c8 ignore start -- unreachable: a matched provider registration always carries a normalized name */
|
|
130
|
-
if (!name) {
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
/* c8 ignore stop */
|
|
134
|
-
const embedBatch = runtimeDefinition.embedBatch;
|
|
135
|
-
const embedBatchSnake = runtimeDefinition.embed_batch;
|
|
136
|
-
const embed = runtimeDefinition.embed;
|
|
137
|
-
const resolvedEmbedBatch = typeof embedBatch === "function"
|
|
138
|
-
? embedBatch
|
|
139
|
-
: typeof embedBatchSnake === "function"
|
|
140
|
-
? embedBatchSnake
|
|
141
|
-
: undefined;
|
|
142
|
-
const resolvedEmbed = typeof embed === "function" ? embed : undefined;
|
|
143
|
-
if (!resolvedEmbedBatch && !resolvedEmbed) {
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
return {
|
|
147
|
-
name,
|
|
148
|
-
embedBatch: resolvedEmbedBatch,
|
|
149
|
-
embed: resolvedEmbed,
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
function resolveExtensionVectorAdapter(settings) {
|
|
153
|
-
const registrations = getActiveExtensionRegistrations();
|
|
154
|
-
const adapterName = toOptionalNonEmptyString(settings.vector_store?.adapter);
|
|
155
|
-
if (!adapterName) {
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
const registration = resolveRegisteredVectorStoreAdapter(registrations, adapterName);
|
|
159
|
-
if (!registration) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
const runtimeDefinition = registration.runtime_definition ?? registration.definition;
|
|
163
|
-
const adapterDisplayName = toOptionalNonEmptyString(runtimeDefinition.name) ??
|
|
164
|
-
toOptionalNonEmptyString(registration.definition.name);
|
|
165
|
-
/* c8 ignore start -- resolveRegisteredVectorStoreAdapter only returns registrations with a normalized runtime or definition name */
|
|
166
|
-
if (!adapterDisplayName) {
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
/* c8 ignore stop */
|
|
170
|
-
const upsert = runtimeDefinition.upsert;
|
|
171
|
-
const deleteHandler = runtimeDefinition.delete;
|
|
172
|
-
return {
|
|
173
|
-
adapterName: adapterDisplayName,
|
|
174
|
-
...(typeof upsert === "function"
|
|
175
|
-
? { upsert: upsert }
|
|
176
|
-
: {}),
|
|
177
|
-
...(typeof deleteHandler === "function"
|
|
178
|
-
? { delete: deleteHandler }
|
|
179
|
-
: {}),
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
function assertVector(value, context) {
|
|
183
|
-
if (!Array.isArray(value) ||
|
|
184
|
-
value.some((entry) => typeof entry !== "number" || !Number.isFinite(entry))) {
|
|
185
|
-
throw new PmCliError(`Invalid vector returned by ${context}`, EXIT_CODE.GENERIC_FAILURE);
|
|
186
|
-
}
|
|
187
|
-
return value;
|
|
188
|
-
}
|
|
189
|
-
async function executeExtensionEmbedding(extensionEmbedding, settings, corpusInputs) {
|
|
190
|
-
const model = settings.search?.embedding_model?.trim() || "text-embedding-3-small";
|
|
191
|
-
if (extensionEmbedding.embedBatch) {
|
|
192
|
-
const vectors = await Promise.resolve(extensionEmbedding.embedBatch({
|
|
193
|
-
inputs: corpusInputs,
|
|
194
|
-
settings,
|
|
195
|
-
model,
|
|
196
|
-
}));
|
|
197
|
-
if (!Array.isArray(vectors)) {
|
|
198
|
-
throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" embedBatch must return an array of vectors`, EXIT_CODE.GENERIC_FAILURE);
|
|
199
|
-
}
|
|
200
|
-
return vectors.map((vector, index) => assertVector(vector, `extension search provider "${extensionEmbedding.name}" embedBatch output at index ${index}`));
|
|
201
|
-
}
|
|
202
|
-
if (!extensionEmbedding.embed) {
|
|
203
|
-
throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" does not implement embed/embedBatch`, EXIT_CODE.GENERIC_FAILURE);
|
|
204
|
-
}
|
|
205
|
-
const vectors = [];
|
|
206
|
-
for (const [index, input] of corpusInputs.entries()) {
|
|
207
|
-
const vector = await Promise.resolve(extensionEmbedding.embed({
|
|
208
|
-
input,
|
|
209
|
-
settings,
|
|
210
|
-
model,
|
|
211
|
-
}));
|
|
212
|
-
vectors.push(assertVector(vector, `extension search provider "${extensionEmbedding.name}" embed output at index ${index}`));
|
|
213
|
-
}
|
|
214
|
-
return vectors;
|
|
215
|
-
}
|
|
216
|
-
function resolveExtensionEmbeddingModel(settings) {
|
|
217
|
-
return settings.search?.embedding_model?.trim() || "text-embedding-3-small";
|
|
218
|
-
}
|
|
219
|
-
function resolveReindexEmbeddingIdentity(settings, activeEmbeddingProvider, extensionEmbedding) {
|
|
220
|
-
const identity = extensionEmbedding
|
|
221
|
-
? buildVectorizationEmbeddingIdentity(extensionEmbedding.name, resolveExtensionEmbeddingModel(settings))
|
|
222
|
-
: activeEmbeddingProvider
|
|
223
|
-
? buildVectorizationEmbeddingIdentity(activeEmbeddingProvider.name, activeEmbeddingProvider.model)
|
|
224
|
-
: null;
|
|
225
|
-
if (!identity) {
|
|
226
|
-
throw new PmCliError(`No embedding identity available for semantic reindex mode`, EXIT_CODE.USAGE);
|
|
227
|
-
}
|
|
228
|
-
return identity;
|
|
229
|
-
}
|
|
230
|
-
function collectLedgerOrphanIds(ledgerEntries, currentIds) {
|
|
231
|
-
return Object.keys(ledgerEntries)
|
|
232
|
-
.filter((id) => !currentIds.has(id))
|
|
233
|
-
.sort((left, right) => left.localeCompare(right));
|
|
234
|
-
}
|
|
235
|
-
async function executeReindexEmbedding(settings, requestedMode, activeEmbeddingProvider, extensionEmbedding, documents, semanticWarnings, semanticSummary, progressEnabled) {
|
|
236
|
-
const semanticProviderName = extensionEmbedding?.name ?? activeEmbeddingProvider?.name;
|
|
237
|
-
const corpusCharacterLimit = resolveSemanticCorpusCharacterLimit(semanticProviderName, settings.search.embedding_corpus_max_characters).maxCharacters;
|
|
238
|
-
const corpusFields = resolveSearchCorpusFields(settings);
|
|
239
|
-
const corpusInputs = documents.map((document) => buildSemanticCorpusInput(document, {
|
|
240
|
-
providerName: semanticProviderName,
|
|
241
|
-
maxCharacters: corpusCharacterLimit,
|
|
242
|
-
fields: corpusFields,
|
|
243
|
-
}));
|
|
244
|
-
let vectors = [];
|
|
245
|
-
let embeddingIdentity = null;
|
|
246
|
-
if (extensionEmbedding) {
|
|
247
|
-
try {
|
|
248
|
-
vectors = await executeExtensionEmbedding(extensionEmbedding, settings, corpusInputs);
|
|
249
|
-
embeddingIdentity = buildVectorizationEmbeddingIdentity(extensionEmbedding.name, resolveExtensionEmbeddingModel(settings));
|
|
250
|
-
}
|
|
251
|
-
catch (error) {
|
|
252
|
-
if (!activeEmbeddingProvider) {
|
|
253
|
-
throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" failed to generate embeddings: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
|
|
254
|
-
}
|
|
255
|
-
semanticWarnings.push(`Extension search provider "${extensionEmbedding.name}" failed; falling back to built-in provider (${error instanceof Error ? error.message : String(error)})`);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
if (vectors.length === 0) {
|
|
259
|
-
if (!activeEmbeddingProvider) {
|
|
260
|
-
throw new PmCliError(`No embedding executor available for reindex mode '${requestedMode}'`, EXIT_CODE.USAGE);
|
|
261
|
-
}
|
|
262
|
-
const embeddingResult = await executeEmbeddingBatchesWithRetry(activeEmbeddingProvider, settings, corpusInputs, {
|
|
263
|
-
onProgress: (event) => {
|
|
264
|
-
if (event.phase === "complete") {
|
|
265
|
-
semanticSummary.batches_completed = event.batch_index;
|
|
266
|
-
}
|
|
267
|
-
emitReindexProgress(progressEnabled, `embedding_batch_${event.phase} batch=${event.batch_index}/${event.batch_total} size=${event.batch_size} completed_inputs=${event.completed_inputs}/${event.total_inputs}`);
|
|
268
|
-
},
|
|
269
|
-
});
|
|
270
|
-
semanticWarnings.push(...embeddingResult.warnings);
|
|
271
|
-
vectors = embeddingResult.vectors;
|
|
272
|
-
embeddingIdentity = buildVectorizationEmbeddingIdentity(activeEmbeddingProvider.name, activeEmbeddingProvider.model);
|
|
273
|
-
}
|
|
274
|
-
emitReindexProgress(progressEnabled, `embedding_complete vectors=${vectors.length}`);
|
|
275
|
-
if (vectors.length !== documents.length) {
|
|
276
|
-
throw new PmCliError(`Embedding output size mismatch (expected ${documents.length}, received ${vectors.length})`, EXIT_CODE.GENERIC_FAILURE);
|
|
277
|
-
}
|
|
278
|
-
if (!embeddingIdentity) {
|
|
279
|
-
throw new PmCliError(`No embedding identity available for reindex mode '${requestedMode}'`, EXIT_CODE.USAGE);
|
|
280
|
-
}
|
|
281
|
-
return { vectors, embeddingIdentity };
|
|
282
|
-
}
|
|
283
|
-
async function resetVectorStoreForReindex(activeVectorStore, extensionVectorAdapter, ledgerEntries, settings, semanticWarnings, vectorDimension) {
|
|
284
|
-
const knownIds = Object.keys(ledgerEntries);
|
|
285
|
-
if (extensionVectorAdapter) {
|
|
286
|
-
if (knownIds.length > 0 && extensionVectorAdapter.delete) {
|
|
287
|
-
try {
|
|
288
|
-
await Promise.resolve(extensionVectorAdapter.delete({
|
|
289
|
-
ids: knownIds.sort((left, right) => left.localeCompare(right)),
|
|
290
|
-
settings,
|
|
291
|
-
}));
|
|
292
|
-
}
|
|
293
|
-
catch (error) {
|
|
294
|
-
throw new PmCliError(`Extension vector adapter "${extensionVectorAdapter.adapterName}" failed to delete vectors during reindex reset: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
else if (knownIds.length > 0) {
|
|
298
|
-
semanticWarnings.push(`search_semantic_reindex_reset_skipped:adapter=${extensionVectorAdapter.adapterName}:known_ids=${knownIds.length}`);
|
|
299
|
-
}
|
|
300
|
-
if (!activeVectorStore) {
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
if (activeVectorStore) {
|
|
305
|
-
await executeVectorReset(activeVectorStore, knownIds, {}, vectorDimension);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
async function pruneReindexOrphanVectors(activeVectorStore, extensionVectorAdapter, orphanIds, settings, semanticWarnings) {
|
|
309
|
-
if (orphanIds.length === 0) {
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
if (extensionVectorAdapter) {
|
|
313
|
-
if (extensionVectorAdapter.delete) {
|
|
314
|
-
try {
|
|
315
|
-
await Promise.resolve(extensionVectorAdapter.delete({ ids: orphanIds, settings }));
|
|
316
|
-
}
|
|
317
|
-
catch (error) {
|
|
318
|
-
throw new PmCliError(`Extension vector adapter "${extensionVectorAdapter.adapterName}" failed to delete orphan vectors during reindex: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
semanticWarnings.push(`search_semantic_reindex_orphan_prune_skipped:adapter=${extensionVectorAdapter.adapterName}:count=${orphanIds.length}`);
|
|
323
|
-
}
|
|
324
|
-
if (!activeVectorStore) {
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
if (activeVectorStore) {
|
|
329
|
-
await executeVectorDelete(activeVectorStore, orphanIds);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
function createReindexSemanticSummary(mode) {
|
|
333
|
-
return {
|
|
334
|
-
enabled: mode !== "keyword",
|
|
335
|
-
stale_items: 0,
|
|
336
|
-
unchanged_items: 0,
|
|
337
|
-
embedded_items: 0,
|
|
338
|
-
vector_upserted: 0,
|
|
339
|
-
batches_completed: 0,
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
function buildReindexManifest(mode, generatedAt, metadataDocuments) {
|
|
343
|
-
return {
|
|
344
|
-
version: 1,
|
|
345
|
-
mode,
|
|
346
|
-
generated_at: generatedAt,
|
|
347
|
-
total_items: metadataDocuments.length,
|
|
348
|
-
items: metadataDocuments.map((document) => ({
|
|
349
|
-
id: document.metadata.id,
|
|
350
|
-
type: document.metadata.type,
|
|
351
|
-
status: document.metadata.status,
|
|
352
|
-
priority: document.metadata.priority,
|
|
353
|
-
updated_at: document.metadata.updated_at,
|
|
354
|
-
})),
|
|
355
|
-
};
|
|
356
|
-
}
|
|
357
|
-
function assertSemanticRuntimeAvailable(params) {
|
|
358
|
-
if (params.requestedMode === "keyword") {
|
|
359
|
-
return {
|
|
360
|
-
activeEmbeddingProvider: null,
|
|
361
|
-
activeVectorStore: null,
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
const providerResolution = resolveEmbeddingProviders(params.settings);
|
|
365
|
-
if (!providerResolution.active && !params.extensionEmbedding) {
|
|
366
|
-
throw new PmCliError(`Reindex mode '${params.requestedMode}' requires a configured embedding provider in settings.providers.openai/settings.providers.ollama or an extension provider selected by settings.search.provider`, EXIT_CODE.USAGE);
|
|
367
|
-
}
|
|
368
|
-
const vectorResolution = resolveVectorStores(params.settings, params.pmRoot);
|
|
369
|
-
if (!vectorResolution.active && !params.extensionVectorAdapter) {
|
|
370
|
-
throw new PmCliError(`Reindex mode '${params.requestedMode}' requires a configured vector store in settings.vector_store.qdrant/settings.vector_store.lancedb or an extension adapter selected by settings.vector_store.adapter`, EXIT_CODE.USAGE);
|
|
371
|
-
}
|
|
372
|
-
return {
|
|
373
|
-
activeEmbeddingProvider: providerResolution.active,
|
|
374
|
-
activeVectorStore: vectorResolution.active,
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
async function loadReindexCorpus(params) {
|
|
378
|
-
const typeRegistry = resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations());
|
|
379
|
-
const loadedCandidates = await loadDocumentCandidates(params.pmRoot, params.settings.item_format, typeRegistry.type_to_folder, params.settings.schema);
|
|
380
|
-
return {
|
|
381
|
-
documentCandidates: loadedCandidates.candidates,
|
|
382
|
-
warnings: [...loadedCandidates.warnings],
|
|
383
|
-
metadataDocuments: loadedCandidates.candidates.map((candidate) => ({
|
|
384
|
-
metadata: candidate.metadata,
|
|
385
|
-
body: typeof candidate.body === "string" ? candidate.body : "",
|
|
386
|
-
})),
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
async function appendKeywordLedgerWarnings(params) {
|
|
390
|
-
const ledger = await readVectorizationStatusLedger(params.pmRoot);
|
|
391
|
-
params.reindexWarnings.push(...ledger.warnings);
|
|
392
|
-
if (params.forceFullSemantic) {
|
|
393
|
-
params.reindexWarnings.push("search_semantic_reindex_full_ignored:mode_keyword");
|
|
394
|
-
}
|
|
395
|
-
if (!ledger.embedding) {
|
|
396
|
-
return;
|
|
397
|
-
}
|
|
398
|
-
const currentEmbeddingIdentity = (() => {
|
|
399
|
-
try {
|
|
400
|
-
return resolveReindexEmbeddingIdentity(params.settings, resolveEmbeddingProviders(params.settings).active, params.extensionEmbedding);
|
|
401
|
-
}
|
|
402
|
-
catch {
|
|
403
|
-
return null;
|
|
404
|
-
}
|
|
405
|
-
})();
|
|
406
|
-
if (currentEmbeddingIdentity &&
|
|
407
|
-
hasVectorizationEmbeddingIdentityChanged(ledger.embedding, currentEmbeddingIdentity)) {
|
|
408
|
-
params.reindexWarnings.push("search_semantic_reindex_requires_rebuild:embedding_identity_changed");
|
|
409
|
-
params.reindexWarnings.push(EMBEDDING_MIGRATION_REINDEX_HINT);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
async function planSemanticReindex(params) {
|
|
413
|
-
const ledger = await readVectorizationStatusLedger(params.pmRoot);
|
|
414
|
-
params.semanticWarnings.push(...ledger.warnings);
|
|
415
|
-
const embeddingIdentity = resolveReindexEmbeddingIdentity(params.settings, params.activeEmbeddingProvider, params.extensionEmbedding);
|
|
416
|
-
const currentIds = new Set(params.metadataDocuments.map((document) => document.metadata.id));
|
|
417
|
-
const orphanIds = collectLedgerOrphanIds(ledger.entries, currentIds);
|
|
418
|
-
const resetRequired = hasVectorizationEmbeddingIdentityChanged(ledger.embedding, embeddingIdentity);
|
|
419
|
-
if (params.forceFullSemantic && !resetRequired) {
|
|
420
|
-
params.semanticWarnings.push("search_semantic_reindex_full_rebuild_forced");
|
|
421
|
-
}
|
|
422
|
-
const staleSourceDocuments = params.forceFullSemantic || resetRequired
|
|
423
|
-
? params.metadataDocuments
|
|
424
|
-
: params.metadataDocuments.filter((document) => ledger.entries[document.metadata.id] !==
|
|
425
|
-
document.metadata.updated_at);
|
|
426
|
-
const staleIds = new Set(staleSourceDocuments.map((document) => document.metadata.id));
|
|
427
|
-
const staleDocuments = staleIds.size > 0
|
|
428
|
-
? await hydrateDocuments(params.pmRoot, params.documentCandidates, params.settings.schema, params.reindexWarnings, staleIds)
|
|
429
|
-
: [];
|
|
430
|
-
return {
|
|
431
|
-
ledgerEntries: ledger.entries,
|
|
432
|
-
ledgerEmbedding: ledger.embedding,
|
|
433
|
-
orphanIds,
|
|
434
|
-
resetRequired,
|
|
435
|
-
staleDocuments,
|
|
436
|
-
freshDocuments: params.metadataDocuments.length - staleDocuments.length,
|
|
437
|
-
};
|
|
438
|
-
}
|
|
439
|
-
async function rerunSemanticEmbeddingAfterDimensionChange(params) {
|
|
440
|
-
const staleIds = new Set(params.metadataDocuments.map((document) => document.metadata.id));
|
|
441
|
-
const staleDocuments = await hydrateDocuments(params.pmRoot, params.documentCandidates, params.settings.schema, params.reindexWarnings, staleIds);
|
|
442
|
-
params.semanticSummary.stale_items = staleDocuments.length;
|
|
443
|
-
params.semanticSummary.unchanged_items = 0;
|
|
444
|
-
emitReindexProgress(params.progressEnabled, `embedding_dimension_changed reset_items=${staleDocuments.length}`);
|
|
445
|
-
const embeddingResult = await executeReindexEmbedding(params.settings, params.requestedMode, params.activeEmbeddingProvider, params.extensionEmbedding, staleDocuments, params.semanticWarnings, params.semanticSummary, params.progressEnabled);
|
|
446
|
-
return {
|
|
447
|
-
...embeddingResult,
|
|
448
|
-
staleDocuments,
|
|
449
|
-
vectorDimension: inferConsistentVectorDimension(embeddingResult.vectors, "Reindex embeddings"),
|
|
450
|
-
};
|
|
451
|
-
}
|
|
452
|
-
async function resolveSemanticEmbeddingForUpsert(params) {
|
|
453
|
-
const embeddingResult = await executeReindexEmbedding(params.settings, params.requestedMode, params.activeEmbeddingProvider, params.extensionEmbedding, params.staleDocuments, params.semanticWarnings, params.semanticSummary, params.progressEnabled);
|
|
454
|
-
let vectors = embeddingResult.vectors;
|
|
455
|
-
let actualEmbeddingIdentity = embeddingResult.embeddingIdentity;
|
|
456
|
-
let vectorDimension = inferConsistentVectorDimension(vectors, "Reindex embeddings");
|
|
457
|
-
const dimensionChanged = !params.resetRequired &&
|
|
458
|
-
(hasVectorizationEmbeddingIdentityChanged(params.ledgerEmbedding, actualEmbeddingIdentity) ||
|
|
459
|
-
hasVectorizationVectorDimensionChanged(params.ledgerEmbedding, vectorDimension));
|
|
460
|
-
if (!dimensionChanged) {
|
|
461
|
-
return {
|
|
462
|
-
vectors,
|
|
463
|
-
embeddingIdentity: actualEmbeddingIdentity,
|
|
464
|
-
staleDocuments: params.staleDocuments,
|
|
465
|
-
vectorDimension,
|
|
466
|
-
resetRequired: params.resetRequired,
|
|
467
|
-
};
|
|
468
|
-
}
|
|
469
|
-
const rerun = await rerunSemanticEmbeddingAfterDimensionChange(params);
|
|
470
|
-
vectors = rerun.vectors;
|
|
471
|
-
actualEmbeddingIdentity = rerun.embeddingIdentity;
|
|
472
|
-
vectorDimension = rerun.vectorDimension;
|
|
473
|
-
return {
|
|
474
|
-
vectors,
|
|
475
|
-
embeddingIdentity: actualEmbeddingIdentity,
|
|
476
|
-
staleDocuments: rerun.staleDocuments,
|
|
477
|
-
vectorDimension,
|
|
478
|
-
resetRequired: true,
|
|
479
|
-
};
|
|
480
|
-
}
|
|
481
|
-
async function upsertReindexVectors(params) {
|
|
482
|
-
if (params.extensionVectorAdapter) {
|
|
483
|
-
try {
|
|
484
|
-
const adapterName = params.extensionVectorAdapter.adapterName;
|
|
485
|
-
emitReindexProgress(params.progressEnabled, `vector_upsert_start adapter=${adapterName} points=${params.points.length}`);
|
|
486
|
-
if (typeof params.extensionVectorAdapter.upsert !== "function") {
|
|
487
|
-
throw new PmCliError(`Extension vector adapter "${adapterName}" does not support upserting vectors.`, EXIT_CODE.USAGE);
|
|
488
|
-
}
|
|
489
|
-
await Promise.resolve(params.extensionVectorAdapter.upsert({
|
|
490
|
-
points: params.points,
|
|
491
|
-
settings: params.settings,
|
|
492
|
-
}));
|
|
493
|
-
params.semanticSummary.vector_upserted = params.points.length;
|
|
494
|
-
emitReindexProgress(params.progressEnabled, `vector_upsert_complete adapter=${adapterName}`);
|
|
495
|
-
return;
|
|
496
|
-
}
|
|
497
|
-
catch (error) {
|
|
498
|
-
if (error instanceof PmCliError) {
|
|
499
|
-
throw error;
|
|
500
|
-
}
|
|
501
|
-
if (!params.activeVectorStore) {
|
|
502
|
-
throw new PmCliError(`Extension vector adapter "${params.extensionVectorAdapter.adapterName}" failed to upsert vectors: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
|
|
503
|
-
}
|
|
504
|
-
params.semanticWarnings.push(`Extension vector adapter "${params.extensionVectorAdapter.adapterName}" failed; falling back to built-in vector store (${error instanceof Error ? error.message : String(error)})`);
|
|
505
|
-
emitReindexProgress(params.progressEnabled, "vector_upsert_fallback built_in_store");
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
if (params.activeVectorStore) {
|
|
509
|
-
emitReindexProgress(params.progressEnabled, `vector_upsert_start adapter=${params.activeVectorStore.name} points=${params.points.length}`);
|
|
510
|
-
await executeVectorUpsert(params.activeVectorStore, params.points);
|
|
511
|
-
params.semanticSummary.vector_upserted = params.points.length;
|
|
512
|
-
emitReindexProgress(params.progressEnabled, `vector_upsert_complete adapter=${params.activeVectorStore.name}`);
|
|
513
|
-
return;
|
|
514
|
-
}
|
|
515
|
-
/* c8 ignore start -- guarded by semantic-mode provider/vector-store preflight above */
|
|
516
|
-
throw new PmCliError(`No vector upsert executor available for reindex mode '${params.requestedMode}'`, EXIT_CODE.USAGE);
|
|
517
|
-
/* c8 ignore stop */
|
|
518
|
-
}
|
|
519
|
-
function buildReindexVectorPoints(staleDocuments, vectors) {
|
|
520
|
-
return staleDocuments.map((document, index) => ({
|
|
521
|
-
id: document.metadata.id,
|
|
522
|
-
vector: assertVector(vectors[index], `reindex embeddings output at index ${index}`),
|
|
523
|
-
payload: {
|
|
524
|
-
id: document.metadata.id,
|
|
525
|
-
type: document.metadata.type,
|
|
526
|
-
status: document.metadata.status,
|
|
527
|
-
priority: document.metadata.priority,
|
|
528
|
-
updated_at: document.metadata.updated_at,
|
|
529
|
-
},
|
|
530
|
-
}));
|
|
531
|
-
}
|
|
532
|
-
async function executeSemanticVectorRefresh(params) {
|
|
533
|
-
emitReindexProgress(params.progressEnabled, `embedding_start items=${params.plan.staleDocuments.length} unchanged_items=${params.plan.freshDocuments}`);
|
|
534
|
-
const embedding = await resolveSemanticEmbeddingForUpsert({
|
|
535
|
-
pmRoot: params.pmRoot,
|
|
536
|
-
settings: params.settings,
|
|
537
|
-
requestedMode: params.requestedMode,
|
|
538
|
-
activeEmbeddingProvider: params.activeEmbeddingProvider,
|
|
539
|
-
extensionEmbedding: params.extensionEmbedding,
|
|
540
|
-
documentCandidates: params.documentCandidates,
|
|
541
|
-
metadataDocuments: params.metadataDocuments,
|
|
542
|
-
staleDocuments: params.plan.staleDocuments,
|
|
543
|
-
ledgerEmbedding: params.plan.ledgerEmbedding,
|
|
544
|
-
resetRequired: params.plan.resetRequired,
|
|
545
|
-
semanticWarnings: params.semanticWarnings,
|
|
546
|
-
reindexWarnings: params.reindexWarnings,
|
|
547
|
-
semanticSummary: params.semanticSummary,
|
|
548
|
-
progressEnabled: params.progressEnabled,
|
|
549
|
-
});
|
|
550
|
-
if (embedding.resetRequired) {
|
|
551
|
-
emitReindexProgress(params.progressEnabled, "vector_reset_start");
|
|
552
|
-
await resetVectorStoreForReindex(params.activeVectorStore, params.extensionVectorAdapter, params.plan.ledgerEntries, params.settings, params.semanticWarnings, params.plan.ledgerEmbedding ? embedding.vectorDimension : undefined);
|
|
553
|
-
emitReindexProgress(params.progressEnabled, "vector_reset_complete");
|
|
554
|
-
}
|
|
555
|
-
else {
|
|
556
|
-
await pruneReindexOrphanVectors(params.activeVectorStore, params.extensionVectorAdapter, params.plan.orphanIds, params.settings, params.semanticWarnings);
|
|
557
|
-
}
|
|
558
|
-
const points = buildReindexVectorPoints(embedding.staleDocuments, embedding.vectors);
|
|
559
|
-
params.semanticSummary.embedded_items = embedding.vectors.length;
|
|
560
|
-
await upsertReindexVectors({
|
|
561
|
-
requestedMode: params.requestedMode,
|
|
562
|
-
activeVectorStore: params.activeVectorStore,
|
|
563
|
-
extensionVectorAdapter: params.extensionVectorAdapter,
|
|
564
|
-
settings: params.settings,
|
|
565
|
-
points,
|
|
566
|
-
semanticWarnings: params.semanticWarnings,
|
|
567
|
-
semanticSummary: params.semanticSummary,
|
|
568
|
-
progressEnabled: params.progressEnabled,
|
|
569
|
-
});
|
|
570
|
-
return {
|
|
571
|
-
staleDocuments: embedding.staleDocuments,
|
|
572
|
-
embeddingMetadata: buildVectorizationEmbeddingMetadata(embedding.embeddingIdentity, embedding.vectorDimension),
|
|
573
|
-
};
|
|
574
|
-
}
|
|
575
|
-
async function runSemanticReindex(params) {
|
|
576
|
-
const plan = await planSemanticReindex(params);
|
|
577
|
-
params.semanticSummary.stale_items = plan.staleDocuments.length;
|
|
578
|
-
params.semanticSummary.unchanged_items = plan.freshDocuments;
|
|
579
|
-
const vectorizationLedgerEntries = Object.fromEntries(params.metadataDocuments.map((document) => [
|
|
580
|
-
document.metadata.id,
|
|
581
|
-
document.metadata.updated_at,
|
|
582
|
-
]));
|
|
583
|
-
emitReindexProgress(params.progressEnabled, `semantic_stale_items stale=${plan.staleDocuments.length} total=${params.metadataDocuments.length} unchanged=${plan.freshDocuments} full=${params.forceFullSemantic || plan.resetRequired}`);
|
|
584
|
-
if (plan.staleDocuments.length === 0) {
|
|
585
|
-
emitReindexProgress(params.progressEnabled, `embedding_skipped unchanged_items=${plan.freshDocuments}`);
|
|
586
|
-
params.semanticWarnings.push(`search_semantic_reindex_skipped_unchanged:count=${plan.freshDocuments}`);
|
|
587
|
-
await pruneReindexOrphanVectors(params.activeVectorStore, params.extensionVectorAdapter, plan.orphanIds, params.settings, params.semanticWarnings);
|
|
588
|
-
return {
|
|
589
|
-
documentsForKeywordArtifacts: params.documentsForKeywordArtifacts,
|
|
590
|
-
vectorizationLedgerEntries,
|
|
591
|
-
vectorizationEmbeddingMetadata: plan.ledgerEmbedding,
|
|
592
|
-
};
|
|
593
|
-
}
|
|
594
|
-
const refresh = await executeSemanticVectorRefresh({ ...params, plan });
|
|
595
|
-
if (plan.freshDocuments > 0) {
|
|
596
|
-
params.semanticWarnings.push(`search_semantic_reindex_skipped_unchanged:count=${plan.freshDocuments}`);
|
|
597
|
-
}
|
|
598
|
-
const staleDocumentsById = new Map(refresh.staleDocuments.map((document) => [document.metadata.id, document]));
|
|
599
|
-
return {
|
|
600
|
-
documentsForKeywordArtifacts: params.metadataDocuments.map((document) => staleDocumentsById.get(document.metadata.id) ?? document),
|
|
601
|
-
vectorizationLedgerEntries,
|
|
602
|
-
vectorizationEmbeddingMetadata: refresh.embeddingMetadata,
|
|
603
|
-
};
|
|
604
|
-
}
|
|
605
|
-
async function writeReindexArtifacts(params) {
|
|
606
|
-
const manifestPath = path.join(params.pmRoot, MANIFEST_PATH);
|
|
607
|
-
const embeddingsPath = path.join(params.pmRoot, EMBEDDINGS_PATH);
|
|
608
|
-
const keywordCorpusFields = resolveSearchCorpusFields(params.settings);
|
|
609
|
-
const embeddingsLines = params.documentsForKeywordArtifacts
|
|
610
|
-
.map((document) => JSON.stringify(buildKeywordRecord(document, params.mode, keywordCorpusFields)))
|
|
611
|
-
.join("\n");
|
|
612
|
-
emitReindexProgress(params.progressEnabled, "writing keyword artifacts");
|
|
613
|
-
await writeFileAtomic(manifestPath, `${JSON.stringify(params.manifest, null, 2)}\n`);
|
|
614
|
-
await writeFileAtomic(embeddingsPath, `${embeddingsLines}\n`);
|
|
615
|
-
const vectorizationWarnings = [];
|
|
616
|
-
if (params.mode !== "keyword") {
|
|
617
|
-
try {
|
|
618
|
-
emitReindexProgress(params.progressEnabled, "writing vectorization status ledger");
|
|
619
|
-
await writeVectorizationStatusLedger(params.pmRoot, params.vectorizationLedgerEntries, params.vectorizationEmbeddingMetadata);
|
|
620
|
-
}
|
|
621
|
-
catch (error) {
|
|
622
|
-
vectorizationWarnings.push(`search_vectorization_status_ledger_write_failed:${error instanceof Error ? error.message : String(error)}`);
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
return vectorizationWarnings;
|
|
626
|
-
}
|
|
627
|
-
/** Implements run reindex for the public runtime surface of this module. */
|
|
628
|
-
export async function runReindex(options, global) {
|
|
629
|
-
const requestedMode = parseMode(options.mode);
|
|
630
|
-
const progressEnabled = shouldEmitReindexProgress(options);
|
|
631
|
-
const forceFullSemantic = options.full === true;
|
|
632
|
-
emitReindexProgress(progressEnabled, `start mode=${requestedMode}`);
|
|
633
|
-
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
634
|
-
await assertInitializedTracker(pmRoot);
|
|
635
|
-
const settings = resolveSettingsWithSemanticRuntimeDefaults(await readSettings(pmRoot)).settings;
|
|
636
|
-
let releaseReindexLock = null;
|
|
637
|
-
try {
|
|
638
|
-
releaseReindexLock = await acquireLock(pmRoot, REINDEX_LOCK_ID, settings.locks.ttl_seconds, resolveAuthor(undefined, "pm-reindex"), false, settings.governance.force_required_for_stale_lock, settings.locks.wait_ms);
|
|
639
|
-
}
|
|
640
|
-
catch (error) {
|
|
641
|
-
if (error instanceof PmCliError && error.exitCode === EXIT_CODE.CONFLICT) {
|
|
642
|
-
throw new PmCliError("Another pm reindex run is already active for this project. Wait for it to finish before starting a new keyword, semantic, or hybrid reindex.", EXIT_CODE.CONFLICT, {
|
|
643
|
-
code: "reindex_already_running",
|
|
644
|
-
type: "urn:pm-cli:error:reindex_already_running",
|
|
645
|
-
why: "Semantic reindex can be expensive and duplicate runs compete for the same local embedding model and vector store.",
|
|
646
|
-
nextSteps: [
|
|
647
|
-
"Check active pm reindex processes before starting another reindex.",
|
|
648
|
-
"Rerun with --progress when you need non-interactive visibility.",
|
|
649
|
-
],
|
|
650
|
-
});
|
|
651
|
-
}
|
|
652
|
-
throw error;
|
|
653
|
-
}
|
|
654
|
-
try {
|
|
655
|
-
const extensionEmbedding = resolveExtensionSearchEmbedding(settings);
|
|
656
|
-
const extensionVectorAdapter = resolveExtensionVectorAdapter(settings);
|
|
657
|
-
const semanticRuntime = assertSemanticRuntimeAvailable({
|
|
658
|
-
requestedMode,
|
|
659
|
-
pmRoot,
|
|
660
|
-
settings,
|
|
661
|
-
extensionEmbedding,
|
|
662
|
-
extensionVectorAdapter,
|
|
663
|
-
});
|
|
664
|
-
const mode = requestedMode;
|
|
665
|
-
emitReindexProgress(progressEnabled, "loading item corpus");
|
|
666
|
-
const corpus = await loadReindexCorpus({ pmRoot, settings });
|
|
667
|
-
const reindexWarnings = corpus.warnings;
|
|
668
|
-
const { documentCandidates, metadataDocuments } = corpus;
|
|
669
|
-
emitReindexProgress(progressEnabled, `loaded_items=${metadataDocuments.length}`);
|
|
670
|
-
const generatedAt = nowIso();
|
|
671
|
-
const manifest = buildReindexManifest(mode, generatedAt, metadataDocuments);
|
|
672
|
-
const manifestPath = path.join(pmRoot, MANIFEST_PATH);
|
|
673
|
-
const embeddingsPath = path.join(pmRoot, EMBEDDINGS_PATH);
|
|
674
|
-
let documentsForKeywordArtifacts = mode === "keyword"
|
|
675
|
-
? await hydrateDocuments(pmRoot, documentCandidates, settings.schema, reindexWarnings)
|
|
676
|
-
: metadataDocuments;
|
|
677
|
-
const semanticWarnings = [];
|
|
678
|
-
let vectorizationLedgerEntries = {};
|
|
679
|
-
let vectorizationEmbeddingMetadata = null;
|
|
680
|
-
const semanticSummary = createReindexSemanticSummary(mode);
|
|
681
|
-
if (mode === "keyword") {
|
|
682
|
-
await appendKeywordLedgerWarnings({
|
|
683
|
-
pmRoot,
|
|
684
|
-
settings,
|
|
685
|
-
forceFullSemantic,
|
|
686
|
-
extensionEmbedding,
|
|
687
|
-
reindexWarnings,
|
|
688
|
-
});
|
|
689
|
-
}
|
|
690
|
-
if (mode !== "keyword") {
|
|
691
|
-
const semantic = await runSemanticReindex({
|
|
692
|
-
pmRoot,
|
|
693
|
-
settings,
|
|
694
|
-
requestedMode,
|
|
695
|
-
activeEmbeddingProvider: semanticRuntime.activeEmbeddingProvider,
|
|
696
|
-
activeVectorStore: semanticRuntime.activeVectorStore,
|
|
697
|
-
extensionEmbedding,
|
|
698
|
-
extensionVectorAdapter,
|
|
699
|
-
documentCandidates,
|
|
700
|
-
metadataDocuments,
|
|
701
|
-
documentsForKeywordArtifacts,
|
|
702
|
-
forceFullSemantic,
|
|
703
|
-
reindexWarnings,
|
|
704
|
-
semanticWarnings,
|
|
705
|
-
semanticSummary,
|
|
706
|
-
progressEnabled,
|
|
707
|
-
});
|
|
708
|
-
documentsForKeywordArtifacts = semantic.documentsForKeywordArtifacts;
|
|
709
|
-
vectorizationLedgerEntries = semantic.vectorizationLedgerEntries;
|
|
710
|
-
vectorizationEmbeddingMetadata = semantic.vectorizationEmbeddingMetadata;
|
|
711
|
-
}
|
|
712
|
-
const vectorizationWarnings = await writeReindexArtifacts({
|
|
713
|
-
pmRoot,
|
|
714
|
-
mode,
|
|
715
|
-
manifest,
|
|
716
|
-
documentsForKeywordArtifacts,
|
|
717
|
-
settings,
|
|
718
|
-
vectorizationLedgerEntries,
|
|
719
|
-
vectorizationEmbeddingMetadata,
|
|
720
|
-
progressEnabled,
|
|
721
|
-
});
|
|
722
|
-
const hookWarnings = [
|
|
723
|
-
...(await runActiveOnWriteHooks({
|
|
724
|
-
path: manifestPath,
|
|
725
|
-
scope: "project",
|
|
726
|
-
op: "reindex:manifest",
|
|
727
|
-
})),
|
|
728
|
-
...(await runActiveOnWriteHooks({
|
|
729
|
-
path: embeddingsPath,
|
|
730
|
-
scope: "project",
|
|
731
|
-
op: "reindex:embeddings",
|
|
732
|
-
})),
|
|
733
|
-
...(await runActiveOnIndexHooks({
|
|
734
|
-
mode,
|
|
735
|
-
total_items: metadataDocuments.length,
|
|
736
|
-
})),
|
|
737
|
-
];
|
|
738
|
-
emitReindexProgress(progressEnabled, "done");
|
|
739
|
-
return {
|
|
740
|
-
ok: true,
|
|
741
|
-
mode,
|
|
742
|
-
total_items: metadataDocuments.length,
|
|
743
|
-
semantic: semanticSummary,
|
|
744
|
-
artifacts: {
|
|
745
|
-
manifest: MANIFEST_PATH,
|
|
746
|
-
embeddings: EMBEDDINGS_PATH,
|
|
747
|
-
},
|
|
748
|
-
warnings: [
|
|
749
|
-
...reindexWarnings,
|
|
750
|
-
...semanticWarnings,
|
|
751
|
-
...vectorizationWarnings,
|
|
752
|
-
...hookWarnings,
|
|
753
|
-
],
|
|
754
|
-
generated_at: generatedAt,
|
|
755
|
-
};
|
|
756
|
-
}
|
|
757
|
-
finally {
|
|
758
|
-
await releaseReindexLock?.();
|
|
759
|
-
}
|
|
760
|
-
}
|
|
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]="02e6f711-7e60-5bb7-a439-9b23d23575f5")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import fs from"node:fs/promises";import path from"node:path";import{toNonEmptyStringOrUndefined,getActiveExtensionRegistrations,runActiveOnIndexHooks,runActiveOnWriteHooks,collectRegisteredItemFieldNames,resolveRegisteredSearchProvider,resolveRegisteredVectorStoreAdapter,writeFileAtomic,resolveItemTypeRegistry,parseItemDocument,acquireLock,buildSearchCorpus,buildSemanticCorpusInput,resolveSearchCorpusFields,resolveSemanticCorpusCharacterLimit,executeEmbeddingBatchesWithRetry,readVectorizationStatusLedger,writeVectorizationStatusLedger,REINDEX_LOCK_ID,resolveEmbeddingProviders,resolveSettingsWithSemanticRuntimeDefaults,executeVectorDelete,executeVectorReset,executeVectorUpsert,resolveVectorStores,buildVectorizationEmbeddingIdentity,buildVectorizationEmbeddingMetadata,hasVectorizationEmbeddingIdentityChanged,hasVectorizationVectorDimensionChanged,inferConsistentVectorDimension,EXIT_CODE,PmCliError,nowIso,listAllDocumentCandidatesCached,resolvePmRoot,readSettings,resolveAuthor}from"../runtime-primitives.js";const MANIFEST_PATH="index/manifest.json";const EMBEDDINGS_PATH="search/embeddings.jsonl";const EMBEDDING_MIGRATION_REINDEX_HINT="Provider or model has changed since last index. Run pm reindex --mode semantic to rebuild.";function shouldEmitReindexProgress(options){return options.progress===true||process.stderr.isTTY===true}function emitReindexProgress(enabled,message){if(!enabled){return}try{process.stderr.write(`[pm reindex] ${message}
|
|
2
|
+
`)}catch{}}function parseMode(raw){const normalized=(raw??"keyword").trim().toLowerCase();if(normalized==="keyword"){return"keyword"}if(normalized==="semantic"||normalized==="hybrid"){return normalized}throw new PmCliError("Reindex mode must be one of keyword|semantic|hybrid",EXIT_CODE.USAGE)}async function loadDocumentCandidates(pmRoot,itemFormat,typeToFolder,schema){const warnings=[];const candidates=await listAllDocumentCandidatesCached(pmRoot,itemFormat,typeToFolder,warnings,schema);return{candidates,warnings}}async function hydrateDocuments(pmRoot,candidates,schema,warnings,itemIds){const extensionFieldNames=collectRegisteredItemFieldNames(getActiveExtensionRegistrations());const hydrated=[];for(const candidate of candidates){if(itemIds&&!itemIds.has(candidate.metadata.id)){continue}if(typeof candidate.body==="string"){hydrated.push({metadata:candidate.metadata,body:candidate.body});continue}try{const raw=await fs.readFile(candidate.item_path,"utf8");const parsed=parseItemDocument(raw,{format:candidate.item_format,schema,extensionFieldNames,onWarning:warning=>warnings.push(warning)});hydrated.push({metadata:candidate.metadata,body:parsed.body})}catch{warnings.push(`item_list_item_read_failed:${path.relative(pmRoot,candidate.item_path)}`);hydrated.push({metadata:candidate.metadata,body:""})}}return hydrated}function buildKeywordRecord(document,mode,corpusFields){const item=document.metadata;return{id:item.id,mode,updated_at:item.updated_at,corpus:buildSearchCorpus(document,{fields:corpusFields})}}const toOptionalNonEmptyString=toNonEmptyStringOrUndefined;const _testOnly={shouldEmitReindexProgress,emitReindexProgress,parseMode,hydrateDocuments,buildKeywordRecord,resolveExtensionSearchEmbedding,resolveExtensionVectorAdapter,assertVector,executeExtensionEmbedding,resolveExtensionEmbeddingModel,resolveReindexEmbeddingIdentity,executeReindexEmbedding,collectLedgerOrphanIds,resetVectorStoreForReindex,pruneReindexOrphanVectors,upsertReindexVectors};function resolveExtensionSearchEmbedding(settings){const registrations=getActiveExtensionRegistrations();const providerName=toOptionalNonEmptyString(settings.search?.provider);if(!providerName){return null}const registration=resolveRegisteredSearchProvider(registrations,providerName);if(!registration){return null}const runtimeDefinition=registration.runtime_definition??registration.definition;const name=toOptionalNonEmptyString(runtimeDefinition.name)??toOptionalNonEmptyString(registration.definition.name);if(!name){return null}const embedBatch=runtimeDefinition.embedBatch;const embedBatchSnake=runtimeDefinition.embed_batch;const embed=runtimeDefinition.embed;const resolvedEmbedBatch=typeof embedBatch==="function"?embedBatch:typeof embedBatchSnake==="function"?embedBatchSnake:void 0;const resolvedEmbed=typeof embed==="function"?embed:void 0;if(!resolvedEmbedBatch&&!resolvedEmbed){return null}return{name,embedBatch:resolvedEmbedBatch,embed:resolvedEmbed}}function resolveExtensionVectorAdapter(settings){const registrations=getActiveExtensionRegistrations();const adapterName=toOptionalNonEmptyString(settings.vector_store?.adapter);if(!adapterName){return null}const registration=resolveRegisteredVectorStoreAdapter(registrations,adapterName);if(!registration){return null}const runtimeDefinition=registration.runtime_definition??registration.definition;const adapterDisplayName=toOptionalNonEmptyString(runtimeDefinition.name)??toOptionalNonEmptyString(registration.definition.name);if(!adapterDisplayName){return null}const upsert=runtimeDefinition.upsert;const deleteHandler=runtimeDefinition.delete;return{adapterName:adapterDisplayName,...typeof upsert==="function"?{upsert}:{},...typeof deleteHandler==="function"?{delete:deleteHandler}:{}}}function assertVector(value,context){if(!Array.isArray(value)||value.some(entry=>typeof entry!=="number"||!Number.isFinite(entry))){throw new PmCliError(`Invalid vector returned by ${context}`,EXIT_CODE.GENERIC_FAILURE)}return value}async function executeExtensionEmbedding(extensionEmbedding,settings,corpusInputs){const model=settings.search?.embedding_model?.trim()||"text-embedding-3-small";if(extensionEmbedding.embedBatch){const vectors2=await Promise.resolve(extensionEmbedding.embedBatch({inputs:corpusInputs,settings,model}));if(!Array.isArray(vectors2)){throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" embedBatch must return an array of vectors`,EXIT_CODE.GENERIC_FAILURE)}return vectors2.map((vector,index)=>assertVector(vector,`extension search provider "${extensionEmbedding.name}" embedBatch output at index ${index}`))}if(!extensionEmbedding.embed){throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" does not implement embed/embedBatch`,EXIT_CODE.GENERIC_FAILURE)}const vectors=[];for(const[index,input]of corpusInputs.entries()){const vector=await Promise.resolve(extensionEmbedding.embed({input,settings,model}));vectors.push(assertVector(vector,`extension search provider "${extensionEmbedding.name}" embed output at index ${index}`))}return vectors}function resolveExtensionEmbeddingModel(settings){return settings.search?.embedding_model?.trim()||"text-embedding-3-small"}function resolveReindexEmbeddingIdentity(settings,activeEmbeddingProvider,extensionEmbedding){const identity=extensionEmbedding?buildVectorizationEmbeddingIdentity(extensionEmbedding.name,resolveExtensionEmbeddingModel(settings)):activeEmbeddingProvider?buildVectorizationEmbeddingIdentity(activeEmbeddingProvider.name,activeEmbeddingProvider.model):null;if(!identity){throw new PmCliError(`No embedding identity available for semantic reindex mode`,EXIT_CODE.USAGE)}return identity}function collectLedgerOrphanIds(ledgerEntries,currentIds){return Object.keys(ledgerEntries).filter(id=>!currentIds.has(id)).sort((left,right)=>left.localeCompare(right))}async function executeReindexEmbedding(settings,requestedMode,activeEmbeddingProvider,extensionEmbedding,documents,semanticWarnings,semanticSummary,progressEnabled){const semanticProviderName=extensionEmbedding?.name??activeEmbeddingProvider?.name;const corpusCharacterLimit=resolveSemanticCorpusCharacterLimit(semanticProviderName,settings.search.embedding_corpus_max_characters).maxCharacters;const corpusFields=resolveSearchCorpusFields(settings);const corpusInputs=documents.map(document=>buildSemanticCorpusInput(document,{providerName:semanticProviderName,maxCharacters:corpusCharacterLimit,fields:corpusFields}));let vectors=[];let embeddingIdentity=null;if(extensionEmbedding){try{vectors=await executeExtensionEmbedding(extensionEmbedding,settings,corpusInputs);embeddingIdentity=buildVectorizationEmbeddingIdentity(extensionEmbedding.name,resolveExtensionEmbeddingModel(settings))}catch(error){if(!activeEmbeddingProvider){throw new PmCliError(`Extension search provider "${extensionEmbedding.name}" failed to generate embeddings: ${error instanceof Error?error.message:String(error)}`,EXIT_CODE.GENERIC_FAILURE)}semanticWarnings.push(`Extension search provider "${extensionEmbedding.name}" failed; falling back to built-in provider (${error instanceof Error?error.message:String(error)})`)}}if(vectors.length===0){if(!activeEmbeddingProvider){throw new PmCliError(`No embedding executor available for reindex mode '${requestedMode}'`,EXIT_CODE.USAGE)}const embeddingResult=await executeEmbeddingBatchesWithRetry(activeEmbeddingProvider,settings,corpusInputs,{onProgress:event=>{if(event.phase==="complete"){semanticSummary.batches_completed=event.batch_index}emitReindexProgress(progressEnabled,`embedding_batch_${event.phase} batch=${event.batch_index}/${event.batch_total} size=${event.batch_size} completed_inputs=${event.completed_inputs}/${event.total_inputs}`)}});semanticWarnings.push(...embeddingResult.warnings);vectors=embeddingResult.vectors;embeddingIdentity=buildVectorizationEmbeddingIdentity(activeEmbeddingProvider.name,activeEmbeddingProvider.model)}emitReindexProgress(progressEnabled,`embedding_complete vectors=${vectors.length}`);if(vectors.length!==documents.length){throw new PmCliError(`Embedding output size mismatch (expected ${documents.length}, received ${vectors.length})`,EXIT_CODE.GENERIC_FAILURE)}if(!embeddingIdentity){throw new PmCliError(`No embedding identity available for reindex mode '${requestedMode}'`,EXIT_CODE.USAGE)}return{vectors,embeddingIdentity}}async function resetVectorStoreForReindex(activeVectorStore,extensionVectorAdapter,ledgerEntries,settings,semanticWarnings,vectorDimension){const knownIds=Object.keys(ledgerEntries);if(extensionVectorAdapter){if(knownIds.length>0&&extensionVectorAdapter.delete){try{await Promise.resolve(extensionVectorAdapter.delete({ids:knownIds.sort((left,right)=>left.localeCompare(right)),settings}))}catch(error){throw new PmCliError(`Extension vector adapter "${extensionVectorAdapter.adapterName}" failed to delete vectors during reindex reset: ${error instanceof Error?error.message:String(error)}`,EXIT_CODE.GENERIC_FAILURE)}}else if(knownIds.length>0){semanticWarnings.push(`search_semantic_reindex_reset_skipped:adapter=${extensionVectorAdapter.adapterName}:known_ids=${knownIds.length}`)}if(!activeVectorStore){return}}if(activeVectorStore){await executeVectorReset(activeVectorStore,knownIds,{},vectorDimension)}}async function pruneReindexOrphanVectors(activeVectorStore,extensionVectorAdapter,orphanIds,settings,semanticWarnings){if(orphanIds.length===0){return}if(extensionVectorAdapter){if(extensionVectorAdapter.delete){try{await Promise.resolve(extensionVectorAdapter.delete({ids:orphanIds,settings}))}catch(error){throw new PmCliError(`Extension vector adapter "${extensionVectorAdapter.adapterName}" failed to delete orphan vectors during reindex: ${error instanceof Error?error.message:String(error)}`,EXIT_CODE.GENERIC_FAILURE)}}else{semanticWarnings.push(`search_semantic_reindex_orphan_prune_skipped:adapter=${extensionVectorAdapter.adapterName}:count=${orphanIds.length}`)}if(!activeVectorStore){return}}if(activeVectorStore){await executeVectorDelete(activeVectorStore,orphanIds)}}function createReindexSemanticSummary(mode){return{enabled:mode!=="keyword",stale_items:0,unchanged_items:0,embedded_items:0,vector_upserted:0,batches_completed:0}}function buildReindexManifest(mode,generatedAt,metadataDocuments){return{version:1,mode,generated_at:generatedAt,total_items:metadataDocuments.length,items:metadataDocuments.map(document=>({id:document.metadata.id,type:document.metadata.type,status:document.metadata.status,priority:document.metadata.priority,updated_at:document.metadata.updated_at}))}}function assertSemanticRuntimeAvailable(params){if(params.requestedMode==="keyword"){return{activeEmbeddingProvider:null,activeVectorStore:null}}const providerResolution=resolveEmbeddingProviders(params.settings);if(!providerResolution.active&&!params.extensionEmbedding){throw new PmCliError(`Reindex mode '${params.requestedMode}' requires a configured embedding provider in settings.providers.openai/settings.providers.ollama or an extension provider selected by settings.search.provider`,EXIT_CODE.USAGE)}const vectorResolution=resolveVectorStores(params.settings,params.pmRoot);if(!vectorResolution.active&&!params.extensionVectorAdapter){throw new PmCliError(`Reindex mode '${params.requestedMode}' requires a configured vector store in settings.vector_store.qdrant/settings.vector_store.lancedb or an extension adapter selected by settings.vector_store.adapter`,EXIT_CODE.USAGE)}return{activeEmbeddingProvider:providerResolution.active,activeVectorStore:vectorResolution.active}}async function loadReindexCorpus(params){const typeRegistry=resolveItemTypeRegistry(params.settings,getActiveExtensionRegistrations());const loadedCandidates=await loadDocumentCandidates(params.pmRoot,params.settings.item_format,typeRegistry.type_to_folder,params.settings.schema);return{documentCandidates:loadedCandidates.candidates,warnings:[...loadedCandidates.warnings],metadataDocuments:loadedCandidates.candidates.map(candidate=>({metadata:candidate.metadata,body:typeof candidate.body==="string"?candidate.body:""}))}}async function appendKeywordLedgerWarnings(params){const ledger=await readVectorizationStatusLedger(params.pmRoot);params.reindexWarnings.push(...ledger.warnings);if(params.forceFullSemantic){params.reindexWarnings.push("search_semantic_reindex_full_ignored:mode_keyword")}if(!ledger.embedding){return}const currentEmbeddingIdentity=(()=>{try{return resolveReindexEmbeddingIdentity(params.settings,resolveEmbeddingProviders(params.settings).active,params.extensionEmbedding)}catch{return null}})();if(currentEmbeddingIdentity&&hasVectorizationEmbeddingIdentityChanged(ledger.embedding,currentEmbeddingIdentity)){params.reindexWarnings.push("search_semantic_reindex_requires_rebuild:embedding_identity_changed");params.reindexWarnings.push(EMBEDDING_MIGRATION_REINDEX_HINT)}}async function planSemanticReindex(params){const ledger=await readVectorizationStatusLedger(params.pmRoot);params.semanticWarnings.push(...ledger.warnings);const embeddingIdentity=resolveReindexEmbeddingIdentity(params.settings,params.activeEmbeddingProvider,params.extensionEmbedding);const currentIds=new Set(params.metadataDocuments.map(document=>document.metadata.id));const orphanIds=collectLedgerOrphanIds(ledger.entries,currentIds);const resetRequired=hasVectorizationEmbeddingIdentityChanged(ledger.embedding,embeddingIdentity);if(params.forceFullSemantic&&!resetRequired){params.semanticWarnings.push("search_semantic_reindex_full_rebuild_forced")}const staleSourceDocuments=params.forceFullSemantic||resetRequired?params.metadataDocuments:params.metadataDocuments.filter(document=>ledger.entries[document.metadata.id]!==document.metadata.updated_at);const staleIds=new Set(staleSourceDocuments.map(document=>document.metadata.id));const staleDocuments=staleIds.size>0?await hydrateDocuments(params.pmRoot,params.documentCandidates,params.settings.schema,params.reindexWarnings,staleIds):[];return{ledgerEntries:ledger.entries,ledgerEmbedding:ledger.embedding,orphanIds,resetRequired,staleDocuments,freshDocuments:params.metadataDocuments.length-staleDocuments.length}}async function rerunSemanticEmbeddingAfterDimensionChange(params){const staleIds=new Set(params.metadataDocuments.map(document=>document.metadata.id));const staleDocuments=await hydrateDocuments(params.pmRoot,params.documentCandidates,params.settings.schema,params.reindexWarnings,staleIds);params.semanticSummary.stale_items=staleDocuments.length;params.semanticSummary.unchanged_items=0;emitReindexProgress(params.progressEnabled,`embedding_dimension_changed reset_items=${staleDocuments.length}`);const embeddingResult=await executeReindexEmbedding(params.settings,params.requestedMode,params.activeEmbeddingProvider,params.extensionEmbedding,staleDocuments,params.semanticWarnings,params.semanticSummary,params.progressEnabled);return{...embeddingResult,staleDocuments,vectorDimension:inferConsistentVectorDimension(embeddingResult.vectors,"Reindex embeddings")}}async function resolveSemanticEmbeddingForUpsert(params){const embeddingResult=await executeReindexEmbedding(params.settings,params.requestedMode,params.activeEmbeddingProvider,params.extensionEmbedding,params.staleDocuments,params.semanticWarnings,params.semanticSummary,params.progressEnabled);let vectors=embeddingResult.vectors;let actualEmbeddingIdentity=embeddingResult.embeddingIdentity;let vectorDimension=inferConsistentVectorDimension(vectors,"Reindex embeddings");const dimensionChanged=!params.resetRequired&&(hasVectorizationEmbeddingIdentityChanged(params.ledgerEmbedding,actualEmbeddingIdentity)||hasVectorizationVectorDimensionChanged(params.ledgerEmbedding,vectorDimension));if(!dimensionChanged){return{vectors,embeddingIdentity:actualEmbeddingIdentity,staleDocuments:params.staleDocuments,vectorDimension,resetRequired:params.resetRequired}}const rerun=await rerunSemanticEmbeddingAfterDimensionChange(params);vectors=rerun.vectors;actualEmbeddingIdentity=rerun.embeddingIdentity;vectorDimension=rerun.vectorDimension;return{vectors,embeddingIdentity:actualEmbeddingIdentity,staleDocuments:rerun.staleDocuments,vectorDimension,resetRequired:true}}async function upsertReindexVectors(params){if(params.extensionVectorAdapter){try{const adapterName=params.extensionVectorAdapter.adapterName;emitReindexProgress(params.progressEnabled,`vector_upsert_start adapter=${adapterName} points=${params.points.length}`);if(typeof params.extensionVectorAdapter.upsert!=="function"){throw new PmCliError(`Extension vector adapter "${adapterName}" does not support upserting vectors.`,EXIT_CODE.USAGE)}await Promise.resolve(params.extensionVectorAdapter.upsert({points:params.points,settings:params.settings}));params.semanticSummary.vector_upserted=params.points.length;emitReindexProgress(params.progressEnabled,`vector_upsert_complete adapter=${adapterName}`);return}catch(error){if(error instanceof PmCliError){throw error}if(!params.activeVectorStore){throw new PmCliError(`Extension vector adapter "${params.extensionVectorAdapter.adapterName}" failed to upsert vectors: ${error instanceof Error?error.message:String(error)}`,EXIT_CODE.GENERIC_FAILURE)}params.semanticWarnings.push(`Extension vector adapter "${params.extensionVectorAdapter.adapterName}" failed; falling back to built-in vector store (${error instanceof Error?error.message:String(error)})`);emitReindexProgress(params.progressEnabled,"vector_upsert_fallback built_in_store")}}if(params.activeVectorStore){emitReindexProgress(params.progressEnabled,`vector_upsert_start adapter=${params.activeVectorStore.name} points=${params.points.length}`);await executeVectorUpsert(params.activeVectorStore,params.points);params.semanticSummary.vector_upserted=params.points.length;emitReindexProgress(params.progressEnabled,`vector_upsert_complete adapter=${params.activeVectorStore.name}`);return}throw new PmCliError(`No vector upsert executor available for reindex mode '${params.requestedMode}'`,EXIT_CODE.USAGE)}function buildReindexVectorPoints(staleDocuments,vectors){return staleDocuments.map((document,index)=>({id:document.metadata.id,vector:assertVector(vectors[index],`reindex embeddings output at index ${index}`),payload:{id:document.metadata.id,type:document.metadata.type,status:document.metadata.status,priority:document.metadata.priority,updated_at:document.metadata.updated_at}}))}async function executeSemanticVectorRefresh(params){emitReindexProgress(params.progressEnabled,`embedding_start items=${params.plan.staleDocuments.length} unchanged_items=${params.plan.freshDocuments}`);const embedding=await resolveSemanticEmbeddingForUpsert({pmRoot:params.pmRoot,settings:params.settings,requestedMode:params.requestedMode,activeEmbeddingProvider:params.activeEmbeddingProvider,extensionEmbedding:params.extensionEmbedding,documentCandidates:params.documentCandidates,metadataDocuments:params.metadataDocuments,staleDocuments:params.plan.staleDocuments,ledgerEmbedding:params.plan.ledgerEmbedding,resetRequired:params.plan.resetRequired,semanticWarnings:params.semanticWarnings,reindexWarnings:params.reindexWarnings,semanticSummary:params.semanticSummary,progressEnabled:params.progressEnabled});if(embedding.resetRequired){emitReindexProgress(params.progressEnabled,"vector_reset_start");await resetVectorStoreForReindex(params.activeVectorStore,params.extensionVectorAdapter,params.plan.ledgerEntries,params.settings,params.semanticWarnings,params.plan.ledgerEmbedding?embedding.vectorDimension:void 0);emitReindexProgress(params.progressEnabled,"vector_reset_complete")}else{await pruneReindexOrphanVectors(params.activeVectorStore,params.extensionVectorAdapter,params.plan.orphanIds,params.settings,params.semanticWarnings)}const points=buildReindexVectorPoints(embedding.staleDocuments,embedding.vectors);params.semanticSummary.embedded_items=embedding.vectors.length;await upsertReindexVectors({requestedMode:params.requestedMode,activeVectorStore:params.activeVectorStore,extensionVectorAdapter:params.extensionVectorAdapter,settings:params.settings,points,semanticWarnings:params.semanticWarnings,semanticSummary:params.semanticSummary,progressEnabled:params.progressEnabled});return{staleDocuments:embedding.staleDocuments,embeddingMetadata:buildVectorizationEmbeddingMetadata(embedding.embeddingIdentity,embedding.vectorDimension)}}async function runSemanticReindex(params){const plan=await planSemanticReindex(params);params.semanticSummary.stale_items=plan.staleDocuments.length;params.semanticSummary.unchanged_items=plan.freshDocuments;const vectorizationLedgerEntries=Object.fromEntries(params.metadataDocuments.map(document=>[document.metadata.id,document.metadata.updated_at]));emitReindexProgress(params.progressEnabled,`semantic_stale_items stale=${plan.staleDocuments.length} total=${params.metadataDocuments.length} unchanged=${plan.freshDocuments} full=${params.forceFullSemantic||plan.resetRequired}`);if(plan.staleDocuments.length===0){emitReindexProgress(params.progressEnabled,`embedding_skipped unchanged_items=${plan.freshDocuments}`);params.semanticWarnings.push(`search_semantic_reindex_skipped_unchanged:count=${plan.freshDocuments}`);await pruneReindexOrphanVectors(params.activeVectorStore,params.extensionVectorAdapter,plan.orphanIds,params.settings,params.semanticWarnings);return{documentsForKeywordArtifacts:params.documentsForKeywordArtifacts,vectorizationLedgerEntries,vectorizationEmbeddingMetadata:plan.ledgerEmbedding}}const refresh=await executeSemanticVectorRefresh({...params,plan});if(plan.freshDocuments>0){params.semanticWarnings.push(`search_semantic_reindex_skipped_unchanged:count=${plan.freshDocuments}`)}const staleDocumentsById=new Map(refresh.staleDocuments.map(document=>[document.metadata.id,document]));return{documentsForKeywordArtifacts:params.metadataDocuments.map(document=>staleDocumentsById.get(document.metadata.id)??document),vectorizationLedgerEntries,vectorizationEmbeddingMetadata:refresh.embeddingMetadata}}async function writeReindexArtifacts(params){const manifestPath=path.join(params.pmRoot,MANIFEST_PATH);const embeddingsPath=path.join(params.pmRoot,EMBEDDINGS_PATH);const keywordCorpusFields=resolveSearchCorpusFields(params.settings);const embeddingsLines=params.documentsForKeywordArtifacts.map(document=>JSON.stringify(buildKeywordRecord(document,params.mode,keywordCorpusFields))).join("\n");emitReindexProgress(params.progressEnabled,"writing keyword artifacts");await writeFileAtomic(manifestPath,`${JSON.stringify(params.manifest,null,2)}
|
|
3
|
+
`);await writeFileAtomic(embeddingsPath,`${embeddingsLines}
|
|
4
|
+
`);const vectorizationWarnings=[];if(params.mode!=="keyword"){try{emitReindexProgress(params.progressEnabled,"writing vectorization status ledger");await writeVectorizationStatusLedger(params.pmRoot,params.vectorizationLedgerEntries,params.vectorizationEmbeddingMetadata)}catch(error){vectorizationWarnings.push(`search_vectorization_status_ledger_write_failed:${error instanceof Error?error.message:String(error)}`)}}return vectorizationWarnings}async function runReindex(options,global2){const requestedMode=parseMode(options.mode);const progressEnabled=shouldEmitReindexProgress(options);const forceFullSemantic=options.full===true;emitReindexProgress(progressEnabled,`start mode=${requestedMode}`);const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=resolveSettingsWithSemanticRuntimeDefaults(await readSettings(pmRoot)).settings;let releaseReindexLock=null;try{releaseReindexLock=await acquireLock(pmRoot,REINDEX_LOCK_ID,settings.locks.ttl_seconds,resolveAuthor(void 0,"pm-reindex"),false,settings.governance.force_required_for_stale_lock,settings.locks.wait_ms)}catch(error){if(error instanceof PmCliError&&error.exitCode===EXIT_CODE.CONFLICT){throw new PmCliError("Another pm reindex run is already active for this project. Wait for it to finish before starting a new keyword, semantic, or hybrid reindex.",EXIT_CODE.CONFLICT,{code:"reindex_already_running",type:"urn:pm-cli:error:reindex_already_running",why:"Semantic reindex can be expensive and duplicate runs compete for the same local embedding model and vector store.",nextSteps:["Check active pm reindex processes before starting another reindex.","Rerun with --progress when you need non-interactive visibility."]})}throw error}try{const extensionEmbedding=resolveExtensionSearchEmbedding(settings);const extensionVectorAdapter=resolveExtensionVectorAdapter(settings);const semanticRuntime=assertSemanticRuntimeAvailable({requestedMode,pmRoot,settings,extensionEmbedding,extensionVectorAdapter});const mode=requestedMode;emitReindexProgress(progressEnabled,"loading item corpus");const corpus=await loadReindexCorpus({pmRoot,settings});const reindexWarnings=corpus.warnings;const{documentCandidates,metadataDocuments}=corpus;emitReindexProgress(progressEnabled,`loaded_items=${metadataDocuments.length}`);const generatedAt=nowIso();const manifest=buildReindexManifest(mode,generatedAt,metadataDocuments);const manifestPath=path.join(pmRoot,MANIFEST_PATH);const embeddingsPath=path.join(pmRoot,EMBEDDINGS_PATH);let documentsForKeywordArtifacts=mode==="keyword"?await hydrateDocuments(pmRoot,documentCandidates,settings.schema,reindexWarnings):metadataDocuments;const semanticWarnings=[];let vectorizationLedgerEntries={};let vectorizationEmbeddingMetadata=null;const semanticSummary=createReindexSemanticSummary(mode);if(mode==="keyword"){await appendKeywordLedgerWarnings({pmRoot,settings,forceFullSemantic,extensionEmbedding,reindexWarnings})}if(mode!=="keyword"){const semantic=await runSemanticReindex({pmRoot,settings,requestedMode,activeEmbeddingProvider:semanticRuntime.activeEmbeddingProvider,activeVectorStore:semanticRuntime.activeVectorStore,extensionEmbedding,extensionVectorAdapter,documentCandidates,metadataDocuments,documentsForKeywordArtifacts,forceFullSemantic,reindexWarnings,semanticWarnings,semanticSummary,progressEnabled});documentsForKeywordArtifacts=semantic.documentsForKeywordArtifacts;vectorizationLedgerEntries=semantic.vectorizationLedgerEntries;vectorizationEmbeddingMetadata=semantic.vectorizationEmbeddingMetadata}const vectorizationWarnings=await writeReindexArtifacts({pmRoot,mode,manifest,documentsForKeywordArtifacts,settings,vectorizationLedgerEntries,vectorizationEmbeddingMetadata,progressEnabled});const hookWarnings=[...await runActiveOnWriteHooks({path:manifestPath,scope:"project",op:"reindex:manifest"}),...await runActiveOnWriteHooks({path:embeddingsPath,scope:"project",op:"reindex:embeddings"}),...await runActiveOnIndexHooks({mode,total_items:metadataDocuments.length})];emitReindexProgress(progressEnabled,"done");return{ok:true,mode,total_items:metadataDocuments.length,semantic:semanticSummary,artifacts:{manifest:MANIFEST_PATH,embeddings:EMBEDDINGS_PATH},warnings:[...reindexWarnings,...semanticWarnings,...vectorizationWarnings,...hookWarnings],generated_at:generatedAt}}finally{await releaseReindexLock?.()}}export{_testOnly,runReindex};
|
|
761
5
|
//# sourceMappingURL=reindex.js.map
|
|
762
|
-
//# debugId=1bcd20e1-2995-56ef-8d04-f265b8282c19
|