@unbrained/pm-cli 2026.9.6 → 2026.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +5 -0
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +218 -182
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
- package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
- package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
- package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
- package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
- package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +29 -29
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +157 -837
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +1 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -0
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +3 -0
- package/docs/RELEASING.md +1 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +23 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,97 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/merge/receipt-operation
|
|
3
|
-
* Records Git coordinates that let reconciliation prove a rebase restored its original state.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
!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]="7bef66b4-7131-5998-84bd-07983a25d762")}catch(e){}}();
|
|
7
|
-
import { execFile } from "node:child_process";
|
|
8
|
-
import { createHash } from "node:crypto";
|
|
9
|
-
import { readdir } from "node:fs/promises";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import { promisify } from "node:util";
|
|
12
|
-
import { readBoundedRegularFile } from "./receipt-file-boundary.js";
|
|
13
|
-
const execFileAsync = promisify(execFile);
|
|
14
|
-
const GIT_OBJECT_ID = /^[a-f0-9]{40}(?:[a-f0-9]{24})?$/u;
|
|
15
|
-
/** Capture a rebase's original commit and item blob, or omit unprovable coordinates. */
|
|
16
|
-
export async function captureMergeReceiptOperation(cwd, itemPath) {
|
|
17
|
-
const trimmedItemPath = itemPath.trim();
|
|
18
|
-
const normalizedItemPath = /^(['"])(.*)\1$/su.exec(trimmedItemPath)?.[2] ?? trimmedItemPath;
|
|
19
|
-
for (const backend of ["rebase-merge", "rebase-apply"]) {
|
|
20
|
-
try {
|
|
21
|
-
const { stdout: marker } = await execFileAsync("git", [
|
|
22
|
-
"rev-parse",
|
|
23
|
-
"--path-format=absolute",
|
|
24
|
-
"--git-path",
|
|
25
|
-
`${backend}/orig-head`,
|
|
26
|
-
], { cwd, timeout: 10_000 });
|
|
27
|
-
const originalHead = (await readBoundedRegularFile(marker.trim(), 128))?.trim();
|
|
28
|
-
if (originalHead === undefined || !GIT_OBJECT_ID.test(originalHead))
|
|
29
|
-
continue;
|
|
30
|
-
const { stdout } = await execFileAsync("git", ["rev-parse", "--verify", `${originalHead}:${normalizedItemPath}`], { cwd, timeout: 10_000 });
|
|
31
|
-
const originalBlob = stdout.trim();
|
|
32
|
-
return {
|
|
33
|
-
kind: "rebase",
|
|
34
|
-
original_head: originalHead,
|
|
35
|
-
original_blob: originalBlob,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
// No evidence is safer than inferring an abandoned operation from item drift.
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return undefined;
|
|
43
|
-
}
|
|
44
|
-
/** Validate only the bounded, privacy-safe operation schema accepted by receipt readers. */
|
|
45
|
-
export function isMergeReceiptOperation(value) {
|
|
46
|
-
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
47
|
-
return false;
|
|
48
|
-
const record = value;
|
|
49
|
-
return (Object.keys(record).length === 3 &&
|
|
50
|
-
record.kind === "rebase" &&
|
|
51
|
-
typeof record.original_head === "string" &&
|
|
52
|
-
GIT_OBJECT_ID.test(record.original_head) &&
|
|
53
|
-
typeof record.original_blob === "string" &&
|
|
54
|
-
GIT_OBJECT_ID.test(record.original_blob));
|
|
55
|
-
}
|
|
56
|
-
/** Prove HEAD, index, and working item all match the captured origin after Git leaves the operation. */
|
|
57
|
-
export async function isOriginalGitStateRestored(cwd, itemPath, operation, expectedItemRaw) {
|
|
58
|
-
if (expectedItemRaw !== undefined) {
|
|
59
|
-
const snapshotBlob = createHash(operation.original_blob.length === 40 ? "sha1" : "sha256")
|
|
60
|
-
.update(`blob ${Buffer.byteLength(expectedItemRaw)}\0`)
|
|
61
|
-
.update(expectedItemRaw)
|
|
62
|
-
.digest("hex");
|
|
63
|
-
if (snapshotBlob !== operation.original_blob)
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
try {
|
|
67
|
-
const { stdout: gitDirectory } = await execFileAsync("git", ["rev-parse", "--absolute-git-dir"], { cwd, timeout: 10_000 });
|
|
68
|
-
const activeMarkers = new Set([
|
|
69
|
-
"rebase-merge",
|
|
70
|
-
"rebase-apply",
|
|
71
|
-
"MERGE_HEAD",
|
|
72
|
-
"CHERRY_PICK_HEAD",
|
|
73
|
-
"REVERT_HEAD",
|
|
74
|
-
]);
|
|
75
|
-
if ((await readdir(gitDirectory.trim())).some((entry) => activeMarkers.has(entry)))
|
|
76
|
-
return false;
|
|
77
|
-
const { stdout: head } = await execFileAsync("git", ["rev-parse", "HEAD"], {
|
|
78
|
-
cwd,
|
|
79
|
-
timeout: 10_000,
|
|
80
|
-
});
|
|
81
|
-
if (head.trim() !== operation.original_head)
|
|
82
|
-
return false;
|
|
83
|
-
const { stdout: originalBlob } = await execFileAsync("git", ["rev-parse", "--verify", `HEAD:${itemPath}`], { cwd, timeout: 10_000 });
|
|
84
|
-
if (originalBlob.trim() !== operation.original_blob)
|
|
85
|
-
return false;
|
|
86
|
-
const { stdout: blob } = await execFileAsync("git", ["hash-object", "--", path.resolve(cwd, itemPath)], { cwd, timeout: 10_000 });
|
|
87
|
-
if (blob.trim() !== operation.original_blob)
|
|
88
|
-
return false;
|
|
89
|
-
await execFileAsync("git", ["diff", "--cached", "--quiet", "HEAD", "--", itemPath], { cwd, timeout: 10_000 });
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
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]="b5dfe3ea-a457-5fb4-84b4-c03110f6b53a")}catch(e2){}})();import{execFile}from"node:child_process";import{createHash}from"node:crypto";import{readdir}from"node:fs/promises";import path from"node:path";import{promisify}from"node:util";import{readBoundedRegularFile}from"./receipt-file-boundary.js";const execFileAsync=promisify(execFile);const GIT_OBJECT_ID=/^[a-f0-9]{40}(?:[a-f0-9]{24})?$/u;async function captureMergeReceiptOperation(cwd,itemPath){const trimmedItemPath=itemPath.trim();const normalizedItemPath=/^(['"])(.*)\1$/su.exec(trimmedItemPath)?.[2]??trimmedItemPath;for(const backend of["rebase-merge","rebase-apply"]){try{const{stdout:marker}=await execFileAsync("git",["rev-parse","--path-format=absolute","--git-path",`${backend}/orig-head`],{cwd,timeout:1e4});const originalHead=(await readBoundedRegularFile(marker.trim(),128))?.trim();if(originalHead===void 0||!GIT_OBJECT_ID.test(originalHead))continue;const{stdout}=await execFileAsync("git",["rev-parse","--verify",`${originalHead}:${normalizedItemPath}`],{cwd,timeout:1e4});const originalBlob=stdout.trim();return{kind:"rebase",original_head:originalHead,original_blob:originalBlob}}catch{}}return void 0}function isMergeReceiptOperation(value){if(typeof value!=="object"||value===null||Array.isArray(value))return false;const record=value;return Object.keys(record).length===3&&record.kind==="rebase"&&typeof record.original_head==="string"&&GIT_OBJECT_ID.test(record.original_head)&&typeof record.original_blob==="string"&&GIT_OBJECT_ID.test(record.original_blob)}async function isOriginalGitStateRestored(cwd,itemPath,operation,expectedItemRaw){if(expectedItemRaw!==void 0){const snapshotBlob=createHash(operation.original_blob.length===40?"sha1":"sha256").update(`blob ${Buffer.byteLength(expectedItemRaw)}\0`).update(expectedItemRaw).digest("hex");if(snapshotBlob!==operation.original_blob)return false}try{const{stdout:gitDirectory}=await execFileAsync("git",["rev-parse","--absolute-git-dir"],{cwd,timeout:1e4});const activeMarkers=new Set(["rebase-merge","rebase-apply","MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD"]);if((await readdir(gitDirectory.trim())).some(entry=>activeMarkers.has(entry)))return false;const{stdout:head}=await execFileAsync("git",["rev-parse","HEAD"],{cwd,timeout:1e4});if(head.trim()!==operation.original_head)return false;const{stdout:originalBlob}=await execFileAsync("git",["rev-parse","--verify",`HEAD:${itemPath}`],{cwd,timeout:1e4});if(originalBlob.trim()!==operation.original_blob)return false;const{stdout:blob}=await execFileAsync("git",["hash-object","--",path.resolve(cwd,itemPath)],{cwd,timeout:1e4});if(blob.trim()!==operation.original_blob)return false;await execFileAsync("git",["diff","--cached","--quiet","HEAD","--",itemPath],{cwd,timeout:1e4});return true}catch{return false}}export{captureMergeReceiptOperation,isMergeReceiptOperation,isOriginalGitStateRestored};
|
|
96
2
|
//# sourceMappingURL=receipt-operation.js.map
|
|
97
|
-
//# debugId=7bef66b4-7131-5998-84bd-07983a25d762
|
|
@@ -1,398 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module sdk/merge/receipt-schema
|
|
3
|
-
* Validates historical and current receipt encodings and enforces durable-value privacy policy.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
!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]="1f6aa507-79da-5d11-a580-72141b725947")}catch(e){}}();
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import { stableStringify } from "../../core/shared/serialization.js";
|
|
9
|
-
import { isRfc3339DateTime } from "../../core/shared/time.js";
|
|
10
|
-
import { encodeItemScalarDecisionValue, hashItemScalarDecisionValue, isItemScalarMissingValue, } from "./three-way.js";
|
|
11
|
-
import { isMergeReceiptOperation } from "./receipt-operation.js";
|
|
12
|
-
const RECEIPT_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/u;
|
|
13
|
-
const RECEIPT_ITEM_ID_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/u;
|
|
14
|
-
const RECEIPT_FIELD_MAX = 2_048;
|
|
15
|
-
const RECEIPT_VALUE_MAX_DEPTH = 64;
|
|
16
|
-
const RECEIPT_VALUE_MAX_NODES = 100_000;
|
|
17
|
-
const RECEIPT_KEYS = new Set([
|
|
18
|
-
"version",
|
|
19
|
-
"id",
|
|
20
|
-
"item_path",
|
|
21
|
-
"item_id",
|
|
22
|
-
"requested_preference",
|
|
23
|
-
"requested_preference_applied",
|
|
24
|
-
"preferred",
|
|
25
|
-
"conflict_resolution",
|
|
26
|
-
"fields_from_theirs",
|
|
27
|
-
"union_fields",
|
|
28
|
-
"merged_field_hashes",
|
|
29
|
-
"decisions",
|
|
30
|
-
"state",
|
|
31
|
-
"created_at",
|
|
32
|
-
"reconciled_at",
|
|
33
|
-
"value_availability",
|
|
34
|
-
"value_policy",
|
|
35
|
-
"evidence_source",
|
|
36
|
-
"operation",
|
|
37
|
-
"settlement",
|
|
38
|
-
]);
|
|
39
|
-
/** Return whether a receipt id is safe to expose in cleartext diagnostics. */
|
|
40
|
-
export function isSafeReceiptId(value) {
|
|
41
|
-
return RECEIPT_ID_PATTERN.test(value);
|
|
42
|
-
}
|
|
43
|
-
const RECEIPT_DECISION_KEYS = new Set([
|
|
44
|
-
"field",
|
|
45
|
-
"base",
|
|
46
|
-
"ours",
|
|
47
|
-
"theirs",
|
|
48
|
-
"retained",
|
|
49
|
-
"discarded",
|
|
50
|
-
"retained_side",
|
|
51
|
-
"resolution_basis",
|
|
52
|
-
]);
|
|
53
|
-
/** Versioned allowlist controlling which scalar evidence may enter tracked receipt sidecars. */
|
|
54
|
-
export const DURABLE_VALUE_POLICY = "bounded_non_sensitive_scalars_v1";
|
|
55
|
-
const REVIEWABLE_BUILTIN_STATUSES = new Set([
|
|
56
|
-
"open",
|
|
57
|
-
"in_progress",
|
|
58
|
-
"blocked",
|
|
59
|
-
"closed",
|
|
60
|
-
"canceled",
|
|
61
|
-
]);
|
|
62
|
-
const REVIEWABLE_ORDINAL_FIELDS = new Set(["risk", "confidence", "severity"]);
|
|
63
|
-
const REVIEWABLE_ORDINAL_VALUES = new Set([
|
|
64
|
-
"low",
|
|
65
|
-
"medium",
|
|
66
|
-
"high",
|
|
67
|
-
"critical",
|
|
68
|
-
]);
|
|
69
|
-
const REVIEWABLE_DURABLE_VALUES_BY_FIELD = new Map([
|
|
70
|
-
["priority", new Set([0, 1, 2, 3, 4].map(stableStringify))],
|
|
71
|
-
["status", new Set([...REVIEWABLE_BUILTIN_STATUSES].map(stableStringify))],
|
|
72
|
-
...[...REVIEWABLE_ORDINAL_FIELDS].map((field) => [
|
|
73
|
-
field,
|
|
74
|
-
new Set([...REVIEWABLE_ORDINAL_VALUES].map(stableStringify)),
|
|
75
|
-
]),
|
|
76
|
-
]);
|
|
77
|
-
/** Narrow untrusted JSON to a non-array object before schema inspection. */
|
|
78
|
-
function isRecord(value) {
|
|
79
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
80
|
-
}
|
|
81
|
-
/** Refuse receipt extensions outside the versioned schema key set. */
|
|
82
|
-
function hasOnlyKeys(value, allowed) {
|
|
83
|
-
return Object.keys(value).every((key) => allowed.has(key));
|
|
84
|
-
}
|
|
85
|
-
/** Validate bounded dense string collections used in receipt coordinates. */
|
|
86
|
-
function isStringArray(value) {
|
|
87
|
-
return (Array.isArray(value) &&
|
|
88
|
-
value.length <= RECEIPT_FIELD_MAX &&
|
|
89
|
-
value.every((entry) => typeof entry === "string" && entry.length > 0 && entry.length <= 256));
|
|
90
|
-
}
|
|
91
|
-
/** Bound JSON depth and node count before retaining untrusted decision values. */
|
|
92
|
-
function hasBoundedJsonStructure(value) {
|
|
93
|
-
const pending = [
|
|
94
|
-
{ value, depth: 0 },
|
|
95
|
-
];
|
|
96
|
-
let nodes = 0;
|
|
97
|
-
while (pending.length > 0) {
|
|
98
|
-
const current = pending.pop();
|
|
99
|
-
nodes += 1;
|
|
100
|
-
if (nodes > RECEIPT_VALUE_MAX_NODES ||
|
|
101
|
-
current.depth > RECEIPT_VALUE_MAX_DEPTH) {
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
if (Array.isArray(current.value)) {
|
|
105
|
-
for (const entry of current.value) {
|
|
106
|
-
pending.push({ value: entry, depth: current.depth + 1 });
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
else if (isRecord(current.value)) {
|
|
110
|
-
for (const entry of Object.values(current.value)) {
|
|
111
|
-
pending.push({ value: entry, depth: current.depth + 1 });
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return true;
|
|
116
|
-
}
|
|
117
|
-
/** Validate one clone-local scalar decision and its optional resolution evidence. */
|
|
118
|
-
function isMergeDecision(value) {
|
|
119
|
-
if (!isRecord(value))
|
|
120
|
-
return false;
|
|
121
|
-
const retainedSides = [undefined, "ours", "theirs"];
|
|
122
|
-
const resolutionBases = [
|
|
123
|
-
undefined,
|
|
124
|
-
"requested_preference",
|
|
125
|
-
"document_updated_at",
|
|
126
|
-
"stable_value_tiebreak",
|
|
127
|
-
];
|
|
128
|
-
return [
|
|
129
|
-
hasOnlyKeys(value, RECEIPT_DECISION_KEYS),
|
|
130
|
-
typeof value.field === "string",
|
|
131
|
-
typeof value.field === "string" && value.field.length > 0,
|
|
132
|
-
typeof value.field === "string" && value.field.length <= 256,
|
|
133
|
-
Object.hasOwn(value, "base"),
|
|
134
|
-
Object.hasOwn(value, "ours"),
|
|
135
|
-
Object.hasOwn(value, "theirs"),
|
|
136
|
-
Object.hasOwn(value, "retained"),
|
|
137
|
-
Object.hasOwn(value, "discarded"),
|
|
138
|
-
hasBoundedJsonStructure(value.base),
|
|
139
|
-
hasBoundedJsonStructure(value.ours),
|
|
140
|
-
hasBoundedJsonStructure(value.theirs),
|
|
141
|
-
hasBoundedJsonStructure(value.retained),
|
|
142
|
-
hasBoundedJsonStructure(value.discarded),
|
|
143
|
-
retainedSides.includes(value.retained_side),
|
|
144
|
-
resolutionBases.includes(value.resolution_basis),
|
|
145
|
-
].every(Boolean);
|
|
146
|
-
}
|
|
147
|
-
/** Validate the complete field-to-SHA-256 proof map used during repair. */
|
|
148
|
-
function isMergedFieldHashes(value) {
|
|
149
|
-
if (!isRecord(value))
|
|
150
|
-
return false;
|
|
151
|
-
const entries = Object.entries(value);
|
|
152
|
-
return (entries.length <= RECEIPT_FIELD_MAX &&
|
|
153
|
-
entries.every(([field, hash]) => field.length > 0 &&
|
|
154
|
-
field.length <= 256 &&
|
|
155
|
-
typeof hash === "string" &&
|
|
156
|
-
/^[a-f0-9]{64}$/u.test(hash)));
|
|
157
|
-
}
|
|
158
|
-
/** Require a normalized tracker item path whose basename matches the receipt item. */
|
|
159
|
-
function isSafeReceiptItemPath(value, itemId) {
|
|
160
|
-
if (typeof value !== "string" ||
|
|
161
|
-
value.length === 0 ||
|
|
162
|
-
value.length > 4_096 ||
|
|
163
|
-
value.includes("\0") ||
|
|
164
|
-
value.includes("\\") ||
|
|
165
|
-
path.posix.isAbsolute(value)) {
|
|
166
|
-
return false;
|
|
167
|
-
}
|
|
168
|
-
const normalized = path.posix.normalize(value);
|
|
169
|
-
return (normalized !== ".." &&
|
|
170
|
-
!normalized.startsWith("../") &&
|
|
171
|
-
path.posix.basename(normalized, path.posix.extname(normalized)) === itemId);
|
|
172
|
-
}
|
|
173
|
-
/** Validate receipt arrays and optional merged-field proof coverage. */
|
|
174
|
-
function hasValidReceiptCollections(value) {
|
|
175
|
-
return !isStringArray(value.fields_from_theirs) ||
|
|
176
|
-
!isStringArray(value.union_fields) ||
|
|
177
|
-
!Array.isArray(value.decisions) ||
|
|
178
|
-
value.decisions.length > RECEIPT_FIELD_MAX ||
|
|
179
|
-
!value.decisions.every(isMergeDecision)
|
|
180
|
-
? false
|
|
181
|
-
: value.merged_field_hashes === undefined ||
|
|
182
|
-
isMergedFieldHashes(value.merged_field_hashes);
|
|
183
|
-
}
|
|
184
|
-
/** Validate every closed-domain lifecycle and merge-policy field. */
|
|
185
|
-
function hasValidReceiptEnums(value) {
|
|
186
|
-
const preferences = [undefined, "ours", "theirs"];
|
|
187
|
-
const resolutions = [
|
|
188
|
-
undefined,
|
|
189
|
-
"preferred_side",
|
|
190
|
-
"stable_value_order",
|
|
191
|
-
"latest_document_update",
|
|
192
|
-
];
|
|
193
|
-
const availabilities = [
|
|
194
|
-
undefined,
|
|
195
|
-
"clone_local",
|
|
196
|
-
"hash_only",
|
|
197
|
-
"bounded_inline",
|
|
198
|
-
"mixed",
|
|
199
|
-
];
|
|
200
|
-
const sources = [undefined, "clone_local", "durable"];
|
|
201
|
-
return (preferences.includes(value.requested_preference) &&
|
|
202
|
-
preferences.includes(value.preferred) &&
|
|
203
|
-
(value.requested_preference_applied === undefined ||
|
|
204
|
-
typeof value.requested_preference_applied === "boolean") &&
|
|
205
|
-
resolutions.includes(value.conflict_resolution) &&
|
|
206
|
-
(value.state === "pending" || value.state === "reconciled") &&
|
|
207
|
-
availabilities.includes(value.value_availability) &&
|
|
208
|
-
(value.value_policy === undefined ||
|
|
209
|
-
value.value_policy === DURABLE_VALUE_POLICY) &&
|
|
210
|
-
sources.includes(value.evidence_source));
|
|
211
|
-
}
|
|
212
|
-
/** Validate creation and optional settlement timestamps as RFC 3339 values. */
|
|
213
|
-
function hasValidReceiptTimestamps(value) {
|
|
214
|
-
return (typeof value.created_at === "string" &&
|
|
215
|
-
isRfc3339DateTime(value.created_at) &&
|
|
216
|
-
(value.reconciled_at === undefined ||
|
|
217
|
-
(typeof value.reconciled_at === "string" &&
|
|
218
|
-
isRfc3339DateTime(value.reconciled_at))));
|
|
219
|
-
}
|
|
220
|
-
/** Validate one hash-only or policy-bounded durable decision value. */
|
|
221
|
-
function hasDurableDecisionValue(field, value) {
|
|
222
|
-
if (!isRecord(value) || isPrehashedValue(value) === undefined)
|
|
223
|
-
return false;
|
|
224
|
-
const keys = Object.keys(value);
|
|
225
|
-
if (!keys.every((key) => key === "pm_value_hash" || key === "pm_value")) {
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
if (!Object.hasOwn(value, "pm_value"))
|
|
229
|
-
return keys.length === 1;
|
|
230
|
-
const preview = value.pm_value;
|
|
231
|
-
const allowed = preview === null ||
|
|
232
|
-
REVIEWABLE_DURABLE_VALUES_BY_FIELD.get(field)?.has(stableStringify(preview)) === true;
|
|
233
|
-
return (allowed && hashItemScalarDecisionValue(preview) === value.pm_value_hash);
|
|
234
|
-
}
|
|
235
|
-
/** Validate durable decision redaction and the declared availability summary. */
|
|
236
|
-
function hasValidDurableDecisions(receipt) {
|
|
237
|
-
if (!receipt.decisions.every((decision) => decision.base === null &&
|
|
238
|
-
decision.ours === null &&
|
|
239
|
-
decision.theirs === null &&
|
|
240
|
-
hasDurableDecisionValue(decision.field, decision.retained) &&
|
|
241
|
-
hasDurableDecisionValue(decision.field, decision.discarded))) {
|
|
242
|
-
return false;
|
|
243
|
-
}
|
|
244
|
-
const inlineValueCount = receipt.decisions.reduce((count, decision) => count +
|
|
245
|
-
(isRecord(decision.retained) &&
|
|
246
|
-
Object.hasOwn(decision.retained, "pm_value")
|
|
247
|
-
? 1
|
|
248
|
-
: 0) +
|
|
249
|
-
(isRecord(decision.discarded) &&
|
|
250
|
-
Object.hasOwn(decision.discarded, "pm_value")
|
|
251
|
-
? 1
|
|
252
|
-
: 0), 0);
|
|
253
|
-
const expectedAvailability = inlineValueCount === 0
|
|
254
|
-
? "hash_only"
|
|
255
|
-
: inlineValueCount === receipt.decisions.length * 2
|
|
256
|
-
? "bounded_inline"
|
|
257
|
-
: "mixed";
|
|
258
|
-
return (receipt.value_availability === expectedAvailability &&
|
|
259
|
-
(inlineValueCount === 0 || receipt.value_policy === DURABLE_VALUE_POLICY));
|
|
260
|
-
}
|
|
261
|
-
/** Require restored-origin settlements to retain the immutable operation they disposition. */
|
|
262
|
-
function hasValidReceiptOperation(value) {
|
|
263
|
-
if (value.operation !== undefined &&
|
|
264
|
-
!isMergeReceiptOperation(value.operation))
|
|
265
|
-
return false;
|
|
266
|
-
return (value.settlement === undefined ||
|
|
267
|
-
(value.settlement === "original_git_state_restored" &&
|
|
268
|
-
value.state === "reconciled" &&
|
|
269
|
-
value.operation !== undefined));
|
|
270
|
-
}
|
|
271
|
-
/** Validate schema identity before inspecting values or lifecycle policy. */
|
|
272
|
-
function receiptIdentityValidationError(value) {
|
|
273
|
-
for (const key of [
|
|
274
|
-
"version",
|
|
275
|
-
"id",
|
|
276
|
-
"item_path",
|
|
277
|
-
"item_id",
|
|
278
|
-
"fields_from_theirs",
|
|
279
|
-
"union_fields",
|
|
280
|
-
"decisions",
|
|
281
|
-
"state",
|
|
282
|
-
"created_at",
|
|
283
|
-
]) {
|
|
284
|
-
if (!Object.hasOwn(value, key))
|
|
285
|
-
return "required_fields";
|
|
286
|
-
}
|
|
287
|
-
if (value.version !== 1 || !hasOnlyKeys(value, RECEIPT_KEYS)) {
|
|
288
|
-
return "required_fields";
|
|
289
|
-
}
|
|
290
|
-
if (typeof value.id !== "string" || !isSafeReceiptId(value.id)) {
|
|
291
|
-
return "receipt_id";
|
|
292
|
-
}
|
|
293
|
-
if (typeof value.item_id !== "string" ||
|
|
294
|
-
!RECEIPT_ITEM_ID_PATTERN.test(value.item_id)) {
|
|
295
|
-
return "item_id";
|
|
296
|
-
}
|
|
297
|
-
if (!isSafeReceiptItemPath(value.item_path, value.item_id)) {
|
|
298
|
-
return "item_path";
|
|
299
|
-
}
|
|
300
|
-
return null;
|
|
301
|
-
}
|
|
302
|
-
/** Return the narrowest validation class for untrusted receipt evidence. */
|
|
303
|
-
export function receiptValidationError(value, evidenceSource) {
|
|
304
|
-
if (!isRecord(value))
|
|
305
|
-
return "required_fields";
|
|
306
|
-
const identityError = receiptIdentityValidationError(value);
|
|
307
|
-
if (identityError !== null)
|
|
308
|
-
return identityError;
|
|
309
|
-
if (!hasValidReceiptOperation(value))
|
|
310
|
-
return "operation";
|
|
311
|
-
if (!hasValidReceiptCollections(value))
|
|
312
|
-
return "collections";
|
|
313
|
-
if (!hasValidReceiptEnums(value))
|
|
314
|
-
return "enums";
|
|
315
|
-
if (!hasValidReceiptTimestamps(value))
|
|
316
|
-
return "timestamps";
|
|
317
|
-
if (evidenceSource === "durable" &&
|
|
318
|
-
!hasValidDurableDecisions(value)) {
|
|
319
|
-
return "durable_decisions";
|
|
320
|
-
}
|
|
321
|
-
return null;
|
|
322
|
-
}
|
|
323
|
-
/** Restore omitted non-selected slots from identified v1 clone-local writer contracts; never infer a missing retained or discarded value. */
|
|
324
|
-
export function normalizeLegacyReceipt(value) {
|
|
325
|
-
if (!isRecord(value) ||
|
|
326
|
-
value.version !== 1 ||
|
|
327
|
-
value.value_policy !== undefined ||
|
|
328
|
-
!Array.isArray(value.decisions))
|
|
329
|
-
return value;
|
|
330
|
-
const preferredEra = (value.preferred === "ours" || value.preferred === "theirs") &&
|
|
331
|
-
value.requested_preference === undefined;
|
|
332
|
-
const requestedPreferenceEra = (value.requested_preference === "ours" ||
|
|
333
|
-
value.requested_preference === "theirs") &&
|
|
334
|
-
value.value_availability === "clone_local";
|
|
335
|
-
if (!preferredEra && !requestedPreferenceEra)
|
|
336
|
-
return value;
|
|
337
|
-
return {
|
|
338
|
-
...value,
|
|
339
|
-
decisions: value.decisions.map((decision) => {
|
|
340
|
-
if (!isRecord(decision) ||
|
|
341
|
-
!Object.hasOwn(decision, "retained") ||
|
|
342
|
-
!Object.hasOwn(decision, "discarded"))
|
|
343
|
-
return decision;
|
|
344
|
-
return {
|
|
345
|
-
base: encodeItemScalarDecisionValue(undefined),
|
|
346
|
-
ours: encodeItemScalarDecisionValue(undefined),
|
|
347
|
-
theirs: encodeItemScalarDecisionValue(undefined),
|
|
348
|
-
...decision,
|
|
349
|
-
};
|
|
350
|
-
}),
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
/** Identify the rejected collection without exposing its values. */
|
|
354
|
-
export function receiptCollectionValidationPath(value) {
|
|
355
|
-
if (!isRecord(value))
|
|
356
|
-
return undefined;
|
|
357
|
-
if (!isStringArray(value.fields_from_theirs))
|
|
358
|
-
return "fields_from_theirs";
|
|
359
|
-
if (!isStringArray(value.union_fields))
|
|
360
|
-
return "union_fields";
|
|
361
|
-
if (!Array.isArray(value.decisions) ||
|
|
362
|
-
value.decisions.length > RECEIPT_FIELD_MAX)
|
|
363
|
-
return "decisions";
|
|
364
|
-
const index = value.decisions.findIndex((decision) => !isMergeDecision(decision));
|
|
365
|
-
if (index >= 0)
|
|
366
|
-
return `decisions[${index}]`;
|
|
367
|
-
return "merged_field_hashes";
|
|
368
|
-
}
|
|
369
|
-
/** Validate a complete receipt against its clone-local or durable evidence policy. */
|
|
370
|
-
export function isMergeDecisionReceipt(value, evidenceSource) {
|
|
371
|
-
return receiptValidationError(value, evidenceSource) === null;
|
|
372
|
-
}
|
|
373
|
-
/** Extract a structurally valid precomputed SHA-256 decision hash. */
|
|
374
|
-
export function isPrehashedValue(value) {
|
|
375
|
-
if (typeof value !== "object" ||
|
|
376
|
-
value === null ||
|
|
377
|
-
Array.isArray(value) ||
|
|
378
|
-
!("pm_value_hash" in value)) {
|
|
379
|
-
return undefined;
|
|
380
|
-
}
|
|
381
|
-
const hash = value.pm_value_hash;
|
|
382
|
-
return typeof hash === "string" && /^[a-f0-9]{64}$/u.test(hash)
|
|
383
|
-
? hash
|
|
384
|
-
: undefined;
|
|
385
|
-
}
|
|
386
|
-
/** Convert a raw scalar into hashed evidence with an allowlisted preview. */
|
|
387
|
-
export function durableValueEvidence(field, value) {
|
|
388
|
-
const missing = isItemScalarMissingValue(value);
|
|
389
|
-
const pmValueHash = hashItemScalarDecisionValue(missing ? undefined : value);
|
|
390
|
-
const reviewable = !missing &&
|
|
391
|
-
(value === null ||
|
|
392
|
-
REVIEWABLE_DURABLE_VALUES_BY_FIELD.get(field)?.has(stableStringify(value)) === true);
|
|
393
|
-
return reviewable
|
|
394
|
-
? { pm_value_hash: pmValueHash, pm_value: value }
|
|
395
|
-
: { pm_value_hash: pmValueHash };
|
|
396
|
-
}
|
|
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]="0d215db3-1a51-5509-aa08-a3d0708aa3ef")}catch(e2){}})();import path from"node:path";import{stableStringify}from"../../core/shared/serialization.js";import{isRfc3339DateTime}from"../../core/shared/time.js";import{encodeItemScalarDecisionValue,hashItemScalarDecisionValue,isItemScalarMissingValue}from"./three-way.js";import{isMergeReceiptOperation}from"./receipt-operation.js";const RECEIPT_ID_PATTERN=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/u;const RECEIPT_ITEM_ID_PATTERN=/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/u;const RECEIPT_FIELD_MAX=2048;const RECEIPT_VALUE_MAX_DEPTH=64;const RECEIPT_VALUE_MAX_NODES=1e5;const RECEIPT_KEYS=new Set(["version","id","item_path","item_id","requested_preference","requested_preference_applied","preferred","conflict_resolution","fields_from_theirs","union_fields","merged_field_hashes","decisions","state","created_at","reconciled_at","value_availability","value_policy","evidence_source","operation","settlement"]);function isSafeReceiptId(value){return RECEIPT_ID_PATTERN.test(value)}const RECEIPT_DECISION_KEYS=new Set(["field","base","ours","theirs","retained","discarded","retained_side","resolution_basis"]);const DURABLE_VALUE_POLICY="bounded_non_sensitive_scalars_v1";const REVIEWABLE_BUILTIN_STATUSES=new Set(["open","in_progress","blocked","closed","canceled"]);const REVIEWABLE_ORDINAL_FIELDS=new Set(["risk","confidence","severity"]);const REVIEWABLE_ORDINAL_VALUES=new Set(["low","medium","high","critical"]);const REVIEWABLE_DURABLE_VALUES_BY_FIELD=new Map([["priority",new Set([0,1,2,3,4].map(stableStringify))],["status",new Set([...REVIEWABLE_BUILTIN_STATUSES].map(stableStringify))],...[...REVIEWABLE_ORDINAL_FIELDS].map(field=>[field,new Set([...REVIEWABLE_ORDINAL_VALUES].map(stableStringify))])]);function isRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function hasOnlyKeys(value,allowed){return Object.keys(value).every(key=>allowed.has(key))}function isStringArray(value){return Array.isArray(value)&&value.length<=RECEIPT_FIELD_MAX&&value.every(entry=>typeof entry==="string"&&entry.length>0&&entry.length<=256)}function hasBoundedJsonStructure(value){const pending=[{value,depth:0}];let nodes=0;while(pending.length>0){const current=pending.pop();nodes+=1;if(nodes>RECEIPT_VALUE_MAX_NODES||current.depth>RECEIPT_VALUE_MAX_DEPTH){return false}if(Array.isArray(current.value)){for(const entry of current.value){pending.push({value:entry,depth:current.depth+1})}}else if(isRecord(current.value)){for(const entry of Object.values(current.value)){pending.push({value:entry,depth:current.depth+1})}}}return true}function isMergeDecision(value){if(!isRecord(value))return false;const retainedSides=[void 0,"ours","theirs"];const resolutionBases=[void 0,"requested_preference","document_updated_at","stable_value_tiebreak"];return[hasOnlyKeys(value,RECEIPT_DECISION_KEYS),typeof value.field==="string",typeof value.field==="string"&&value.field.length>0,typeof value.field==="string"&&value.field.length<=256,Object.hasOwn(value,"base"),Object.hasOwn(value,"ours"),Object.hasOwn(value,"theirs"),Object.hasOwn(value,"retained"),Object.hasOwn(value,"discarded"),hasBoundedJsonStructure(value.base),hasBoundedJsonStructure(value.ours),hasBoundedJsonStructure(value.theirs),hasBoundedJsonStructure(value.retained),hasBoundedJsonStructure(value.discarded),retainedSides.includes(value.retained_side),resolutionBases.includes(value.resolution_basis)].every(Boolean)}function isMergedFieldHashes(value){if(!isRecord(value))return false;const entries=Object.entries(value);return entries.length<=RECEIPT_FIELD_MAX&&entries.every(([field,hash])=>field.length>0&&field.length<=256&&typeof hash==="string"&&/^[a-f0-9]{64}$/u.test(hash))}function isSafeReceiptItemPath(value,itemId){if(typeof value!=="string"||value.length===0||value.length>4096||value.includes("\0")||value.includes("\\")||path.posix.isAbsolute(value)){return false}const normalized=path.posix.normalize(value);return normalized!==".."&&!normalized.startsWith("../")&&path.posix.basename(normalized,path.posix.extname(normalized))===itemId}function hasValidReceiptCollections(value){return!isStringArray(value.fields_from_theirs)||!isStringArray(value.union_fields)||!Array.isArray(value.decisions)||value.decisions.length>RECEIPT_FIELD_MAX||!value.decisions.every(isMergeDecision)?false:value.merged_field_hashes===void 0||isMergedFieldHashes(value.merged_field_hashes)}function hasValidReceiptEnums(value){const preferences=[void 0,"ours","theirs"];const resolutions=[void 0,"preferred_side","stable_value_order","latest_document_update"];const availabilities=[void 0,"clone_local","hash_only","bounded_inline","mixed"];const sources=[void 0,"clone_local","durable"];return preferences.includes(value.requested_preference)&&preferences.includes(value.preferred)&&(value.requested_preference_applied===void 0||typeof value.requested_preference_applied==="boolean")&&resolutions.includes(value.conflict_resolution)&&(value.state==="pending"||value.state==="reconciled")&&availabilities.includes(value.value_availability)&&(value.value_policy===void 0||value.value_policy===DURABLE_VALUE_POLICY)&&sources.includes(value.evidence_source)}function hasValidReceiptTimestamps(value){return typeof value.created_at==="string"&&isRfc3339DateTime(value.created_at)&&(value.reconciled_at===void 0||typeof value.reconciled_at==="string"&&isRfc3339DateTime(value.reconciled_at))}function hasDurableDecisionValue(field,value){if(!isRecord(value)||isPrehashedValue(value)===void 0)return false;const keys=Object.keys(value);if(!keys.every(key=>key==="pm_value_hash"||key==="pm_value")){return false}if(!Object.hasOwn(value,"pm_value"))return keys.length===1;const preview=value.pm_value;const allowed=preview===null||REVIEWABLE_DURABLE_VALUES_BY_FIELD.get(field)?.has(stableStringify(preview))===true;return allowed&&hashItemScalarDecisionValue(preview)===value.pm_value_hash}function hasValidDurableDecisions(receipt){if(!receipt.decisions.every(decision=>decision.base===null&&decision.ours===null&&decision.theirs===null&&hasDurableDecisionValue(decision.field,decision.retained)&&hasDurableDecisionValue(decision.field,decision.discarded))){return false}const inlineValueCount=receipt.decisions.reduce((count,decision)=>count+(isRecord(decision.retained)&&Object.hasOwn(decision.retained,"pm_value")?1:0)+(isRecord(decision.discarded)&&Object.hasOwn(decision.discarded,"pm_value")?1:0),0);const expectedAvailability=inlineValueCount===0?"hash_only":inlineValueCount===receipt.decisions.length*2?"bounded_inline":"mixed";return receipt.value_availability===expectedAvailability&&(inlineValueCount===0||receipt.value_policy===DURABLE_VALUE_POLICY)}function hasValidReceiptOperation(value){if(value.operation!==void 0&&!isMergeReceiptOperation(value.operation))return false;return value.settlement===void 0||value.settlement==="original_git_state_restored"&&value.state==="reconciled"&&value.operation!==void 0}function receiptIdentityValidationError(value){for(const key of["version","id","item_path","item_id","fields_from_theirs","union_fields","decisions","state","created_at"]){if(!Object.hasOwn(value,key))return"required_fields"}if(value.version!==1||!hasOnlyKeys(value,RECEIPT_KEYS)){return"required_fields"}if(typeof value.id!=="string"||!isSafeReceiptId(value.id)){return"receipt_id"}if(typeof value.item_id!=="string"||!RECEIPT_ITEM_ID_PATTERN.test(value.item_id)){return"item_id"}if(!isSafeReceiptItemPath(value.item_path,value.item_id)){return"item_path"}return null}function receiptValidationError(value,evidenceSource){if(!isRecord(value))return"required_fields";const identityError=receiptIdentityValidationError(value);if(identityError!==null)return identityError;if(!hasValidReceiptOperation(value))return"operation";if(!hasValidReceiptCollections(value))return"collections";if(!hasValidReceiptEnums(value))return"enums";if(!hasValidReceiptTimestamps(value))return"timestamps";if(evidenceSource==="durable"&&!hasValidDurableDecisions(value)){return"durable_decisions"}return null}function normalizeLegacyReceipt(value){if(!isRecord(value)||value.version!==1||value.value_policy!==void 0||!Array.isArray(value.decisions))return value;const preferredEra=(value.preferred==="ours"||value.preferred==="theirs")&&value.requested_preference===void 0;const requestedPreferenceEra=(value.requested_preference==="ours"||value.requested_preference==="theirs")&&value.value_availability==="clone_local";if(!preferredEra&&!requestedPreferenceEra)return value;return{...value,decisions:value.decisions.map(decision=>{if(!isRecord(decision)||!Object.hasOwn(decision,"retained")||!Object.hasOwn(decision,"discarded"))return decision;return{base:encodeItemScalarDecisionValue(void 0),ours:encodeItemScalarDecisionValue(void 0),theirs:encodeItemScalarDecisionValue(void 0),...decision}})}}function receiptCollectionValidationPath(value){if(!isRecord(value))return void 0;if(!isStringArray(value.fields_from_theirs))return"fields_from_theirs";if(!isStringArray(value.union_fields))return"union_fields";if(!Array.isArray(value.decisions)||value.decisions.length>RECEIPT_FIELD_MAX)return"decisions";const index=value.decisions.findIndex(decision=>!isMergeDecision(decision));if(index>=0)return`decisions[${index}]`;return"merged_field_hashes"}function isMergeDecisionReceipt(value,evidenceSource){return receiptValidationError(value,evidenceSource)===null}function isPrehashedValue(value){if(typeof value!=="object"||value===null||Array.isArray(value)||!("pm_value_hash"in value)){return void 0}const hash=value.pm_value_hash;return typeof hash==="string"&&/^[a-f0-9]{64}$/u.test(hash)?hash:void 0}function durableValueEvidence(field,value){const missing=isItemScalarMissingValue(value);const pmValueHash=hashItemScalarDecisionValue(missing?void 0:value);const reviewable=!missing&&(value===null||REVIEWABLE_DURABLE_VALUES_BY_FIELD.get(field)?.has(stableStringify(value))===true);return reviewable?{pm_value_hash:pmValueHash,pm_value:value}:{pm_value_hash:pmValueHash}}export{DURABLE_VALUE_POLICY,durableValueEvidence,isMergeDecisionReceipt,isPrehashedValue,isSafeReceiptId,normalizeLegacyReceipt,receiptCollectionValidationPath,receiptValidationError};
|
|
397
2
|
//# sourceMappingURL=receipt-schema.js.map
|
|
398
|
-
//# debugId=1f6aa507-79da-5d11-a580-72141b725947
|