@unbrained/pm-cli 2026.10.4 → 2026.10.5
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/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +11 -0
- package/dist/cli/after-command-context-usage.js +1 -1
- package/dist/cli/argv-utils.js +1 -1
- package/dist/cli/bootstrap-args.js +1 -1
- package/dist/cli/bundle-integrity.js +2 -2
- package/dist/cli/command-namespaces.js +1 -1
- package/dist/cli/commander-usage.d.ts +1 -1
- package/dist/cli/commander-usage.js +7 -4
- package/dist/cli/commands/annotations/comments.js +1 -1
- package/dist/cli/commands/annotations/docs.js +1 -1
- package/dist/cli/commands/annotations/files.js +1 -1
- package/dist/cli/commands/annotations/learnings.js +1 -1
- package/dist/cli/commands/annotations/notes.js +1 -1
- package/dist/cli/commands/extension/describe.js +1 -1
- package/dist/cli/commands/extension/extension.js +1 -1
- package/dist/cli/commands/extension/scaffold.js +1 -1
- package/dist/cli/commands/extension/shared.js +1 -1
- package/dist/cli/commands/governance/gc.js +1 -1
- package/dist/cli/commands/governance/health.js +1 -1
- package/dist/cli/commands/governance/telemetry.js +1 -1
- package/dist/cli/commands/governance/validate.js +1 -1
- package/dist/cli/commands/history/activity.js +1 -1
- package/dist/cli/commands/history/history-compact.js +1 -1
- package/dist/cli/commands/history/history-redact.js +1 -1
- package/dist/cli/commands/history/history-repair.js +1 -1
- package/dist/cli/commands/history/history.js +1 -1
- package/dist/cli/commands/history/restore.js +1 -1
- package/dist/cli/commands/lifecycle/append.js +1 -1
- package/dist/cli/commands/lifecycle/claim.js +1 -1
- package/dist/cli/commands/lifecycle/close-many.js +1 -1
- package/dist/cli/commands/lifecycle/close.js +1 -1
- package/dist/cli/commands/lifecycle/copy.js +1 -1
- package/dist/cli/commands/lifecycle/create.js +1 -1
- package/dist/cli/commands/lifecycle/delete.js +1 -1
- package/dist/cli/commands/lifecycle/focus.js +1 -1
- package/dist/cli/commands/lifecycle/plan.js +1 -1
- package/dist/cli/commands/lifecycle/update-many.js +1 -1
- package/dist/cli/commands/lifecycle/update.js +1 -1
- package/dist/cli/commands/query/aggregate.js +1 -1
- package/dist/cli/commands/query/context.js +1 -1
- package/dist/cli/commands/query/deps.js +1 -1
- package/dist/cli/commands/query/duplicates.js +1 -1
- package/dist/cli/commands/query/eval.js +1 -1
- package/dist/cli/commands/query/get.js +1 -1
- package/dist/cli/commands/query/graph.js +1 -1
- package/dist/cli/commands/query/list.js +1 -1
- package/dist/cli/commands/query/next.js +1 -1
- package/dist/cli/commands/query/search.js +1 -1
- package/dist/cli/commands/query/stats.js +1 -1
- package/dist/cli/commands/test/test-all.js +1 -1
- package/dist/cli/commands/test/test-runs.js +1 -1
- package/dist/cli/commands/test/test.js +1 -1
- package/dist/cli/commands/workspace/config.js +1 -1
- package/dist/cli/commands/workspace/contracts.js +1 -1
- package/dist/cli/commands/workspace/init.js +1 -1
- package/dist/cli/commands/workspace/merge.js +1 -1
- package/dist/cli/commands/workspace/profile.js +1 -1
- package/dist/cli/commands/workspace/schema.js +1 -1
- package/dist/cli/commands/workspace/upgrade.js +1 -1
- package/dist/cli/context-intent-invocation.js +1 -1
- package/dist/cli/description-stdin.js +1 -1
- package/dist/cli/error-guidance.js +3 -1
- package/dist/cli/extension-command-help.js +5 -3
- package/dist/cli/extension-command-options.js +1 -1
- package/dist/cli/extension-recovery.js +1 -1
- package/dist/cli/help-content.js +5 -2
- package/dist/cli/help-json-payload.js +6 -3
- package/dist/cli/invocation-profile.js +2 -2
- package/dist/cli/main.js +5 -5
- package/dist/cli/migration-gates.js +1 -1
- package/dist/cli/option-values.js +1 -1
- package/dist/cli/public.js +1 -1
- package/dist/cli/register-annotations.js +1 -1
- package/dist/cli/register-assurance.js +1 -1
- package/dist/cli/register-files-lookup.js +1 -1
- package/dist/cli/register-history-activity.js +1 -1
- package/dist/cli/register-history-author.js +1 -1
- package/dist/cli/register-history-maintenance.js +2 -2
- package/dist/cli/register-list-query.js +10 -10
- package/dist/cli/register-mutation-options.js +1 -1
- package/dist/cli/register-mutation.js +2 -2
- package/dist/cli/register-operations.js +1 -1
- package/dist/cli/register-setup.js +1 -1
- package/dist/cli/register-structured-mutation.js +1 -1
- package/dist/cli/registration-helpers.js +1 -1
- package/dist/cli/runtime/activation.js +1 -1
- package/dist/cli/runtime/invocation-options.js +1 -1
- package/dist/cli/runtime/projection-retry.js +1 -1
- package/dist/cli/runtime/selection.js +1 -1
- package/dist/cli/runtime/telemetry-outcome.js +1 -1
- package/dist/cli/runtime-compatibility-boundary.js +4 -4
- package/dist/cli/schema/registration.js +2 -2
- package/dist/cli/schema-registration-helpers.js +1 -1
- package/dist/cli/search-refresh.js +1 -1
- package/dist/cli/stats-analytics-json.js +1 -1
- package/dist/cli/telemetry-flush.js +1 -1
- package/dist/cli-bundle/bundle-manifest.json +163 -163
- package/dist/cli-bundle/chunks/chunk-3CYOBJUK.js +3 -0
- package/dist/cli-bundle/chunks/chunk-5MNOWZPN.js +3 -0
- package/dist/cli-bundle/chunks/chunk-AJ7H6XUF.js +20 -0
- package/dist/cli-bundle/chunks/chunk-D332RXZ7.js +80 -0
- package/dist/cli-bundle/chunks/chunk-HRJ6G6ZG.js +31 -0
- package/dist/cli-bundle/chunks/chunk-KRVI56QE.js +6 -0
- package/dist/cli-bundle/chunks/chunk-N4YGSG6F.js +238 -0
- package/dist/cli-bundle/chunks/{chunk-7CE2DJMA.js → chunk-OOLYASYJ.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-R7CG2DB7.js +2 -0
- package/dist/cli-bundle/chunks/chunk-TGMONGWX.js +2 -0
- package/dist/cli-bundle/chunks/chunk-UZ7BIUCI.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-GZMWISWW.js → chunk-VZ63DEVJ.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-WFZ4UEOB.js +2 -0
- package/dist/cli-bundle/chunks/chunk-YVBRASXO.js +8 -0
- package/dist/cli-bundle/chunks/{chunk-SMKHR6BM.js → chunk-Z66DWDAU.js} +87 -87
- package/dist/cli-bundle/chunks/{register-list-query-QBGXO5JJ.js → register-list-query-75QXHIFH.js} +11 -11
- package/dist/cli-bundle/chunks/register-mutation-YS54SCHG.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-6KHZQSYJ.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-RTATEN2M.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-Q6DJ5DFQ.js → chunk-2CVX3KR3.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-5C3IDDW7.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-467EW5RL.js → chunk-ABV67XCC.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-B5RSLVE6.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-C224METM.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-CLDPTMQY.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-DDRN42PB.js +8 -0
- package/dist/cli-bundle/focused-chunks/{chunk-7O4NUJVO.js → chunk-DOVTUKJQ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-ECBOPEJE.js +75 -0
- package/dist/cli-bundle/focused-chunks/chunk-GITOYRUW.js +165 -0
- package/dist/cli-bundle/focused-chunks/chunk-GUIF3WVC.js +30 -0
- package/dist/cli-bundle/focused-chunks/chunk-LE4JUCRR.js +3 -0
- package/dist/cli-bundle/focused-chunks/{chunk-HFAW3FJQ.js → chunk-PSXFFQFT.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RHIH6XIW.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-UDYRVBOZ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-XV5RV4ZT.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-JCVMOSWQ.js → chunk-YMU42COG.js} +2 -2
- package/dist/cli-bundle/main.js +27 -27
- 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 +32 -32
- 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 +55 -55
- 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 +10 -10
- package/dist/cli.js +1 -1
- package/dist/core/checkpoint/checkpoint-gc.js +1 -1
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
- package/dist/core/config/nested-settings.js +1 -1
- package/dist/core/config/positional-value.js +1 -1
- package/dist/core/diagnostics/remediation.js +1 -1
- package/dist/core/extensions/activation-summary-markdown.js +2 -1
- package/dist/core/extensions/activation-summary.js +1 -1
- package/dist/core/extensions/activation-transaction.js +1 -1
- package/dist/core/extensions/capability-usage.js +1 -1
- package/dist/core/extensions/command-hook-context.js +1 -1
- package/dist/core/extensions/command-metadata-contract.js +1 -1
- package/dist/core/extensions/command-visibility-tier.js +1 -1
- package/dist/core/extensions/contribution-inventory.js +1 -1
- package/dist/core/extensions/exporter-output-contract.js +1 -1
- package/dist/core/extensions/extension-candidate.js +1 -1
- package/dist/core/extensions/extension-capability-aliases.js +1 -1
- package/dist/core/extensions/extension-hook-runtime.js +1 -1
- package/dist/core/extensions/extension-policy.js +1 -1
- package/dist/core/extensions/extension-registries.js +1 -1
- package/dist/core/extensions/extension-runtime-helpers.js +1 -1
- package/dist/core/extensions/extension-types.js +1 -1
- package/dist/core/extensions/flag-definition-validation.js +1 -1
- package/dist/core/extensions/flag-value-types.js +1 -1
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/item-field-types.js +1 -1
- package/dist/core/extensions/item-fields.js +1 -1
- package/dist/core/extensions/loader.js +1 -1
- package/dist/core/extensions/manifest-parser.js +1 -1
- package/dist/core/extensions/manifest-schema.js +1 -1
- package/dist/core/extensions/module-graph-snapshot.js +1 -1
- package/dist/core/extensions/preflight-ownership.js +1 -1
- package/dist/core/extensions/registration-contracts.js +1 -1
- package/dist/core/extensions/registration-validation.js +1 -1
- package/dist/core/extensions/registration-values.js +1 -1
- package/dist/core/extensions/reserved-host-flags.js +1 -1
- package/dist/core/extensions/runtime-registrations.js +1 -1
- package/dist/core/extensions/service-ownership.js +1 -1
- package/dist/core/extensions/version-compat.js +1 -1
- package/dist/core/fs/atomic-create.js +1 -1
- package/dist/core/fs/fs-utils.js +2 -2
- package/dist/core/fs/host-environment-errors.js +1 -1
- package/dist/core/fs/index.js +1 -1
- package/dist/core/fs/path-utils.js +1 -1
- package/dist/core/governance/content-fields.js +1 -1
- package/dist/core/governance/issue-codes.js +1 -1
- package/dist/core/governance/metadata-coverage.js +1 -1
- package/dist/core/history/digest.js +1 -1
- package/dist/core/history/drift-cache.js +3 -3
- package/dist/core/history/drift-scan.d.ts +4 -0
- package/dist/core/history/drift-scan.js +1 -1
- package/dist/core/history/event-classification.js +1 -1
- package/dist/core/history/event-index.js +8 -7
- package/dist/core/history/history-compact-bulk.js +1 -1
- package/dist/core/history/history-diff.js +1 -1
- package/dist/core/history/history-rewrite.js +1 -1
- package/dist/core/history/history-storage-stats.js +1 -1
- package/dist/core/history/history-stream-policy.js +1 -1
- package/dist/core/history/history.js +2 -2
- package/dist/core/history/identity.js +1 -1
- package/dist/core/history/index.js +1 -1
- package/dist/core/history/operation-contract.js +1 -1
- package/dist/core/history/projection.js +1 -1
- package/dist/core/history/read.js +1 -1
- package/dist/core/history/replay.js +2 -1
- package/dist/core/history/tombstone.js +1 -1
- package/dist/core/history/version-address.js +1 -1
- package/dist/core/history/workspace-history.js +2 -2
- package/dist/core/io/body-file.js +1 -1
- package/dist/core/io/bulk-ids-input.js +2 -1
- package/dist/core/item/actionability.js +1 -1
- package/dist/core/item/dependency-reference.js +1 -1
- package/dist/core/item/id.js +1 -1
- package/dist/core/item/index.js +1 -1
- package/dist/core/item/item-format-version.js +1 -1
- package/dist/core/item/item-format.js +6 -4
- package/dist/core/item/item-record.js +1 -1
- package/dist/core/item/item-type-definition.js +1 -1
- package/dist/core/item/parent-reference-policy.js +1 -1
- package/dist/core/item/parse.js +8 -2
- package/dist/core/item/plan-lifecycle.js +1 -1
- package/dist/core/item/priority.js +1 -1
- package/dist/core/item/sprint-release-format.js +1 -1
- package/dist/core/item/status-filter.js +1 -1
- package/dist/core/item/status.js +1 -1
- package/dist/core/item/toon-decode.js +1 -1
- package/dist/core/item/type-registry.js +1 -1
- package/dist/core/item/type-synonyms.js +1 -1
- package/dist/core/lock/index.js +1 -1
- package/dist/core/lock/lock-gc.js +1 -1
- package/dist/core/lock/lock.js +3 -3
- package/dist/core/output/mutation-projection.js +1 -1
- package/dist/core/output/output-control.js +1 -1
- package/dist/core/output/output.js +22 -10
- package/dist/core/output/query-summary.js +1 -1
- package/dist/core/output/tabular.js +3 -1
- package/dist/core/packages/manifest.js +1 -1
- package/dist/core/packages/root.js +1 -1
- package/dist/core/policy/workflow-policy-schema.js +1 -1
- package/dist/core/policy/workflow-policy-store.js +1 -1
- package/dist/core/policy/workflow-policy.js +1 -1
- package/dist/core/profile/profile-describe.js +1 -1
- package/dist/core/profile/profile-lint.js +1 -1
- package/dist/core/profile/profile-plan.js +1 -1
- package/dist/core/profile/profile-presets.js +25 -1
- package/dist/core/reproducibility/context.js +1 -1
- package/dist/core/schema/fields-file.js +2 -2
- package/dist/core/schema/item-types-file.js +2 -2
- package/dist/core/schema/runtime-field-filters.js +1 -1
- package/dist/core/schema/runtime-field-values.js +1 -1
- package/dist/core/schema/runtime-schema.js +2 -2
- package/dist/core/schema/status-defs-file.js +2 -2
- package/dist/core/schema/status-token.js +1 -1
- package/dist/core/schema/type-inference.js +1 -1
- package/dist/core/schema/type-presets.js +1 -1
- package/dist/core/schema/type-workflows.js +1 -1
- package/dist/core/search/background-refresh.js +2 -2
- package/dist/core/search/bm25.js +1 -1
- package/dist/core/search/cache.js +2 -2
- package/dist/core/search/corpus.js +1 -1
- package/dist/core/search/embedding-batches.js +1 -1
- package/dist/core/search/eval-thresholds.js +1 -1
- package/dist/core/search/eval.js +1 -1
- package/dist/core/search/http-client.js +1 -1
- package/dist/core/search/providers.js +1 -1
- package/dist/core/search/relevance.js +1 -1
- package/dist/core/search/semantic-defaults.js +1 -1
- package/dist/core/search/staleness.js +1 -1
- package/dist/core/search/vector-stores.js +2 -2
- package/dist/core/search/vectorization-metadata.js +1 -1
- package/dist/core/sentry/helpers.js +1 -1
- package/dist/core/sentry/instrument.js +1 -1
- package/dist/core/session/session-state.js +1 -1
- package/dist/core/shared/agent-session-context.js +1 -1
- package/dist/core/shared/author.js +5 -1
- package/dist/core/shared/command-line.js +1 -1
- package/dist/core/shared/command-types.js +1 -1
- package/dist/core/shared/conflict-markers.js +1 -1
- package/dist/core/shared/constants.js +1 -1
- package/dist/core/shared/errors.js +1 -1
- package/dist/core/shared/html-entity-decode.js +1 -1
- package/dist/core/shared/index.js +1 -1
- package/dist/core/shared/item-metadata-contract.js +1 -1
- package/dist/core/shared/lazy-module.js +1 -1
- package/dist/core/shared/levenshtein.js +1 -1
- package/dist/core/shared/memo.js +1 -1
- package/dist/core/shared/numeric-parsers.js +1 -1
- package/dist/core/shared/option-alias-visibility.js +1 -1
- package/dist/core/shared/primitives.js +1 -1
- package/dist/core/shared/secret-rules.js +1 -1
- package/dist/core/shared/serial-queue.js +1 -1
- package/dist/core/shared/serialization.js +1 -1
- package/dist/core/shared/split-comma-list.js +1 -1
- package/dist/core/shared/text-normalization.js +1 -1
- package/dist/core/shared/time.js +2 -1
- package/dist/core/store/index.js +1 -1
- package/dist/core/store/item-format-migration.js +1 -1
- package/dist/core/store/item-metadata-cache.js +1 -1
- package/dist/core/store/item-metadata-query-index.js +7 -7
- package/dist/core/store/item-metadata-read-work.js +1 -1
- package/dist/core/store/item-store.js +1 -1
- package/dist/core/store/paths.js +1 -1
- package/dist/core/store/settings-concurrency.js +1 -1
- package/dist/core/store/settings-read-cache.js +1 -1
- package/dist/core/store/settings-validator.js +1 -1
- package/dist/core/store/settings.js +3 -3
- package/dist/core/store/tracker-preflight.js +1 -1
- package/dist/core/telemetry/consent.js +2 -2
- package/dist/core/telemetry/observability.js +1 -1
- package/dist/core/telemetry/policy.js +1 -1
- package/dist/core/telemetry/read-sampling.js +2 -2
- package/dist/core/telemetry/runtime.js +9 -5
- package/dist/core/test/background-runs.js +3 -3
- package/dist/core/test/item-test-run-tracking.js +1 -1
- package/dist/core/test/run-selectors.js +1 -1
- package/dist/core/validate/estimate-defaults.js +1 -1
- package/dist/core/validate/fix-planning.js +1 -1
- package/dist/core/validate/linked-artifact-reference.js +1 -1
- package/dist/core/validate/missing-by-type.js +1 -1
- package/dist/core/validate/missing-link-owners.js +1 -1
- package/dist/core/validate/stale-file-classification.js +1 -1
- package/dist/mcp/http-server.js +6 -4
- package/dist/mcp/legacy-adapter.js +1 -1
- package/dist/mcp/runtime-capabilities.js +1 -1
- package/dist/mcp/server.js +4 -4
- package/dist/mcp/tool-definitions.js +1 -1
- package/dist/sdk/actionability.js +1 -1
- package/dist/sdk/agent/closed-domain-contracts.js +1 -1
- package/dist/sdk/agent/command-recovery.js +1 -1
- package/dist/sdk/agent/command-suggestions.js +1 -1
- package/dist/sdk/agent/create-option-policy.js +1 -1
- package/dist/sdk/agent/identity-config.js +1 -1
- package/dist/sdk/agent/item-addressing.js +1 -1
- package/dist/sdk/agent/refusal-closure-census.js +2 -1
- package/dist/sdk/agent/refusal-closure.js +1 -1
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -1
- package/dist/sdk/agent/refusal-reachability.js +3 -1
- package/dist/sdk/agent/subcommand-recovery.js +1 -1
- package/dist/sdk/agent/task-transcript-contracts.js +1 -1
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -1
- package/dist/sdk/agent-capability-contracts.js +3 -1
- package/dist/sdk/agent-session-context.js +1 -1
- package/dist/sdk/annotations.js +1 -1
- package/dist/sdk/author-attribution.js +1 -1
- package/dist/sdk/authoring.js +1 -1
- package/dist/sdk/cli-bootstrap.js +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +5 -3
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -1
- package/dist/sdk/cli-contracts/command-aliases.js +1 -1
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -1
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1
- package/dist/sdk/cli-contracts/commander-types.js +1 -1
- package/dist/sdk/cli-contracts/completeness.js +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +2 -1
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -7
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -1
- package/dist/sdk/cli-contracts/string-lists.js +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -1
- package/dist/sdk/cli-contracts.js +1 -1
- package/dist/sdk/cli-program.js +1 -1
- package/dist/sdk/command-line.js +1 -1
- package/dist/sdk/comments.js +1 -1
- package/dist/sdk/compile-cache.js +1 -1
- package/dist/sdk/completion/bash.js +2 -1
- package/dist/sdk/completion/fish.js +13 -7
- package/dist/sdk/completion/shared.js +1 -1
- package/dist/sdk/completion/zsh.js +14 -8
- package/dist/sdk/completion.js +1 -1
- package/dist/sdk/compose.js +1 -1
- package/dist/sdk/config.js +1 -1
- package/dist/sdk/context/recency.js +1 -1
- package/dist/sdk/context/semantic-session-attribution.js +1 -1
- package/dist/sdk/context/usage-egress.js +1 -1
- package/dist/sdk/context/usage-ledger.js +6 -3
- package/dist/sdk/context-intent-contracts.js +1 -1
- package/dist/sdk/context-intent-runtime.js +1 -1
- package/dist/sdk/context-packing.js +1 -1
- package/dist/sdk/context-relevance.js +1 -1
- package/dist/sdk/context-signal-store.js +2 -2
- package/dist/sdk/context-usage.js +1 -1
- package/dist/sdk/contracts.js +1 -1
- package/dist/sdk/core-governance.js +1 -1
- package/dist/sdk/core.js +1 -1
- package/dist/sdk/corpus-shape.js +1 -1
- package/dist/sdk/define.js +1 -1
- package/dist/sdk/dependencies.js +1 -1
- package/dist/sdk/dependency-flag-validation.js +1 -1
- package/dist/sdk/dependency-provenance.js +1 -1
- package/dist/sdk/docs.js +1 -1
- package/dist/sdk/duplicates.js +1 -1
- package/dist/sdk/environment/agent-environment.js +1 -1
- package/dist/sdk/environment/host-environment-errors.js +1 -1
- package/dist/sdk/environment/project-runtime-compatibility.js +2 -1
- package/dist/sdk/environment/source-context.js +1 -1
- package/dist/sdk/environment/tracker-preflight.js +1 -1
- package/dist/sdk/error-code-catalog.js +1 -1
- package/dist/sdk/error-runtime.js +1 -1
- package/dist/sdk/errors.js +1 -1
- package/dist/sdk/eval.js +1 -1
- package/dist/sdk/extension/author-manifest.js +1 -1
- package/dist/sdk/extension/bundled-catalog.js +1 -1
- package/dist/sdk/extension/concurrency.js +1 -1
- package/dist/sdk/extension/copy-scope.js +1 -1
- package/dist/sdk/extension/custom-field-collisions.js +1 -1
- package/dist/sdk/extension/describe.js +4 -2
- package/dist/sdk/extension/doctor.js +1 -1
- package/dist/sdk/extension/install-plan.js +1 -1
- package/dist/sdk/extension/install-receipts.js +1 -1
- package/dist/sdk/extension/install-runtime.js +3 -3
- package/dist/sdk/extension/install-snapshot.js +1 -1
- package/dist/sdk/extension/install-sources.js +5 -5
- package/dist/sdk/extension/managed-state.js +2 -2
- package/dist/sdk/extension/migrations.js +2 -2
- package/dist/sdk/extension/output-ownership.js +1 -1
- package/dist/sdk/extension/runtime-summary.js +1 -1
- package/dist/sdk/extension/scaffold.js +11 -4
- package/dist/sdk/extension/shared.js +1 -1
- package/dist/sdk/extension/source-resolution.js +1 -1
- package/dist/sdk/extension/static-inventory.js +1 -1
- package/dist/sdk/extension/update-check.js +1 -1
- package/dist/sdk/extension-command-context.js +1 -1
- package/dist/sdk/extension-contracts.js +1 -1
- package/dist/sdk/extension.js +1 -1
- package/dist/sdk/files.js +1 -1
- package/dist/sdk/flag-invocation-contracts.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
- package/dist/sdk/generated-error-code-catalog.js +1 -1
- package/dist/sdk/governance/assurance-action-contracts.js +1 -1
- package/dist/sdk/governance/assurance-action.js +1 -1
- package/dist/sdk/governance/assurance-limits.js +1 -1
- package/dist/sdk/governance/assurance-mutation-error.js +1 -1
- package/dist/sdk/governance/assurance-presets.js +1 -1
- package/dist/sdk/governance/assurance-runtime.js +1 -1
- package/dist/sdk/governance/assurance.js +4 -4
- package/dist/sdk/governance/boundary-fixtures.js +1 -1
- package/dist/sdk/governance/closure-timestamps.js +1 -1
- package/dist/sdk/governance/coverage-assurance.js +1 -1
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -1
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -1
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -1
- package/dist/sdk/governance/defect-recurrence.js +1 -1
- package/dist/sdk/governance/extension-host-version.js +1 -1
- package/dist/sdk/governance/gc.js +1 -1
- package/dist/sdk/governance/health-merge-evidence.js +1 -1
- package/dist/sdk/governance/health.js +2 -1
- package/dist/sdk/governance/hierarchy-validation.js +1 -1
- package/dist/sdk/governance/linked-file-report.js +1 -1
- package/dist/sdk/governance/merge-receipt-history.js +1 -1
- package/dist/sdk/governance/provenance-health.js +4 -1
- package/dist/sdk/governance/reindex.js +5 -4
- package/dist/sdk/governance/stale-work.js +1 -1
- package/dist/sdk/governance/status-role-diagnostics.js +1 -1
- package/dist/sdk/governance/storage-integrity.js +1 -1
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -1
- package/dist/sdk/governance/upgrade.js +2 -2
- package/dist/sdk/governance/validate-history-drift.js +1 -1
- package/dist/sdk/governance/validate-item-reader.js +1 -1
- package/dist/sdk/governance/validate-normalization.js +1 -1
- package/dist/sdk/governance/validate.js +1 -1
- package/dist/sdk/governance/workflow-completeness.js +1 -1
- package/dist/sdk/governance/workflow-policy.js +3 -3
- package/dist/sdk/governance/workspace-position.js +2 -1
- package/dist/sdk/governance.js +1 -1
- package/dist/sdk/graph/adapter.js +1 -1
- package/dist/sdk/graph/analytics.js +1 -1
- package/dist/sdk/graph/assembly.js +1 -1
- package/dist/sdk/graph/cache.js +1 -1
- package/dist/sdk/graph/centrality.js +1 -1
- package/dist/sdk/graph/conformance.js +1 -1
- package/dist/sdk/graph/deadline-scheduling.js +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -1
- package/dist/sdk/graph/governance-contracts.js +1 -1
- package/dist/sdk/graph/governance.js +1 -1
- package/dist/sdk/graph/hierarchy-integrity.js +1 -1
- package/dist/sdk/graph/index.js +1 -1
- package/dist/sdk/graph/lifecycle-coverage.js +1 -1
- package/dist/sdk/graph/mutation-advisory.js +1 -1
- package/dist/sdk/graph/query-contracts.js +1 -1
- package/dist/sdk/graph/remediation.js +1 -1
- package/dist/sdk/graph/run.js +1 -1
- package/dist/sdk/graph/scheduling.js +1 -1
- package/dist/sdk/graph/traversal.js +1 -1
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -1
- package/dist/sdk/graph.js +1 -1
- package/dist/sdk/guide-topics.js +1 -1
- package/dist/sdk/guide.js +8 -1
- package/dist/sdk/history/attestation-command.js +1 -1
- package/dist/sdk/history/attestation-contract.js +1 -1
- package/dist/sdk/history/attestation-scan.js +1 -1
- package/dist/sdk/history/attestation.js +1 -1
- package/dist/sdk/history/maintenance.js +1 -1
- package/dist/sdk/history/salvage.js +3 -2
- package/dist/sdk/history/subject.js +1 -1
- package/dist/sdk/history-analytics.js +1 -1
- package/dist/sdk/history-compact.js +1 -1
- package/dist/sdk/history-mcp.js +1 -1
- package/dist/sdk/history-provenance.js +1 -1
- package/dist/sdk/history-read.js +1 -1
- package/dist/sdk/history-redact.js +1 -1
- package/dist/sdk/history-repair.js +1 -1
- package/dist/sdk/improvement-ledger-validation.js +1 -1
- package/dist/sdk/improvement-ledger.js +2 -2
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/init-agent-guidance.js +16 -2
- package/dist/sdk/init.js +16 -2
- package/dist/sdk/invocation-author.js +1 -1
- package/dist/sdk/item-children.js +1 -1
- package/dist/sdk/item-metadata-index.js +1 -1
- package/dist/sdk/item-schedule.js +1 -1
- package/dist/sdk/item-transaction.js +1 -1
- package/dist/sdk/learnings.js +1 -1
- package/dist/sdk/lifecycle/append.js +4 -2
- package/dist/sdk/lifecycle/claim.js +1 -1
- package/dist/sdk/lifecycle/close-many.js +1 -1
- package/dist/sdk/lifecycle/close.js +1 -1
- package/dist/sdk/lifecycle/copy.js +1 -1
- package/dist/sdk/lifecycle/create.js +1 -1
- package/dist/sdk/lifecycle/delete.js +1 -1
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -1
- package/dist/sdk/lifecycle/focus.js +1 -1
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -1
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -1
- package/dist/sdk/lifecycle/mcp-actions.js +1 -1
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -1
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -1
- package/dist/sdk/lifecycle/plan-mutation-receipt.js +1 -1
- package/dist/sdk/lifecycle/plan.js +1 -1
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -1
- package/dist/sdk/lifecycle/reopen.js +1 -1
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +2 -1
- package/dist/sdk/lifecycle/restore.js +1 -1
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
- package/dist/sdk/lifecycle/task-composition.js +1 -1
- package/dist/sdk/lifecycle/update-many.js +1 -1
- package/dist/sdk/lifecycle/update.js +2 -1
- package/dist/sdk/lifecycle-completion.js +1 -1
- package/dist/sdk/lifecycle-policy.js +1 -1
- package/dist/sdk/linked-artifacts.js +2 -1
- package/dist/sdk/mcp/apps.js +1 -1
- package/dist/sdk/mcp/authorization.js +1 -1
- package/dist/sdk/mcp/discovery.js +1 -1
- package/dist/sdk/mcp/interactions.js +1 -1
- package/dist/sdk/mcp/protocol.js +1 -1
- package/dist/sdk/mcp/skills.js +3 -1
- package/dist/sdk/mcp/subscriptions.js +1 -1
- package/dist/sdk/mcp/tasks.js +2 -2
- package/dist/sdk/mcp/transport.js +1 -1
- package/dist/sdk/merge/abandoned-receipts.js +1 -1
- package/dist/sdk/merge/driver.js +1 -1
- package/dist/sdk/merge/index.js +1 -1
- package/dist/sdk/merge/install.js +4 -2
- package/dist/sdk/merge/receipt-file-boundary.js +1 -1
- package/dist/sdk/merge/receipt-operation.js +1 -1
- package/dist/sdk/merge/receipt-schema.js +1 -1
- package/dist/sdk/merge/receipts.js +4 -4
- package/dist/sdk/merge/reconcile.js +1 -1
- package/dist/sdk/merge/three-way.js +3 -2
- package/dist/sdk/merge/worktree-config.js +1 -1
- package/dist/sdk/merge.js +1 -1
- package/dist/sdk/mutation-events.js +1 -1
- package/dist/sdk/mutation-guard.js +1 -1
- package/dist/sdk/notes.js +1 -1
- package/dist/sdk/output-contracts.js +1 -1
- package/dist/sdk/output-projection.js +1 -1
- package/dist/sdk/output-token-accounting.js +1 -1
- package/dist/sdk/output.js +2 -1
- package/dist/sdk/ownership-source.js +1 -1
- package/dist/sdk/package-import-adapters.js +1 -1
- package/dist/sdk/package-migrations.js +1 -1
- package/dist/sdk/package-runtime-options.js +1 -1
- package/dist/sdk/pagination.js +1 -1
- package/dist/sdk/profile.js +5 -1
- package/dist/sdk/provenance.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -1
- package/dist/sdk/query/aggregate.js +1 -1
- package/dist/sdk/query/calendar.js +4 -1
- package/dist/sdk/query/complete-list.js +1 -1
- package/dist/sdk/query/context.js +2 -1
- package/dist/sdk/query/duplicate-candidates.js +1 -1
- package/dist/sdk/query/get.d.ts +14 -2
- package/dist/sdk/query/get.js +1 -1
- package/dist/sdk/query/history.js +1 -1
- package/dist/sdk/query/item-filter-options.js +1 -1
- package/dist/sdk/query/light-metadata.js +1 -1
- package/dist/sdk/query/list-filter-shared.js +1 -1
- package/dist/sdk/query/list.js +1 -1
- package/dist/sdk/query/multi-value-filters.js +1 -1
- package/dist/sdk/query/next-ready-budget.js +1 -1
- package/dist/sdk/query/next.js +2 -1
- package/dist/sdk/query/parsers.js +1 -1
- package/dist/sdk/query/projection-contracts.js +1 -1
- package/dist/sdk/query/search/corpus.js +2 -1
- package/dist/sdk/query/search/filters.js +1 -1
- package/dist/sdk/query/search/input.js +1 -1
- package/dist/sdk/query/search/lexical.js +1 -1
- package/dist/sdk/query/search/response.js +1 -1
- package/dist/sdk/query/search/semantic.js +3 -2
- package/dist/sdk/query/search/types.js +1 -1
- package/dist/sdk/query/search-contracts.js +1 -1
- package/dist/sdk/query/search-pagination.js +1 -1
- package/dist/sdk/query/search-rendering.js +1 -1
- package/dist/sdk/query/search.js +1 -1
- package/dist/sdk/query/workspace-contracts.js +1 -1
- package/dist/sdk/query.js +1 -1
- package/dist/sdk/read-output/continuation.js +1 -1
- package/dist/sdk/read-output/options.js +1 -1
- package/dist/sdk/read-output/provenance.js +1 -1
- package/dist/sdk/read-output-budget.js +1 -1
- package/dist/sdk/read-output-contracts.js +1 -1
- package/dist/sdk/read-output-rows.js +1 -1
- package/dist/sdk/read-output-session.js +1 -1
- package/dist/sdk/relationship-analytics.js +1 -1
- package/dist/sdk/relationship-context.js +1 -1
- package/dist/sdk/relationship-history.js +7 -4
- package/dist/sdk/relationship-kinds/contract.js +1 -1
- package/dist/sdk/relationship-migration.js +1 -1
- package/dist/sdk/relationships.js +1 -1
- package/dist/sdk/reproducibility/process.js +1 -1
- package/dist/sdk/runtime/actions.js +1 -1
- package/dist/sdk/runtime/context.js +1 -1
- package/dist/sdk/runtime/schema-preview.js +1 -1
- package/dist/sdk/runtime/schema.js +1 -1
- package/dist/sdk/runtime-action-aliases.js +1 -1
- package/dist/sdk/runtime-extended-actions.js +1 -1
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime-primitives.js +1 -1
- package/dist/sdk/runtime-public-contracts.js +1 -1
- package/dist/sdk/runtime-stats-options.js +1 -1
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/scheduling-shortcuts.js +1 -1
- package/dist/sdk/schema-migration.js +4 -3
- package/dist/sdk/schema.js +7 -1
- package/dist/sdk/search-refresh-worker.js +1 -1
- package/dist/sdk/similarity-scoring.js +1 -1
- package/dist/sdk/similarity.js +1 -1
- package/dist/sdk/start-task-status.js +1 -1
- package/dist/sdk/stats.js +1 -1
- package/dist/sdk/structured-mutations.js +1 -1
- package/dist/sdk/telemetry-flush.js +1 -1
- package/dist/sdk/telemetry.js +4 -3
- package/dist/sdk/templates.js +26 -2
- package/dist/sdk/test/batch.js +2 -2
- package/dist/sdk/test/entry.js +1 -1
- package/dist/sdk/test/execution.js +6 -5
- package/dist/sdk/test/json-path.js +1 -1
- package/dist/sdk/test/linked-command-detection.js +1 -1
- package/dist/sdk/test/measurements.js +1 -1
- package/dist/sdk/test/parsers.js +1 -1
- package/dist/sdk/test/runs.js +1 -1
- package/dist/sdk/test/trust.js +2 -2
- package/dist/sdk/test/workspace-snapshot.js +1 -1
- package/dist/sdk/testing.js +7 -4
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -1
- package/dist/sdk/traceability/source-traceability.js +2 -1
- package/dist/sdk/tracker-root-discovery.js +1 -1
- package/dist/sdk/workspace-contracts-cache.js +1 -1
- package/dist/sdk/workspace-contracts.js +1 -1
- package/dist/sdk/workspace-memory.js +2 -2
- package/dist/sdk/workspace-recipe.js +1 -1
- package/dist/sdk/workspace-snapshot.js +5 -4
- package/dist/sdk/workspace-transaction-gc.js +1 -1
- package/dist/sdk/workspace-transaction.js +2 -2
- package/dist/sdk/workspace.js +3 -2
- package/dist/types/index.js +1 -1
- package/dist/types.js +1 -1
- package/docs/AGENT_EVIDENCE_CONSISTENCY.md +88 -0
- package/docs/GET_READ_EVIDENCE.md +68 -0
- package/docs/README.md +2 -0
- 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/extensions/vcs/index.ts +4 -2
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/package.json +2 -2
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +2 -2
- package/plugins/pm-codex/plugin.json +1 -1
- package/scripts/finalize-build.mjs +3 -2
- package/dist/cli-bundle/chunks/chunk-7UVXKI7K.js +0 -2
- package/dist/cli-bundle/chunks/chunk-D7Z2ZMJL.js +0 -3
- package/dist/cli-bundle/chunks/chunk-DEZPZOQ7.js +0 -2
- package/dist/cli-bundle/chunks/chunk-J52QIRRZ.js +0 -80
- package/dist/cli-bundle/chunks/chunk-JDKD3WGG.js +0 -6
- package/dist/cli-bundle/chunks/chunk-JQ7DW663.js +0 -2
- package/dist/cli-bundle/chunks/chunk-QXIDOOWT.js +0 -20
- package/dist/cli-bundle/chunks/chunk-SGFQQXFD.js +0 -2
- package/dist/cli-bundle/chunks/chunk-V3U77H3V.js +0 -31
- package/dist/cli-bundle/chunks/chunk-XZDWAYJC.js +0 -3
- package/dist/cli-bundle/chunks/chunk-Y6VRBTP3.js +0 -238
- package/dist/cli-bundle/chunks/chunk-YAAFYFS4.js +0 -8
- package/dist/cli-bundle/chunks/register-mutation-53ZLT4RX.js +0 -20
- package/dist/cli-bundle/chunks/register-operations-OBK2FXUU.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-HM3OCBH2.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-2JFYR56O.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-32EVUSS4.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-5GUSO2P4.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-6XBRADQQ.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-CURTIIQT.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-IJUWEEEB.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-JMJK2L4Z.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-KG3H4UZZ.js +0 -30
- package/dist/cli-bundle/focused-chunks/chunk-MHQ2XICU.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-RJV6QVJE.js +0 -75
- package/dist/cli-bundle/focused-chunks/chunk-ZE2JZ7R6.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-ZLEN4HZD.js +0 -165
|
@@ -1,2 +1,2 @@
|
|
|
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};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="789f7451-ceb1-5e5c-b2b6-45eec49580ce")}catch{}})();import{hierarchyParentEndpoint,orderingPredecessorEndpoint}from"./traversal.js";const DEFAULT_MAX_ITERATIONS=16,DEFAULT_MIN_COMMUNITY_SIZE=2,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(),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);wanted!==void 0&&!(wanted.has(definition.kind)||definition.inverse!==void 0&&wanted.has(definition.inverse))||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);neighbors===void 0?adjacency.set(from,[to]):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,bestCount=0;for(const[label,count]of counts)(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);members===void 0?groups.set(label,[id]):members.push(id)}const communities=[];for(const members of groups.values())members.length<minSize||(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,minSize=options.minSize??DEFAULT_MIN_COMMUNITY_SIZE;assertPositiveBound("maxIterations",maxIterations),assertPositiveBound("minSize",minSize);const adjacency=buildUndirectedAdjacency(graph,options.kinds),nodes=graph.nodes(),labels=new Map(nodes.map(id=>[id,id]));let iterations=0,converged=!1,visitedNodes=0,inspectedEdges=0;for(;iterations<maxIterations&&!converged;){options.signal?.throwIfAborted(),iterations+=1,converged=!0;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);dominant!==labels.get(id)&&(labels.set(id,dominant),converged=!1)}}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){return(definition.hierarchy?hierarchyParentEndpoint(edge,definition):edge.source===orderingPredecessorEndpoint(edge,definition)?edge.target:edge.source)===edge.target?{from:edge.source,to:edge.target}:{from:edge.target,to:edge.source}}function resolveRedundancyFamilies(graph,kinds){if(kinds===void 0)return;const registry=graph.registry(),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(),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);family===void 0&&(family={adjacency:new Map,records:[]},families.set(key,family));const targets=family.adjacency.get(oriented.from);targets===void 0?family.adjacency.set(oriented.from,new Set([oriented.to])):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);return witness.push(from),witness.reverse()}function expandWitnessFrontier(adjacency,record,current,parents,queue,cost){for(const next of adjacency.get(current.id)??[])if(cost.inspectedEdges+=1,!(current.depth===0&&next===record.to)&&!parents.has(next)){if(parents.set(next,current.id),next===record.to)return reconstructWitness(parents,record.from,current.id,next);queue.push({id:next,depth:current.depth+1})}}function findWitnessPath(adjacency,record,maxDepth,cost){const parents=new Map([[record.from,record.from]]),queue=[{id:record.from,depth:0}];for(let index=0;index<queue.length;index+=1){const current=queue[index];if(cost.visitedNodes+=1,current.depth>=maxDepth)continue;const witness=expandWitnessFrontier(adjacency,record,current,parents,queue,cost);if(witness!==void 0)return witness}}function findRedundantRelationshipEdges(graph,options={}){const maxDepth=options.maxDepth??DEFAULT_REDUNDANCY_MAX_DEPTH;assertPositiveBound("maxDepth",maxDepth),options.limit!==void 0&&assertPositiveBound("limit",options.limit);const limit=options.limit??Number.POSITIVE_INFINITY,wanted=resolveRedundancyFamilies(graph,options.kinds),families=collectTransitiveFamilies(graph,wanted),value=[],cost={visitedNodes:0,inspectedEdges:0};let truncated=!1;scan:for(const key of[...families.keys()].sort()){const family=families.get(key),adjacency=sortedFamilyAdjacency(family);for(const record of family.records){options.signal?.throwIfAborted();const witness=findWitnessPath(adjacency,record,maxDepth,cost);if(witness!==void 0){if(value.length>=limit){truncated=!0;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,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=!0;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);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",maxDepth=options.maxDepth??Number.POSITIVE_INFINITY,order=[],successors=new Map,state={seen:new Set([root]),queue:[{id:root,depth:0}],predecessors:new Map,truncated:!1};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=[],visited=new Set([root]),stack=[{id:root,index:0}];for(;stack.length>0;){const frame=stack.at(-1),nexts=subgraph.successors.get(frame.id);if(frame.index<nexts.length){const next=nexts[frame.index];frame.index+=1,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,second=right;for(;first!==second;){for(;ordinal.get(first)>ordinal.get(second);)first=idom.get(first);for(;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())idom.has(pred)&&(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=!0;for(;changed;){changed=!1;for(const id of order){if(signal?.throwIfAborted(),id===root)continue;const candidate=dominatorCandidate(subgraph.predecessors.get(id),idom,ordinal);candidate!==void 0&&idom.get(id)!==candidate&&(idom.set(id,candidate),changed=!0)}}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),order=reversePostorder(subgraph,root),ordinal=new Map(order.map((id,index)=>[id,index])),idom=solveImmediateDominators(subgraph,root,order,ordinal,options.signal),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};
|
|
2
2
|
//# sourceMappingURL=analytics.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
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]="06ecc7a4-c593-5d99-89f5-714a4590d0a5")}catch(e2){}})();import{RelationshipGraph}from"../relationships.js";import{isExternalDependencyReference,isExternalDependencySourceKind}from"../dependency-provenance.js";import{analyzeHierarchyIntegrity}from"./hierarchy-integrity.js";import{resolveWorkspaceRelationshipKindRegistry}from"./workspace-relationship-kind-registry.js";import{resolveWorkspaceRelationshipKindRegistry as resolveWorkspaceRelationshipKindRegistry2}from"./workspace-relationship-kind-registry.js";function normalizeDependencyReferenceTarget(target){if(typeof target!=="string")return void 0;const normalized=target.trim();if(!normalized||["none","null","n/a","na"].includes(normalized.toLowerCase()))return void 0;return normalized}function normalizeDependencyGraphTarget(target){const normalized=normalizeDependencyReferenceTarget(target);return normalized?.toLowerCase()==="no-active-blocker"?void 0:normalized}function isExternalGraphReference(target,sourceKind,externalAllowed=true){const normalized=normalizeDependencyReferenceTarget(target);return externalAllowed&&(isExternalDependencySourceKind(sourceKind)||normalized!==void 0&&isExternalDependencyReference(normalized))}function dependencyReferenceIdentityKey(target,sourceKind){return isExternalGraphReference(target,sourceKind)?`external\0${target}`:`local\0${target.toLowerCase()}`}function resolveGraphReferenceTarget(target,sourceKind,canonicalIds,externalGraphIds){return isExternalGraphReference(target,sourceKind)?externalGraphIds.get(target):canonicalIds.get(target.toLowerCase())}function compareCaseFoldedText(left,right){const normalizedLeft=left.toLowerCase();const normalizedRight=right.toLowerCase();if(normalizedLeft!==normalizedRight)return normalizedLeft<normalizedRight?-1:1;if(left!==right)return left<right?-1:1;return 0}function countDependencyRowIdentities(item){const occurrences=new Map;for(const dependency of item.dependencies??[]){if(typeof dependency!=="object"||dependency===null)continue;const legacyDependency=dependency;const target=normalizeDependencyReferenceTarget(legacyDependency.id);if(!target)continue;const kind=typeof legacyDependency.kind==="string"?legacyDependency.kind:"related";const key=`${kind}\0${dependencyReferenceIdentityKey(target,legacyDependency.source_kind)}`;const existing=occurrences.get(key);if(existing)existing.count+=1;else occurrences.set(key,{target_id:target,kind,count:1})}return occurrences}function collectDuplicateDependencyRows(items,isTerminal=status=>status==="closed"||status==="canceled"){const rows=[];for(const item of items){if(typeof item?.id!=="string"||item.id.trim().length===0)continue;for(const entry of countDependencyRowIdentities(item).values()){if(entry.count<2)continue;rows.push({holder_id:item.id.trim(),target_id:entry.target_id,kind:entry.kind,occurrences:entry.count,holder_status:item.status,legacy_terminal:isTerminal(item.status)})}}return rows.sort((left,right)=>{const holderCompare=compareCaseFoldedText(left.holder_id,right.holder_id);if(holderCompare!==0)return holderCompare;const targetCompare=compareCaseFoldedText(left.target_id,right.target_id);if(targetCompare!==0)return targetCompare;return compareCaseFoldedText(left.kind,right.kind)})}function decodeOrderingStorageContradiction(item,blocker,dependency,isTerminal,registry){if(typeof dependency!=="object"||dependency===null)return void 0;const target=normalizeDependencyReferenceTarget(dependency.id);if(!target||dependencyReferenceIdentityKey(target,dependency.source_kind)!==dependencyReferenceIdentityKey(blocker))return void 0;const definition=registry.resolve(typeof dependency.kind==="string"?dependency.kind:"related");if(definition?.ordering!==true||(definition.precedence??"source_before_target")!=="source_before_target")return void 0;return{holder_id:item.id.trim(),target_id:target,dependency_kind:definition.kind,holder_status:item.status,legacy_terminal:isTerminal(item.status)}}function collectOrderingStorageContradictions(items,isTerminal=status=>status==="closed"||status==="canceled",registry=resolveWorkspaceRelationshipKindRegistry()){const contradictions=new Map;for(const item of items){if(typeof item?.id!=="string"||item.id.trim().length===0)continue;const blocker=normalizeDependencyReferenceTarget(item.blocked_by);if(!blocker)continue;for(const dependency of item.dependencies??[]){const row=decodeOrderingStorageContradiction(item,blocker,dependency,isTerminal,registry);if(!row)continue;contradictions.set(`${row.holder_id.toLowerCase()}\0${row.target_id.toLowerCase()}\0${row.dependency_kind}`,row)}}return[...contradictions.values()].sort((left,right)=>{const holderCompare=compareCaseFoldedText(left.holder_id,right.holder_id);if(holderCompare!==0)return holderCompare;const targetCompare=compareCaseFoldedText(left.target_id,right.target_id);if(targetCompare!==0)return targetCompare;return compareCaseFoldedText(left.dependency_kind,right.dependency_kind)})}function collectDanglingDependencyReferences(items,isTerminal=status=>status==="closed"||status==="canceled"){const safeItems=items.filter(item=>typeof item?.id==="string"&&item.id.trim().length>0);const knownIds=new Set(safeItems.map(item=>item.id.trim().toLowerCase()));const rows=new Map;const addReference=(item,target,kind,source,externalAllowed)=>{const normalized=normalizeDependencyReferenceTarget(target);if(!normalized||knownIds.has(normalized.toLowerCase())||isExternalGraphReference(normalized,void 0,externalAllowed)){return}const row={holder_id:item.id.trim(),target_id:normalized,kind,source,holder_status:item.status,legacy_terminal:isTerminal(item.status),no_active_blocker_sentinel:normalized.toLowerCase()==="no-active-blocker"};rows.set(`${row.holder_id}::${row.target_id}::${row.kind}::${row.source}`,row)};for(const item of safeItems){addReference(item,item.parent,"parent","parent",false);addReference(item,item.blocked_by,"blocked_by","blocked_by",true);for(const dependency of item.dependencies??[]){if(typeof dependency!=="object"||dependency===null){continue}const legacyDependency=dependency;if(isExternalDependencySourceKind(legacyDependency.source_kind)){continue}addReference(item,legacyDependency.id,typeof legacyDependency.kind==="string"?legacyDependency.kind:"related","dependency",true)}}const sorted=[...rows.values()].sort((left,right)=>left.holder_id.localeCompare(right.holder_id)||left.target_id.localeCompare(right.target_id)||left.kind.localeCompare(right.kind)||left.source.localeCompare(right.source));const legacyTerminal=sorted.filter(row=>row.legacy_terminal);return{active:sorted.filter(row=>!row.legacy_terminal),legacy_terminal:legacyTerminal,no_active_blocker_sentinels:sorted.filter(row=>row.no_active_blocker_sentinel)}}function collectMissingDependencyTargetIds(dangling){const targets=new Map;for(const reference of[...dangling.active,...dangling.legacy_terminal]){if(reference.no_active_blocker_sentinel)continue;const target=reference.target_id.trim();const key=target.toLowerCase();if(!targets.has(key))targets.set(key,target)}return[...targets.values()].sort((left,right)=>left.localeCompare(right))}function collectExternalDependencyTargetIds(items){const targets=new Map;for(const item of items){const scalarBlocker=normalizeDependencyGraphTarget(item.blocked_by);if(scalarBlocker&&isExternalGraphReference(scalarBlocker)&&!targets.has(scalarBlocker)){targets.set(scalarBlocker,scalarBlocker)}for(const dependency of item.dependencies??[]){if(typeof dependency!=="object"||dependency===null||!isExternalGraphReference(dependency.id,dependency.source_kind)){continue}const id=normalizeDependencyGraphTarget(dependency.id);if(id&&!targets.has(id)){targets.set(id,id)}}}return[...targets.values()].sort((left,right)=>left.localeCompare(right))}const hierarchyIntegrityByAssembly=new WeakMap;function getWorkspaceHierarchyIntegrity(assembly){return assembly.hierarchyIntegrity??hierarchyIntegrityByAssembly.get(assembly)}function collectLegacyDependencyAliasCounts(items,registry=resolveWorkspaceRelationshipKindRegistry()){const counts={};for(const item of items){for(const dependency of item.dependencies??[]){if(typeof dependency!=="object"||dependency===null)continue;const rawKind=dependency.kind;if(typeof rawKind!=="string")continue;const normalized=rawKind.trim().toLowerCase().replaceAll("-","_");const definition=registry.resolve(rawKind);if(definition&&normalized!==definition.kind){counts[normalized]=(counts[normalized]??0)+1}}}return Object.fromEntries(Object.entries(counts).sort(([left],[right])=>left.localeCompare(right)))}function assembleWorkspaceRelationshipGraph(items,isTerminal,registry){const relationshipRegistry=registry??resolveWorkspaceRelationshipKindRegistry();const safeItems=items.filter(item=>typeof item?.id==="string"&&item.id.trim().length>0);const canonicalIds=new Map(safeItems.map(item=>[item.id.trim().toLowerCase(),item.id.trim()]));const dangling=collectDanglingDependencyReferences(safeItems,isTerminal);const missingIds=collectMissingDependencyTargetIds(dangling);for(const id of missingIds)canonicalIds.set(id.toLowerCase(),id);const externalIds=collectExternalDependencyTargetIds(safeItems);const usedGraphIds=new Set(canonicalIds.keys());const externalGraphIds=new Map;for(const id of externalIds){let graphId=id;while(usedGraphIds.has(graphId.toLowerCase())){graphId=`external:${graphId}`}externalGraphIds.set(id,graphId);usedGraphIds.add(graphId.toLowerCase())}const graphItems=safeItems.map(item=>{const parent=normalizeDependencyGraphTarget(item.parent);const blocker=normalizeDependencyGraphTarget(item.blocked_by);const dependencies=(item.dependencies??[]).flatMap(rawDependency=>{if(typeof rawDependency!=="object"||rawDependency===null)return[];const dependency=rawDependency;const target=normalizeDependencyGraphTarget(dependency.id);if(!target)return[];const targetId=resolveGraphReferenceTarget(target,dependency.source_kind,canonicalIds,externalGraphIds);return[{id:targetId,kind:typeof dependency.kind==="string"?dependency.kind:"related"}]});return{id:item.id.trim(),...parent?{parent:canonicalIds.get(parent.toLowerCase())}:{},...blocker?{blocked_by:resolveGraphReferenceTarget(blocker,void 0,canonicalIds,externalGraphIds)}:{},dependencies}});const hierarchyIntegrity=analyzeHierarchyIntegrity(safeItems,isTerminal,relationshipRegistry);const assembly={graph:RelationshipGraph.fromItems([...graphItems,...missingIds.map(id=>({id})),...externalIds.map(id=>({id:externalGraphIds.get(id)}))],relationshipRegistry),details:[...safeItems.map(item=>({id:item.id.trim(),title:item.title,status:item.status,...typeof item.type==="string"&&item.type.trim().length>0?{type:item.type.trim()}:{}})),...missingIds.map(id=>({id,title:`[missing] ${id}`,status:"missing"})),...externalIds.map(id=>({id:externalGraphIds.get(id),title:`[external] ${id}`,status:"external"}))],missingIdSet:new Set(missingIds.map(id=>id.toLowerCase())),dangling,duplicateRows:collectDuplicateDependencyRows(safeItems,isTerminal),orderingContradictions:collectOrderingStorageContradictions(safeItems,isTerminal,relationshipRegistry),legacyAliasCounts:collectLegacyDependencyAliasCounts(safeItems,relationshipRegistry),hierarchyIntegrity};hierarchyIntegrityByAssembly.set(assembly,hierarchyIntegrity);return assembly}export{assembleWorkspaceRelationshipGraph,collectDanglingDependencyReferences,collectDuplicateDependencyRows,collectExternalDependencyTargetIds,collectLegacyDependencyAliasCounts,collectMissingDependencyTargetIds,collectOrderingStorageContradictions,getWorkspaceHierarchyIntegrity,normalizeDependencyGraphTarget,resolveWorkspaceRelationshipKindRegistry2 as resolveWorkspaceRelationshipKindRegistry};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="41f814be-ee87-5cae-b674-69c2e7f42655")}catch{}})();import{RelationshipGraph}from"../relationships.js";import{isExternalDependencyReference,isExternalDependencySourceKind}from"../dependency-provenance.js";import{analyzeHierarchyIntegrity}from"./hierarchy-integrity.js";import{resolveWorkspaceRelationshipKindRegistry}from"./workspace-relationship-kind-registry.js";import{resolveWorkspaceRelationshipKindRegistry as resolveWorkspaceRelationshipKindRegistry2}from"./workspace-relationship-kind-registry.js";function normalizeDependencyReferenceTarget(target){if(typeof target!="string")return;const normalized=target.trim();if(!(!normalized||["none","null","n/a","na"].includes(normalized.toLowerCase())))return normalized}function normalizeDependencyGraphTarget(target){const normalized=normalizeDependencyReferenceTarget(target);return normalized?.toLowerCase()==="no-active-blocker"?void 0:normalized}function isExternalGraphReference(target,sourceKind,externalAllowed=!0){const normalized=normalizeDependencyReferenceTarget(target);return externalAllowed&&(isExternalDependencySourceKind(sourceKind)||normalized!==void 0&&isExternalDependencyReference(normalized))}function dependencyReferenceIdentityKey(target,sourceKind){return isExternalGraphReference(target,sourceKind)?`external\0${target}`:`local\0${target.toLowerCase()}`}function resolveGraphReferenceTarget(target,sourceKind,canonicalIds,externalGraphIds){return isExternalGraphReference(target,sourceKind)?externalGraphIds.get(target):canonicalIds.get(target.toLowerCase())}function compareCaseFoldedText(left,right){const normalizedLeft=left.toLowerCase(),normalizedRight=right.toLowerCase();return normalizedLeft!==normalizedRight?normalizedLeft<normalizedRight?-1:1:left!==right?left<right?-1:1:0}function countDependencyRowIdentities(item){const occurrences=new Map;for(const dependency of item.dependencies??[]){if(typeof dependency!="object"||dependency===null)continue;const legacyDependency=dependency,target=normalizeDependencyReferenceTarget(legacyDependency.id);if(!target)continue;const kind=typeof legacyDependency.kind=="string"?legacyDependency.kind:"related",key=`${kind}\0${dependencyReferenceIdentityKey(target,legacyDependency.source_kind)}`,existing=occurrences.get(key);existing?existing.count+=1:occurrences.set(key,{target_id:target,kind,count:1})}return occurrences}function collectDuplicateDependencyRows(items,isTerminal=status=>status==="closed"||status==="canceled"){const rows=[];for(const item of items)if(!(typeof item?.id!="string"||item.id.trim().length===0))for(const entry of countDependencyRowIdentities(item).values())entry.count<2||rows.push({holder_id:item.id.trim(),target_id:entry.target_id,kind:entry.kind,occurrences:entry.count,holder_status:item.status,legacy_terminal:isTerminal(item.status)});return rows.sort((left,right)=>{const holderCompare=compareCaseFoldedText(left.holder_id,right.holder_id);if(holderCompare!==0)return holderCompare;const targetCompare=compareCaseFoldedText(left.target_id,right.target_id);return targetCompare!==0?targetCompare:compareCaseFoldedText(left.kind,right.kind)})}function decodeOrderingStorageContradiction(item,blocker,dependency,isTerminal,registry){if(typeof dependency!="object"||dependency===null)return;const target=normalizeDependencyReferenceTarget(dependency.id);if(!target||dependencyReferenceIdentityKey(target,dependency.source_kind)!==dependencyReferenceIdentityKey(blocker))return;const definition=registry.resolve(typeof dependency.kind=="string"?dependency.kind:"related");if(!(definition?.ordering!==!0||(definition.precedence??"source_before_target")!=="source_before_target"))return{holder_id:item.id.trim(),target_id:target,dependency_kind:definition.kind,holder_status:item.status,legacy_terminal:isTerminal(item.status)}}function collectOrderingStorageContradictions(items,isTerminal=status=>status==="closed"||status==="canceled",registry=resolveWorkspaceRelationshipKindRegistry()){const contradictions=new Map;for(const item of items){if(typeof item?.id!="string"||item.id.trim().length===0)continue;const blocker=normalizeDependencyReferenceTarget(item.blocked_by);if(blocker)for(const dependency of item.dependencies??[]){const row=decodeOrderingStorageContradiction(item,blocker,dependency,isTerminal,registry);row&&contradictions.set(`${row.holder_id.toLowerCase()}\0${row.target_id.toLowerCase()}\0${row.dependency_kind}`,row)}}return[...contradictions.values()].sort((left,right)=>{const holderCompare=compareCaseFoldedText(left.holder_id,right.holder_id);if(holderCompare!==0)return holderCompare;const targetCompare=compareCaseFoldedText(left.target_id,right.target_id);return targetCompare!==0?targetCompare:compareCaseFoldedText(left.dependency_kind,right.dependency_kind)})}function collectDanglingDependencyReferences(items,isTerminal=status=>status==="closed"||status==="canceled"){const safeItems=items.filter(item=>typeof item?.id=="string"&&item.id.trim().length>0),knownIds=new Set(safeItems.map(item=>item.id.trim().toLowerCase())),rows=new Map,addReference=(item,target,kind,source,externalAllowed)=>{const normalized=normalizeDependencyReferenceTarget(target);if(!normalized||knownIds.has(normalized.toLowerCase())||isExternalGraphReference(normalized,void 0,externalAllowed))return;const row={holder_id:item.id.trim(),target_id:normalized,kind,source,holder_status:item.status,legacy_terminal:isTerminal(item.status),no_active_blocker_sentinel:normalized.toLowerCase()==="no-active-blocker"};rows.set(`${row.holder_id}::${row.target_id}::${row.kind}::${row.source}`,row)};for(const item of safeItems){addReference(item,item.parent,"parent","parent",!1),addReference(item,item.blocked_by,"blocked_by","blocked_by",!0);for(const dependency of item.dependencies??[]){if(typeof dependency!="object"||dependency===null)continue;const legacyDependency=dependency;isExternalDependencySourceKind(legacyDependency.source_kind)||addReference(item,legacyDependency.id,typeof legacyDependency.kind=="string"?legacyDependency.kind:"related","dependency",!0)}}const sorted=[...rows.values()].sort((left,right)=>left.holder_id.localeCompare(right.holder_id)||left.target_id.localeCompare(right.target_id)||left.kind.localeCompare(right.kind)||left.source.localeCompare(right.source)),legacyTerminal=sorted.filter(row=>row.legacy_terminal);return{active:sorted.filter(row=>!row.legacy_terminal),legacy_terminal:legacyTerminal,no_active_blocker_sentinels:sorted.filter(row=>row.no_active_blocker_sentinel)}}function collectMissingDependencyTargetIds(dangling){const targets=new Map;for(const reference of[...dangling.active,...dangling.legacy_terminal]){if(reference.no_active_blocker_sentinel)continue;const target=reference.target_id.trim(),key=target.toLowerCase();targets.has(key)||targets.set(key,target)}return[...targets.values()].sort((left,right)=>left.localeCompare(right))}function collectExternalDependencyTargetIds(items){const targets=new Map;for(const item of items){const scalarBlocker=normalizeDependencyGraphTarget(item.blocked_by);scalarBlocker&&isExternalGraphReference(scalarBlocker)&&!targets.has(scalarBlocker)&&targets.set(scalarBlocker,scalarBlocker);for(const dependency of item.dependencies??[]){if(typeof dependency!="object"||dependency===null||!isExternalGraphReference(dependency.id,dependency.source_kind))continue;const id=normalizeDependencyGraphTarget(dependency.id);id&&!targets.has(id)&&targets.set(id,id)}}return[...targets.values()].sort((left,right)=>left.localeCompare(right))}const hierarchyIntegrityByAssembly=new WeakMap;function getWorkspaceHierarchyIntegrity(assembly){return assembly.hierarchyIntegrity??hierarchyIntegrityByAssembly.get(assembly)}function collectLegacyDependencyAliasCounts(items,registry=resolveWorkspaceRelationshipKindRegistry()){const counts={};for(const item of items)for(const dependency of item.dependencies??[]){if(typeof dependency!="object"||dependency===null)continue;const rawKind=dependency.kind;if(typeof rawKind!="string")continue;const normalized=rawKind.trim().toLowerCase().replaceAll("-","_"),definition=registry.resolve(rawKind);definition&&normalized!==definition.kind&&(counts[normalized]=(counts[normalized]??0)+1)}return Object.fromEntries(Object.entries(counts).sort(([left],[right])=>left.localeCompare(right)))}function assembleWorkspaceRelationshipGraph(items,isTerminal,registry){const relationshipRegistry=registry??resolveWorkspaceRelationshipKindRegistry(),safeItems=items.filter(item=>typeof item?.id=="string"&&item.id.trim().length>0),canonicalIds=new Map(safeItems.map(item=>[item.id.trim().toLowerCase(),item.id.trim()])),dangling=collectDanglingDependencyReferences(safeItems,isTerminal),missingIds=collectMissingDependencyTargetIds(dangling);for(const id of missingIds)canonicalIds.set(id.toLowerCase(),id);const externalIds=collectExternalDependencyTargetIds(safeItems),usedGraphIds=new Set(canonicalIds.keys()),externalGraphIds=new Map;for(const id of externalIds){let graphId=id;for(;usedGraphIds.has(graphId.toLowerCase());)graphId=`external:${graphId}`;externalGraphIds.set(id,graphId),usedGraphIds.add(graphId.toLowerCase())}const graphItems=safeItems.map(item=>{const parent=normalizeDependencyGraphTarget(item.parent),blocker=normalizeDependencyGraphTarget(item.blocked_by),dependencies=(item.dependencies??[]).flatMap(rawDependency=>{if(typeof rawDependency!="object"||rawDependency===null)return[];const dependency=rawDependency,target=normalizeDependencyGraphTarget(dependency.id);return target?[{id:resolveGraphReferenceTarget(target,dependency.source_kind,canonicalIds,externalGraphIds),kind:typeof dependency.kind=="string"?dependency.kind:"related"}]:[]});return{id:item.id.trim(),...parent?{parent:canonicalIds.get(parent.toLowerCase())}:{},...blocker?{blocked_by:resolveGraphReferenceTarget(blocker,void 0,canonicalIds,externalGraphIds)}:{},dependencies}}),hierarchyIntegrity=analyzeHierarchyIntegrity(safeItems,isTerminal,relationshipRegistry),assembly={graph:RelationshipGraph.fromItems([...graphItems,...missingIds.map(id=>({id})),...externalIds.map(id=>({id:externalGraphIds.get(id)}))],relationshipRegistry),details:[...safeItems.map(item=>({id:item.id.trim(),title:item.title,status:item.status,...typeof item.type=="string"&&item.type.trim().length>0?{type:item.type.trim()}:{}})),...missingIds.map(id=>({id,title:`[missing] ${id}`,status:"missing"})),...externalIds.map(id=>({id:externalGraphIds.get(id),title:`[external] ${id}`,status:"external"}))],missingIdSet:new Set(missingIds.map(id=>id.toLowerCase())),dangling,duplicateRows:collectDuplicateDependencyRows(safeItems,isTerminal),orderingContradictions:collectOrderingStorageContradictions(safeItems,isTerminal,relationshipRegistry),legacyAliasCounts:collectLegacyDependencyAliasCounts(safeItems,relationshipRegistry),hierarchyIntegrity};return hierarchyIntegrityByAssembly.set(assembly,hierarchyIntegrity),assembly}export{assembleWorkspaceRelationshipGraph,collectDanglingDependencyReferences,collectDuplicateDependencyRows,collectExternalDependencyTargetIds,collectLegacyDependencyAliasCounts,collectMissingDependencyTargetIds,collectOrderingStorageContradictions,getWorkspaceHierarchyIntegrity,normalizeDependencyGraphTarget,resolveWorkspaceRelationshipKindRegistry2 as resolveWorkspaceRelationshipKindRegistry};
|
|
2
2
|
//# sourceMappingURL=assembly.js.map
|
package/dist/sdk/graph/cache.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e31ef0fb-e803-500b-b1e5-db9edfc880c4")}catch{}})();import{createHash}from"node:crypto";import{stableStringify}from"../../core/shared/serialization.js";import{createRelationshipKindRegistry}from"../relationships.js";const DEFAULT_MAX_RESULTS_PER_WORKSPACE=64,DEFAULT_MAX_WORKSPACES=8;function fingerprintLine(item,isTerminal){const dependencies=(item.dependencies??[]).map(rawDependency=>{if(typeof rawDependency!="object"||rawDependency===null)return"";const dependency=rawDependency;return`${typeof dependency.kind=="string"?dependency.kind:"related"}:${typeof dependency.id=="string"?dependency.id:""}`}).sort().join(",");return[item.id,item.title,item.status,isTerminal(item.status)?"1":"0",typeof item.type=="string"?item.type.trim():"",item.parent??"",item.blocked_by??"",dependencies].join("\0")}function computeWorkspaceGraphFingerprint(items,isTerminal=status=>status==="closed"||status==="canceled",registry=createRelationshipKindRegistry()){const lines=items.filter(item=>typeof item?.id=="string"&&item.id.trim().length>0).map(item=>fingerprintLine(item,isTerminal)).sort(),relationshipSemantics=registry.list().map(definition=>stableStringify(definition)).sort();return createHash("sha256").update(lines.join("")).update("").update(relationshipSemantics.join("")).digest("hex")}function requirePositiveCacheBound(name,value,fallback){const bound=value??fallback;if(!Number.isInteger(bound)||bound<1)throw new TypeError(`Invalid ${name} bound: ${String(value)}`);return bound}class WorkspaceGraphCache{#entries=new Map;#maxResultsPerWorkspace;#maxWorkspaces;constructor(options={}){this.#maxResultsPerWorkspace=requirePositiveCacheBound("maxResultsPerWorkspace",options.maxResultsPerWorkspace,DEFAULT_MAX_RESULTS_PER_WORKSPACE),this.#maxWorkspaces=requirePositiveCacheBound("maxWorkspaces",options.maxWorkspaces,DEFAULT_MAX_WORKSPACES)}lookup(key,fingerprint,build){let entry=this.#entries.get(key),assemblyReused=!0;(entry===void 0||entry.fingerprint!==fingerprint)&&(entry={fingerprint,assembly:build(),results:new Map},assemblyReused=!1,!this.#entries.has(key)&&this.#entries.size>=this.#maxWorkspaces&&this.#entries.delete(this.#entries.keys().next().value)),this.#entries.delete(key),this.#entries.set(key,entry);const resolved=entry,maxResults=this.#maxResultsPerWorkspace;return{assembly:resolved.assembly,assemblyReused,fingerprint,memoize(queryKey,compute){const cached=resolved.results.get(queryKey);if(cached!==void 0||resolved.results.has(queryKey))return resolved.results.delete(queryKey),resolved.results.set(queryKey,cached),{value:structuredClone(cached),reused:!0};const value=compute();return resolved.results.size>=maxResults&&resolved.results.delete(resolved.results.keys().next().value),resolved.results.set(queryKey,structuredClone(value)),{value,reused:!1}}}}clear(){this.#entries.clear()}}const sharedCache=new WorkspaceGraphCache;function workspaceGraphCache(){return sharedCache}function resetWorkspaceGraphCache(){sharedCache.clear()}export{WorkspaceGraphCache,computeWorkspaceGraphFingerprint,resetWorkspaceGraphCache,workspaceGraphCache};
|
|
2
2
|
//# sourceMappingURL=cache.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3cef3a97-fda4-5811-9e69-04ff722e40a1")}catch{}})();import{forEachMatchedRelationshipEdge}from"./analytics.js";import{orientOrderingEdge}from"./traversal.js";function roundScore(value){return Math.round(value*1e6)/1e6}function addToSetMap(map,key,value){const set=map.get(key);set===void 0?map.set(key,new Set([value])):set.add(value)}function buildSimpleUndirectedAdjacency(graph,kinds){const sets=new Map(graph.nodes().map(id=>[id,new Set]));forEachMatchedRelationshipEdge(graph,kinds,edge=>{sets.get(edge.source).add(edge.target),sets.get(edge.target).add(edge.source)});const adjacency=new Map;for(const[id,neighbors]of sets)adjacency.set(id,[...neighbors].sort());return adjacency}function collectOrderingDegrees(graph,kinds){const incoming=new Map,outgoing=new Map;return forEachMatchedRelationshipEdge(graph,kinds,(edge,definition)=>{if(!definition.ordering)return;const{predecessor,successor}=orientOrderingEdge(edge,definition);addToSetMap(outgoing,predecessor,successor),addToSetMap(incoming,successor,predecessor)}),{incoming,outgoing}}function brandesShortestPaths(source,adjacency,cost){const distance=new Map([[source,0]]),sigma=new Map([[source,1]]),predecessors=new Map,stack=[],queue=[source];let reachableCount=0,distanceSum=0;for(let index=0;index<queue.length;index+=1){const node=queue[index];cost.visitedNodes+=1,stack.push(node);const nodeDistance=distance.get(node);node!==source&&(reachableCount+=1,distanceSum+=nodeDistance);for(const neighbor of adjacency.get(node))if(cost.inspectedEdges+=1,distance.has(neighbor)||(distance.set(neighbor,nodeDistance+1),queue.push(neighbor)),distance.get(neighbor)===nodeDistance+1){sigma.set(neighbor,(sigma.get(neighbor)??0)+sigma.get(node));const predecessorList=predecessors.get(neighbor);predecessorList===void 0?predecessors.set(neighbor,[node]):predecessorList.push(node)}}return{stack,sigma,predecessors,reachableCount,distanceSum}}function accumulateBetweenness(sweep,source,betweenness){const dependency=new Map;for(let index=sweep.stack.length-1;index>=0;index-=1){const node=sweep.stack[index],share=(1+(dependency.get(node)??0))/sweep.sigma.get(node);for(const predecessor of sweep.predecessors.get(node)??[])dependency.set(predecessor,(dependency.get(predecessor)??0)+sweep.sigma.get(predecessor)*share);node!==source&&betweenness.set(node,(betweenness.get(node)??0)+(dependency.get(node)??0))}}function wassermanFaustCloseness(sweep,nodeCount){return nodeCount<=1||sweep.reachableCount===0?0:sweep.reachableCount/(nodeCount-1)*(sweep.reachableCount/sweep.distanceSum)}function centralityRow(id,adjacency,directed,betweenness,closeness){return{id,degree:adjacency.get(id).length,inDegree:directed.incoming.get(id)?.size??0,outDegree:directed.outgoing.get(id)?.size??0,betweenness:roundScore((betweenness.get(id)??0)/2),closeness:roundScore(closeness.get(id))}}function computeRelationshipCentrality(graph,options={}){const adjacency=buildSimpleUndirectedAdjacency(graph,options.kinds),directed=collectOrderingDegrees(graph,options.kinds),nodes=graph.nodes(),betweenness=new Map,closeness=new Map,cost={visitedNodes:0,inspectedEdges:0};for(const source of nodes){options.signal?.throwIfAborted();const sweep=brandesShortestPaths(source,adjacency,cost);closeness.set(source,wassermanFaustCloseness(sweep,nodes.length)),accumulateBetweenness(sweep,source,betweenness)}let degreeSum=0;for(const neighbors of adjacency.values())degreeSum+=neighbors.length;const rows=nodes.map(id=>centralityRow(id,adjacency,directed,betweenness,closeness)).sort((left,right)=>right.betweenness-left.betweenness||right.degree-left.degree||left.id.localeCompare(right.id));return{value:{nodeCount:nodes.length,edgeCount:degreeSum/2,rows},meta:{visitedNodes:cost.visitedNodes,inspectedEdges:cost.inspectedEdges,truncated:!1}}}function orderedBridge(left,right){return left<=right?{source:left,target:right}:{source:right,target:left}}function advanceCutFrame(frame,adjacency,state){const neighbor=adjacency.get(frame.node)[frame.neighborIndex];if(frame.neighborIndex+=1,state.inspectedEdges+=1,neighbor!==frame.parent){if(state.discovery.has(neighbor)){state.low.set(frame.node,Math.min(state.low.get(frame.node),state.discovery.get(neighbor)));return}return frame.children+=1,state.discovery.set(neighbor,state.timer),state.low.set(neighbor,state.timer),state.timer+=1,{node:neighbor,parent:frame.node,neighborIndex:0,children:0}}}function retreatCutFrame(frame,root,state){if(frame.parent===null){frame.children>1&&state.articulation.add(frame.node);return}const parent=frame.parent,childLow=state.low.get(frame.node);state.low.set(parent,Math.min(state.low.get(parent),childLow)),parent!==root&&childLow>=state.discovery.get(parent)&&state.articulation.add(parent),childLow>state.discovery.get(parent)&&state.bridges.push(orderedBridge(parent,frame.node))}function searchComponentCuts(root,adjacency,state,signal){state.discovery.set(root,state.timer),state.low.set(root,state.timer),state.timer+=1;const stack=[{node:root,parent:null,neighborIndex:0,children:0}];for(;stack.length>0;){signal?.throwIfAborted();const frame=stack.at(-1);if(frame.neighborIndex<adjacency.get(frame.node).length){const child=advanceCutFrame(frame,adjacency,state);child!==void 0&&stack.push(child)}else retreatCutFrame(frame,root,state),stack.pop()}}function findRelationshipCutStructure(graph,options={}){const adjacency=buildSimpleUndirectedAdjacency(graph,options.kinds),state={discovery:new Map,low:new Map,timer:0,articulation:new Set,bridges:[],inspectedEdges:0};for(const root of graph.nodes())state.discovery.has(root)||searchComponentCuts(root,adjacency,state,options.signal);return{value:{articulationPoints:[...state.articulation].sort(),bridges:state.bridges.sort((left,right)=>left.source.localeCompare(right.source)||left.target.localeCompare(right.target))},meta:{visitedNodes:state.discovery.size,inspectedEdges:state.inspectedEdges,truncated:!1}}}export{computeRelationshipCentrality,findRelationshipCutStructure};
|
|
2
2
|
//# sourceMappingURL=centrality.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e47f9bb8-f98e-5159-9116-29c3e6fedfc3")}catch{}})();import{MemoryRelationshipGraphAdapter,createRelationshipGraphSnapshot,loadRelationshipGraphAdapter,syncRelationshipGraphAdapter}from"./adapter.js";import{RelationshipGraph,createRelationshipKindRegistry}from"../relationships.js";function positiveInteger(value,field){if(!Number.isInteger(value)||value<1)throw new TypeError(`Relationship graph ${field} must be a positive integer`);return value}function createRelationshipGraphScaleFixture(options){const nodeCount=positiveInteger(options.nodeCount,"nodeCount"),edgeStride=positiveInteger(options.edgeStride??1,"edgeStride"),topology=options.topology??"chain";if(!["chain","star","disconnected"].includes(topology))throw new TypeError(`Unsupported relationship graph topology: ${topology}`);const kind=(options.kind??"related").trim(),idPrefix=(options.idPrefix??"node").trim();if(!kind||!idPrefix)throw new TypeError("Relationship graph kind and idPrefix must be non-empty");const edgeCount=topology==="disconnected"?0:Math.floor((nodeCount-1)/edgeStride);return{node_count:nodeCount,edge_count:edgeCount,edge_basis:"fixture_generated",nodes:{*[Symbol.iterator](){for(let index=0;index<nodeCount;index+=1)yield`${idPrefix}-${index}`}},edges:{*[Symbol.iterator](){if(topology!=="disconnected")for(let index=edgeStride;index<nodeCount;index+=edgeStride)yield{source:`${idPrefix}-${topology==="star"?0:index-edgeStride}`,target:`${idPrefix}-${index}`,kind}}}}}function assertConformance(condition,message){if(!condition)throw new Error(`Relationship graph adapter conformance: ${message}`)}async function assertRelationshipGraphAdapterConformance(adapter,options={}){const workspace=options.workspace?.trim()||"pm-graph-conformance",registry=createRelationshipKindRegistry(),first=createRelationshipGraphSnapshot(new RelationshipGraph(["a","b"],[{source:"a",target:"b",kind:"related"}],registry),registry,{createdAt:"2026-01-01T00:00:00.000Z"}),second=createRelationshipGraphSnapshot(new RelationshipGraph(["a","b","c"],[{source:"a",target:"b",kind:"related"},{source:"b",target:"c",kind:"blocked_by"}],registry),registry,{createdAt:"2026-01-02T00:00:00.000Z"}),cases=[];assertConformance(await loadRelationshipGraphAdapter(adapter,{workspace})===null,"workspace must start empty"),cases.push({name:"empty-read",passed:!0});const written=await syncRelationshipGraphAdapter(adapter,{workspace,snapshot:first});assertConformance(written.disposition==="written","first sync must write"),cases.push({name:"atomic-replace",passed:!0}),(await adapter.read({workspace})).nodes.push("mutated-reader-copy"),assertConformance((await loadRelationshipGraphAdapter(adapter,{workspace}))?.snapshot.nodes.length===2,"reads must not mutate stored state"),cases.push({name:"read-isolation",passed:!0}),assertConformance((await syncRelationshipGraphAdapter(adapter,{workspace,snapshot:first})).disposition==="current","identical sync must be idempotent"),cases.push({name:"idempotent-sync",passed:!0}),await adapter.replace({workspace,snapshot:second,expected_fingerprint:first.fingerprint}),assertConformance((await loadRelationshipGraphAdapter(adapter,{workspace}))?.snapshot.fingerprint===second.fingerprint,"replacement must become visible"),cases.push({name:"replacement-visibility",passed:!0});let conflict=!1;try{await adapter.replace({workspace,snapshot:first,expected_fingerprint:first.fingerprint})}catch{conflict=!0}return assertConformance(conflict,"stale compare-and-swap must fail"),cases.push({name:"stale-cas",passed:!0}),adapter.clear&&(await adapter.clear({workspace,expected_fingerprint:second.fingerprint}),assertConformance(await loadRelationshipGraphAdapter(adapter,{workspace})===null,"clear must remove the workspace"),cases.push({name:"clear",passed:!0})),{adapter:adapter.name,workspace,cases:Object.freeze(cases),clear_supported:adapter.clear!==void 0}}function assertMemoryRelationshipGraphAdapterConformance(workspace){return assertRelationshipGraphAdapterConformance(new MemoryRelationshipGraphAdapter,workspace?{workspace}:{})}export{assertMemoryRelationshipGraphAdapterConformance,assertRelationshipGraphAdapterConformance,createRelationshipGraphScaleFixture};
|
|
2
2
|
//# sourceMappingURL=conformance.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="fa17672a-97a2-5f94-bdfe-9df970cc038b")}catch{}})();import{orientOrderingEdge}from"./traversal.js";function propagateLatest(order,states,signal){for(let index=order.length-1;index>=0;index-=1){signal?.throwIfAborted();const state=states.get(order[index]);for(const id of state.successors){signal?.throwIfAborted();const successor=states.get(id);if(successor.latest===void 0||successor.duration===void 0)continue;const finish=successor.latest-successor.duration;(state.latest===void 0||finish<state.latest)&&(state.latest=finish,state.anchor=successor.anchor)}}}function deadlinePath(id,states,limit,signal){const reverse=[];let current=id;for(;current!==void 0&&reverse.length<limit;)signal?.throwIfAborted(),reverse.push(current),current=states.get(current).predecessor;return reverse.reverse(),{path:reverse,path_truncated:current!==void 0}}function initializeStates(nodes,items,now,residual,signal){const inputs=new Map(items.map(item=>[item.id,item])),states=new Map;for(const id of nodes){signal?.throwIfAborted();const item=inputs.get(id),estimate=item?.estimated_minutes,duration=typeof estimate=="number"&&Number.isFinite(estimate)&&estimate>=0?estimate:void 0,state={item,duration,pending:0,successors:new Set,earliest:0};if(item?.deadline!==void 0){const date=Date.parse(item.deadline);Number.isFinite(date)?(state.deadline=(date-now)/6e4,state.latest=state.deadline,state.anchor=id):residual(id,"invalid_deadline")}states.set(id,state)}return states}function indexScheduleEdges(graph,states,signal){for(const edge of graph.edges()){signal?.throwIfAborted();const definition=graph.registry().require(edge.kind);if(!definition.ordering)continue;const{predecessor,successor}=orientOrderingEdge(edge,definition),source=states.get(predecessor);source.successors.has(successor)||(source.successors.add(successor),states.get(successor).pending+=1)}}function propagateEarliest(nodes,states,signal){const order=nodes.filter(id=>states.get(id).pending===0);for(let index=0;index<order.length;index+=1){signal?.throwIfAborted();const id=order[index],state=states.get(id),finish=state.earliest===null||state.duration===void 0?null:state.earliest+state.duration;for(const next of state.successors){signal?.throwIfAborted();const target=states.get(next);finish===null?target.earliest=null:target.earliest!==null&&(finish>target.earliest||finish===target.earliest&&(target.predecessor===void 0||id<target.predecessor))&&(target.earliest=finish,target.predecessor=id),target.pending-=1,target.pending===0&&order.push(next)}}return order}function collectDatedState(id,state,states,result,now,limit,pathBudget,signal){const duration=state.duration;if(state.latest!==void 0){result.scheduled_count+=1;const latest=state.latest-duration;result.rows.length<limit?result.rows.push({id,deadline_id:state.anchor,latest_start:new Date(now+latest*6e4).toISOString(),slack_minutes:state.earliest===null?null:latest-state.earliest}):result.truncated=!0}if(state.deadline!==void 0&&state.earliest!==null&&state.earliest+duration>state.deadline)if(result.overcommitted_count+=1,result.overcommitted.length<limit){const evidence=deadlinePath(id,states,Math.min(limit,pathBudget.remaining),signal);pathBudget.remaining-=evidence.path.length,evidence.path_truncated&&(result.truncated=!0),result.overcommitted.push({deadline_id:id,deadline:state.item.deadline,shortfall_minutes:state.earliest+duration-state.deadline,...evidence})}else result.truncated=!0}function collectScheduleResult(nodes,states,result,now,limit,maxPathEntries,residual,signal){const pathBudget={remaining:maxPathEntries};for(const id of nodes){signal?.throwIfAborted();const state=states.get(id);if(state.pending>0){residual(id,"cycle_or_gated_by_cycle");continue}if(state.duration===void 0){residual(id,"unknown_estimate");continue}if(state.latest!==void 0&&!Number.isFinite(new Date(now+(state.latest-state.duration)*6e4).getTime())){residual(id,"date_range_exceeded");continue}state.earliest===null&&residual(id,"unknown_predecessor_estimate"),collectDatedState(id,state,states,result,now,limit,pathBudget,signal)}}function deriveRelationshipDeadlines(graph,items,options={}){options.signal?.throwIfAborted();const now=Date.parse(options.now??new Date().toISOString());if(!Number.isFinite(now))throw new TypeError("Invalid scheduling clock");const maxWork=options.maxWork??1e5,limit=options.limit??10;for(const[name,value]of[["maxWork",maxWork],["limit",limit]])if(!Number.isSafeInteger(value)||value<1)throw new TypeError(`Invalid scheduling ${name}`);const result={as_of:new Date(now).toISOString(),basis:"derived_elapsed_minutes",complete:!0,truncated:!1,work_limit_exceeded:!1,scheduled_count:0,residual_count:0,overcommitted_count:0,rows:[],residuals:[],overcommitted:[]},nodes=graph.nodes(),edges=graph.edges();if(nodes.length+edges.length+items.length>maxWork)return{...result,complete:!1,work_limit_exceeded:!0};const residual=(id,reason)=>{result.complete=!1,result.residual_count+=1,result.residuals.length<limit?result.residuals.push({id,reason}):result.truncated=!0},states=initializeStates(nodes,items,now,residual,options.signal);indexScheduleEdges(graph,states,options.signal);const order=propagateEarliest(nodes,states,options.signal);return propagateLatest(order,states,options.signal),collectScheduleResult(nodes,states,result,now,limit,maxWork,residual,options.signal),result}export{deriveRelationshipDeadlines};
|
|
2
2
|
//# sourceMappingURL=deadline-scheduling.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e5089f2d-3fc5-5843-95ab-ba3dd2ab9582")}catch{}})();import path from"node:path";import{readFileIfExists,removeFileIfExists,writeFileAtomic}from"../../core/fs/fs-utils.js";import{acquireLock}from"../../core/lock/lock.js";import{isSemanticContextKind}from"./governance.js";import{RELATIONSHIP_AUDIT_FINDING_CODES}from"./governance-contracts.js";import{validLifecycleSnapshot}from"./lifecycle-coverage.js";const GRAPH_DURABLE_CACHE_VERSION=2,GRAPH_DURABLE_CACHE_MIN_ITEMS=500,MAX_DURABLE_RESULTS=64,DURABLE_GRAPH_CACHE_LOCK_ID="graph-durable-cache";function acquireDurableGraphCacheLock(pmRoot){return acquireLock(pmRoot,DURABLE_GRAPH_CACHE_LOCK_ID,30,`graph-cache:${process.pid}`,!1,!1,3e3)}function durableGraphCachePath(pmRoot){return path.join(pmRoot,"runtime","graph-cache.json")}function graphAuditBaselinePath(pmRoot){return path.join(pmRoot,"runtime","graph-audit-baseline.json")}function decodeEnvelope(raw){if(raw!==null)try{const parsed=JSON.parse(raw);return typeof parsed!="object"||parsed===null||parsed.version!==GRAPH_DURABLE_CACHE_VERSION||typeof parsed.fingerprint!="string"||typeof parsed.saved_at!="string"||typeof parsed.results!="object"||parsed.results===null||Array.isArray(parsed.results)?void 0:parsed}catch{return}}async function openDurableGraphCache(pmRoot,fingerprint){const raw=await readFileIfExists(durableGraphCachePath(pmRoot)),envelope=decodeEnvelope(raw),fresh=envelope?.fingerprint===fingerprint;return{exists:raw!==null,fresh,results:fresh?envelope.results:{}}}async function persistDurableGraphResult(pmRoot,fingerprint,view,queryKey,result){const release=await acquireDurableGraphCacheLock(pmRoot);try{const envelope=decodeEnvelope(await readFileIfExists(durableGraphCachePath(pmRoot))),results=envelope?.fingerprint===fingerprint?envelope.results:{};delete results[queryKey],results[queryKey]=result;const keys=Object.keys(results);for(const stale of keys.slice(0,Math.max(0,keys.length-MAX_DURABLE_RESULTS)))delete results[stale];await writeFileAtomic(durableGraphCachePath(pmRoot),JSON.stringify({version:GRAPH_DURABLE_CACHE_VERSION,fingerprint,saved_at:new Date().toISOString(),results})),view.results=results}finally{await release()}}async function clearDurableGraphCache(pmRoot){const release=await acquireDurableGraphCacheLock(pmRoot);try{await removeFileIfExists(durableGraphCachePath(pmRoot))}finally{await release()}}async function durableGraphCacheStatus(pmRoot,fingerprint){const cachePath=durableGraphCachePath(pmRoot),raw=await readFileIfExists(cachePath),envelope=decodeEnvelope(raw);return envelope===void 0?{exists:raw!==null,fresh:!1,entry_count:0}:{exists:!0,fresh:envelope.fingerprint===fingerprint,entry_count:Object.keys(envelope.results).length,fingerprint:envelope.fingerprint.slice(0,12),saved_at:envelope.saved_at,bytes:Buffer.byteLength(raw,"utf8")}}function shouldPersistDurableGraphCache(itemCount,envelopeExists){return envelopeExists||itemCount>=GRAPH_DURABLE_CACHE_MIN_ITEMS}function isNonnegativeCountRecord(value){return isRecord(value)&&Object.values(value).every(isNonnegativeInteger)}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function isNonnegativeInteger(value){return Number.isInteger(value)&&Number(value)>=0}function isUnitShare(value){return typeof value=="number"&&Number.isFinite(value)&&value>=0&&value<=1}function isOptionalValid(value,validate){return value===void 0||validate(value)}function isUnitShareRecord(value){return isRecord(value)&&Object.values(value).every(isUnitShare)}function isNonnegativeCoverageByTypeRecord(value){return isRecord(value)?Object.values(value).every(entry=>isRecord(entry)&&[entry.active,entry.isolated,entry.degree_leq_one].every(isNonnegativeInteger)):!1}function decodeInformativeProfile(profile,nodes,edges){const fields=["recorded_nodes","informative_edges","redundant_edges","ordering_contradiction_edges"],presentCount=fields.filter(field=>profile[field]!==void 0).length;if(presentCount!==0&&presentCount!==fields.length||!fields.every(field=>isOptionalValid(profile[field],isNonnegativeInteger)))return;const decoded={recorded_nodes:profile.recorded_nodes??nodes,informative_edges:profile.informative_edges??edges,redundant_edges:profile.redundant_edges??0,ordering_contradiction_edges:profile.ordering_contradiction_edges??0};return decoded.recorded_nodes<=nodes&&decoded.informative_edges<=edges&&decoded.redundant_edges<=edges&&decoded.ordering_contradiction_edges<=edges?decoded:void 0}function hasValidStructuralFields(profile,countFields,rateFields){const introducedFields=[...countFields,...rateFields,"finding_subjects_by_code"],presentCount=introducedFields.filter(field=>profile[field]!==void 0).length;return presentCount!==0&&presentCount!==introducedFields.length?!1:countFields.every(field=>isOptionalValid(profile[field],isNonnegativeInteger))&&rateFields.every(field=>isOptionalValid(profile[field],isNonnegativeInteger)&&(profile[field]===void 0||Number(profile[field])<=1e4))&&isOptionalValid(profile.finding_subjects_by_code,isNonnegativeCountRecord)}function decodeStructuralProfile(profile,affectedSubjectsByCode,nodes,edges){const informative=decodeInformativeProfile(profile,nodes,edges);if(informative===void 0)return;const countFields=["articulation_points","bridge_edges","outcome_nodes","active_outcome_reachable_nodes","active_outcome_unreachable_nodes","terminal_nodes","terminal_outcome_reachable_nodes","terminal_outcome_unreachable_nodes","outcome_reachable_nodes","outcome_unreachable_nodes"],rateFields=["active_outcome_reachability_basis_points","terminal_outcome_reachability_basis_points","outcome_reachability_basis_points"];if(!hasValidStructuralFields(profile,countFields,rateFields)||profile.edge_basis!==void 0&&profile.edge_basis!=="deduplicated_directed")return;const findingSubjects=isNonnegativeCountRecord(profile.finding_subjects_by_code)?profile.finding_subjects_by_code:{};return{edge_basis:"deduplicated_directed",...informative,...Object.fromEntries(countFields.map(field=>[field,profile[field]??0])),...Object.fromEntries(rateFields.map(field=>[field,profile[field]??0])),finding_subjects_by_code:Object.fromEntries(RELATIONSHIP_AUDIT_FINDING_CODES.map(code=>[code,findingSubjects[code]??affectedSubjectsByCode[code]??0]))}}function decodeGraphComposition(edges,edgesByKind,edgeShareByKind,semanticEdgesValue,semanticEdgeShareValue){const values=[edgeShareByKind,semanticEdgesValue,semanticEdgeShareValue],presentCount=values.filter(value=>value!==void 0).length;if(presentCount===0)return{edge_share_by_kind:{},semantic_edges:0,semantic_edge_share:0};if(presentCount!==values.length||!isUnitShareRecord(edgeShareByKind)||!isNonnegativeInteger(semanticEdgesValue)||!isUnitShare(semanticEdgeShareValue))return;const edgeEntries=Object.entries(edgesByKind);if(edgeEntries.reduce((sum,[,count])=>sum+count,0)!==edges||Object.keys(edgeShareByKind).length!==edgeEntries.length||edgeEntries.some(([kind,count])=>edgeShareByKind[kind]!==(edges===0?0:count/edges)))return;const semanticEdges=edgeEntries.reduce((sum,[kind,count])=>sum+(isSemanticContextKind(kind)?count:0),0);if(!(semanticEdgesValue!==semanticEdges||semanticEdgeShareValue!==(edges===0?0:semanticEdges/edges)))return{edge_share_by_kind:edgeShareByKind,semantic_edges:semanticEdgesValue,semantic_edge_share:semanticEdgeShareValue}}function decodeBaseline(raw){if(raw!==null)try{const parsed=JSON.parse(raw);if(!isRecord(parsed))return;const snapshot=parsed,profile=snapshot.profile;if(typeof snapshot.saved_at!="string"||typeof snapshot.fingerprint!="string")return;const affectedSubjectsByCode=snapshot.affected_subjects_by_code;if(!isNonnegativeCountRecord(affectedSubjectsByCode)||!isRecord(profile)||!validLifecycleSnapshot(profile)||![profile.nodes,profile.edges,profile.active_nodes,profile.missing_nodes,profile.isolated_active_nodes,profile.degree_leq_one_active_nodes].every(isNonnegativeInteger)||!isNonnegativeCountRecord(profile.edges_by_kind)||!isOptionalValid(profile.coverage_by_type,isNonnegativeCoverageByTypeRecord))return;const composition=decodeGraphComposition(profile.edges,profile.edges_by_kind,profile.edge_share_by_kind,profile.semantic_edges,profile.semantic_edge_share);if(composition===void 0)return;const structural=decodeStructuralProfile(profile,affectedSubjectsByCode,profile.nodes,profile.edges);if(structural===void 0)return;const{coverage_by_type={}}=profile;return{...snapshot,profile:{...profile,...composition,...structural,coverage_by_type}}}catch{return}}async function loadGraphAuditBaseline(pmRoot){return decodeBaseline(await readFileIfExists(graphAuditBaselinePath(pmRoot)))}async function saveGraphAuditBaseline(pmRoot,snapshot){await writeFileAtomic(graphAuditBaselinePath(pmRoot),JSON.stringify(snapshot))}export{GRAPH_DURABLE_CACHE_MIN_ITEMS,GRAPH_DURABLE_CACHE_VERSION,clearDurableGraphCache,durableGraphCachePath,durableGraphCacheStatus,graphAuditBaselinePath,loadGraphAuditBaseline,openDurableGraphCache,persistDurableGraphResult,saveGraphAuditBaseline,shouldPersistDurableGraphCache};
|
|
2
2
|
//# sourceMappingURL=durable-cache.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="896e1553-b127-532f-ac39-e0d47f29eebc")}catch{}})();const RELATIONSHIP_AUDIT_FINDING_CODES=["missing_reference_active","missing_reference_terminal","legacy_no_blocker_sentinel","ordering_cycle","legacy_ordering_cycle","ordering_storage_contradiction","legacy_ordering_storage_contradiction","hierarchy_cycle","legacy_hierarchy_cycle","hierarchy_cardinality_violation","legacy_hierarchy_cardinality_violation","hierarchy_direction_violation","legacy_hierarchy_direction_violation","duplicate_edge","legacy_duplicate_edge","duplicate_dependency_row","legacy_duplicate_dependency_row","stale_lifecycle_block","isolated_active_node","sparse_active_node"];export{RELATIONSHIP_AUDIT_FINDING_CODES};
|
|
2
2
|
//# sourceMappingURL=governance-contracts.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
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]="1335acb2-0730-5934-89a4-14fe4a160288")}catch(e2){}})();import{findRedundantRelationshipEdges,isTransitiveKind,orientTransitiveEdge,transitiveFamilyKey}from"./analytics.js";import{findRelationshipCutStructure}from"./centrality.js";import{getWorkspaceHierarchyIntegrity}from"./assembly.js";import{profileRelationshipLifecycles,diffLifecycleCoverage}from"./lifecycle-coverage.js";import{RELATIONSHIP_AUDIT_FINDING_CODES}from"./governance-contracts.js";const DEFAULT_MAX_SAMPLE_SIZE=25;const OUTCOME_MILESTONE_TYPE="milestone";const OUTCOME_MILESTONE_TITLE_PREFIX="outcome milestone:";const SEMANTIC_CONTEXT_KINDS=new Set(["discovered_from","incident_from","recurs_from","supersedes","verifies"]);function isSemanticContextKind(kind){return SEMANTIC_CONTEXT_KINDS.has(kind)}const SEVERITY_RANK={error:0,warning:1,info:2};function normalizeExemptionSet(values){return new Set((values??[]).filter(value=>typeof value==="string").map(value=>value.trim().toLowerCase()))}function buildFinding(code,severity,policy,describe,subjects,maxSampleSize,remediation,evidence){const sorted=[...subjects].sort((left,right)=>left.localeCompare(right));return{code,severity,policy,message:describe(sorted.length),count:sorted.length,sample:sorted.slice(0,maxSampleSize),sample_truncated:sorted.length>maxSampleSize,remediation,...evidence===void 0?{}:{evidence:[...evidence].sort((left,right)=>left.localeCompare(right)).slice(0,maxSampleSize)}}}function collectHierarchyCycleFindings(analysis,maxSampleSize){return analysis.cycles.map(cycle=>buildFinding(cycle.legacy_terminal?"legacy_hierarchy_cycle":"hierarchy_cycle",cycle.legacy_terminal?"info":"error","Structural hierarchy must be acyclic across scalar and registered dependency relationships.",count=>`${count} items participate in one hierarchy cycle.`,cycle.item_ids,maxSampleSize,cycle.legacy_terminal?"Preserve historical rows unless an explicit legacy repair is approved.":"Remove or retype one exact hierarchy relation before continuing mutation."))}function collectHierarchyCardinalityFindings(analysis,maxSampleSize,legacyTerminal){const rows=analysis.cardinality_violations.filter(finding=>finding.legacy_terminal===legacyTerminal);if(rows.length===0)return[];return[buildFinding(legacyTerminal?"legacy_hierarchy_cardinality_violation":"hierarchy_cardinality_violation",legacyTerminal?"info":"error","Every structural child must resolve to at most one logical parent across all hierarchy spellings.",count=>`${count} child item${count===1?"":"s"} resolve to multiple hierarchy parents.`,rows.map(finding=>finding.child_id),maxSampleSize,legacyTerminal?"Preserve historical rows unless an explicit legacy repair is approved.":"Remove the exact surplus hierarchy rows so each child has one parent.",rows.map(finding=>`${finding.child_id} <- ${finding.parent_ids.join(", ")}`))]}function collectHierarchyDirectionFindings(analysis,maxSampleSize,legacyTerminal){const rows=analysis.divergences.filter(finding=>finding.legacy_terminal===legacyTerminal);if(rows.length===0)return[];return[buildFinding(legacyTerminal?"legacy_hierarchy_direction_violation":"hierarchy_direction_violation",legacyTerminal?"info":"error","Scalar parent metadata and dependency-backed hierarchy rows must resolve to the same logical parent.",count=>`${count} child item${count===1?"":"s"} have divergent hierarchy storage surfaces.`,rows.map(finding=>finding.child_id),maxSampleSize,legacyTerminal?"Preserve historical rows unless an explicit legacy repair is approved.":"Align the scalar parent and exact dependency rows to one canonical parent.",rows.map(finding=>`${finding.child_id}: scalar=${finding.scalar_parent_id} dependencies=${finding.dependency_parent_ids.join(",")}`))]}function collectHierarchyIntegrityFindings(assembly,maxSampleSize){const analysis=getWorkspaceHierarchyIntegrity(assembly);if(!analysis)return[];return[...collectHierarchyCycleFindings(analysis,maxSampleSize),...collectHierarchyCardinalityFindings(analysis,maxSampleSize,false),...collectHierarchyCardinalityFindings(analysis,maxSampleSize,true),...collectHierarchyDirectionFindings(analysis,maxSampleSize,false),...collectHierarchyDirectionFindings(analysis,maxSampleSize,true)]}function buildOrderingAdjacency(assembly){const registry=assembly.graph.registry();const successors=new Map;for(const edge of assembly.graph.edges()){const definition=registry.require(edge.kind);if(!definition.ordering)continue;const[predecessor,successor]=(definition.precedence??"source_before_target")==="target_before_source"?[edge.target,edge.source]:[edge.source,edge.target];const adjacent=successors.get(predecessor);if(adjacent)adjacent.push(successor);else successors.set(predecessor,[successor])}for(const adjacent of successors.values())adjacent.sort((left,right)=>left.localeCompare(right));return successors}function registerTarjanNode(node,state){state.indexes.set(node,state.nextIndex);state.lowLinks.set(node,state.nextIndex);state.nextIndex+=1;state.stack.push(node);state.onStack.add(node)}function visitNextTarjanNeighbor(frame,frames,successors,state){const neighbors=successors.get(frame.node)??[];if(frame.neighborIndex>=neighbors.length)return false;const neighbor=neighbors[frame.neighborIndex];frame.neighborIndex+=1;if(!state.indexes.has(neighbor)){registerTarjanNode(neighbor,state);frames.push({node:neighbor,neighborIndex:0})}else if(state.onStack.has(neighbor)){state.lowLinks.set(frame.node,Math.min(state.lowLinks.get(frame.node),state.indexes.get(neighbor)))}return true}function completeTarjanFrame(frame,frames,successors,state){frames.pop();const parent=frames.at(-1);if(parent)state.lowLinks.set(parent.node,Math.min(state.lowLinks.get(parent.node),state.lowLinks.get(frame.node)));if(state.lowLinks.get(frame.node)!==state.indexes.get(frame.node))return;const component=[];while(true){const member=state.stack.pop();state.onStack.delete(member);component.push(member);if(member===frame.node)break}if(component.length>1||component.length===1&&successors.get(component[0])?.includes(component[0]))state.components.push(component.sort((left,right)=>left.localeCompare(right)))}function collectOrderingCycles(successors){const state={indexes:new Map,lowLinks:new Map,onStack:new Set,stack:[],components:[],nextIndex:0};const roots=[...successors.keys()].sort((left,right)=>left.localeCompare(right));for(const root of roots){if(state.indexes.has(root))continue;const frames=[{node:root,neighborIndex:0}];registerTarjanNode(root,state);while(frames.length>0){const frame=frames.at(-1);if(visitNextTarjanNeighbor(frame,frames,successors,state))continue;completeTarjanFrame(frame,frames,successors,state)}}return state.components.sort((left,right)=>left[0].localeCompare(right[0]))}function formatDanglingReference(reference){return`${reference.holder_id} -> ${reference.target_id} (${reference.kind})`}function appendFinding(findings,subjects,maxSampleSize,code,severity,policy,describe,remediation){if(subjects.length===0)return;findings.push(buildFinding(code,severity,policy,describe,subjects,maxSampleSize,remediation))}function collectIntegrityFindings(assembly,isTerminal,maxSampleSize){const findings=[];const references=[...assembly.dangling.active,...assembly.dangling.legacy_terminal].filter(reference=>!reference.no_active_blocker_sentinel);appendFinding(findings,references.filter(reference=>!isTerminal(reference.holder_status)).map(formatDanglingReference),maxSampleSize,"missing_reference_active","error","Active items must not reference absent targets; missing prerequisites distort scheduling.",count=>`${count} active dangling reference(s) to absent items`,"Restore or re-create the referenced item, or remove/retype the reference on the holder.");appendFinding(findings,references.filter(reference=>isTerminal(reference.holder_status)).map(formatDanglingReference),maxSampleSize,"missing_reference_terminal","info","Terminal items may retain historical references, but absent targets remain unexplainable context.",count=>`${count} terminal dangling reference(s) to absent items`,"Leave as history debt or clean up in a dedicated changelog-safe closed-item batch.");appendFinding(findings,assembly.dangling.no_active_blocker_sentinels.map(formatDanglingReference),maxSampleSize,"legacy_no_blocker_sentinel","info","The pre-structured-dependency no-active-blocker sentinel is retired; real edges carry blocker state.",count=>`${count} legacy no-active-blocker sentinel reference(s)`,"Delete the sentinel reference; blocker state is derived from blocked_by edges.");return findings}function isActiveAuditMember(member,nodeStates){const state=nodeStates.get(member);if(!state)return true;return!state.terminal}function formatOrderingStorageContradiction(contradiction){return`${contradiction.holder_id} -> ${contradiction.target_id} (blocked_by scalar + ${contradiction.dependency_kind} dependency)`}function collectOrderingStorageContradictionFindings(assembly,maxSampleSize){const active=[];const legacy=[];for(const contradiction of assembly.orderingContradictions??[])(contradiction.legacy_terminal?legacy:active).push(formatOrderingStorageContradiction(contradiction));const findings=[];appendFinding(findings,active,maxSampleSize,"ordering_storage_contradiction","error","A scalar blocker and same-target structured ordering row must not assert opposite precedence.",count=>`${count} active scalar-versus-structured ordering contradiction(s)`,"Remove the structured dependency row that points the holder before its scalar blocker, or replace both representations with one unambiguous ordering edge.");appendFinding(findings,legacy,maxSampleSize,"legacy_ordering_storage_contradiction","info","Terminal scalar-versus-structured ordering contradictions are exact historical storage defects with no live scheduling effect.",count=>`${count} terminal scalar-versus-structured ordering contradiction(s)`,"Remove the contradictory blocks dependency row in a dedicated changelog-safe closed-item batch; preserve the scalar blocker as the historical precedence record.");return findings}function collectOrderingFindings(assembly,nodeStates,isBlocked,maxSampleSize){const findings=[];const orderingAdjacency=buildOrderingAdjacency(assembly);for(const cycle of collectOrderingCycles(orderingAdjacency)){const active=cycle.some(member=>isActiveAuditMember(member,nodeStates));const cycleMembers=new Set(cycle.map(member=>member.toLowerCase()));const contradictionEvidence=(assembly.orderingContradictions??[]).filter(row=>cycleMembers.has(row.holder_id.toLowerCase())&&cycleMembers.has(row.target_id.toLowerCase())).map(formatOrderingStorageContradiction);findings.push(active?buildFinding("ordering_cycle","error","Order-bearing relationship kinds must stay acyclic; a cycle makes every member unschedulable.",count=>`execution-order cycle across ${count} item(s)`,cycle,maxSampleSize,"Remove or retype one ordering edge inside the cycle, or split the work so precedence is linear.",contradictionEvidence.length===0?void 0:contradictionEvidence):buildFinding("legacy_ordering_cycle","info","Ordering cycles between exclusively terminal items are historical contradictions with no scheduling effect.",count=>`terminal-only execution-order cycle across ${count} item(s)`,cycle,maxSampleSize,"Leave as history debt, or clean up in a dedicated changelog-safe closed-item batch; never repair closed items ad hoc.",contradictionEvidence.length===0?void 0:contradictionEvidence))}const predecessorsByNode=new Map;for(const[predecessor,adjacent]of orderingAdjacency)for(const successor of adjacent){const predecessors=predecessorsByNode.get(successor);if(predecessors)predecessors.push(predecessor);else predecessorsByNode.set(successor,[predecessor])}const staleLifecycleBlocks=[...nodeStates.values()].filter(state=>!state.missing&&!state.terminal&&isBlocked(state.status)&&!(predecessorsByNode.get(state.id)??[]).some(predecessor=>{const predecessorState=nodeStates.get(predecessor);return predecessorState===void 0||!predecessorState.terminal})).map(state=>state.id);appendFinding(findings,staleLifecycleBlocks,maxSampleSize,"stale_lifecycle_block","warning","A blocked lifecycle status must be backed by at least one open ordering predecessor.",count=>`${count} status-blocked item(s) with no open blocker edge`,'Add a local blocker edge, declare an external blocker with --dep "id=<external-ref>,kind=blocked_by,source_kind=external", or move the item back to an active status.');return findings}function formatDuplicateEdgeGroup(group){const kinds=group.edges.map(edge=>edge.kind).sort((left,right)=>left.localeCompare(right));return`${group.from} -> ${group.to} (${kinds.join(" + ")})`}function collectDuplicateRelationshipEdgeGroups(assembly){const registry=assembly.graph.registry();const groups=new Map;for(const edge of assembly.graph.edges()){const definition=registry.require(edge.kind);if(!isTransitiveKind(definition))continue;const oriented=orientTransitiveEdge(edge,definition);if(oriented.from===oriented.to)continue;const key=`${transitiveFamilyKey(definition)}::${oriented.from}::${oriented.to}`;const group=groups.get(key);if(group)group.edges.push(edge);else groups.set(key,{...oriented,edges:[edge]})}const duplicated=[...groups.values()].filter(group=>group.edges.length>=2);for(const group of duplicated)group.edges.sort((left,right)=>left.kind.localeCompare(right.kind));return duplicated.sort((left,right)=>left.from.localeCompare(right.from)||left.to.localeCompare(right.to))}function collectDuplicateEdgeFindings(assembly,nodeStates,maxSampleSize){const active=[];const legacy=[];for(const group of collectDuplicateRelationshipEdgeGroups(assembly)){const subjects=isActiveAuditMember(group.from,nodeStates)||isActiveAuditMember(group.to,nodeStates)?active:legacy;subjects.push(formatDuplicateEdgeGroup(group))}const findings=[];appendFinding(findings,active,maxSampleSize,"duplicate_edge","info","One semantic relationship should be stored once; parallel same-family spellings (reciprocal inverse pairs included) add no information and skew degree metrics.",count=>`${count} duplicated relationship(s) between active endpoints`,"Remove all but one stored spelling of the relationship; keep the canonical direction the holder declared first.");appendFinding(findings,legacy,maxSampleSize,"legacy_duplicate_edge","info","Duplicated spellings between exclusively terminal items are historical noise with no scheduling effect.",count=>`${count} duplicated relationship(s) between terminal endpoints`,"Leave as history debt or clean up in a dedicated changelog-safe closed-item batch.");return findings}function collectDuplicateRowFindings(assembly,maxSampleSize){const active=[];const legacy=[];for(const row of assembly.duplicateRows??[]){(row.legacy_terminal?legacy:active).push(`${row.holder_id} -> ${row.target_id} (${row.kind} x${row.occurrences})`)}const findings=[];appendFinding(findings,active,maxSampleSize,"duplicate_dependency_row","warning","One dependency row must be stored once per holder; identical repeated rows are a storage-layer defect invisible to the assembled graph.",count=>`${count} exactly duplicated stored dependency row(s) on active holder(s)`,"Remove the repeated rows so the dependency is stored exactly once; graph semantics are unchanged.");appendFinding(findings,legacy,maxSampleSize,"legacy_duplicate_dependency_row","info","Identical repeated dependency rows on terminal holders are historical storage noise with no scheduling effect.",count=>`${count} exactly duplicated stored dependency row(s) on terminal holder(s)`,"Leave as history debt or clean up in a dedicated changelog-safe closed-item batch.");return findings}function buildOutcomeReverseIndex(assembly,signal){const reverse=new Map;const basisKinds={source_to_target:[],target_to_source:[],both:[]};for(const definition of assembly.graph.registry().list()){if(definition.outcomeTraversal!==void 0){basisKinds[definition.outcomeTraversal].push(definition.kind)}}const basis={source_to_target:basisKinds.source_to_target.join(","),target_to_source:basisKinds.target_to_source.join(","),both:basisKinds.both.join(",")};const append=(from,to)=>{const sources=reverse.get(to)??new Set;sources.add(from);reverse.set(to,sources)};for(const edge of assembly.graph.edges()){signal?.throwIfAborted();const definition=assembly.graph.registry().require(edge.kind);if(definition.outcomeTraversal==="source_to_target"||definition.outcomeTraversal==="both")append(edge.source,edge.target);if(definition.outcomeTraversal==="target_to_source"||definition.outcomeTraversal==="both")append(edge.target,edge.source)}return{basis,reverse}}function expandOutcomeReachability(outcomes,reverse,signal){const reachable=new Set(outcomes);const queue=[...outcomes].sort();for(let index=0;index<queue.length;index+=1){signal?.throwIfAborted();for(const source of[...reverse.get(queue[index])??[]].sort()){if(reachable.has(source))continue;reachable.add(source);queue.push(source)}}return reachable}function tallyOutcomeReachability(nodeStates,outcomes,reachable,signal){let activeReachable=0;let activeUnreachable=0;let terminal=0;let terminalReachable=0;for(const state of nodeStates.values()){signal?.throwIfAborted();if(outcomes.has(state.id))continue;if(state.missing||state.status==="external")continue;if(state.terminal){terminal+=1;if(reachable.has(state.id))terminalReachable+=1;continue}if(reachable.has(state.id))activeReachable+=1;else activeUnreachable+=1}const active=activeReachable+activeUnreachable;const terminalUnreachable=terminal-terminalReachable;const outcomeReachable=activeReachable+terminalReachable;const outcomeUnreachable=activeUnreachable+terminalUnreachable;const outcomePopulation=outcomeReachable+outcomeUnreachable;return{active_outcome_reachable_nodes:activeReachable,active_outcome_unreachable_nodes:activeUnreachable,active_outcome_reachability_basis_points:active===0?0:Math.floor(activeReachable*1e4/active),terminal_nodes:terminal,terminal_outcome_reachable_nodes:terminalReachable,terminal_outcome_unreachable_nodes:terminalUnreachable,terminal_outcome_reachability_basis_points:terminal===0?0:Math.floor(terminalReachable*1e4/terminal),outcome_reachable_nodes:outcomeReachable,outcome_unreachable_nodes:outcomeUnreachable,outcome_reachability_basis_points:outcomePopulation===0?0:Math.floor(outcomeReachable*1e4/outcomePopulation)}}function profileOutcomeReachability(assembly,nodeStates,signal){const outcomes=new Set(assembly.details.filter(detail=>detail.type?.toLowerCase()===OUTCOME_MILESTONE_TYPE&&detail.title.trim().toLowerCase().startsWith(OUTCOME_MILESTONE_TITLE_PREFIX)).map(detail=>detail.id));const{basis,reverse}=buildOutcomeReverseIndex(assembly,signal);const reachable=expandOutcomeReachability(outcomes,reverse,signal);return{outcome_nodes:outcomes.size,outcome_reachability_basis:basis,...tallyOutcomeReachability(nodeStates,outcomes,reachable,signal)}}function tallyActiveCoverageNode(tallies,state,degree,exemptIsolates,isolateExemptTypes){tallies.active+=1;const typeKey=state.type??"(untyped)";let typeProfile=tallies.byType.get(typeKey);if(!typeProfile){typeProfile={active:0,isolated:0,degree_leq_one:0};tallies.byType.set(typeKey,typeProfile)}typeProfile.active+=1;if(degree>1)return;tallies.degreeLeqOne+=1;typeProfile.degree_leq_one+=1;if(degree===0){tallies.isolated+=1;typeProfile.isolated+=1}if(exemptIsolates.has(state.id.toLowerCase())||isolateExemptTypes.has(typeKey.toLowerCase()))return;if(degree===0)tallies.isolates.push(state.id);else tallies.sparse.push(state.id)}function collectCoverageReport(assembly,nodeStates,exemptIsolates,isolateExemptTypes,maxSampleSize,edgesByKind,signal){const tallies={active:0,missing:0,isolated:0,degreeLeqOne:0,isolates:[],sparse:[],byType:new Map};for(const id of assembly.graph.nodes()){signal?.throwIfAborted();const state=nodeStates.get(id);if(!state)continue;if(state.missing){tallies.missing+=1;continue}if(state.terminal)continue;tallyActiveCoverageNode(tallies,state,assembly.graph.incidentEdges(id).length,exemptIsolates,isolateExemptTypes)}const{isolates,sparse}=tallies;const findings=[];appendFinding(findings,isolates,maxSampleSize,"isolated_active_node","warning","Active work should be reachable from the graph unless explicitly declared a valid isolate.",count=>`${count} active item(s) with no relationships`,"Link the item to its parent, prerequisite, or origin \u2014 or register it as an exempt isolate.");appendFinding(findings,sparse,maxSampleSize,"sparse_active_node","info","Active items with a single edge often miss an honest semantic partner; sparse is not automatically defective.",count=>`${count} active item(s) with exactly one relationship`,"Investigate for an honest second edge (story->task, defect family, cross-epic complement); do not fabricate one.");const edgeCount=assembly.graph.edges().length;const redundantEdges=findRedundantRelationshipEdges(assembly.graph,{signal}).value;const nonInformativeEdgeKeys=new Set(redundantEdges.map(({edge})=>`${edge.source.toLowerCase()}\0${edge.target.toLowerCase()}\0${edge.kind}`));for(const contradiction of assembly.orderingContradictions??[])nonInformativeEdgeKeys.add(`${contradiction.holder_id.toLowerCase()}\0${contradiction.target_id.toLowerCase()}\0${contradiction.dependency_kind}`);const sortedEdgesByKind=Object.fromEntries(Object.entries(edgesByKind).sort(([left],[right])=>left.localeCompare(right)));const semanticEdges=Object.entries(sortedEdgesByKind).reduce((count,[kind,value])=>count+(isSemanticContextKind(kind)?value:0),0);const cutStructure=findRelationshipCutStructure(assembly.graph,{signal}).value;const outcomeReachability=profileOutcomeReachability(assembly,nodeStates,signal);return{findings,profile:{nodes:assembly.graph.nodes().length,recorded_nodes:assembly.details.filter(detail=>detail.status!=="missing"&&detail.status!=="external").length,edges:edgeCount,informative_edges:edgeCount-nonInformativeEdgeKeys.size,redundant_edges:redundantEdges.length,ordering_contradiction_edges:assembly.orderingContradictions?.length??0,edge_basis:"deduplicated_directed",edges_by_kind:sortedEdgesByKind,edge_share_by_kind:Object.fromEntries(Object.entries(sortedEdgesByKind).map(([kind,count])=>[kind,count/edgeCount])),semantic_edges:semanticEdges,semantic_edge_share:edgeCount===0?0:semanticEdges/edgeCount,active_nodes:tallies.active,missing_nodes:tallies.missing,isolated_active_nodes:tallies.isolated,degree_leq_one_active_nodes:tallies.degreeLeqOne,coverage_by_type:Object.fromEntries([...tallies.byType.entries()].sort(([left],[right])=>left<right?-1:1)),articulation_points:cutStructure.articulationPoints.length,bridge_edges:cutStructure.bridges.length,...outcomeReachability,finding_subjects_by_code:Object.fromEntries(RELATIONSHIP_AUDIT_FINDING_CODES.map(code=>[code,0]))}}}function auditWorkspaceRelationshipGraph(assembly,options={}){const isTerminal=options.isTerminal??(status=>status==="closed"||status==="canceled");const isBlocked=options.isBlocked??(status=>status==="blocked");const maxSampleSize=options.maxSampleSize??DEFAULT_MAX_SAMPLE_SIZE;if(!Number.isInteger(maxSampleSize)||maxSampleSize<1)throw new TypeError(`Invalid audit sample bound: ${String(options.maxSampleSize)}`);const exemptIsolates=normalizeExemptionSet(options.exemptIsolates);const isolateExemptTypes=normalizeExemptionSet(options.isolateExemptTypes);const nodeStates=new Map(assembly.details.map(detail=>[detail.id,{id:detail.id,status:detail.status,missing:assembly.missingIdSet.has(detail.id.toLowerCase()),terminal:isTerminal(detail.status),...detail.type===void 0?{}:{type:detail.type}}]));options.signal?.throwIfAborted();const edgesByKind={};for(const edge of assembly.graph.edges())edgesByKind[edge.kind]=(edgesByKind[edge.kind]??0)+1;const findings=collectIntegrityFindings(assembly,isTerminal,maxSampleSize);findings.push(...collectHierarchyIntegrityFindings(assembly,maxSampleSize));options.signal?.throwIfAborted();findings.push(...collectOrderingStorageContradictionFindings(assembly,maxSampleSize));options.signal?.throwIfAborted();findings.push(...collectOrderingFindings(assembly,nodeStates,isBlocked,maxSampleSize));options.signal?.throwIfAborted();findings.push(...collectDuplicateEdgeFindings(assembly,nodeStates,maxSampleSize),...collectDuplicateRowFindings(assembly,maxSampleSize));options.signal?.throwIfAborted();const coverage=collectCoverageReport(assembly,nodeStates,exemptIsolates,isolateExemptTypes,maxSampleSize,edgesByKind,options.signal);findings.push(...coverage.findings);findings.sort((left,right)=>SEVERITY_RANK[left.severity]-SEVERITY_RANK[right.severity]||left.code.localeCompare(right.code)||left.sample[0].localeCompare(right.sample[0]));const findingSubjectsByCode=coverage.profile.finding_subjects_by_code;for(const finding of findings){findingSubjectsByCode[finding.code]+=finding.count}return{findings,profile:{...coverage.profile,...profileRelationshipLifecycles(assembly,isTerminal,isSemanticContextKind,options.signal),ordering_acyclic:!findings.some(finding=>finding.code==="ordering_cycle"||finding.code==="legacy_ordering_cycle"),active_ordering_acyclic:!findings.some(finding=>finding.code==="ordering_cycle"),finding_subjects_by_code:findingSubjectsByCode}}}function diffCountRecords(baseline,current){const keys=[...new Set([...Object.keys(baseline),...Object.keys(current)])].sort();const deltas={};for(const key of keys){const delta=(current[key]??0)-(baseline[key]??0);if(delta!==0)deltas[key]=delta}return deltas}function readSnapshotCoverageByType(snapshot){return snapshot.profile.coverage_by_type??{}}function diffCoverageByType(baseline,current){const deltas={};const baselineCoverage=readSnapshotCoverageByType(baseline);const currentCoverage=readSnapshotCoverageByType(current);const types=[...new Set([...Object.keys(baselineCoverage),...Object.keys(currentCoverage)])].sort();for(const type of types){const before=Object.assign({active:0,isolated:0,degree_leq_one:0},baselineCoverage[type]);const after=Object.assign({active:0,isolated:0,degree_leq_one:0},currentCoverage[type]);const delta={active:after.active-before.active,isolated:after.isolated-before.isolated,degree_leq_one:after.degree_leq_one-before.degree_leq_one};if(Object.values(delta).some(value=>value!==0))deltas[type]=delta}return deltas}function diffRelationshipAuditSnapshots(baseline,current){const coverageByType=diffCoverageByType(baseline,current);const{edge_share_by_kind:baselineEdgeShareByKind={},semantic_edges:baselineSemanticEdges=0,semantic_edge_share:baselineSemanticEdgeShare=0}=baseline.profile;const{edge_share_by_kind:currentEdgeShareByKind={},semantic_edges:currentSemanticEdges=0,semantic_edge_share:currentSemanticEdgeShare=0}=current.profile;const baselineRecordedNodes=baseline.profile.recorded_nodes??baseline.profile.nodes;const currentRecordedNodes=current.profile.recorded_nodes??current.profile.nodes;const baselineInformativeEdges=baseline.profile.informative_edges??baseline.profile.edges;const currentInformativeEdges=current.profile.informative_edges??current.profile.edges;const baselineRedundantEdges=baseline.profile.redundant_edges??0;const currentRedundantEdges=current.profile.redundant_edges??0;const baselineOrderingContradictionEdges=baseline.profile.ordering_contradiction_edges??0;const currentOrderingContradictionEdges=current.profile.ordering_contradiction_edges??0;return{baseline_saved_at:baseline.saved_at,same_snapshot:baseline.fingerprint===current.fingerprint,affected_subjects_by_code:diffCountRecords(baseline.affected_subjects_by_code,current.affected_subjects_by_code),profile:{nodes:current.profile.nodes-baseline.profile.nodes,recorded_nodes:currentRecordedNodes-baselineRecordedNodes,edges:current.profile.edges-baseline.profile.edges,informative_edges:currentInformativeEdges-baselineInformativeEdges,redundant_edges:currentRedundantEdges-baselineRedundantEdges,ordering_contradiction_edges:currentOrderingContradictionEdges-baselineOrderingContradictionEdges,active_nodes:current.profile.active_nodes-baseline.profile.active_nodes,missing_nodes:current.profile.missing_nodes-baseline.profile.missing_nodes,isolated_active_nodes:current.profile.isolated_active_nodes-baseline.profile.isolated_active_nodes,degree_leq_one_active_nodes:current.profile.degree_leq_one_active_nodes-baseline.profile.degree_leq_one_active_nodes,edges_by_kind:diffCountRecords(baseline.profile.edges_by_kind,current.profile.edges_by_kind),edge_share_by_kind:diffCountRecords(baselineEdgeShareByKind,currentEdgeShareByKind),semantic_edges:currentSemanticEdges-baselineSemanticEdges,semantic_edge_share:currentSemanticEdgeShare-baselineSemanticEdgeShare,coverage_by_type:coverageByType,...diffLifecycleCoverage(baseline.profile,current.profile)}}}export{auditWorkspaceRelationshipGraph,collectDuplicateRelationshipEdgeGroups,collectOrderingCycles,diffRelationshipAuditSnapshots,formatDuplicateEdgeGroup,formatOrderingStorageContradiction,isSemanticContextKind};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="34b2e83e-f6a1-57e7-84ee-4ad83acb2e19")}catch{}})();import{findRedundantRelationshipEdges,isTransitiveKind,orientTransitiveEdge,transitiveFamilyKey}from"./analytics.js";import{findRelationshipCutStructure}from"./centrality.js";import{getWorkspaceHierarchyIntegrity}from"./assembly.js";import{profileRelationshipLifecycles,diffLifecycleCoverage}from"./lifecycle-coverage.js";import{RELATIONSHIP_AUDIT_FINDING_CODES}from"./governance-contracts.js";const DEFAULT_MAX_SAMPLE_SIZE=25,OUTCOME_MILESTONE_TYPE="milestone",OUTCOME_MILESTONE_TITLE_PREFIX="outcome milestone:",SEMANTIC_CONTEXT_KINDS=new Set(["discovered_from","incident_from","recurs_from","supersedes","verifies"]);function isSemanticContextKind(kind){return SEMANTIC_CONTEXT_KINDS.has(kind)}const SEVERITY_RANK={error:0,warning:1,info:2};function normalizeExemptionSet(values){return new Set((values??[]).filter(value=>typeof value=="string").map(value=>value.trim().toLowerCase()))}function buildFinding(code,severity,policy,describe,subjects,maxSampleSize,remediation,evidence){const sorted=[...subjects].sort((left,right)=>left.localeCompare(right));return{code,severity,policy,message:describe(sorted.length),count:sorted.length,sample:sorted.slice(0,maxSampleSize),sample_truncated:sorted.length>maxSampleSize,remediation,...evidence===void 0?{}:{evidence:[...evidence].sort((left,right)=>left.localeCompare(right)).slice(0,maxSampleSize)}}}function collectHierarchyCycleFindings(analysis,maxSampleSize){return analysis.cycles.map(cycle=>buildFinding(cycle.legacy_terminal?"legacy_hierarchy_cycle":"hierarchy_cycle",cycle.legacy_terminal?"info":"error","Structural hierarchy must be acyclic across scalar and registered dependency relationships.",count=>`${count} items participate in one hierarchy cycle.`,cycle.item_ids,maxSampleSize,cycle.legacy_terminal?"Preserve historical rows unless an explicit legacy repair is approved.":"Remove or retype one exact hierarchy relation before continuing mutation."))}function collectHierarchyCardinalityFindings(analysis,maxSampleSize,legacyTerminal){const rows=analysis.cardinality_violations.filter(finding=>finding.legacy_terminal===legacyTerminal);return rows.length===0?[]:[buildFinding(legacyTerminal?"legacy_hierarchy_cardinality_violation":"hierarchy_cardinality_violation",legacyTerminal?"info":"error","Every structural child must resolve to at most one logical parent across all hierarchy spellings.",count=>`${count} child item${count===1?"":"s"} resolve to multiple hierarchy parents.`,rows.map(finding=>finding.child_id),maxSampleSize,legacyTerminal?"Preserve historical rows unless an explicit legacy repair is approved.":"Remove the exact surplus hierarchy rows so each child has one parent.",rows.map(finding=>`${finding.child_id} <- ${finding.parent_ids.join(", ")}`))]}function collectHierarchyDirectionFindings(analysis,maxSampleSize,legacyTerminal){const rows=analysis.divergences.filter(finding=>finding.legacy_terminal===legacyTerminal);return rows.length===0?[]:[buildFinding(legacyTerminal?"legacy_hierarchy_direction_violation":"hierarchy_direction_violation",legacyTerminal?"info":"error","Scalar parent metadata and dependency-backed hierarchy rows must resolve to the same logical parent.",count=>`${count} child item${count===1?"":"s"} have divergent hierarchy storage surfaces.`,rows.map(finding=>finding.child_id),maxSampleSize,legacyTerminal?"Preserve historical rows unless an explicit legacy repair is approved.":"Align the scalar parent and exact dependency rows to one canonical parent.",rows.map(finding=>`${finding.child_id}: scalar=${finding.scalar_parent_id} dependencies=${finding.dependency_parent_ids.join(",")}`))]}function collectHierarchyIntegrityFindings(assembly,maxSampleSize){const analysis=getWorkspaceHierarchyIntegrity(assembly);return analysis?[...collectHierarchyCycleFindings(analysis,maxSampleSize),...collectHierarchyCardinalityFindings(analysis,maxSampleSize,!1),...collectHierarchyCardinalityFindings(analysis,maxSampleSize,!0),...collectHierarchyDirectionFindings(analysis,maxSampleSize,!1),...collectHierarchyDirectionFindings(analysis,maxSampleSize,!0)]:[]}function buildOrderingAdjacency(assembly){const registry=assembly.graph.registry(),successors=new Map;for(const edge of assembly.graph.edges()){const definition=registry.require(edge.kind);if(!definition.ordering)continue;const[predecessor,successor]=(definition.precedence??"source_before_target")==="target_before_source"?[edge.target,edge.source]:[edge.source,edge.target],adjacent=successors.get(predecessor);adjacent?adjacent.push(successor):successors.set(predecessor,[successor])}for(const adjacent of successors.values())adjacent.sort((left,right)=>left.localeCompare(right));return successors}function registerTarjanNode(node,state){state.indexes.set(node,state.nextIndex),state.lowLinks.set(node,state.nextIndex),state.nextIndex+=1,state.stack.push(node),state.onStack.add(node)}function visitNextTarjanNeighbor(frame,frames,successors,state){const neighbors=successors.get(frame.node)??[];if(frame.neighborIndex>=neighbors.length)return!1;const neighbor=neighbors[frame.neighborIndex];return frame.neighborIndex+=1,state.indexes.has(neighbor)?state.onStack.has(neighbor)&&state.lowLinks.set(frame.node,Math.min(state.lowLinks.get(frame.node),state.indexes.get(neighbor))):(registerTarjanNode(neighbor,state),frames.push({node:neighbor,neighborIndex:0})),!0}function completeTarjanFrame(frame,frames,successors,state){frames.pop();const parent=frames.at(-1);if(parent&&state.lowLinks.set(parent.node,Math.min(state.lowLinks.get(parent.node),state.lowLinks.get(frame.node))),state.lowLinks.get(frame.node)!==state.indexes.get(frame.node))return;const component=[];for(;;){const member=state.stack.pop();if(state.onStack.delete(member),component.push(member),member===frame.node)break}(component.length>1||component.length===1&&successors.get(component[0])?.includes(component[0]))&&state.components.push(component.sort((left,right)=>left.localeCompare(right)))}function collectOrderingCycles(successors){const state={indexes:new Map,lowLinks:new Map,onStack:new Set,stack:[],components:[],nextIndex:0},roots=[...successors.keys()].sort((left,right)=>left.localeCompare(right));for(const root of roots){if(state.indexes.has(root))continue;const frames=[{node:root,neighborIndex:0}];for(registerTarjanNode(root,state);frames.length>0;){const frame=frames.at(-1);visitNextTarjanNeighbor(frame,frames,successors,state)||completeTarjanFrame(frame,frames,successors,state)}}return state.components.sort((left,right)=>left[0].localeCompare(right[0]))}function formatDanglingReference(reference){return`${reference.holder_id} -> ${reference.target_id} (${reference.kind})`}function appendFinding(findings,subjects,maxSampleSize,code,severity,policy,describe,remediation){subjects.length!==0&&findings.push(buildFinding(code,severity,policy,describe,subjects,maxSampleSize,remediation))}function collectIntegrityFindings(assembly,isTerminal,maxSampleSize){const findings=[],references=[...assembly.dangling.active,...assembly.dangling.legacy_terminal].filter(reference=>!reference.no_active_blocker_sentinel);return appendFinding(findings,references.filter(reference=>!isTerminal(reference.holder_status)).map(formatDanglingReference),maxSampleSize,"missing_reference_active","error","Active items must not reference absent targets; missing prerequisites distort scheduling.",count=>`${count} active dangling reference(s) to absent items`,"Restore or re-create the referenced item, or remove/retype the reference on the holder."),appendFinding(findings,references.filter(reference=>isTerminal(reference.holder_status)).map(formatDanglingReference),maxSampleSize,"missing_reference_terminal","info","Terminal items may retain historical references, but absent targets remain unexplainable context.",count=>`${count} terminal dangling reference(s) to absent items`,"Leave as history debt or clean up in a dedicated changelog-safe closed-item batch."),appendFinding(findings,assembly.dangling.no_active_blocker_sentinels.map(formatDanglingReference),maxSampleSize,"legacy_no_blocker_sentinel","info","The pre-structured-dependency no-active-blocker sentinel is retired; real edges carry blocker state.",count=>`${count} legacy no-active-blocker sentinel reference(s)`,"Delete the sentinel reference; blocker state is derived from blocked_by edges."),findings}function isActiveAuditMember(member,nodeStates){const state=nodeStates.get(member);return state?!state.terminal:!0}function formatOrderingStorageContradiction(contradiction){return`${contradiction.holder_id} -> ${contradiction.target_id} (blocked_by scalar + ${contradiction.dependency_kind} dependency)`}function collectOrderingStorageContradictionFindings(assembly,maxSampleSize){const active=[],legacy=[];for(const contradiction of assembly.orderingContradictions??[])(contradiction.legacy_terminal?legacy:active).push(formatOrderingStorageContradiction(contradiction));const findings=[];return appendFinding(findings,active,maxSampleSize,"ordering_storage_contradiction","error","A scalar blocker and same-target structured ordering row must not assert opposite precedence.",count=>`${count} active scalar-versus-structured ordering contradiction(s)`,"Remove the structured dependency row that points the holder before its scalar blocker, or replace both representations with one unambiguous ordering edge."),appendFinding(findings,legacy,maxSampleSize,"legacy_ordering_storage_contradiction","info","Terminal scalar-versus-structured ordering contradictions are exact historical storage defects with no live scheduling effect.",count=>`${count} terminal scalar-versus-structured ordering contradiction(s)`,"Remove the contradictory blocks dependency row in a dedicated changelog-safe closed-item batch; preserve the scalar blocker as the historical precedence record."),findings}function collectOrderingFindings(assembly,nodeStates,isBlocked,maxSampleSize){const findings=[],orderingAdjacency=buildOrderingAdjacency(assembly);for(const cycle of collectOrderingCycles(orderingAdjacency)){const active=cycle.some(member=>isActiveAuditMember(member,nodeStates)),cycleMembers=new Set(cycle.map(member=>member.toLowerCase())),contradictionEvidence=(assembly.orderingContradictions??[]).filter(row=>cycleMembers.has(row.holder_id.toLowerCase())&&cycleMembers.has(row.target_id.toLowerCase())).map(formatOrderingStorageContradiction);findings.push(active?buildFinding("ordering_cycle","error","Order-bearing relationship kinds must stay acyclic; a cycle makes every member unschedulable.",count=>`execution-order cycle across ${count} item(s)`,cycle,maxSampleSize,"Remove or retype one ordering edge inside the cycle, or split the work so precedence is linear.",contradictionEvidence.length===0?void 0:contradictionEvidence):buildFinding("legacy_ordering_cycle","info","Ordering cycles between exclusively terminal items are historical contradictions with no scheduling effect.",count=>`terminal-only execution-order cycle across ${count} item(s)`,cycle,maxSampleSize,"Leave as history debt, or clean up in a dedicated changelog-safe closed-item batch; never repair closed items ad hoc.",contradictionEvidence.length===0?void 0:contradictionEvidence))}const predecessorsByNode=new Map;for(const[predecessor,adjacent]of orderingAdjacency)for(const successor of adjacent){const predecessors=predecessorsByNode.get(successor);predecessors?predecessors.push(predecessor):predecessorsByNode.set(successor,[predecessor])}const staleLifecycleBlocks=[...nodeStates.values()].filter(state=>!state.missing&&!state.terminal&&isBlocked(state.status)&&!(predecessorsByNode.get(state.id)??[]).some(predecessor=>{const predecessorState=nodeStates.get(predecessor);return predecessorState===void 0||!predecessorState.terminal})).map(state=>state.id);return appendFinding(findings,staleLifecycleBlocks,maxSampleSize,"stale_lifecycle_block","warning","A blocked lifecycle status must be backed by at least one open ordering predecessor.",count=>`${count} status-blocked item(s) with no open blocker edge`,'Add a local blocker edge, declare an external blocker with --dep "id=<external-ref>,kind=blocked_by,source_kind=external", or move the item back to an active status.'),findings}function formatDuplicateEdgeGroup(group){const kinds=group.edges.map(edge=>edge.kind).sort((left,right)=>left.localeCompare(right));return`${group.from} -> ${group.to} (${kinds.join(" + ")})`}function collectDuplicateRelationshipEdgeGroups(assembly){const registry=assembly.graph.registry(),groups=new Map;for(const edge of assembly.graph.edges()){const definition=registry.require(edge.kind);if(!isTransitiveKind(definition))continue;const oriented=orientTransitiveEdge(edge,definition);if(oriented.from===oriented.to)continue;const key=`${transitiveFamilyKey(definition)}::${oriented.from}::${oriented.to}`,group=groups.get(key);group?group.edges.push(edge):groups.set(key,{...oriented,edges:[edge]})}const duplicated=[...groups.values()].filter(group=>group.edges.length>=2);for(const group of duplicated)group.edges.sort((left,right)=>left.kind.localeCompare(right.kind));return duplicated.sort((left,right)=>left.from.localeCompare(right.from)||left.to.localeCompare(right.to))}function collectDuplicateEdgeFindings(assembly,nodeStates,maxSampleSize){const active=[],legacy=[];for(const group of collectDuplicateRelationshipEdgeGroups(assembly))(isActiveAuditMember(group.from,nodeStates)||isActiveAuditMember(group.to,nodeStates)?active:legacy).push(formatDuplicateEdgeGroup(group));const findings=[];return appendFinding(findings,active,maxSampleSize,"duplicate_edge","info","One semantic relationship should be stored once; parallel same-family spellings (reciprocal inverse pairs included) add no information and skew degree metrics.",count=>`${count} duplicated relationship(s) between active endpoints`,"Remove all but one stored spelling of the relationship; keep the canonical direction the holder declared first."),appendFinding(findings,legacy,maxSampleSize,"legacy_duplicate_edge","info","Duplicated spellings between exclusively terminal items are historical noise with no scheduling effect.",count=>`${count} duplicated relationship(s) between terminal endpoints`,"Leave as history debt or clean up in a dedicated changelog-safe closed-item batch."),findings}function collectDuplicateRowFindings(assembly,maxSampleSize){const active=[],legacy=[];for(const row of assembly.duplicateRows??[])(row.legacy_terminal?legacy:active).push(`${row.holder_id} -> ${row.target_id} (${row.kind} x${row.occurrences})`);const findings=[];return appendFinding(findings,active,maxSampleSize,"duplicate_dependency_row","warning","One dependency row must be stored once per holder; identical repeated rows are a storage-layer defect invisible to the assembled graph.",count=>`${count} exactly duplicated stored dependency row(s) on active holder(s)`,"Remove the repeated rows so the dependency is stored exactly once; graph semantics are unchanged."),appendFinding(findings,legacy,maxSampleSize,"legacy_duplicate_dependency_row","info","Identical repeated dependency rows on terminal holders are historical storage noise with no scheduling effect.",count=>`${count} exactly duplicated stored dependency row(s) on terminal holder(s)`,"Leave as history debt or clean up in a dedicated changelog-safe closed-item batch."),findings}function buildOutcomeReverseIndex(assembly,signal){const reverse=new Map,basisKinds={source_to_target:[],target_to_source:[],both:[]};for(const definition of assembly.graph.registry().list())definition.outcomeTraversal!==void 0&&basisKinds[definition.outcomeTraversal].push(definition.kind);const basis={source_to_target:basisKinds.source_to_target.join(","),target_to_source:basisKinds.target_to_source.join(","),both:basisKinds.both.join(",")},append=(from,to)=>{const sources=reverse.get(to)??new Set;sources.add(from),reverse.set(to,sources)};for(const edge of assembly.graph.edges()){signal?.throwIfAborted();const definition=assembly.graph.registry().require(edge.kind);(definition.outcomeTraversal==="source_to_target"||definition.outcomeTraversal==="both")&&append(edge.source,edge.target),(definition.outcomeTraversal==="target_to_source"||definition.outcomeTraversal==="both")&&append(edge.target,edge.source)}return{basis,reverse}}function expandOutcomeReachability(outcomes,reverse,signal){const reachable=new Set(outcomes),queue=[...outcomes].sort();for(let index=0;index<queue.length;index+=1){signal?.throwIfAborted();for(const source of[...reverse.get(queue[index])??[]].sort())reachable.has(source)||(reachable.add(source),queue.push(source))}return reachable}function tallyOutcomeReachability(nodeStates,outcomes,reachable,signal){let activeReachable=0,activeUnreachable=0,terminal=0,terminalReachable=0;for(const state of nodeStates.values())if(signal?.throwIfAborted(),!outcomes.has(state.id)&&!(state.missing||state.status==="external")){if(state.terminal){terminal+=1,reachable.has(state.id)&&(terminalReachable+=1);continue}reachable.has(state.id)?activeReachable+=1:activeUnreachable+=1}const active=activeReachable+activeUnreachable,terminalUnreachable=terminal-terminalReachable,outcomeReachable=activeReachable+terminalReachable,outcomeUnreachable=activeUnreachable+terminalUnreachable,outcomePopulation=outcomeReachable+outcomeUnreachable;return{active_outcome_reachable_nodes:activeReachable,active_outcome_unreachable_nodes:activeUnreachable,active_outcome_reachability_basis_points:active===0?0:Math.floor(activeReachable*1e4/active),terminal_nodes:terminal,terminal_outcome_reachable_nodes:terminalReachable,terminal_outcome_unreachable_nodes:terminalUnreachable,terminal_outcome_reachability_basis_points:terminal===0?0:Math.floor(terminalReachable*1e4/terminal),outcome_reachable_nodes:outcomeReachable,outcome_unreachable_nodes:outcomeUnreachable,outcome_reachability_basis_points:outcomePopulation===0?0:Math.floor(outcomeReachable*1e4/outcomePopulation)}}function profileOutcomeReachability(assembly,nodeStates,signal){const outcomes=new Set(assembly.details.filter(detail=>detail.type?.toLowerCase()===OUTCOME_MILESTONE_TYPE&&detail.title.trim().toLowerCase().startsWith(OUTCOME_MILESTONE_TITLE_PREFIX)).map(detail=>detail.id)),{basis,reverse}=buildOutcomeReverseIndex(assembly,signal),reachable=expandOutcomeReachability(outcomes,reverse,signal);return{outcome_nodes:outcomes.size,outcome_reachability_basis:basis,...tallyOutcomeReachability(nodeStates,outcomes,reachable,signal)}}function tallyActiveCoverageNode(tallies,state,degree,exemptIsolates,isolateExemptTypes){tallies.active+=1;const typeKey=state.type??"(untyped)";let typeProfile=tallies.byType.get(typeKey);typeProfile||(typeProfile={active:0,isolated:0,degree_leq_one:0},tallies.byType.set(typeKey,typeProfile)),typeProfile.active+=1,!(degree>1)&&(tallies.degreeLeqOne+=1,typeProfile.degree_leq_one+=1,degree===0&&(tallies.isolated+=1,typeProfile.isolated+=1),!(exemptIsolates.has(state.id.toLowerCase())||isolateExemptTypes.has(typeKey.toLowerCase()))&&(degree===0?tallies.isolates.push(state.id):tallies.sparse.push(state.id)))}function collectCoverageReport(assembly,nodeStates,exemptIsolates,isolateExemptTypes,maxSampleSize,edgesByKind,signal){const tallies={active:0,missing:0,isolated:0,degreeLeqOne:0,isolates:[],sparse:[],byType:new Map};for(const id of assembly.graph.nodes()){signal?.throwIfAborted();const state=nodeStates.get(id);if(state){if(state.missing){tallies.missing+=1;continue}state.terminal||tallyActiveCoverageNode(tallies,state,assembly.graph.incidentEdges(id).length,exemptIsolates,isolateExemptTypes)}}const{isolates,sparse}=tallies,findings=[];appendFinding(findings,isolates,maxSampleSize,"isolated_active_node","warning","Active work should be reachable from the graph unless explicitly declared a valid isolate.",count=>`${count} active item(s) with no relationships`,"Link the item to its parent, prerequisite, or origin \u2014 or register it as an exempt isolate."),appendFinding(findings,sparse,maxSampleSize,"sparse_active_node","info","Active items with a single edge often miss an honest semantic partner; sparse is not automatically defective.",count=>`${count} active item(s) with exactly one relationship`,"Investigate for an honest second edge (story->task, defect family, cross-epic complement); do not fabricate one.");const edgeCount=assembly.graph.edges().length,redundantEdges=findRedundantRelationshipEdges(assembly.graph,{signal}).value,nonInformativeEdgeKeys=new Set(redundantEdges.map(({edge})=>`${edge.source.toLowerCase()}\0${edge.target.toLowerCase()}\0${edge.kind}`));for(const contradiction of assembly.orderingContradictions??[])nonInformativeEdgeKeys.add(`${contradiction.holder_id.toLowerCase()}\0${contradiction.target_id.toLowerCase()}\0${contradiction.dependency_kind}`);const sortedEdgesByKind=Object.fromEntries(Object.entries(edgesByKind).sort(([left],[right])=>left.localeCompare(right))),semanticEdges=Object.entries(sortedEdgesByKind).reduce((count,[kind,value])=>count+(isSemanticContextKind(kind)?value:0),0),cutStructure=findRelationshipCutStructure(assembly.graph,{signal}).value,outcomeReachability=profileOutcomeReachability(assembly,nodeStates,signal);return{findings,profile:{nodes:assembly.graph.nodes().length,recorded_nodes:assembly.details.filter(detail=>detail.status!=="missing"&&detail.status!=="external").length,edges:edgeCount,informative_edges:edgeCount-nonInformativeEdgeKeys.size,redundant_edges:redundantEdges.length,ordering_contradiction_edges:assembly.orderingContradictions?.length??0,edge_basis:"deduplicated_directed",edges_by_kind:sortedEdgesByKind,edge_share_by_kind:Object.fromEntries(Object.entries(sortedEdgesByKind).map(([kind,count])=>[kind,count/edgeCount])),semantic_edges:semanticEdges,semantic_edge_share:edgeCount===0?0:semanticEdges/edgeCount,active_nodes:tallies.active,missing_nodes:tallies.missing,isolated_active_nodes:tallies.isolated,degree_leq_one_active_nodes:tallies.degreeLeqOne,coverage_by_type:Object.fromEntries([...tallies.byType.entries()].sort(([left],[right])=>left<right?-1:1)),articulation_points:cutStructure.articulationPoints.length,bridge_edges:cutStructure.bridges.length,...outcomeReachability,finding_subjects_by_code:Object.fromEntries(RELATIONSHIP_AUDIT_FINDING_CODES.map(code=>[code,0]))}}}function auditWorkspaceRelationshipGraph(assembly,options={}){const isTerminal=options.isTerminal??(status=>status==="closed"||status==="canceled"),isBlocked=options.isBlocked??(status=>status==="blocked"),maxSampleSize=options.maxSampleSize??DEFAULT_MAX_SAMPLE_SIZE;if(!Number.isInteger(maxSampleSize)||maxSampleSize<1)throw new TypeError(`Invalid audit sample bound: ${String(options.maxSampleSize)}`);const exemptIsolates=normalizeExemptionSet(options.exemptIsolates),isolateExemptTypes=normalizeExemptionSet(options.isolateExemptTypes),nodeStates=new Map(assembly.details.map(detail=>[detail.id,{id:detail.id,status:detail.status,missing:assembly.missingIdSet.has(detail.id.toLowerCase()),terminal:isTerminal(detail.status),...detail.type===void 0?{}:{type:detail.type}}]));options.signal?.throwIfAborted();const edgesByKind={};for(const edge of assembly.graph.edges())edgesByKind[edge.kind]=(edgesByKind[edge.kind]??0)+1;const findings=collectIntegrityFindings(assembly,isTerminal,maxSampleSize);findings.push(...collectHierarchyIntegrityFindings(assembly,maxSampleSize)),options.signal?.throwIfAborted(),findings.push(...collectOrderingStorageContradictionFindings(assembly,maxSampleSize)),options.signal?.throwIfAborted(),findings.push(...collectOrderingFindings(assembly,nodeStates,isBlocked,maxSampleSize)),options.signal?.throwIfAborted(),findings.push(...collectDuplicateEdgeFindings(assembly,nodeStates,maxSampleSize),...collectDuplicateRowFindings(assembly,maxSampleSize)),options.signal?.throwIfAborted();const coverage=collectCoverageReport(assembly,nodeStates,exemptIsolates,isolateExemptTypes,maxSampleSize,edgesByKind,options.signal);findings.push(...coverage.findings),findings.sort((left,right)=>SEVERITY_RANK[left.severity]-SEVERITY_RANK[right.severity]||left.code.localeCompare(right.code)||left.sample[0].localeCompare(right.sample[0]));const findingSubjectsByCode=coverage.profile.finding_subjects_by_code;for(const finding of findings)findingSubjectsByCode[finding.code]+=finding.count;return{findings,profile:{...coverage.profile,...profileRelationshipLifecycles(assembly,isTerminal,isSemanticContextKind,options.signal),ordering_acyclic:!findings.some(finding=>finding.code==="ordering_cycle"||finding.code==="legacy_ordering_cycle"),active_ordering_acyclic:!findings.some(finding=>finding.code==="ordering_cycle"),finding_subjects_by_code:findingSubjectsByCode}}}function diffCountRecords(baseline,current){const keys=[...new Set([...Object.keys(baseline),...Object.keys(current)])].sort(),deltas={};for(const key of keys){const delta=(current[key]??0)-(baseline[key]??0);delta!==0&&(deltas[key]=delta)}return deltas}function readSnapshotCoverageByType(snapshot){return snapshot.profile.coverage_by_type??{}}function diffCoverageByType(baseline,current){const deltas={},baselineCoverage=readSnapshotCoverageByType(baseline),currentCoverage=readSnapshotCoverageByType(current),types=[...new Set([...Object.keys(baselineCoverage),...Object.keys(currentCoverage)])].sort();for(const type of types){const before=Object.assign({active:0,isolated:0,degree_leq_one:0},baselineCoverage[type]),after=Object.assign({active:0,isolated:0,degree_leq_one:0},currentCoverage[type]),delta={active:after.active-before.active,isolated:after.isolated-before.isolated,degree_leq_one:after.degree_leq_one-before.degree_leq_one};Object.values(delta).some(value=>value!==0)&&(deltas[type]=delta)}return deltas}function diffRelationshipAuditSnapshots(baseline,current){const coverageByType=diffCoverageByType(baseline,current),{edge_share_by_kind:baselineEdgeShareByKind={},semantic_edges:baselineSemanticEdges=0,semantic_edge_share:baselineSemanticEdgeShare=0}=baseline.profile,{edge_share_by_kind:currentEdgeShareByKind={},semantic_edges:currentSemanticEdges=0,semantic_edge_share:currentSemanticEdgeShare=0}=current.profile,baselineRecordedNodes=baseline.profile.recorded_nodes??baseline.profile.nodes,currentRecordedNodes=current.profile.recorded_nodes??current.profile.nodes,baselineInformativeEdges=baseline.profile.informative_edges??baseline.profile.edges,currentInformativeEdges=current.profile.informative_edges??current.profile.edges,baselineRedundantEdges=baseline.profile.redundant_edges??0,currentRedundantEdges=current.profile.redundant_edges??0,baselineOrderingContradictionEdges=baseline.profile.ordering_contradiction_edges??0,currentOrderingContradictionEdges=current.profile.ordering_contradiction_edges??0;return{baseline_saved_at:baseline.saved_at,same_snapshot:baseline.fingerprint===current.fingerprint,affected_subjects_by_code:diffCountRecords(baseline.affected_subjects_by_code,current.affected_subjects_by_code),profile:{nodes:current.profile.nodes-baseline.profile.nodes,recorded_nodes:currentRecordedNodes-baselineRecordedNodes,edges:current.profile.edges-baseline.profile.edges,informative_edges:currentInformativeEdges-baselineInformativeEdges,redundant_edges:currentRedundantEdges-baselineRedundantEdges,ordering_contradiction_edges:currentOrderingContradictionEdges-baselineOrderingContradictionEdges,active_nodes:current.profile.active_nodes-baseline.profile.active_nodes,missing_nodes:current.profile.missing_nodes-baseline.profile.missing_nodes,isolated_active_nodes:current.profile.isolated_active_nodes-baseline.profile.isolated_active_nodes,degree_leq_one_active_nodes:current.profile.degree_leq_one_active_nodes-baseline.profile.degree_leq_one_active_nodes,edges_by_kind:diffCountRecords(baseline.profile.edges_by_kind,current.profile.edges_by_kind),edge_share_by_kind:diffCountRecords(baselineEdgeShareByKind,currentEdgeShareByKind),semantic_edges:currentSemanticEdges-baselineSemanticEdges,semantic_edge_share:currentSemanticEdgeShare-baselineSemanticEdgeShare,coverage_by_type:coverageByType,...diffLifecycleCoverage(baseline.profile,current.profile)}}}export{auditWorkspaceRelationshipGraph,collectDuplicateRelationshipEdgeGroups,collectOrderingCycles,diffRelationshipAuditSnapshots,formatDuplicateEdgeGroup,formatOrderingStorageContradiction,isSemanticContextKind};
|
|
2
2
|
//# sourceMappingURL=governance.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8b57e560-4ac4-53b6-9fb1-eebb1f30562a")}catch{}})();import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{resolveWorkspaceRelationshipKindRegistry}from"./workspace-relationship-kind-registry.js";function normalizeItemId(value){if(typeof value!="string")return;const normalized=value.trim().toLowerCase();return normalized.length>0?normalized:void 0}function relationIdentity(relation){return[relation.parent_id,relation.child_id,relation.source,relation.kind,relation.holder_id,relation.target_id??""].join("\0")}function collectHierarchyFinishOrder(nodeIds,childrenByParent){const visited=new Set,finishOrder=[];for(const root of[...nodeIds].sort()){if(visited.has(root))continue;visited.add(root);const frames=[{nodeId:root,children:[...childrenByParent.get(root)??[]].sort(),nextChild:0}];for(;frames.length>0;){const frame=frames.at(-1),childId=frame.children[frame.nextChild];childId===void 0?(finishOrder.push(frame.nodeId),frames.pop()):(frame.nextChild+=1,visited.has(childId)||(visited.add(childId),frames.push({nodeId:childId,children:[...childrenByParent.get(childId)??[]].sort(),nextChild:0})))}}return finishOrder}function collectCyclicComponents(nodeIds,childrenByParent){const sortedNodeIds=[...nodeIds].sort(),finishOrder=collectHierarchyFinishOrder(sortedNodeIds,childrenByParent),visited=new Set,parentsByChild=reverseHierarchyEdges(sortedNodeIds,childrenByParent),components=[];for(const root of finishOrder.reverse()){if(visited.has(root))continue;const component=collectReverseComponent(root,parentsByChild,visited);(component.length>1||childrenByParent.get(component[0])?.has(component[0]))&&components.push(component)}return components.sort((left,right)=>left.join("\0").localeCompare(right.join("\0")))}function reverseHierarchyEdges(nodeIds,childrenByParent){const parentsByChild=new Map(nodeIds.map(nodeId=>[nodeId,new Set]));for(const[parentId,childIds]of childrenByParent)for(const childId of childIds)parentsByChild.get(childId)?.add(parentId);return parentsByChild}function collectReverseComponent(root,parentsByChild,visited){const component=[],pending=[root];for(visited.add(root);pending.length>0;){const nodeId=pending.pop();component.push(nodeId);for(const parentId of[...parentsByChild.get(nodeId)].sort())visited.has(parentId)||(visited.add(parentId),pending.push(parentId))}return component.sort()}function collectHierarchyItems(items){const itemById=new Map;for(const item of items){const itemId=normalizeItemId(item?.id);itemId&&!itemById.has(itemId)&&itemById.set(itemId,item)}return itemById}function buildScalarHierarchyRelation(holderId,item,itemById){const parentId=normalizeItemId(item.parent);if(!(!parentId||!itemById.has(parentId)))return{parent_id:parentId,child_id:holderId,source:"scalar_parent",kind:"parent",holder_id:holderId,child_cardinality:"one"}}function buildDependencyHierarchyRelation(holderId,dependency,itemById,registry){const targetId=normalizeItemId(dependency?.id),definition=registry.resolve(dependency?.kind);if(!targetId||!itemById.has(targetId)||!definition?.hierarchy)return;const sourceIsParent=definition.hierarchyDirection==="source_parent";return{parent_id:sourceIsParent?holderId:targetId,child_id:sourceIsParent?targetId:holderId,source:"dependency",kind:definition.kind,holder_id:holderId,target_id:targetId,child_cardinality:sourceIsParent?definition.incoming:definition.outgoing}}function collectHierarchyRelationsFromItemMap(itemById,registry){const relationsByIdentity=new Map;for(const[holderId,item]of itemById){const scalarRelation=buildScalarHierarchyRelation(holderId,item,itemById);scalarRelation&&relationsByIdentity.set(relationIdentity(scalarRelation),scalarRelation);for(const dependency of item.dependencies??[]){const relation=buildDependencyHierarchyRelation(holderId,dependency,itemById,registry);relation&&relationsByIdentity.set(relationIdentity(relation),relation)}}return[...relationsByIdentity.values()].sort((left,right)=>relationIdentity(left).localeCompare(relationIdentity(right)))}function collectHierarchyRelations(items,registry=resolveWorkspaceRelationshipKindRegistry()){return collectHierarchyRelationsFromItemMap(collectHierarchyItems(items),registry)}function collectHierarchyCardinalityViolations(relations,parentsByChild,terminalIds){const oneCardinalityChildren=new Set(relations.filter(relation=>relation.child_cardinality==="one").map(relation=>relation.child_id));return[...parentsByChild].filter(([childId,parentIds])=>parentIds.length>1&&oneCardinalityChildren.has(childId)).map(([childId,parentIds])=>({child_id:childId,parent_ids:[...parentIds],legacy_terminal:terminalIds.has(childId)&&parentIds.every(id=>terminalIds.has(id))})).sort((left,right)=>left.child_id.localeCompare(right.child_id))}function collectHierarchyDivergences(itemById,relations,terminalIds){const dependencyParentsByChild=new Map;for(const relation of relations){if(relation.source!=="dependency")continue;const parents=dependencyParentsByChild.get(relation.child_id)??new Set;parents.add(relation.parent_id),dependencyParentsByChild.set(relation.child_id,parents)}const divergences=[];for(const[childId,item]of itemById){const scalarParentId=normalizeItemId(item.parent);if(!scalarParentId||!itemById.has(scalarParentId))continue;const dependencyParentIds=[...dependencyParentsByChild.get(childId)??[]].filter(parentId=>parentId!==scalarParentId).sort();dependencyParentIds.length!==0&&divergences.push({child_id:childId,scalar_parent_id:scalarParentId,dependency_parent_ids:dependencyParentIds,legacy_terminal:terminalIds.has(childId)&&terminalIds.has(scalarParentId)&&dependencyParentIds.every(id=>terminalIds.has(id))})}return divergences.sort((left,right)=>left.child_id.localeCompare(right.child_id))}function analyzeHierarchyIntegrity(items,isTerminal=status=>status==="closed"||status==="canceled",registry=resolveWorkspaceRelationshipKindRegistry()){const itemById=collectHierarchyItems(items),relations=collectHierarchyRelationsFromItemMap(itemById,registry),indexes=indexHierarchyRelations(relations),terminalIds=new Set([...itemById].filter(([,item])=>isTerminal(item.status)).map(([id])=>id)),cycles=collectCyclicComponents([...itemById.keys()],new Map([...indexes.children_by_parent].map(([id,childIds])=>[id,new Set(childIds)]))).map(itemIds=>({item_ids:itemIds,legacy_terminal:itemIds.every(id=>terminalIds.has(id))}));return{relations,cycles,cardinality_violations:collectHierarchyCardinalityViolations(relations,indexes.parents_by_child,terminalIds),divergences:collectHierarchyDivergences(itemById,relations,terminalIds)}}function formatHierarchyRelation(relation){return relation.source==="scalar_parent"?`${relation.parent_id} -> ${relation.child_id} (scalar parent on ${relation.holder_id})`:`${relation.parent_id} -> ${relation.child_id} (${relation.kind} dependency on ${relation.holder_id})`}function indexHierarchyRelations(relations){const parentSets=new Map,childSets=new Map;for(const relation of relations){const parents=parentSets.get(relation.child_id)??new Set;parents.add(relation.parent_id),parentSets.set(relation.child_id,parents);const children=childSets.get(relation.parent_id)??new Set;children.add(relation.child_id),childSets.set(relation.parent_id,children)}return{parents_by_child:new Map([...parentSets].map(([id,values])=>[id,[...values].sort()])),children_by_parent:new Map([...childSets].map(([id,values])=>[id,[...values].sort()]))}}function isIdentifierSubset(candidate,prior){const priorIds=new Set(prior);return candidate.every(id=>priorIds.has(id))}function assertHierarchyMutationAllowed(beforeItems,afterItems,changedItemId,isTerminal,registry){const holderId=normalizeItemId(changedItemId);if(!holderId)return;const before=analyzeHierarchyIntegrity(beforeItems,isTerminal,registry),after=analyzeHierarchyIntegrity(afterItems,isTerminal,registry),divergence=after.divergences.find(finding=>!before.divergences.some(prior=>prior.child_id===finding.child_id&&prior.scalar_parent_id===finding.scalar_parent_id&&isIdentifierSubset(finding.dependency_parent_ids,prior.dependency_parent_ids)));if(divergence){const parentIds=[divergence.scalar_parent_id,...divergence.dependency_parent_ids].sort();throw new PmCliError(`Hierarchy mutation would assign ${divergence.child_id} to multiple parents: ${parentIds.join(", ")}.`,EXIT_CODE.CONFLICT,{code:"hierarchy_parent_divergence_created",source_id:holderId,target_id:divergence.child_id,verification_errors:parentIds})}const cardinality=after.cardinality_violations.find(finding=>(finding.child_id===holderId||finding.parent_ids.includes(holderId))&&!before.cardinality_violations.some(prior=>prior.child_id===finding.child_id&&isIdentifierSubset(finding.parent_ids,prior.parent_ids)));if(cardinality)throw new PmCliError(`Hierarchy mutation would assign ${cardinality.child_id} to multiple parents: ${cardinality.parent_ids.join(", ")}.`,EXIT_CODE.CONFLICT,{code:"hierarchy_cardinality_created",source_id:holderId,target_id:cardinality.child_id,verification_errors:cardinality.parent_ids});const cycle=after.cycles.find(finding=>finding.item_ids.includes(holderId)&&!before.cycles.some(prior=>isIdentifierSubset(finding.item_ids,prior.item_ids)));if(cycle)throw new PmCliError(`Hierarchy mutation would create a cycle: ${cycle.item_ids.join(" -> ")}.`,EXIT_CODE.CONFLICT,{code:"hierarchy_cycle_created",source_id:holderId,verification_errors:cycle.item_ids})}export{analyzeHierarchyIntegrity,assertHierarchyMutationAllowed,collectHierarchyRelations,formatHierarchyRelation,indexHierarchyRelations};
|
|
2
2
|
//# sourceMappingURL=hierarchy-integrity.js.map
|
package/dist/sdk/graph/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="df28925a-72d8-5d39-accf-e295ee01d3f9")}catch{}})();export*from"./query-contracts.js";import{computeRelationshipDominators,detectRelationshipCommunities,findRedundantRelationshipEdges,forEachMatchedRelationshipEdge}from"./analytics.js";import{computeRelationshipCentrality,findRelationshipCutStructure}from"./centrality.js";import{createRelationshipGraphSnapshot,federateRelationshipGraphSnapshots,loadRelationshipGraphAdapter,MemoryRelationshipGraphAdapter,parseRelationshipGraphSnapshot,RELATIONSHIP_GRAPH_SNAPSHOT_VERSION,syncRelationshipGraphAdapter}from"./adapter.js";import{assertMemoryRelationshipGraphAdapterConformance,assertRelationshipGraphAdapterConformance,createRelationshipGraphScaleFixture}from"./conformance.js";import{analyzeRelationshipSchedule}from"./scheduling.js";import{deriveRelationshipDeadlines}from"./deadline-scheduling.js";import{assembleWorkspaceRelationshipGraph,collectDanglingDependencyReferences,collectDuplicateDependencyRows,collectMissingDependencyTargetIds,collectOrderingStorageContradictions,normalizeDependencyGraphTarget,resolveWorkspaceRelationshipKindRegistry}from"./assembly.js";import{auditWorkspaceRelationshipGraph,collectDuplicateRelationshipEdgeGroups,collectOrderingCycles,diffRelationshipAuditSnapshots,formatDuplicateEdgeGroup,formatOrderingStorageContradiction}from"./governance.js";import{analyzeHierarchyIntegrity,assertHierarchyMutationAllowed,collectHierarchyRelations,formatHierarchyRelation,indexHierarchyRelations}from"./hierarchy-integrity.js";import{clearDurableGraphCache,durableGraphCachePath,durableGraphCacheStatus,GRAPH_DURABLE_CACHE_MIN_ITEMS,GRAPH_DURABLE_CACHE_VERSION,graphAuditBaselinePath,loadGraphAuditBaseline,openDurableGraphCache,persistDurableGraphResult,saveGraphAuditBaseline,shouldPersistDurableGraphCache}from"./durable-cache.js";import{enumerateRelationshipPaths,hierarchyAncestors,hierarchyDescendants,orderingPredecessors,orderingSuccessors}from"./traversal.js";import{computeWorkspaceGraphFingerprint,resetWorkspaceGraphCache,workspaceGraphCache,WorkspaceGraphCache}from"./cache.js";import{planRelationshipRemediation}from"./remediation.js";import{collectNewOrderingCycleWarnings}from"./mutation-advisory.js";import{GRAPH_SUBCOMMAND_VALUES,parseGraphSubcommand,runGraph}from"./run.js";export{GRAPH_DURABLE_CACHE_MIN_ITEMS,GRAPH_DURABLE_CACHE_VERSION,GRAPH_SUBCOMMAND_VALUES,MemoryRelationshipGraphAdapter,RELATIONSHIP_GRAPH_SNAPSHOT_VERSION,WorkspaceGraphCache,analyzeHierarchyIntegrity,analyzeRelationshipSchedule,assembleWorkspaceRelationshipGraph,assertHierarchyMutationAllowed,assertMemoryRelationshipGraphAdapterConformance,assertRelationshipGraphAdapterConformance,auditWorkspaceRelationshipGraph,clearDurableGraphCache,collectDanglingDependencyReferences,collectDuplicateDependencyRows,collectDuplicateRelationshipEdgeGroups,collectHierarchyRelations,collectMissingDependencyTargetIds,collectNewOrderingCycleWarnings,collectOrderingCycles,collectOrderingStorageContradictions,computeRelationshipCentrality,computeRelationshipDominators,computeWorkspaceGraphFingerprint,createRelationshipGraphScaleFixture,createRelationshipGraphSnapshot,deriveRelationshipDeadlines,detectRelationshipCommunities,diffRelationshipAuditSnapshots,durableGraphCachePath,durableGraphCacheStatus,enumerateRelationshipPaths,federateRelationshipGraphSnapshots,findRedundantRelationshipEdges,findRelationshipCutStructure,forEachMatchedRelationshipEdge,formatDuplicateEdgeGroup,formatHierarchyRelation,formatOrderingStorageContradiction,graphAuditBaselinePath,hierarchyAncestors,hierarchyDescendants,indexHierarchyRelations,loadGraphAuditBaseline,loadRelationshipGraphAdapter,normalizeDependencyGraphTarget,openDurableGraphCache,orderingPredecessors,orderingSuccessors,parseGraphSubcommand,parseRelationshipGraphSnapshot,persistDurableGraphResult,planRelationshipRemediation,resetWorkspaceGraphCache,resolveWorkspaceRelationshipKindRegistry,runGraph,saveGraphAuditBaseline,shouldPersistDurableGraphCache,syncRelationshipGraphAdapter,workspaceGraphCache};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ccb7d865-8baa-5379-a810-7be494eadcb1")}catch{}})();function emptyCoverage(){return{nodes:0,isolated:0,degree_leq_one:0,semantic_nodes:0,without_semantic_edges:0,degree_histogram:{}}}function profileRelationshipLifecycles(assembly,isTerminal,isSemantic,signal){const lifecycle={all:emptyCoverage(),active:emptyCoverage(),terminal:emptyCoverage()},statuses=new Map;for(const detail of assembly.details){if(signal?.throwIfAborted(),assembly.missingIdSet.has(detail.id.toLowerCase())||detail.status==="external")continue;const status=statuses.get(detail.status)??emptyCoverage();statuses.set(detail.status,status);const incident=assembly.graph.incidentEdges(detail.id),semantic=incident.some(edge=>isSemantic(edge.kind));for(const bucket of[lifecycle.all,lifecycle[isTerminal(detail.status)?"terminal":"active"],status]){bucket.nodes+=1,bucket.isolated+=+(incident.length===0),incident.length<=1&&(bucket.degree_leq_one+=1),semantic?bucket.semantic_nodes+=1:bucket.without_semantic_edges+=1;const degree=String(incident.length);bucket.degree_histogram[degree]=(bucket.degree_histogram[degree]??0)+1}}return{coverage_by_lifecycle:lifecycle,coverage_by_status:Object.fromEntries([...statuses].sort(([left],[right])=>left.localeCompare(right)))}}function validPopulation(value){if(!isCoverageRecord(value))return!1;const row=value;if(!["nodes","isolated","degree_leq_one","semantic_nodes","without_semantic_edges"].every(field=>Number.isSafeInteger(row[field])&&Number(row[field])>=0)||!isCoverageRecord(row.degree_histogram))return!1;const histogram=Object.entries(row.degree_histogram);return histogram.every(([key,count])=>/^(0|[1-9]\d*)$/.test(key)&&Number.isSafeInteger(count)&&Number(count)>=0)&&histogram.reduce((sum,[,count])=>sum+Number(count),0)===row.nodes&&Number(row.isolated)<=Number(row.degree_leq_one)&&Number(row.degree_leq_one)<=Number(row.nodes)&&Number(row.semantic_nodes)+Number(row.without_semantic_edges)===row.nodes}function isCoverageRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function validLifecycleSnapshot(profile){for(const field of["ordering_acyclic","active_ordering_acyclic"])if(profile[field]!==void 0&&typeof profile[field]!="boolean")return!1;const lifecycle=profile.coverage_by_lifecycle,statuses=profile.coverage_by_status;return lifecycle===void 0&&statuses===void 0?!0:!isCoverageRecord(lifecycle)||!isCoverageRecord(statuses)?!1:["all","active","terminal"].every(key=>validPopulation(lifecycle[key]))&&Object.values(statuses).every(validPopulation)}function diffPopulations(before,after){return Object.fromEntries([...new Set([...Object.keys(before),...Object.keys(after)])].sort().map(key=>{const left=Object.hasOwn(before,key)?before[key]:emptyCoverage(),right=Object.hasOwn(after,key)?after[key]:emptyCoverage(),histogram=Object.fromEntries([...new Set([...Object.keys(left.degree_histogram),...Object.keys(right.degree_histogram)])].sort().map(degree=>[degree,(right.degree_histogram[degree]??0)-(left.degree_histogram[degree]??0)]));return[key,{nodes:right.nodes-left.nodes,isolated:right.isolated-left.isolated,degree_leq_one:right.degree_leq_one-left.degree_leq_one,semantic_nodes:right.semantic_nodes-left.semantic_nodes,without_semantic_edges:right.without_semantic_edges-left.without_semantic_edges,degree_histogram:histogram}]}))}function diffLifecycleCoverage(before,after){return!before.coverage_by_lifecycle||!after.coverage_by_lifecycle||!before.coverage_by_status||!after.coverage_by_status?{lifecycle_comparable:!1}:{lifecycle_comparable:!0,coverage_by_lifecycle:diffPopulations(before.coverage_by_lifecycle,after.coverage_by_lifecycle),coverage_by_status:diffPopulations(before.coverage_by_status,after.coverage_by_status)}}export{diffLifecycleCoverage,profileRelationshipLifecycles,validLifecycleSnapshot};
|
|
2
2
|
//# sourceMappingURL=lifecycle-coverage.js.map
|