@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,475 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="24898402-1568-5b05-9072-f89dd91f25a6")}catch(e){}}();
|
|
3
|
-
import { hierarchyParentEndpoint, orderingPredecessorEndpoint, } from "./traversal.js";
|
|
4
|
-
/** Default label-propagation sweeps before reporting non-convergence. */
|
|
5
|
-
const DEFAULT_MAX_ITERATIONS = 16;
|
|
6
|
-
/** Default minimum member count for a reported community. */
|
|
7
|
-
const DEFAULT_MIN_COMMUNITY_SIZE = 2;
|
|
8
|
-
/** Default witness-path depth searched per candidate redundant edge. */
|
|
9
|
-
const DEFAULT_REDUNDANCY_MAX_DEPTH = 8;
|
|
10
|
-
/** Require a positive integer for one analytics bound. */
|
|
11
|
-
function assertPositiveBound(name, value) {
|
|
12
|
-
if (!Number.isInteger(value) || value < 1)
|
|
13
|
-
throw new TypeError(`Invalid ${name} bound: ${String(value)}`);
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Invoke `visit` once per canonical-kind-matched edge, skipping self-loops.
|
|
17
|
-
* Kind filters resolve to canonical spelling and match either the requested
|
|
18
|
-
* kind or its inverse so directed families are selected by either spelling. The
|
|
19
|
-
* resolved definition is passed alongside the edge so callers can distinguish
|
|
20
|
-
* directed and undirected families. This is the single edge-selection primitive
|
|
21
|
-
* shared by community, centrality, cut-structure, and degree builders.
|
|
22
|
-
*/
|
|
23
|
-
export function forEachMatchedRelationshipEdge(graph, kinds, visit) {
|
|
24
|
-
const registry = graph.registry();
|
|
25
|
-
const wanted = kinds === undefined
|
|
26
|
-
? undefined
|
|
27
|
-
: new Set(kinds.map((kind) => registry.require(kind).kind));
|
|
28
|
-
for (const edge of graph.edges()) {
|
|
29
|
-
if (edge.source === edge.target)
|
|
30
|
-
continue;
|
|
31
|
-
const definition = registry.require(edge.kind);
|
|
32
|
-
if (wanted !== undefined &&
|
|
33
|
-
!(wanted.has(definition.kind) ||
|
|
34
|
-
(definition.inverse !== undefined && wanted.has(definition.inverse))))
|
|
35
|
-
continue;
|
|
36
|
-
visit(edge, definition);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/** Build the deterministic undirected multiset adjacency restricted to canonicalized kinds. */
|
|
40
|
-
function buildUndirectedAdjacency(graph, kinds) {
|
|
41
|
-
const adjacency = new Map();
|
|
42
|
-
forEachMatchedRelationshipEdge(graph, kinds, (edge) => {
|
|
43
|
-
appendAdjacency(adjacency, edge.source, edge.target);
|
|
44
|
-
appendAdjacency(adjacency, edge.target, edge.source);
|
|
45
|
-
});
|
|
46
|
-
for (const neighbors of adjacency.values())
|
|
47
|
-
neighbors.sort();
|
|
48
|
-
return adjacency;
|
|
49
|
-
}
|
|
50
|
-
/** Append one neighbor to a node's adjacency list, creating the list on demand. */
|
|
51
|
-
function appendAdjacency(adjacency, from, to) {
|
|
52
|
-
const neighbors = adjacency.get(from);
|
|
53
|
-
if (neighbors === undefined)
|
|
54
|
-
adjacency.set(from, [to]);
|
|
55
|
-
else
|
|
56
|
-
neighbors.push(to);
|
|
57
|
-
}
|
|
58
|
-
/** Adopt the most frequent neighbor label with lexicographic tie-breaking. */
|
|
59
|
-
function dominantNeighborLabel(neighbors, labels) {
|
|
60
|
-
const counts = new Map();
|
|
61
|
-
for (const neighbor of neighbors) {
|
|
62
|
-
const label = labels.get(neighbor);
|
|
63
|
-
counts.set(label, (counts.get(label) ?? 0) + 1);
|
|
64
|
-
}
|
|
65
|
-
let best;
|
|
66
|
-
let bestCount = 0;
|
|
67
|
-
for (const [label, count] of counts) {
|
|
68
|
-
if (count > bestCount || (count === bestCount && label < best)) {
|
|
69
|
-
best = label;
|
|
70
|
-
bestCount = count;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return best;
|
|
74
|
-
}
|
|
75
|
-
/** Group stabilized labels into sorted communities meeting the size floor. */
|
|
76
|
-
function collectCommunities(labels, minSize) {
|
|
77
|
-
const groups = new Map();
|
|
78
|
-
for (const [id, label] of labels) {
|
|
79
|
-
const members = groups.get(label);
|
|
80
|
-
if (members === undefined)
|
|
81
|
-
groups.set(label, [id]);
|
|
82
|
-
else
|
|
83
|
-
members.push(id);
|
|
84
|
-
}
|
|
85
|
-
const communities = [];
|
|
86
|
-
for (const members of groups.values()) {
|
|
87
|
-
if (members.length < minSize)
|
|
88
|
-
continue;
|
|
89
|
-
members.sort();
|
|
90
|
-
communities.push({
|
|
91
|
-
representative: members[0],
|
|
92
|
-
size: members.length,
|
|
93
|
-
members,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
return communities.sort((left, right) => right.size - left.size ||
|
|
97
|
-
left.representative.localeCompare(right.representative));
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Detect communities with deterministic asynchronous label propagation: nodes
|
|
101
|
-
* are swept in sorted order, each adopting the most frequent label among its
|
|
102
|
-
* neighbors with lexicographic tie-breaking, until labels stabilize or the
|
|
103
|
-
* iteration bound stops the sweep. Adjacency is undirected — every
|
|
104
|
-
* participating edge connects both endpoints symmetrically and parallel edges
|
|
105
|
-
* weight their neighbor. `meta.truncated` reports non-convergence.
|
|
106
|
-
*/
|
|
107
|
-
export function detectRelationshipCommunities(graph, options = {}) {
|
|
108
|
-
const maxIterations = options.maxIterations ?? DEFAULT_MAX_ITERATIONS;
|
|
109
|
-
const minSize = options.minSize ?? DEFAULT_MIN_COMMUNITY_SIZE;
|
|
110
|
-
assertPositiveBound("maxIterations", maxIterations);
|
|
111
|
-
assertPositiveBound("minSize", minSize);
|
|
112
|
-
const adjacency = buildUndirectedAdjacency(graph, options.kinds);
|
|
113
|
-
const nodes = graph.nodes();
|
|
114
|
-
const labels = new Map(nodes.map((id) => [id, id]));
|
|
115
|
-
let iterations = 0;
|
|
116
|
-
let converged = false;
|
|
117
|
-
let visitedNodes = 0;
|
|
118
|
-
let inspectedEdges = 0;
|
|
119
|
-
while (iterations < maxIterations && !converged) {
|
|
120
|
-
options.signal?.throwIfAborted();
|
|
121
|
-
iterations += 1;
|
|
122
|
-
converged = true;
|
|
123
|
-
for (const id of nodes) {
|
|
124
|
-
visitedNodes += 1;
|
|
125
|
-
const neighbors = adjacency.get(id);
|
|
126
|
-
if (neighbors === undefined)
|
|
127
|
-
continue;
|
|
128
|
-
inspectedEdges += neighbors.length;
|
|
129
|
-
const dominant = dominantNeighborLabel(neighbors, labels);
|
|
130
|
-
if (dominant !== labels.get(id)) {
|
|
131
|
-
labels.set(id, dominant);
|
|
132
|
-
converged = false;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
value: {
|
|
138
|
-
communities: collectCommunities(labels, minSize),
|
|
139
|
-
iterations,
|
|
140
|
-
converged,
|
|
141
|
-
},
|
|
142
|
-
meta: { visitedNodes, inspectedEdges, truncated: !converged },
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
/** Decide whether a kind carries transitive semantics eligible for redundancy and duplicate analysis. */
|
|
146
|
-
export function isTransitiveKind(definition) {
|
|
147
|
-
return (definition.direction === "directed" &&
|
|
148
|
-
(definition.ordering || definition.hierarchy));
|
|
149
|
-
}
|
|
150
|
-
/** Family grouping key joining a directed kind with its inverse spelling. */
|
|
151
|
-
export function transitiveFamilyKey(definition) {
|
|
152
|
-
return definition.inverse !== undefined &&
|
|
153
|
-
definition.inverse < definition.kind
|
|
154
|
-
? definition.inverse
|
|
155
|
-
: definition.kind;
|
|
156
|
-
}
|
|
157
|
-
/** Orient one transitive edge into its semantic forward direction. */
|
|
158
|
-
export function orientTransitiveEdge(edge, definition) {
|
|
159
|
-
// Hierarchy families flow child -> parent; ordering families flow
|
|
160
|
-
// predecessor -> successor, so inverse spellings land in one relation.
|
|
161
|
-
const head = definition.hierarchy
|
|
162
|
-
? hierarchyParentEndpoint(edge, definition)
|
|
163
|
-
: edge.source === orderingPredecessorEndpoint(edge, definition)
|
|
164
|
-
? edge.target
|
|
165
|
-
: edge.source;
|
|
166
|
-
return head === edge.target
|
|
167
|
-
? { from: edge.source, to: edge.target }
|
|
168
|
-
: { from: edge.target, to: edge.source };
|
|
169
|
-
}
|
|
170
|
-
/** Resolve explicit redundancy kind filters into their family keys. */
|
|
171
|
-
function resolveRedundancyFamilies(graph, kinds) {
|
|
172
|
-
if (kinds === undefined)
|
|
173
|
-
return undefined;
|
|
174
|
-
const registry = graph.registry();
|
|
175
|
-
const families = new Set();
|
|
176
|
-
for (const kind of kinds) {
|
|
177
|
-
const definition = registry.require(kind);
|
|
178
|
-
if (!isTransitiveKind(definition))
|
|
179
|
-
throw new TypeError(`Relationship kind ${definition.kind} is not a directed ordering or hierarchy kind`);
|
|
180
|
-
families.add(transitiveFamilyKey(definition));
|
|
181
|
-
}
|
|
182
|
-
return families;
|
|
183
|
-
}
|
|
184
|
-
/** Group eligible stored edges into oriented per-family scan structures. */
|
|
185
|
-
function collectTransitiveFamilies(graph, wanted) {
|
|
186
|
-
const registry = graph.registry();
|
|
187
|
-
const families = new Map();
|
|
188
|
-
for (const edge of graph.edges()) {
|
|
189
|
-
const definition = registry.require(edge.kind);
|
|
190
|
-
if (!isTransitiveKind(definition))
|
|
191
|
-
continue;
|
|
192
|
-
const key = transitiveFamilyKey(definition);
|
|
193
|
-
if (wanted !== undefined && !wanted.has(key))
|
|
194
|
-
continue;
|
|
195
|
-
const oriented = orientTransitiveEdge(edge, definition);
|
|
196
|
-
if (oriented.from === oriented.to)
|
|
197
|
-
continue;
|
|
198
|
-
let family = families.get(key);
|
|
199
|
-
if (family === undefined) {
|
|
200
|
-
family = { adjacency: new Map(), records: [] };
|
|
201
|
-
families.set(key, family);
|
|
202
|
-
}
|
|
203
|
-
const targets = family.adjacency.get(oriented.from);
|
|
204
|
-
if (targets === undefined)
|
|
205
|
-
family.adjacency.set(oriented.from, new Set([oriented.to]));
|
|
206
|
-
else
|
|
207
|
-
targets.add(oriented.to);
|
|
208
|
-
family.records.push({ ...oriented, edge });
|
|
209
|
-
}
|
|
210
|
-
return families;
|
|
211
|
-
}
|
|
212
|
-
/** Freeze one family's adjacency sets into deterministic sorted lists. */
|
|
213
|
-
function sortedFamilyAdjacency(family) {
|
|
214
|
-
const sorted = new Map();
|
|
215
|
-
for (const [from, targets] of family.adjacency)
|
|
216
|
-
sorted.set(from, [...targets].sort());
|
|
217
|
-
return sorted;
|
|
218
|
-
}
|
|
219
|
-
/** Rebuild the witness node path from breadth-first parent pointers. */
|
|
220
|
-
function reconstructWitness(parents, from, tail, head) {
|
|
221
|
-
const witness = [head];
|
|
222
|
-
for (let node = tail; node !== from; node = parents.get(node))
|
|
223
|
-
witness.push(node);
|
|
224
|
-
witness.push(from);
|
|
225
|
-
return witness.reverse();
|
|
226
|
-
}
|
|
227
|
-
/** Expand one witness frontier node; return the completed witness when the head is reached. */
|
|
228
|
-
function expandWitnessFrontier(adjacency, record, current, parents, queue, cost) {
|
|
229
|
-
for (const next of adjacency.get(current.id) ?? []) {
|
|
230
|
-
cost.inspectedEdges += 1;
|
|
231
|
-
// Skip the direct edge under test; deeper hops may still reach the head.
|
|
232
|
-
if (current.depth === 0 && next === record.to)
|
|
233
|
-
continue;
|
|
234
|
-
if (parents.has(next))
|
|
235
|
-
continue;
|
|
236
|
-
parents.set(next, current.id);
|
|
237
|
-
if (next === record.to)
|
|
238
|
-
return reconstructWitness(parents, record.from, current.id, next);
|
|
239
|
-
queue.push({ id: next, depth: current.depth + 1 });
|
|
240
|
-
}
|
|
241
|
-
return undefined;
|
|
242
|
-
}
|
|
243
|
-
/** Search one bounded same-family witness path that implies a direct edge. */
|
|
244
|
-
function findWitnessPath(adjacency, record, maxDepth, cost) {
|
|
245
|
-
const parents = new Map([[record.from, record.from]]);
|
|
246
|
-
const queue = [{ id: record.from, depth: 0 }];
|
|
247
|
-
for (let index = 0; index < queue.length; index += 1) {
|
|
248
|
-
const current = queue[index];
|
|
249
|
-
cost.visitedNodes += 1;
|
|
250
|
-
if (current.depth >= maxDepth)
|
|
251
|
-
continue;
|
|
252
|
-
const witness = expandWitnessFrontier(adjacency, record, current, parents, queue, cost);
|
|
253
|
-
if (witness !== undefined)
|
|
254
|
-
return witness;
|
|
255
|
-
}
|
|
256
|
-
return undefined;
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Find stored edges implied by a longer path of the same semantic family —
|
|
260
|
-
* the transitive-reduction view of ordering and hierarchy relations. Each
|
|
261
|
-
* family joins a directed kind with its inverse spelling in semantic
|
|
262
|
-
* orientation, so `blocked_by` and `blocks` witness each other. The witness
|
|
263
|
-
* search is breadth-first, shortest and lexicographic first, bounded by
|
|
264
|
-
* `maxDepth` per edge; `meta.truncated` reports only the `limit` bound.
|
|
265
|
-
*/
|
|
266
|
-
export function findRedundantRelationshipEdges(graph, options = {}) {
|
|
267
|
-
const maxDepth = options.maxDepth ?? DEFAULT_REDUNDANCY_MAX_DEPTH;
|
|
268
|
-
assertPositiveBound("maxDepth", maxDepth);
|
|
269
|
-
if (options.limit !== undefined)
|
|
270
|
-
assertPositiveBound("limit", options.limit);
|
|
271
|
-
const limit = options.limit ?? Number.POSITIVE_INFINITY;
|
|
272
|
-
const wanted = resolveRedundancyFamilies(graph, options.kinds);
|
|
273
|
-
const families = collectTransitiveFamilies(graph, wanted);
|
|
274
|
-
const value = [];
|
|
275
|
-
const cost = { visitedNodes: 0, inspectedEdges: 0 };
|
|
276
|
-
let truncated = false;
|
|
277
|
-
scan: for (const key of [...families.keys()].sort()) {
|
|
278
|
-
const family = families.get(key);
|
|
279
|
-
const adjacency = sortedFamilyAdjacency(family);
|
|
280
|
-
for (const record of family.records) {
|
|
281
|
-
options.signal?.throwIfAborted();
|
|
282
|
-
const witness = findWitnessPath(adjacency, record, maxDepth, cost);
|
|
283
|
-
if (witness === undefined)
|
|
284
|
-
continue;
|
|
285
|
-
if (value.length >= limit) {
|
|
286
|
-
truncated = true;
|
|
287
|
-
break scan;
|
|
288
|
-
}
|
|
289
|
-
value.push({ edge: record.edge, witness });
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
return {
|
|
293
|
-
value,
|
|
294
|
-
meta: {
|
|
295
|
-
visitedNodes: cost.visitedNodes,
|
|
296
|
-
inspectedEdges: cost.inspectedEdges,
|
|
297
|
-
truncated,
|
|
298
|
-
},
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
/** Expand one node's neighbor rows into successors, predecessors, and frontier work. */
|
|
302
|
-
function expandReachableNode(id, depth, rows, maxDepth, state) {
|
|
303
|
-
const nextSet = new Set();
|
|
304
|
-
const nexts = [];
|
|
305
|
-
for (const row of rows) {
|
|
306
|
-
if (row.id === id || nextSet.has(row.id))
|
|
307
|
-
continue;
|
|
308
|
-
if (!state.seen.has(row.id)) {
|
|
309
|
-
// A depth-boundary node keeps its edges to already-indexed nodes but
|
|
310
|
-
// may not discover new ones; excluded discoveries mark truncation.
|
|
311
|
-
if (depth >= maxDepth) {
|
|
312
|
-
state.truncated = true;
|
|
313
|
-
continue;
|
|
314
|
-
}
|
|
315
|
-
state.seen.add(row.id);
|
|
316
|
-
state.queue.push({ id: row.id, depth: depth + 1 });
|
|
317
|
-
}
|
|
318
|
-
nextSet.add(row.id);
|
|
319
|
-
nexts.push(row.id);
|
|
320
|
-
let incoming = state.predecessors.get(row.id);
|
|
321
|
-
if (incoming === undefined) {
|
|
322
|
-
incoming = new Set();
|
|
323
|
-
state.predecessors.set(row.id, incoming);
|
|
324
|
-
}
|
|
325
|
-
incoming.add(id);
|
|
326
|
-
}
|
|
327
|
-
return nexts;
|
|
328
|
-
}
|
|
329
|
-
/** Index the bounded reachable subgraph used by dominator analysis. */
|
|
330
|
-
function indexReachableSubgraph(graph, root, options) {
|
|
331
|
-
const direction = options.direction ?? "outgoing";
|
|
332
|
-
const maxDepth = options.maxDepth ?? Number.POSITIVE_INFINITY;
|
|
333
|
-
const order = [];
|
|
334
|
-
const successors = new Map();
|
|
335
|
-
const state = {
|
|
336
|
-
seen: new Set([root]),
|
|
337
|
-
queue: [{ id: root, depth: 0 }],
|
|
338
|
-
predecessors: new Map(),
|
|
339
|
-
truncated: false,
|
|
340
|
-
};
|
|
341
|
-
let inspectedEdges = 0;
|
|
342
|
-
for (let index = 0; index < state.queue.length; index += 1) {
|
|
343
|
-
options.signal?.throwIfAborted();
|
|
344
|
-
const { id, depth } = state.queue[index];
|
|
345
|
-
order.push(id);
|
|
346
|
-
const rows = graph.neighborEdges(id, {
|
|
347
|
-
direction,
|
|
348
|
-
...(options.kinds === undefined ? {} : { kinds: options.kinds }),
|
|
349
|
-
});
|
|
350
|
-
inspectedEdges += rows.meta.inspectedEdges;
|
|
351
|
-
successors.set(id, expandReachableNode(id, depth, rows.value, maxDepth, state));
|
|
352
|
-
}
|
|
353
|
-
return {
|
|
354
|
-
order,
|
|
355
|
-
successors,
|
|
356
|
-
predecessors: state.predecessors,
|
|
357
|
-
inspectedEdges,
|
|
358
|
-
truncated: state.truncated,
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
/** Compute the deterministic reverse postorder of one reachable subgraph. */
|
|
362
|
-
function reversePostorder(subgraph, root) {
|
|
363
|
-
const postorder = [];
|
|
364
|
-
const visited = new Set([root]);
|
|
365
|
-
const stack = [{ id: root, index: 0 }];
|
|
366
|
-
while (stack.length > 0) {
|
|
367
|
-
const frame = stack.at(-1);
|
|
368
|
-
const nexts = subgraph.successors.get(frame.id);
|
|
369
|
-
if (frame.index < nexts.length) {
|
|
370
|
-
const next = nexts[frame.index];
|
|
371
|
-
frame.index += 1;
|
|
372
|
-
if (!visited.has(next)) {
|
|
373
|
-
visited.add(next);
|
|
374
|
-
stack.push({ id: next, index: 0 });
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
else {
|
|
378
|
-
postorder.push(frame.id);
|
|
379
|
-
stack.pop();
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
return postorder.reverse();
|
|
383
|
-
}
|
|
384
|
-
/** Walk two dominator-tree fingers to their common ancestor by reverse-postorder number. */
|
|
385
|
-
function intersectDominators(left, right, idom, ordinal) {
|
|
386
|
-
let first = left;
|
|
387
|
-
let second = right;
|
|
388
|
-
while (first !== second) {
|
|
389
|
-
while (ordinal.get(first) > ordinal.get(second))
|
|
390
|
-
first = idom.get(first);
|
|
391
|
-
while (ordinal.get(second) > ordinal.get(first))
|
|
392
|
-
second = idom.get(second);
|
|
393
|
-
}
|
|
394
|
-
return first;
|
|
395
|
-
}
|
|
396
|
-
/** Fold one node's processed predecessors into its dominator candidate. */
|
|
397
|
-
function dominatorCandidate(predecessors, idom, ordinal) {
|
|
398
|
-
let candidate;
|
|
399
|
-
for (const pred of [...predecessors].sort()) {
|
|
400
|
-
if (!idom.has(pred))
|
|
401
|
-
continue;
|
|
402
|
-
candidate =
|
|
403
|
-
candidate === undefined
|
|
404
|
-
? pred
|
|
405
|
-
: intersectDominators(candidate, pred, idom, ordinal);
|
|
406
|
-
}
|
|
407
|
-
return candidate;
|
|
408
|
-
}
|
|
409
|
-
/** Run the Cooper–Harvey–Kennedy fixed-point over one reverse postorder. */
|
|
410
|
-
function solveImmediateDominators(subgraph, root, order, ordinal, signal) {
|
|
411
|
-
const idom = new Map([[root, root]]);
|
|
412
|
-
let changed = true;
|
|
413
|
-
while (changed) {
|
|
414
|
-
changed = false;
|
|
415
|
-
for (const id of order) {
|
|
416
|
-
signal?.throwIfAborted();
|
|
417
|
-
if (id === root)
|
|
418
|
-
continue;
|
|
419
|
-
// Every non-root node in the order was discovered through at least one
|
|
420
|
-
// predecessor, so the set is always present.
|
|
421
|
-
const candidate = dominatorCandidate(subgraph.predecessors.get(id), idom, ordinal);
|
|
422
|
-
if (candidate !== undefined && idom.get(id) !== candidate) {
|
|
423
|
-
idom.set(id, candidate);
|
|
424
|
-
changed = true;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
return idom;
|
|
429
|
-
}
|
|
430
|
-
/**
|
|
431
|
-
* Compute immediate dominators and gating weights over one node's reachable
|
|
432
|
-
* subgraph using the Cooper–Harvey–Kennedy fixed-point. A node dominates the
|
|
433
|
-
* work that every path from the root must pass through it to reach, so rows
|
|
434
|
-
* with a positive `dominatedCount` are the structural bottlenecks of the
|
|
435
|
-
* root's blast radius. Rows sort by gating weight, then id; `meta.truncated`
|
|
436
|
-
* reports when the `maxDepth` bound excluded reachable nodes.
|
|
437
|
-
*/
|
|
438
|
-
export function computeRelationshipDominators(graph, root, options = {}) {
|
|
439
|
-
if (!graph.hasNode(root))
|
|
440
|
-
throw new TypeError(`Relationship node not found: ${root}`);
|
|
441
|
-
if (options.maxDepth !== undefined &&
|
|
442
|
-
(!Number.isInteger(options.maxDepth) || options.maxDepth < 0))
|
|
443
|
-
throw new TypeError(`Invalid maxDepth bound: ${String(options.maxDepth)}`);
|
|
444
|
-
const subgraph = indexReachableSubgraph(graph, root, options);
|
|
445
|
-
const order = reversePostorder(subgraph, root);
|
|
446
|
-
const ordinal = new Map(order.map((id, index) => [id, index]));
|
|
447
|
-
const idom = solveImmediateDominators(subgraph, root, order, ordinal, options.signal);
|
|
448
|
-
const subtreeSizes = new Map(order.map((id) => [id, 1]));
|
|
449
|
-
for (let index = order.length - 1; index >= 0; index -= 1) {
|
|
450
|
-
const id = order[index];
|
|
451
|
-
if (id === root)
|
|
452
|
-
continue;
|
|
453
|
-
const parent = idom.get(id);
|
|
454
|
-
subtreeSizes.set(parent, subtreeSizes.get(parent) + subtreeSizes.get(id));
|
|
455
|
-
}
|
|
456
|
-
const rows = order
|
|
457
|
-
.filter((id) => id !== root)
|
|
458
|
-
.map((id) => ({
|
|
459
|
-
id,
|
|
460
|
-
idom: idom.get(id),
|
|
461
|
-
dominatedCount: subtreeSizes.get(id) - 1,
|
|
462
|
-
}))
|
|
463
|
-
.sort((left, right) => right.dominatedCount - left.dominatedCount ||
|
|
464
|
-
left.id.localeCompare(right.id));
|
|
465
|
-
return {
|
|
466
|
-
value: { root, reachableCount: subgraph.order.length, rows },
|
|
467
|
-
meta: {
|
|
468
|
-
visitedNodes: subgraph.order.length,
|
|
469
|
-
inspectedEdges: subgraph.inspectedEdges,
|
|
470
|
-
truncated: subgraph.truncated,
|
|
471
|
-
},
|
|
472
|
-
};
|
|
473
|
-
}
|
|
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]="2ea07760-bca8-579d-9b3a-78051461485a")}catch(e2){}})();import{hierarchyParentEndpoint,orderingPredecessorEndpoint}from"./traversal.js";const DEFAULT_MAX_ITERATIONS=16;const DEFAULT_MIN_COMMUNITY_SIZE=2;const DEFAULT_REDUNDANCY_MAX_DEPTH=8;function assertPositiveBound(name,value){if(!Number.isInteger(value)||value<1)throw new TypeError(`Invalid ${name} bound: ${String(value)}`)}function forEachMatchedRelationshipEdge(graph,kinds,visit){const registry=graph.registry();const wanted=kinds===void 0?void 0:new Set(kinds.map(kind=>registry.require(kind).kind));for(const edge of graph.edges()){if(edge.source===edge.target)continue;const definition=registry.require(edge.kind);if(wanted!==void 0&&!(wanted.has(definition.kind)||definition.inverse!==void 0&&wanted.has(definition.inverse)))continue;visit(edge,definition)}}function buildUndirectedAdjacency(graph,kinds){const adjacency=new Map;forEachMatchedRelationshipEdge(graph,kinds,edge=>{appendAdjacency(adjacency,edge.source,edge.target);appendAdjacency(adjacency,edge.target,edge.source)});for(const neighbors of adjacency.values())neighbors.sort();return adjacency}function appendAdjacency(adjacency,from,to){const neighbors=adjacency.get(from);if(neighbors===void 0)adjacency.set(from,[to]);else neighbors.push(to)}function dominantNeighborLabel(neighbors,labels){const counts=new Map;for(const neighbor of neighbors){const label=labels.get(neighbor);counts.set(label,(counts.get(label)??0)+1)}let best;let bestCount=0;for(const[label,count]of counts){if(count>bestCount||count===bestCount&&label<best){best=label;bestCount=count}}return best}function collectCommunities(labels,minSize){const groups=new Map;for(const[id,label]of labels){const members=groups.get(label);if(members===void 0)groups.set(label,[id]);else members.push(id)}const communities=[];for(const members of groups.values()){if(members.length<minSize)continue;members.sort();communities.push({representative:members[0],size:members.length,members})}return communities.sort((left,right)=>right.size-left.size||left.representative.localeCompare(right.representative))}function detectRelationshipCommunities(graph,options={}){const maxIterations=options.maxIterations??DEFAULT_MAX_ITERATIONS;const minSize=options.minSize??DEFAULT_MIN_COMMUNITY_SIZE;assertPositiveBound("maxIterations",maxIterations);assertPositiveBound("minSize",minSize);const adjacency=buildUndirectedAdjacency(graph,options.kinds);const nodes=graph.nodes();const labels=new Map(nodes.map(id=>[id,id]));let iterations=0;let converged=false;let visitedNodes=0;let inspectedEdges=0;while(iterations<maxIterations&&!converged){options.signal?.throwIfAborted();iterations+=1;converged=true;for(const id of nodes){visitedNodes+=1;const neighbors=adjacency.get(id);if(neighbors===void 0)continue;inspectedEdges+=neighbors.length;const dominant=dominantNeighborLabel(neighbors,labels);if(dominant!==labels.get(id)){labels.set(id,dominant);converged=false}}}return{value:{communities:collectCommunities(labels,minSize),iterations,converged},meta:{visitedNodes,inspectedEdges,truncated:!converged}}}function isTransitiveKind(definition){return definition.direction==="directed"&&(definition.ordering||definition.hierarchy)}function transitiveFamilyKey(definition){return definition.inverse!==void 0&&definition.inverse<definition.kind?definition.inverse:definition.kind}function orientTransitiveEdge(edge,definition){const head=definition.hierarchy?hierarchyParentEndpoint(edge,definition):edge.source===orderingPredecessorEndpoint(edge,definition)?edge.target:edge.source;return head===edge.target?{from:edge.source,to:edge.target}:{from:edge.target,to:edge.source}}function resolveRedundancyFamilies(graph,kinds){if(kinds===void 0)return void 0;const registry=graph.registry();const families=new Set;for(const kind of kinds){const definition=registry.require(kind);if(!isTransitiveKind(definition))throw new TypeError(`Relationship kind ${definition.kind} is not a directed ordering or hierarchy kind`);families.add(transitiveFamilyKey(definition))}return families}function collectTransitiveFamilies(graph,wanted){const registry=graph.registry();const families=new Map;for(const edge of graph.edges()){const definition=registry.require(edge.kind);if(!isTransitiveKind(definition))continue;const key=transitiveFamilyKey(definition);if(wanted!==void 0&&!wanted.has(key))continue;const oriented=orientTransitiveEdge(edge,definition);if(oriented.from===oriented.to)continue;let family=families.get(key);if(family===void 0){family={adjacency:new Map,records:[]};families.set(key,family)}const targets=family.adjacency.get(oriented.from);if(targets===void 0)family.adjacency.set(oriented.from,new Set([oriented.to]));else targets.add(oriented.to);family.records.push({...oriented,edge})}return families}function sortedFamilyAdjacency(family){const sorted=new Map;for(const[from,targets]of family.adjacency)sorted.set(from,[...targets].sort());return sorted}function reconstructWitness(parents,from,tail,head){const witness=[head];for(let node=tail;node!==from;node=parents.get(node))witness.push(node);witness.push(from);return witness.reverse()}function expandWitnessFrontier(adjacency,record,current,parents,queue,cost){for(const next of adjacency.get(current.id)??[]){cost.inspectedEdges+=1;if(current.depth===0&&next===record.to)continue;if(parents.has(next))continue;parents.set(next,current.id);if(next===record.to)return reconstructWitness(parents,record.from,current.id,next);queue.push({id:next,depth:current.depth+1})}return void 0}function findWitnessPath(adjacency,record,maxDepth,cost){const parents=new Map([[record.from,record.from]]);const queue=[{id:record.from,depth:0}];for(let index=0;index<queue.length;index+=1){const current=queue[index];cost.visitedNodes+=1;if(current.depth>=maxDepth)continue;const witness=expandWitnessFrontier(adjacency,record,current,parents,queue,cost);if(witness!==void 0)return witness}return void 0}function findRedundantRelationshipEdges(graph,options={}){const maxDepth=options.maxDepth??DEFAULT_REDUNDANCY_MAX_DEPTH;assertPositiveBound("maxDepth",maxDepth);if(options.limit!==void 0)assertPositiveBound("limit",options.limit);const limit=options.limit??Number.POSITIVE_INFINITY;const wanted=resolveRedundancyFamilies(graph,options.kinds);const families=collectTransitiveFamilies(graph,wanted);const value=[];const cost={visitedNodes:0,inspectedEdges:0};let truncated=false;scan:for(const key of[...families.keys()].sort()){const family=families.get(key);const adjacency=sortedFamilyAdjacency(family);for(const record of family.records){options.signal?.throwIfAborted();const witness=findWitnessPath(adjacency,record,maxDepth,cost);if(witness===void 0)continue;if(value.length>=limit){truncated=true;break scan}value.push({edge:record.edge,witness})}}return{value,meta:{visitedNodes:cost.visitedNodes,inspectedEdges:cost.inspectedEdges,truncated}}}function expandReachableNode(id,depth,rows,maxDepth,state){const nextSet=new Set;const nexts=[];for(const row of rows){if(row.id===id||nextSet.has(row.id))continue;if(!state.seen.has(row.id)){if(depth>=maxDepth){state.truncated=true;continue}state.seen.add(row.id);state.queue.push({id:row.id,depth:depth+1})}nextSet.add(row.id);nexts.push(row.id);let incoming=state.predecessors.get(row.id);if(incoming===void 0){incoming=new Set;state.predecessors.set(row.id,incoming)}incoming.add(id)}return nexts}function indexReachableSubgraph(graph,root,options){const direction=options.direction??"outgoing";const maxDepth=options.maxDepth??Number.POSITIVE_INFINITY;const order=[];const successors=new Map;const state={seen:new Set([root]),queue:[{id:root,depth:0}],predecessors:new Map,truncated:false};let inspectedEdges=0;for(let index=0;index<state.queue.length;index+=1){options.signal?.throwIfAborted();const{id,depth}=state.queue[index];order.push(id);const rows=graph.neighborEdges(id,{direction,...options.kinds===void 0?{}:{kinds:options.kinds}});inspectedEdges+=rows.meta.inspectedEdges;successors.set(id,expandReachableNode(id,depth,rows.value,maxDepth,state))}return{order,successors,predecessors:state.predecessors,inspectedEdges,truncated:state.truncated}}function reversePostorder(subgraph,root){const postorder=[];const visited=new Set([root]);const stack=[{id:root,index:0}];while(stack.length>0){const frame=stack.at(-1);const nexts=subgraph.successors.get(frame.id);if(frame.index<nexts.length){const next=nexts[frame.index];frame.index+=1;if(!visited.has(next)){visited.add(next);stack.push({id:next,index:0})}}else{postorder.push(frame.id);stack.pop()}}return postorder.reverse()}function intersectDominators(left,right,idom,ordinal){let first=left;let second=right;while(first!==second){while(ordinal.get(first)>ordinal.get(second))first=idom.get(first);while(ordinal.get(second)>ordinal.get(first))second=idom.get(second)}return first}function dominatorCandidate(predecessors,idom,ordinal){let candidate;for(const pred of[...predecessors].sort()){if(!idom.has(pred))continue;candidate=candidate===void 0?pred:intersectDominators(candidate,pred,idom,ordinal)}return candidate}function solveImmediateDominators(subgraph,root,order,ordinal,signal){const idom=new Map([[root,root]]);let changed=true;while(changed){changed=false;for(const id of order){signal?.throwIfAborted();if(id===root)continue;const candidate=dominatorCandidate(subgraph.predecessors.get(id),idom,ordinal);if(candidate!==void 0&&idom.get(id)!==candidate){idom.set(id,candidate);changed=true}}}return idom}function computeRelationshipDominators(graph,root,options={}){if(!graph.hasNode(root))throw new TypeError(`Relationship node not found: ${root}`);if(options.maxDepth!==void 0&&(!Number.isInteger(options.maxDepth)||options.maxDepth<0))throw new TypeError(`Invalid maxDepth bound: ${String(options.maxDepth)}`);const subgraph=indexReachableSubgraph(graph,root,options);const order=reversePostorder(subgraph,root);const ordinal=new Map(order.map((id,index)=>[id,index]));const idom=solveImmediateDominators(subgraph,root,order,ordinal,options.signal);const subtreeSizes=new Map(order.map(id=>[id,1]));for(let index=order.length-1;index>=0;index-=1){const id=order[index];if(id===root)continue;const parent=idom.get(id);subtreeSizes.set(parent,subtreeSizes.get(parent)+subtreeSizes.get(id))}const rows=order.filter(id=>id!==root).map(id=>({id,idom:idom.get(id),dominatedCount:subtreeSizes.get(id)-1})).sort((left,right)=>right.dominatedCount-left.dominatedCount||left.id.localeCompare(right.id));return{value:{root,reachableCount:subgraph.order.length,rows},meta:{visitedNodes:subgraph.order.length,inspectedEdges:subgraph.inspectedEdges,truncated:subgraph.truncated}}}export{computeRelationshipDominators,detectRelationshipCommunities,findRedundantRelationshipEdges,forEachMatchedRelationshipEdge,isTransitiveKind,orientTransitiveEdge,transitiveFamilyKey};
|
|
474
2
|
//# sourceMappingURL=analytics.js.map
|
|
475
|
-
//# debugId=24898402-1568-5b05-9072-f89dd91f25a6
|