@unbrained/pm-cli 2026.9.7 → 2026.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +5 -0
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +211 -181
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
- package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
- package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
- package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
- package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
- package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +29 -29
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +157 -837
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +1 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -0
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +3 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +23 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,535 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
* @module core/search/cache
|
|
3
|
-
*
|
|
4
|
-
* Powers search, embeddings, and semantic retrieval behavior for Cache.
|
|
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]="7939a590-3662-5c66-99aa-3835a0dbaecc")}catch(e){}}();
|
|
8
|
-
import path from "node:path";
|
|
9
|
-
import { getActiveExtensionRegistrations } from "../extensions/index.js";
|
|
10
|
-
import { pathExists, readFileIfExists, removeFileIfExists, writeFileAtomic, } from "../fs/fs-utils.js";
|
|
11
|
-
import { resolveItemTypeRegistry } from "../item/type-registry.js";
|
|
12
|
-
import { toErrorMessage } from "../shared/primitives.js";
|
|
13
|
-
import { locateItem, readLocatedItem } from "../store/item-store.js";
|
|
14
|
-
import { getSettingsPath } from "../store/paths.js";
|
|
15
|
-
import { readSettingsWithMetadata, } from "../store/settings.js";
|
|
16
|
-
import { executeEmbeddingBatchesWithRetry } from "./embedding-batches.js";
|
|
17
|
-
import { buildSemanticCorpusInput, resolveSearchCorpusFields, resolveSemanticCorpusCharacterLimit, } from "./corpus.js";
|
|
18
|
-
import { resolveEmbeddingProviders } from "./providers.js";
|
|
19
|
-
import { resolveSettingsWithSemanticRuntimeDefaults } from "./semantic-defaults.js";
|
|
20
|
-
import { scheduleBackgroundSemanticRefresh } from "./background-refresh.js";
|
|
21
|
-
import { executeVectorDelete, executeVectorReset, executeVectorUpsert, resolveVectorStores, } from "./vector-stores.js";
|
|
22
|
-
import { buildVectorizationEmbeddingIdentity, buildVectorizationEmbeddingMetadata, hasVectorizationEmbeddingIdentityChanged, hasVectorizationVectorDimensionChanged, inferConsistentVectorDimension, normalizeVectorizationEmbeddingMetadata, } from "./vectorization-metadata.js";
|
|
23
|
-
import { nowIso } from "../shared/time.js";
|
|
24
|
-
/** Public contract for search cache artifact paths, shared by SDK and presentation-layer consumers. */
|
|
25
|
-
export const SEARCH_CACHE_ARTIFACT_PATHS = [
|
|
26
|
-
"index/manifest.json",
|
|
27
|
-
"search/embeddings.jsonl",
|
|
28
|
-
];
|
|
29
|
-
/** Filesystem path used for vectorization status ledger resolution. */
|
|
30
|
-
export const VECTORIZATION_STATUS_LEDGER_PATH = "search/vectorization-status.json";
|
|
31
|
-
function formatInvalidationWarning(relativePath, error) {
|
|
32
|
-
return `search_cache_invalidation_failed:${relativePath}:${String(error)}`;
|
|
33
|
-
}
|
|
34
|
-
function toUniqueSorted(values) {
|
|
35
|
-
return [
|
|
36
|
-
...new Set([...values]
|
|
37
|
-
.map((value) => value.trim())
|
|
38
|
-
.filter((value) => value.length > 0)),
|
|
39
|
-
].sort((left, right) => left.localeCompare(right));
|
|
40
|
-
}
|
|
41
|
-
function isValidUpdatedAt(value) {
|
|
42
|
-
return (typeof value === "string" &&
|
|
43
|
-
value.trim().length > 0 &&
|
|
44
|
-
Number.isFinite(Date.parse(value)));
|
|
45
|
-
}
|
|
46
|
-
function normalizeVectorizationLedgerEntries(entries) {
|
|
47
|
-
const normalized = new Map();
|
|
48
|
-
for (const [rawId, rawUpdatedAt] of Object.entries(entries)) {
|
|
49
|
-
const id = rawId.trim();
|
|
50
|
-
if (id.length === 0 || !isValidUpdatedAt(rawUpdatedAt)) {
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
normalized.set(id, rawUpdatedAt);
|
|
54
|
-
}
|
|
55
|
-
return Object.fromEntries([...normalized.entries()].sort((left, right) => left[0].localeCompare(right[0])));
|
|
56
|
-
}
|
|
57
|
-
/** Implements read vectorization status ledger for the public runtime surface of this module. */
|
|
58
|
-
export async function readVectorizationStatusLedger(pmRoot) {
|
|
59
|
-
const ledgerPath = path.join(pmRoot, VECTORIZATION_STATUS_LEDGER_PATH);
|
|
60
|
-
const raw = await readFileIfExists(ledgerPath);
|
|
61
|
-
if (raw === null || raw.trim().length === 0) {
|
|
62
|
-
return {
|
|
63
|
-
entries: {},
|
|
64
|
-
embedding: null,
|
|
65
|
-
warnings: [],
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
let parsed;
|
|
69
|
-
try {
|
|
70
|
-
parsed = JSON.parse(raw);
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
return {
|
|
74
|
-
entries: {},
|
|
75
|
-
embedding: null,
|
|
76
|
-
warnings: ["search_vectorization_status_ledger_invalid"],
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
if (typeof parsed !== "object" ||
|
|
80
|
-
parsed === null ||
|
|
81
|
-
parsed.version !== 1 ||
|
|
82
|
-
!Array.isArray(parsed.items)) {
|
|
83
|
-
return {
|
|
84
|
-
entries: {},
|
|
85
|
-
embedding: null,
|
|
86
|
-
warnings: ["search_vectorization_status_ledger_invalid"],
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
const mapped = new Map();
|
|
90
|
-
for (const entry of parsed.items) {
|
|
91
|
-
if (typeof entry !== "object" || entry === null) {
|
|
92
|
-
return {
|
|
93
|
-
entries: {},
|
|
94
|
-
embedding: null,
|
|
95
|
-
warnings: ["search_vectorization_status_ledger_invalid"],
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
const id = entry.id;
|
|
99
|
-
const updatedAt = entry.updated_at;
|
|
100
|
-
if (typeof id !== "string" ||
|
|
101
|
-
id.trim().length === 0 ||
|
|
102
|
-
!isValidUpdatedAt(updatedAt)) {
|
|
103
|
-
return {
|
|
104
|
-
entries: {},
|
|
105
|
-
embedding: null,
|
|
106
|
-
warnings: ["search_vectorization_status_ledger_invalid"],
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
mapped.set(id.trim(), updatedAt);
|
|
110
|
-
}
|
|
111
|
-
let embedding = null;
|
|
112
|
-
try {
|
|
113
|
-
embedding = normalizeVectorizationEmbeddingMetadata(parsed.embedding);
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
return {
|
|
117
|
-
entries: {},
|
|
118
|
-
embedding: null,
|
|
119
|
-
warnings: ["search_vectorization_status_ledger_invalid"],
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
return {
|
|
123
|
-
entries: Object.fromEntries([...mapped.entries()].sort((left, right) => left[0].localeCompare(right[0]))),
|
|
124
|
-
embedding,
|
|
125
|
-
warnings: [],
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
/** Implements write vectorization status ledger for the public runtime surface of this module. */
|
|
129
|
-
export async function writeVectorizationStatusLedger(pmRoot, entries, embedding) {
|
|
130
|
-
const normalizedEntries = normalizeVectorizationLedgerEntries(entries);
|
|
131
|
-
const ledgerPath = path.join(pmRoot, VECTORIZATION_STATUS_LEDGER_PATH);
|
|
132
|
-
const serialized = `${JSON.stringify({
|
|
133
|
-
version: 1,
|
|
134
|
-
generated_at: nowIso(),
|
|
135
|
-
...(embedding ? { embedding } : {}),
|
|
136
|
-
items: Object.entries(normalizedEntries).map(([id, updated_at]) => ({
|
|
137
|
-
id,
|
|
138
|
-
updated_at,
|
|
139
|
-
})),
|
|
140
|
-
}, null, 2)}\n`;
|
|
141
|
-
await writeFileAtomic(ledgerPath, serialized);
|
|
142
|
-
}
|
|
143
|
-
function buildVectorPayload(item) {
|
|
144
|
-
return {
|
|
145
|
-
id: item.id,
|
|
146
|
-
type: item.type,
|
|
147
|
-
status: item.status,
|
|
148
|
-
priority: item.priority,
|
|
149
|
-
updated_at: item.updated_at,
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
function buildVectorizationIdentityForProvider(provider) {
|
|
153
|
-
const identity = buildVectorizationEmbeddingIdentity(provider.name, provider.model);
|
|
154
|
-
if (!identity) {
|
|
155
|
-
throw new Error("Embedding provider must include a provider name and model");
|
|
156
|
-
}
|
|
157
|
-
return identity;
|
|
158
|
-
}
|
|
159
|
-
function buildSkippedSemanticRefreshResult(itemIds, warning) {
|
|
160
|
-
return {
|
|
161
|
-
refreshed: [],
|
|
162
|
-
skipped: itemIds,
|
|
163
|
-
warnings: [warning],
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
async function resolveSemanticRefreshRuntimeContext(pmRoot, normalizedItemIds, options) {
|
|
167
|
-
if (!options.settings && !(await pathExists(getSettingsPath(pmRoot)))) {
|
|
168
|
-
return buildSkippedSemanticRefreshResult(normalizedItemIds, "search_semantic_refresh_skipped:settings_not_initialized");
|
|
169
|
-
}
|
|
170
|
-
let settings;
|
|
171
|
-
try {
|
|
172
|
-
if (options.settings) {
|
|
173
|
-
settings = options.settings;
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
const settingsRead = await readSettingsWithMetadata(pmRoot);
|
|
177
|
-
const readFailure = settingsRead.warnings.find((warning) => warning.startsWith("settings_read_"));
|
|
178
|
-
if (readFailure) {
|
|
179
|
-
return buildSkippedSemanticRefreshResult(normalizedItemIds, `search_semantic_refresh_skipped:settings_read_failed:${readFailure}`);
|
|
180
|
-
}
|
|
181
|
-
settings = settingsRead.settings;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
catch (error) {
|
|
185
|
-
return buildSkippedSemanticRefreshResult(normalizedItemIds, `search_semantic_refresh_skipped:settings_read_failed:${toErrorMessage(error)}`);
|
|
186
|
-
}
|
|
187
|
-
const effectiveSettings = options.apply_runtime_defaults
|
|
188
|
-
? resolveSettingsWithSemanticRuntimeDefaults(settings).settings
|
|
189
|
-
: settings;
|
|
190
|
-
const provider = resolveEmbeddingProviders(effectiveSettings).active;
|
|
191
|
-
if (!provider) {
|
|
192
|
-
return buildSkippedSemanticRefreshResult(normalizedItemIds, "search_semantic_refresh_skipped:provider_unconfigured");
|
|
193
|
-
}
|
|
194
|
-
const vectorStore = resolveVectorStores(effectiveSettings, pmRoot).active;
|
|
195
|
-
if (!vectorStore) {
|
|
196
|
-
return buildSkippedSemanticRefreshResult(normalizedItemIds, "search_semantic_refresh_skipped:vector_store_unconfigured");
|
|
197
|
-
}
|
|
198
|
-
return {
|
|
199
|
-
settings: effectiveSettings,
|
|
200
|
-
provider,
|
|
201
|
-
vectorStore,
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
async function collectSemanticRefreshWorkload(pmRoot, idPrefix, preferredFormat, normalizedItemIds, typeToFolder, schema) {
|
|
205
|
-
const warnings = [];
|
|
206
|
-
const skipped = new Set();
|
|
207
|
-
const missing = new Set();
|
|
208
|
-
const documents = [];
|
|
209
|
-
for (const itemId of normalizedItemIds) {
|
|
210
|
-
const located = await locateItem(pmRoot, itemId, idPrefix, preferredFormat, typeToFolder);
|
|
211
|
-
if (!located) {
|
|
212
|
-
missing.add(itemId);
|
|
213
|
-
continue;
|
|
214
|
-
}
|
|
215
|
-
try {
|
|
216
|
-
const loaded = await readLocatedItem(located, { schema });
|
|
217
|
-
documents.push({
|
|
218
|
-
id: loaded.document.metadata.id,
|
|
219
|
-
document: loaded.document,
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
catch (error) {
|
|
223
|
-
skipped.add(located.id);
|
|
224
|
-
warnings.push(`search_semantic_refresh_item_read_failed:${located.id}:${toErrorMessage(error)}`);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
documents.sort((left, right) => left.id.localeCompare(right.id));
|
|
228
|
-
return {
|
|
229
|
-
documents,
|
|
230
|
-
missingIds: toUniqueSorted(missing),
|
|
231
|
-
skippedIds: toUniqueSorted(skipped),
|
|
232
|
-
warnings,
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
async function embedLocatedSemanticVectors(settings, provider, documents) {
|
|
236
|
-
const corpusCharacterLimit = resolveSemanticCorpusCharacterLimit(provider.name, settings.search.embedding_corpus_max_characters).maxCharacters;
|
|
237
|
-
const corpusFields = resolveSearchCorpusFields(settings);
|
|
238
|
-
const corpusInputs = documents.map((entry) => buildSemanticCorpusInput(entry.document, {
|
|
239
|
-
providerName: provider.name,
|
|
240
|
-
maxCharacters: corpusCharacterLimit,
|
|
241
|
-
fields: corpusFields,
|
|
242
|
-
}));
|
|
243
|
-
const embeddingResult = await executeEmbeddingBatchesWithRetry(provider, settings, corpusInputs);
|
|
244
|
-
return {
|
|
245
|
-
vectors: embeddingResult.vectors,
|
|
246
|
-
vector_dimension: inferConsistentVectorDimension(embeddingResult.vectors, "Semantic refresh embedding"),
|
|
247
|
-
warnings: embeddingResult.warnings,
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
async function upsertLocatedSemanticVectors(vectorStore, documents, vectors) {
|
|
251
|
-
await executeVectorUpsert(vectorStore, documents.map((entry, index) => ({
|
|
252
|
-
id: entry.id,
|
|
253
|
-
vector: vectors[index],
|
|
254
|
-
payload: buildVectorPayload(entry.document.metadata),
|
|
255
|
-
})));
|
|
256
|
-
return {
|
|
257
|
-
refreshed: documents.map((entry) => entry.id),
|
|
258
|
-
skipped: [],
|
|
259
|
-
warnings: [],
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
async function resetSemanticVectorStore(vectorStore, ledgerEntries) {
|
|
263
|
-
try {
|
|
264
|
-
await executeVectorReset(vectorStore, Object.keys(ledgerEntries));
|
|
265
|
-
return { refreshed: [], skipped: [], warnings: [] };
|
|
266
|
-
}
|
|
267
|
-
catch (error) {
|
|
268
|
-
return {
|
|
269
|
-
refreshed: [],
|
|
270
|
-
skipped: [],
|
|
271
|
-
warnings: [
|
|
272
|
-
`search_semantic_refresh_reset_failed:${toErrorMessage(error)}`,
|
|
273
|
-
],
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
async function pruneMissingSemanticVectors(vectorStore, missingIds) {
|
|
278
|
-
if (missingIds.length === 0) {
|
|
279
|
-
return { refreshed: [], skipped: [], warnings: [] };
|
|
280
|
-
}
|
|
281
|
-
try {
|
|
282
|
-
await executeVectorDelete(vectorStore, missingIds);
|
|
283
|
-
return {
|
|
284
|
-
refreshed: [],
|
|
285
|
-
skipped: [],
|
|
286
|
-
warnings: [],
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
catch (error) {
|
|
290
|
-
return {
|
|
291
|
-
refreshed: [],
|
|
292
|
-
skipped: missingIds,
|
|
293
|
-
warnings: [
|
|
294
|
-
`search_semantic_refresh_delete_failed:${toErrorMessage(error)}`,
|
|
295
|
-
],
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
/** Implements invalidate search cache artifacts for the public runtime surface of this module. */
|
|
300
|
-
export async function invalidateSearchCacheArtifacts(pmRoot) {
|
|
301
|
-
const invalidated = [];
|
|
302
|
-
const warnings = [];
|
|
303
|
-
for (const relativePath of SEARCH_CACHE_ARTIFACT_PATHS) {
|
|
304
|
-
const artifactPath = path.join(pmRoot, relativePath);
|
|
305
|
-
try {
|
|
306
|
-
if (!(await pathExists(artifactPath))) {
|
|
307
|
-
continue;
|
|
308
|
-
}
|
|
309
|
-
await removeFileIfExists(artifactPath);
|
|
310
|
-
invalidated.push(relativePath);
|
|
311
|
-
}
|
|
312
|
-
catch (error) {
|
|
313
|
-
warnings.push(formatInvalidationWarning(relativePath, error));
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
return {
|
|
317
|
-
invalidated,
|
|
318
|
-
warnings,
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
/** Implements refresh semantic embeddings for mutated items for the public runtime surface of this module. */
|
|
322
|
-
export async function refreshSemanticEmbeddingsForMutatedItems(pmRoot, itemIds, options = {}) {
|
|
323
|
-
const normalizedItemIds = toUniqueSorted(itemIds);
|
|
324
|
-
if (normalizedItemIds.length === 0) {
|
|
325
|
-
return {
|
|
326
|
-
refreshed: [],
|
|
327
|
-
skipped: [],
|
|
328
|
-
warnings: [],
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
const runtimeContext = await resolveSemanticRefreshRuntimeContext(pmRoot, normalizedItemIds, options);
|
|
332
|
-
if (!("settings" in runtimeContext)) {
|
|
333
|
-
return runtimeContext;
|
|
334
|
-
}
|
|
335
|
-
const typeRegistry = resolveItemTypeRegistry(runtimeContext.settings, getActiveExtensionRegistrations());
|
|
336
|
-
const workload = await collectSemanticRefreshWorkload(pmRoot, runtimeContext.settings.id_prefix, runtimeContext.settings.item_format, normalizedItemIds, typeRegistry.type_to_folder, runtimeContext.settings.schema);
|
|
337
|
-
const ledgerRead = workload.documents.length > 0 || workload.missingIds.length > 0
|
|
338
|
-
? await readVectorizationStatusLedger(pmRoot)
|
|
339
|
-
: { entries: {}, embedding: null, warnings: [] };
|
|
340
|
-
const embeddingIdentity = buildVectorizationIdentityForProvider(runtimeContext.provider);
|
|
341
|
-
const nextLedgerBaseEntries = ledgerRead.entries;
|
|
342
|
-
let refreshedResult = {
|
|
343
|
-
refreshed: [],
|
|
344
|
-
skipped: [],
|
|
345
|
-
warnings: [],
|
|
346
|
-
};
|
|
347
|
-
let nextEmbeddingMetadata = ledgerRead.embedding;
|
|
348
|
-
if (workload.documents.length > 0) {
|
|
349
|
-
if (ledgerRead.embedding &&
|
|
350
|
-
hasVectorizationEmbeddingIdentityChanged(ledgerRead.embedding, embeddingIdentity)) {
|
|
351
|
-
refreshedResult = {
|
|
352
|
-
refreshed: [],
|
|
353
|
-
skipped: workload.documents.map((entry) => entry.id),
|
|
354
|
-
warnings: [
|
|
355
|
-
"search_semantic_refresh_requires_reindex:embedding_identity_changed",
|
|
356
|
-
],
|
|
357
|
-
};
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
try {
|
|
361
|
-
const embedded = await embedLocatedSemanticVectors(runtimeContext.settings, runtimeContext.provider, workload.documents);
|
|
362
|
-
if (hasVectorizationVectorDimensionChanged(ledgerRead.embedding, embedded.vector_dimension)) {
|
|
363
|
-
refreshedResult = {
|
|
364
|
-
refreshed: [],
|
|
365
|
-
skipped: workload.documents.map((entry) => entry.id),
|
|
366
|
-
warnings: [
|
|
367
|
-
...embedded.warnings,
|
|
368
|
-
"search_semantic_refresh_requires_reindex:vector_dimension_changed",
|
|
369
|
-
],
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
else {
|
|
373
|
-
nextEmbeddingMetadata = buildVectorizationEmbeddingMetadata(embeddingIdentity, embedded.vector_dimension);
|
|
374
|
-
const upserted = await upsertLocatedSemanticVectors(runtimeContext.vectorStore, workload.documents, embedded.vectors);
|
|
375
|
-
refreshedResult = {
|
|
376
|
-
refreshed: upserted.refreshed,
|
|
377
|
-
skipped: upserted.skipped,
|
|
378
|
-
warnings: [...embedded.warnings, ...upserted.warnings],
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
catch (error) {
|
|
383
|
-
refreshedResult = {
|
|
384
|
-
refreshed: [],
|
|
385
|
-
skipped: workload.documents.map((entry) => entry.id),
|
|
386
|
-
warnings: [`search_semantic_refresh_failed:${toErrorMessage(error)}`],
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
const pruneResult = await pruneMissingSemanticVectors(runtimeContext.vectorStore, workload.missingIds);
|
|
392
|
-
const refreshedIdSet = new Set(refreshedResult.refreshed);
|
|
393
|
-
const refreshedEntries = Object.fromEntries(workload.documents
|
|
394
|
-
.filter((entry) => refreshedIdSet.has(entry.id))
|
|
395
|
-
.map((entry) => [entry.id, entry.document.metadata.updated_at]));
|
|
396
|
-
const ledgerWarnings = [];
|
|
397
|
-
if (Object.keys(refreshedEntries).length > 0 ||
|
|
398
|
-
workload.missingIds.length > 0) {
|
|
399
|
-
const nextEntries = {
|
|
400
|
-
...nextLedgerBaseEntries,
|
|
401
|
-
...normalizeVectorizationLedgerEntries(refreshedEntries),
|
|
402
|
-
};
|
|
403
|
-
for (const missingId of workload.missingIds) {
|
|
404
|
-
delete nextEntries[missingId];
|
|
405
|
-
}
|
|
406
|
-
try {
|
|
407
|
-
await writeVectorizationStatusLedger(pmRoot, nextEntries, nextEmbeddingMetadata);
|
|
408
|
-
}
|
|
409
|
-
catch (error) {
|
|
410
|
-
ledgerWarnings.push(`search_vectorization_status_ledger_write_failed:${toErrorMessage(error)}`);
|
|
411
|
-
}
|
|
412
|
-
ledgerWarnings.push(...ledgerRead.warnings);
|
|
413
|
-
}
|
|
414
|
-
return {
|
|
415
|
-
refreshed: toUniqueSorted([
|
|
416
|
-
...refreshedResult.refreshed,
|
|
417
|
-
...pruneResult.refreshed,
|
|
418
|
-
]),
|
|
419
|
-
skipped: toUniqueSorted([
|
|
420
|
-
...workload.skippedIds,
|
|
421
|
-
...refreshedResult.skipped,
|
|
422
|
-
...pruneResult.skipped,
|
|
423
|
-
]),
|
|
424
|
-
warnings: [
|
|
425
|
-
...workload.warnings,
|
|
426
|
-
...refreshedResult.warnings,
|
|
427
|
-
...pruneResult.warnings,
|
|
428
|
-
...ledgerWarnings,
|
|
429
|
-
],
|
|
430
|
-
};
|
|
431
|
-
}
|
|
432
|
-
/** Returns true when a semantic embedding refresh would do real work for these settings (an embedding provider AND a vector store both resolve). Used to decide whether a mutation's refresh is worth dispatching to a background worker — when semantic search is not configured the inline path is already a fast no-op and no child is spawned. */
|
|
433
|
-
export function isSemanticRefreshActive(settings, applyRuntimeDefaults) {
|
|
434
|
-
const effectiveSettings = applyRuntimeDefaults
|
|
435
|
-
? resolveSettingsWithSemanticRuntimeDefaults(settings).settings
|
|
436
|
-
: settings;
|
|
437
|
-
return Boolean(resolveEmbeddingProviders(effectiveSettings).active &&
|
|
438
|
-
resolveVectorStores(effectiveSettings).active);
|
|
439
|
-
}
|
|
440
|
-
/** Implements refresh search artifacts for mutation for the public runtime surface of this module. */
|
|
441
|
-
export async function refreshSearchArtifactsForMutation(pmRoot, itemIds, options = {}) {
|
|
442
|
-
const invalidation = await invalidateSearchCacheArtifacts(pmRoot);
|
|
443
|
-
const normalizedItemIds = toUniqueSorted(itemIds);
|
|
444
|
-
if (normalizedItemIds.length === 0) {
|
|
445
|
-
return {
|
|
446
|
-
invalidated: invalidation.invalidated,
|
|
447
|
-
refreshed: [],
|
|
448
|
-
skipped: [],
|
|
449
|
-
warnings: invalidation.warnings,
|
|
450
|
-
};
|
|
451
|
-
}
|
|
452
|
-
if (!(await pathExists(getSettingsPath(pmRoot)))) {
|
|
453
|
-
const semanticRefresh = await refreshSemanticEmbeddingsForMutatedItems(pmRoot, normalizedItemIds);
|
|
454
|
-
return {
|
|
455
|
-
invalidated: invalidation.invalidated,
|
|
456
|
-
refreshed: semanticRefresh.refreshed,
|
|
457
|
-
skipped: semanticRefresh.skipped,
|
|
458
|
-
warnings: [...invalidation.warnings, ...semanticRefresh.warnings],
|
|
459
|
-
};
|
|
460
|
-
}
|
|
461
|
-
let settings;
|
|
462
|
-
try {
|
|
463
|
-
const settingsRead = await readSettingsWithMetadata(pmRoot);
|
|
464
|
-
const readFailure = settingsRead.warnings.find((warning) => warning.startsWith("settings_read_"));
|
|
465
|
-
if (readFailure) {
|
|
466
|
-
return {
|
|
467
|
-
invalidated: invalidation.invalidated,
|
|
468
|
-
refreshed: [],
|
|
469
|
-
skipped: normalizedItemIds,
|
|
470
|
-
warnings: [
|
|
471
|
-
...invalidation.warnings,
|
|
472
|
-
`search_semantic_refresh_skipped:settings_read_failed:${readFailure}`,
|
|
473
|
-
],
|
|
474
|
-
};
|
|
475
|
-
}
|
|
476
|
-
settings = settingsRead.settings;
|
|
477
|
-
}
|
|
478
|
-
catch (error) {
|
|
479
|
-
return {
|
|
480
|
-
invalidated: invalidation.invalidated,
|
|
481
|
-
refreshed: [],
|
|
482
|
-
skipped: normalizedItemIds,
|
|
483
|
-
warnings: [
|
|
484
|
-
...invalidation.warnings,
|
|
485
|
-
`search_semantic_refresh_skipped:settings_read_failed:${toErrorMessage(error)}`,
|
|
486
|
-
],
|
|
487
|
-
};
|
|
488
|
-
}
|
|
489
|
-
if (settings.search.mutation_refresh_policy === "cache_only") {
|
|
490
|
-
return {
|
|
491
|
-
invalidated: invalidation.invalidated,
|
|
492
|
-
refreshed: [],
|
|
493
|
-
skipped: normalizedItemIds,
|
|
494
|
-
warnings: invalidation.warnings,
|
|
495
|
-
};
|
|
496
|
-
}
|
|
497
|
-
const applyRuntimeDefaults = settings.search.mutation_refresh_policy === "semantic_auto";
|
|
498
|
-
// Keyword cache is already invalidated synchronously above (so keyword search
|
|
499
|
-
// stays immediately correct). When requested, dispatch the slow embedding
|
|
500
|
-
// refresh to a detached worker so the mutation returns instantly; the
|
|
501
|
-
// vector_index_stale health/search warning covers the catch-up window.
|
|
502
|
-
if (options.background &&
|
|
503
|
-
isSemanticRefreshActive(settings, applyRuntimeDefaults)) {
|
|
504
|
-
await scheduleBackgroundSemanticRefresh(pmRoot, normalizedItemIds);
|
|
505
|
-
return {
|
|
506
|
-
invalidated: invalidation.invalidated,
|
|
507
|
-
refreshed: [],
|
|
508
|
-
skipped: [],
|
|
509
|
-
warnings: [
|
|
510
|
-
...invalidation.warnings,
|
|
511
|
-
"search_semantic_refresh_scheduled_background",
|
|
512
|
-
],
|
|
513
|
-
scheduled: true,
|
|
514
|
-
};
|
|
515
|
-
}
|
|
516
|
-
const semanticRefresh = await refreshSemanticEmbeddingsForMutatedItems(pmRoot, normalizedItemIds, {
|
|
517
|
-
settings,
|
|
518
|
-
apply_runtime_defaults: applyRuntimeDefaults,
|
|
519
|
-
});
|
|
520
|
-
return {
|
|
521
|
-
invalidated: invalidation.invalidated,
|
|
522
|
-
refreshed: semanticRefresh.refreshed,
|
|
523
|
-
skipped: semanticRefresh.skipped,
|
|
524
|
-
warnings: [...invalidation.warnings, ...semanticRefresh.warnings],
|
|
525
|
-
};
|
|
526
|
-
}
|
|
527
|
-
/** Public contract for test only, shared by SDK and presentation-layer consumers. */
|
|
528
|
-
export const _testOnly = {
|
|
529
|
-
buildSkippedSemanticRefreshResult,
|
|
530
|
-
buildVectorizationIdentityForProvider,
|
|
531
|
-
normalizeVectorizationLedgerEntries,
|
|
532
|
-
resetSemanticVectorStore,
|
|
533
|
-
};
|
|
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]="b382ab50-682e-5e53-a32d-277c5ccf8bef")}catch(e2){}})();import path from"node:path";import{getActiveExtensionRegistrations}from"../extensions/index.js";import{pathExists,readFileIfExists,removeFileIfExists,writeFileAtomic}from"../fs/fs-utils.js";import{resolveItemTypeRegistry}from"../item/type-registry.js";import{toErrorMessage}from"../shared/primitives.js";import{locateItem,readLocatedItem}from"../store/item-store.js";import{getSettingsPath}from"../store/paths.js";import{readSettingsWithMetadata}from"../store/settings.js";import{executeEmbeddingBatchesWithRetry}from"./embedding-batches.js";import{buildSemanticCorpusInput,resolveSearchCorpusFields,resolveSemanticCorpusCharacterLimit}from"./corpus.js";import{resolveEmbeddingProviders}from"./providers.js";import{resolveSettingsWithSemanticRuntimeDefaults}from"./semantic-defaults.js";import{scheduleBackgroundSemanticRefresh}from"./background-refresh.js";import{executeVectorDelete,executeVectorReset,executeVectorUpsert,resolveVectorStores}from"./vector-stores.js";import{buildVectorizationEmbeddingIdentity,buildVectorizationEmbeddingMetadata,hasVectorizationEmbeddingIdentityChanged,hasVectorizationVectorDimensionChanged,inferConsistentVectorDimension,normalizeVectorizationEmbeddingMetadata}from"./vectorization-metadata.js";import{nowIso}from"../shared/time.js";const SEARCH_CACHE_ARTIFACT_PATHS=["index/manifest.json","search/embeddings.jsonl"];const VECTORIZATION_STATUS_LEDGER_PATH="search/vectorization-status.json";function formatInvalidationWarning(relativePath,error){return`search_cache_invalidation_failed:${relativePath}:${String(error)}`}function toUniqueSorted(values){return[...new Set([...values].map(value=>value.trim()).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right))}function isValidUpdatedAt(value){return typeof value==="string"&&value.trim().length>0&&Number.isFinite(Date.parse(value))}function normalizeVectorizationLedgerEntries(entries){const normalized=new Map;for(const[rawId,rawUpdatedAt]of Object.entries(entries)){const id=rawId.trim();if(id.length===0||!isValidUpdatedAt(rawUpdatedAt)){continue}normalized.set(id,rawUpdatedAt)}return Object.fromEntries([...normalized.entries()].sort((left,right)=>left[0].localeCompare(right[0])))}async function readVectorizationStatusLedger(pmRoot){const ledgerPath=path.join(pmRoot,VECTORIZATION_STATUS_LEDGER_PATH);const raw=await readFileIfExists(ledgerPath);if(raw===null||raw.trim().length===0){return{entries:{},embedding:null,warnings:[]}}let parsed;try{parsed=JSON.parse(raw)}catch{return{entries:{},embedding:null,warnings:["search_vectorization_status_ledger_invalid"]}}if(typeof parsed!=="object"||parsed===null||parsed.version!==1||!Array.isArray(parsed.items)){return{entries:{},embedding:null,warnings:["search_vectorization_status_ledger_invalid"]}}const mapped=new Map;for(const entry of parsed.items){if(typeof entry!=="object"||entry===null){return{entries:{},embedding:null,warnings:["search_vectorization_status_ledger_invalid"]}}const id=entry.id;const updatedAt=entry.updated_at;if(typeof id!=="string"||id.trim().length===0||!isValidUpdatedAt(updatedAt)){return{entries:{},embedding:null,warnings:["search_vectorization_status_ledger_invalid"]}}mapped.set(id.trim(),updatedAt)}let embedding=null;try{embedding=normalizeVectorizationEmbeddingMetadata(parsed.embedding)}catch{return{entries:{},embedding:null,warnings:["search_vectorization_status_ledger_invalid"]}}return{entries:Object.fromEntries([...mapped.entries()].sort((left,right)=>left[0].localeCompare(right[0]))),embedding,warnings:[]}}async function writeVectorizationStatusLedger(pmRoot,entries,embedding){const normalizedEntries=normalizeVectorizationLedgerEntries(entries);const ledgerPath=path.join(pmRoot,VECTORIZATION_STATUS_LEDGER_PATH);const serialized=`${JSON.stringify({version:1,generated_at:nowIso(),...embedding?{embedding}:{},items:Object.entries(normalizedEntries).map(([id,updated_at])=>({id,updated_at}))},null,2)}
|
|
2
|
+
`;await writeFileAtomic(ledgerPath,serialized)}function buildVectorPayload(item){return{id:item.id,type:item.type,status:item.status,priority:item.priority,updated_at:item.updated_at}}function buildVectorizationIdentityForProvider(provider){const identity=buildVectorizationEmbeddingIdentity(provider.name,provider.model);if(!identity){throw new Error("Embedding provider must include a provider name and model")}return identity}function buildSkippedSemanticRefreshResult(itemIds,warning){return{refreshed:[],skipped:itemIds,warnings:[warning]}}async function resolveSemanticRefreshRuntimeContext(pmRoot,normalizedItemIds,options){if(!options.settings&&!await pathExists(getSettingsPath(pmRoot))){return buildSkippedSemanticRefreshResult(normalizedItemIds,"search_semantic_refresh_skipped:settings_not_initialized")}let settings;try{if(options.settings){settings=options.settings}else{const settingsRead=await readSettingsWithMetadata(pmRoot);const readFailure=settingsRead.warnings.find(warning=>warning.startsWith("settings_read_"));if(readFailure){return buildSkippedSemanticRefreshResult(normalizedItemIds,`search_semantic_refresh_skipped:settings_read_failed:${readFailure}`)}settings=settingsRead.settings}}catch(error){return buildSkippedSemanticRefreshResult(normalizedItemIds,`search_semantic_refresh_skipped:settings_read_failed:${toErrorMessage(error)}`)}const effectiveSettings=options.apply_runtime_defaults?resolveSettingsWithSemanticRuntimeDefaults(settings).settings:settings;const provider=resolveEmbeddingProviders(effectiveSettings).active;if(!provider){return buildSkippedSemanticRefreshResult(normalizedItemIds,"search_semantic_refresh_skipped:provider_unconfigured")}const vectorStore=resolveVectorStores(effectiveSettings,pmRoot).active;if(!vectorStore){return buildSkippedSemanticRefreshResult(normalizedItemIds,"search_semantic_refresh_skipped:vector_store_unconfigured")}return{settings:effectiveSettings,provider,vectorStore}}async function collectSemanticRefreshWorkload(pmRoot,idPrefix,preferredFormat,normalizedItemIds,typeToFolder,schema){const warnings=[];const skipped=new Set;const missing=new Set;const documents=[];for(const itemId of normalizedItemIds){const located=await locateItem(pmRoot,itemId,idPrefix,preferredFormat,typeToFolder);if(!located){missing.add(itemId);continue}try{const loaded=await readLocatedItem(located,{schema});documents.push({id:loaded.document.metadata.id,document:loaded.document})}catch(error){skipped.add(located.id);warnings.push(`search_semantic_refresh_item_read_failed:${located.id}:${toErrorMessage(error)}`)}}documents.sort((left,right)=>left.id.localeCompare(right.id));return{documents,missingIds:toUniqueSorted(missing),skippedIds:toUniqueSorted(skipped),warnings}}async function embedLocatedSemanticVectors(settings,provider,documents){const corpusCharacterLimit=resolveSemanticCorpusCharacterLimit(provider.name,settings.search.embedding_corpus_max_characters).maxCharacters;const corpusFields=resolveSearchCorpusFields(settings);const corpusInputs=documents.map(entry=>buildSemanticCorpusInput(entry.document,{providerName:provider.name,maxCharacters:corpusCharacterLimit,fields:corpusFields}));const embeddingResult=await executeEmbeddingBatchesWithRetry(provider,settings,corpusInputs);return{vectors:embeddingResult.vectors,vector_dimension:inferConsistentVectorDimension(embeddingResult.vectors,"Semantic refresh embedding"),warnings:embeddingResult.warnings}}async function upsertLocatedSemanticVectors(vectorStore,documents,vectors){await executeVectorUpsert(vectorStore,documents.map((entry,index)=>({id:entry.id,vector:vectors[index],payload:buildVectorPayload(entry.document.metadata)})));return{refreshed:documents.map(entry=>entry.id),skipped:[],warnings:[]}}async function resetSemanticVectorStore(vectorStore,ledgerEntries){try{await executeVectorReset(vectorStore,Object.keys(ledgerEntries));return{refreshed:[],skipped:[],warnings:[]}}catch(error){return{refreshed:[],skipped:[],warnings:[`search_semantic_refresh_reset_failed:${toErrorMessage(error)}`]}}}async function pruneMissingSemanticVectors(vectorStore,missingIds){if(missingIds.length===0){return{refreshed:[],skipped:[],warnings:[]}}try{await executeVectorDelete(vectorStore,missingIds);return{refreshed:[],skipped:[],warnings:[]}}catch(error){return{refreshed:[],skipped:missingIds,warnings:[`search_semantic_refresh_delete_failed:${toErrorMessage(error)}`]}}}async function invalidateSearchCacheArtifacts(pmRoot){const invalidated=[];const warnings=[];for(const relativePath of SEARCH_CACHE_ARTIFACT_PATHS){const artifactPath=path.join(pmRoot,relativePath);try{if(!await pathExists(artifactPath)){continue}await removeFileIfExists(artifactPath);invalidated.push(relativePath)}catch(error){warnings.push(formatInvalidationWarning(relativePath,error))}}return{invalidated,warnings}}async function refreshSemanticEmbeddingsForMutatedItems(pmRoot,itemIds,options={}){const normalizedItemIds=toUniqueSorted(itemIds);if(normalizedItemIds.length===0){return{refreshed:[],skipped:[],warnings:[]}}const runtimeContext=await resolveSemanticRefreshRuntimeContext(pmRoot,normalizedItemIds,options);if(!("settings"in runtimeContext)){return runtimeContext}const typeRegistry=resolveItemTypeRegistry(runtimeContext.settings,getActiveExtensionRegistrations());const workload=await collectSemanticRefreshWorkload(pmRoot,runtimeContext.settings.id_prefix,runtimeContext.settings.item_format,normalizedItemIds,typeRegistry.type_to_folder,runtimeContext.settings.schema);const ledgerRead=workload.documents.length>0||workload.missingIds.length>0?await readVectorizationStatusLedger(pmRoot):{entries:{},embedding:null,warnings:[]};const embeddingIdentity=buildVectorizationIdentityForProvider(runtimeContext.provider);const nextLedgerBaseEntries=ledgerRead.entries;let refreshedResult={refreshed:[],skipped:[],warnings:[]};let nextEmbeddingMetadata=ledgerRead.embedding;if(workload.documents.length>0){if(ledgerRead.embedding&&hasVectorizationEmbeddingIdentityChanged(ledgerRead.embedding,embeddingIdentity)){refreshedResult={refreshed:[],skipped:workload.documents.map(entry=>entry.id),warnings:["search_semantic_refresh_requires_reindex:embedding_identity_changed"]}}else{try{const embedded=await embedLocatedSemanticVectors(runtimeContext.settings,runtimeContext.provider,workload.documents);if(hasVectorizationVectorDimensionChanged(ledgerRead.embedding,embedded.vector_dimension)){refreshedResult={refreshed:[],skipped:workload.documents.map(entry=>entry.id),warnings:[...embedded.warnings,"search_semantic_refresh_requires_reindex:vector_dimension_changed"]}}else{nextEmbeddingMetadata=buildVectorizationEmbeddingMetadata(embeddingIdentity,embedded.vector_dimension);const upserted=await upsertLocatedSemanticVectors(runtimeContext.vectorStore,workload.documents,embedded.vectors);refreshedResult={refreshed:upserted.refreshed,skipped:upserted.skipped,warnings:[...embedded.warnings,...upserted.warnings]}}}catch(error){refreshedResult={refreshed:[],skipped:workload.documents.map(entry=>entry.id),warnings:[`search_semantic_refresh_failed:${toErrorMessage(error)}`]}}}}const pruneResult=await pruneMissingSemanticVectors(runtimeContext.vectorStore,workload.missingIds);const refreshedIdSet=new Set(refreshedResult.refreshed);const refreshedEntries=Object.fromEntries(workload.documents.filter(entry=>refreshedIdSet.has(entry.id)).map(entry=>[entry.id,entry.document.metadata.updated_at]));const ledgerWarnings=[];if(Object.keys(refreshedEntries).length>0||workload.missingIds.length>0){const nextEntries={...nextLedgerBaseEntries,...normalizeVectorizationLedgerEntries(refreshedEntries)};for(const missingId of workload.missingIds){delete nextEntries[missingId]}try{await writeVectorizationStatusLedger(pmRoot,nextEntries,nextEmbeddingMetadata)}catch(error){ledgerWarnings.push(`search_vectorization_status_ledger_write_failed:${toErrorMessage(error)}`)}ledgerWarnings.push(...ledgerRead.warnings)}return{refreshed:toUniqueSorted([...refreshedResult.refreshed,...pruneResult.refreshed]),skipped:toUniqueSorted([...workload.skippedIds,...refreshedResult.skipped,...pruneResult.skipped]),warnings:[...workload.warnings,...refreshedResult.warnings,...pruneResult.warnings,...ledgerWarnings]}}function isSemanticRefreshActive(settings,applyRuntimeDefaults){const effectiveSettings=applyRuntimeDefaults?resolveSettingsWithSemanticRuntimeDefaults(settings).settings:settings;return Boolean(resolveEmbeddingProviders(effectiveSettings).active&&resolveVectorStores(effectiveSettings).active)}async function refreshSearchArtifactsForMutation(pmRoot,itemIds,options={}){const invalidation=await invalidateSearchCacheArtifacts(pmRoot);const normalizedItemIds=toUniqueSorted(itemIds);if(normalizedItemIds.length===0){return{invalidated:invalidation.invalidated,refreshed:[],skipped:[],warnings:invalidation.warnings}}if(!await pathExists(getSettingsPath(pmRoot))){const semanticRefresh2=await refreshSemanticEmbeddingsForMutatedItems(pmRoot,normalizedItemIds);return{invalidated:invalidation.invalidated,refreshed:semanticRefresh2.refreshed,skipped:semanticRefresh2.skipped,warnings:[...invalidation.warnings,...semanticRefresh2.warnings]}}let settings;try{const settingsRead=await readSettingsWithMetadata(pmRoot);const readFailure=settingsRead.warnings.find(warning=>warning.startsWith("settings_read_"));if(readFailure){return{invalidated:invalidation.invalidated,refreshed:[],skipped:normalizedItemIds,warnings:[...invalidation.warnings,`search_semantic_refresh_skipped:settings_read_failed:${readFailure}`]}}settings=settingsRead.settings}catch(error){return{invalidated:invalidation.invalidated,refreshed:[],skipped:normalizedItemIds,warnings:[...invalidation.warnings,`search_semantic_refresh_skipped:settings_read_failed:${toErrorMessage(error)}`]}}if(settings.search.mutation_refresh_policy==="cache_only"){return{invalidated:invalidation.invalidated,refreshed:[],skipped:normalizedItemIds,warnings:invalidation.warnings}}const applyRuntimeDefaults=settings.search.mutation_refresh_policy==="semantic_auto";if(options.background&&isSemanticRefreshActive(settings,applyRuntimeDefaults)){await scheduleBackgroundSemanticRefresh(pmRoot,normalizedItemIds);return{invalidated:invalidation.invalidated,refreshed:[],skipped:[],warnings:[...invalidation.warnings,"search_semantic_refresh_scheduled_background"],scheduled:true}}const semanticRefresh=await refreshSemanticEmbeddingsForMutatedItems(pmRoot,normalizedItemIds,{settings,apply_runtime_defaults:applyRuntimeDefaults});return{invalidated:invalidation.invalidated,refreshed:semanticRefresh.refreshed,skipped:semanticRefresh.skipped,warnings:[...invalidation.warnings,...semanticRefresh.warnings]}}const _testOnly={buildSkippedSemanticRefreshResult,buildVectorizationIdentityForProvider,normalizeVectorizationLedgerEntries,resetSemanticVectorStore};export{SEARCH_CACHE_ARTIFACT_PATHS,VECTORIZATION_STATUS_LEDGER_PATH,_testOnly,invalidateSearchCacheArtifacts,isSemanticRefreshActive,readVectorizationStatusLedger,refreshSearchArtifactsForMutation,refreshSemanticEmbeddingsForMutatedItems,writeVectorizationStatusLedger};
|
|
534
3
|
//# sourceMappingURL=cache.js.map
|
|
535
|
-
//# debugId=7939a590-3662-5c66-99aa-3835a0dbaecc
|