@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,594 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module sdk/agent/refusal-reachability
|
|
3
|
-
*
|
|
4
|
-
* Verifies real-entrypoint observations against refusal states declared by the
|
|
5
|
-
* generated public error-code catalog.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
!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]="4f4e7daa-14aa-5dad-8a30-79a4d76159d4")}catch(e){}}();
|
|
9
|
-
import * as nodeModule from "node:module";
|
|
10
|
-
/** Recovery-reference kinds emitted by structured refusal envelopes. */
|
|
11
|
-
export const PM_RECOVERY_REFERENCE_KINDS = [
|
|
12
|
-
"suggested_retry",
|
|
13
|
-
"candidate_command",
|
|
14
|
-
"example",
|
|
15
|
-
"next_step",
|
|
16
|
-
"migration_hint",
|
|
17
|
-
"restore_with",
|
|
18
|
-
];
|
|
19
|
-
const RECOVERY_REFERENCE_FIELD_CONTRACTS = {
|
|
20
|
-
suggested_retry: { kind: "suggested_retry", semantics: "recovery" },
|
|
21
|
-
retry_command: { kind: "suggested_retry", semantics: "recovery" },
|
|
22
|
-
candidate_command: { kind: "candidate_command", semantics: "recovery" },
|
|
23
|
-
candidate_commands: { kind: "candidate_command", semantics: "recovery" },
|
|
24
|
-
fallback_candidates: {
|
|
25
|
-
kind: "candidate_command",
|
|
26
|
-
semantics: "recovery",
|
|
27
|
-
nested_value_field: "command",
|
|
28
|
-
},
|
|
29
|
-
next_best_command: { kind: "candidate_command", semantics: "recovery" },
|
|
30
|
-
example: { kind: "example", semantics: "recovery" },
|
|
31
|
-
examples: { kind: "example", semantics: "recovery" },
|
|
32
|
-
next_step: { kind: "next_step", semantics: "recovery" },
|
|
33
|
-
next_steps: { kind: "next_step", semantics: "recovery" },
|
|
34
|
-
suggested_next_steps: { kind: "next_step", semantics: "recovery" },
|
|
35
|
-
migration_hint: { kind: "migration_hint", semantics: "replacement" },
|
|
36
|
-
migration_hints: { kind: "migration_hint", semantics: "replacement" },
|
|
37
|
-
restore_with: {
|
|
38
|
-
kind: "restore_with",
|
|
39
|
-
semantics: "behavior_preserving",
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
/** Literal envelope fields recognized as recovery-reference producers. */
|
|
43
|
-
export const PM_RECOVERY_REFERENCE_FIELDS = Object.freeze(Object.keys(RECOVERY_REFERENCE_FIELD_CONTRACTS));
|
|
44
|
-
/** Resolve an own recovery-field contract without trusting object prototypes. */
|
|
45
|
-
function recoveryReferenceContract(field) {
|
|
46
|
-
if (!Object.hasOwn(RECOVERY_REFERENCE_FIELD_CONTRACTS, field))
|
|
47
|
-
return undefined;
|
|
48
|
-
return RECOVERY_REFERENCE_FIELD_CONTRACTS[field];
|
|
49
|
-
}
|
|
50
|
-
const SOURCE_REGEXP_PREFIX_PUNCTUATORS = new Set([
|
|
51
|
-
..."=([{,:;!?&|+-*%^~<>",
|
|
52
|
-
"=>",
|
|
53
|
-
]);
|
|
54
|
-
function compareCodeUnits(left, right) {
|
|
55
|
-
return left < right ? -1 : left > right ? 1 : 0;
|
|
56
|
-
}
|
|
57
|
-
function skipQuotedSourceToken(source, index) {
|
|
58
|
-
const quote = source[index];
|
|
59
|
-
let next = index + 1;
|
|
60
|
-
let value = "";
|
|
61
|
-
while (next < source.length && source[next] !== quote) {
|
|
62
|
-
if (source[next] === "\\")
|
|
63
|
-
next += 2;
|
|
64
|
-
else {
|
|
65
|
-
value += source[next];
|
|
66
|
-
next += 1;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if (source[next] === quote)
|
|
70
|
-
next += 1;
|
|
71
|
-
return { next, value };
|
|
72
|
-
}
|
|
73
|
-
function canStartRegularExpression(previous) {
|
|
74
|
-
return (previous === undefined ||
|
|
75
|
-
(previous.kind === "punctuator" &&
|
|
76
|
-
SOURCE_REGEXP_PREFIX_PUNCTUATORS.has(previous.value)) ||
|
|
77
|
-
(previous.kind === "identifier" &&
|
|
78
|
-
["return", "case", "throw", "else", "yield"].includes(previous.value)));
|
|
79
|
-
}
|
|
80
|
-
function sourceTriviaEnd(source, index) {
|
|
81
|
-
if (/\s/u.test(source[index]))
|
|
82
|
-
return index + 1;
|
|
83
|
-
if (source.startsWith("//", index)) {
|
|
84
|
-
const newline = source.indexOf("\n", index + 2);
|
|
85
|
-
return newline === -1 ? source.length : newline + 1;
|
|
86
|
-
}
|
|
87
|
-
if (!source.startsWith("/*", index))
|
|
88
|
-
return undefined;
|
|
89
|
-
// stripTypeScriptTypes validates block-comment termination before tokenization.
|
|
90
|
-
return source.indexOf("*/", index + 2) + 2;
|
|
91
|
-
}
|
|
92
|
-
function regularExpressionEnd(source, index, previous) {
|
|
93
|
-
if (source[index] !== "/" || !canStartRegularExpression(previous))
|
|
94
|
-
return undefined;
|
|
95
|
-
let next = index + 1;
|
|
96
|
-
let inClass = false;
|
|
97
|
-
while (next < source.length) {
|
|
98
|
-
if (source[next] === "\\")
|
|
99
|
-
next += 2;
|
|
100
|
-
else if (source[next] === "[") {
|
|
101
|
-
inClass = true;
|
|
102
|
-
next += 1;
|
|
103
|
-
}
|
|
104
|
-
else if (source[next] === "]") {
|
|
105
|
-
inClass = false;
|
|
106
|
-
next += 1;
|
|
107
|
-
}
|
|
108
|
-
else if (source[next] === "/" && !inClass) {
|
|
109
|
-
next += 1;
|
|
110
|
-
while (/[A-Za-z]/u.test(source.charAt(next)))
|
|
111
|
-
next += 1;
|
|
112
|
-
return next;
|
|
113
|
-
}
|
|
114
|
-
else
|
|
115
|
-
next += 1;
|
|
116
|
-
}
|
|
117
|
-
return next;
|
|
118
|
-
}
|
|
119
|
-
function readSourceSyntaxToken(source, index) {
|
|
120
|
-
const character = source[index];
|
|
121
|
-
if (character === "'" || character === '"' || character === "`") {
|
|
122
|
-
const quoted = skipQuotedSourceToken(source, index);
|
|
123
|
-
return character === "`"
|
|
124
|
-
? { next: quoted.next }
|
|
125
|
-
: {
|
|
126
|
-
next: quoted.next,
|
|
127
|
-
token: { kind: "string", value: quoted.value, offset: index + 1 },
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
if (/[A-Za-z_$]/u.test(character)) {
|
|
131
|
-
let next = index + 1;
|
|
132
|
-
while (/[A-Za-z0-9_$]/u.test(source[next] ?? ""))
|
|
133
|
-
next += 1;
|
|
134
|
-
return {
|
|
135
|
-
next,
|
|
136
|
-
token: {
|
|
137
|
-
kind: "identifier",
|
|
138
|
-
value: source.slice(index, next),
|
|
139
|
-
offset: index,
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
const punctuator = source.startsWith("=>", index) ? "=>" : character;
|
|
144
|
-
return {
|
|
145
|
-
next: index + punctuator.length,
|
|
146
|
-
token: { kind: "punctuator", value: punctuator, offset: index },
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
/** Tokenize executable JavaScript while ignoring comments, templates, and regex bodies. */
|
|
150
|
-
function tokenizeExecutableSource(source) {
|
|
151
|
-
const tokens = [];
|
|
152
|
-
let index = 0;
|
|
153
|
-
while (index < source.length) {
|
|
154
|
-
const ignoredEnd = sourceTriviaEnd(source, index);
|
|
155
|
-
if (ignoredEnd !== undefined) {
|
|
156
|
-
index = ignoredEnd;
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
const regexEnd = regularExpressionEnd(source, index, tokens.at(-1));
|
|
160
|
-
if (regexEnd !== undefined) {
|
|
161
|
-
index = regexEnd;
|
|
162
|
-
continue;
|
|
163
|
-
}
|
|
164
|
-
const read = readSourceSyntaxToken(source, index);
|
|
165
|
-
if (read.token)
|
|
166
|
-
tokens.push(read.token);
|
|
167
|
-
index = read.next;
|
|
168
|
-
}
|
|
169
|
-
return tokens;
|
|
170
|
-
}
|
|
171
|
-
const SOURCE_BRACE_FRAME_KINDS = new Set([
|
|
172
|
-
"object",
|
|
173
|
-
"block",
|
|
174
|
-
"pattern",
|
|
175
|
-
]);
|
|
176
|
-
const SOURCE_PATTERN_DECLARATIONS = new Set(["const", "let", "var"]);
|
|
177
|
-
const SOURCE_CLOSING_TOKENS = new Set(["}", ")", "]"]);
|
|
178
|
-
const SOURCE_OBJECT_PRECEDERS = new Set([
|
|
179
|
-
"=",
|
|
180
|
-
"(",
|
|
181
|
-
"[",
|
|
182
|
-
",",
|
|
183
|
-
":",
|
|
184
|
-
"?",
|
|
185
|
-
"return",
|
|
186
|
-
]);
|
|
187
|
-
function objectFrameKind(tokens, index, stack) {
|
|
188
|
-
const enclosingBrace = [...stack]
|
|
189
|
-
.reverse()
|
|
190
|
-
.find((frame) => SOURCE_BRACE_FRAME_KINDS.has(frame.kind));
|
|
191
|
-
if (enclosingBrace?.kind === "pattern")
|
|
192
|
-
return "pattern";
|
|
193
|
-
if (stack.at(-1)?.kind === "paren" && stack.at(-1)?.parameter_list)
|
|
194
|
-
return "pattern";
|
|
195
|
-
const previous = tokens[index - 1];
|
|
196
|
-
if (previous?.kind === "identifier" &&
|
|
197
|
-
SOURCE_PATTERN_DECLARATIONS.has(previous.value)) {
|
|
198
|
-
return "pattern";
|
|
199
|
-
}
|
|
200
|
-
if (previous?.value === "=>" || previous?.value === ")")
|
|
201
|
-
return "block";
|
|
202
|
-
return previous && SOURCE_OBJECT_PRECEDERS.has(previous.value)
|
|
203
|
-
? "object"
|
|
204
|
-
: "block";
|
|
205
|
-
}
|
|
206
|
-
function openingSourceFrame(tokens, index, stack) {
|
|
207
|
-
const token = tokens[index];
|
|
208
|
-
if (token.value === "{") {
|
|
209
|
-
const kind = objectFrameKind(tokens, index, stack);
|
|
210
|
-
return {
|
|
211
|
-
kind,
|
|
212
|
-
...(kind === "object" ? { member_start: true, candidates: [] } : {}),
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
if (token.value === "[")
|
|
216
|
-
return { kind: "array" };
|
|
217
|
-
if (token.value !== "(")
|
|
218
|
-
return undefined;
|
|
219
|
-
const previous = tokens[index - 1];
|
|
220
|
-
const beforePrevious = tokens[index - 2];
|
|
221
|
-
const parameterList = previous?.value === "function" || beforePrevious?.value === "function";
|
|
222
|
-
return { kind: "paren", ...(parameterList ? { parameter_list: true } : {}) };
|
|
223
|
-
}
|
|
224
|
-
function staticObjectMember(frame, token, next) {
|
|
225
|
-
if (frame?.kind !== "object" ||
|
|
226
|
-
!frame.member_start ||
|
|
227
|
-
(token.kind !== "identifier" && token.kind !== "string") ||
|
|
228
|
-
next?.value !== ":" ||
|
|
229
|
-
!/^[A-Za-z][A-Za-z0-9_]*$/u.test(token.value)) {
|
|
230
|
-
return undefined;
|
|
231
|
-
}
|
|
232
|
-
return { field: token.value, offset: token.offset };
|
|
233
|
-
}
|
|
234
|
-
function isPatternLikeObjectClosure(tokens, index) {
|
|
235
|
-
return ((tokens[index + 1]?.value === ")" && tokens[index + 2]?.value === "=>") ||
|
|
236
|
-
tokens[index + 1]?.value === "=");
|
|
237
|
-
}
|
|
238
|
-
/** Parse static object-literal members without treating patterns or labels as producers. */
|
|
239
|
-
function scanSourcePropertyTokens(source) {
|
|
240
|
-
const tokens = tokenizeExecutableSource(nodeModule.stripTypeScriptTypes(source, { mode: "strip" }));
|
|
241
|
-
const properties = [];
|
|
242
|
-
const stack = [];
|
|
243
|
-
for (const [index, token] of tokens.entries()) {
|
|
244
|
-
const frame = stack.at(-1);
|
|
245
|
-
const property = staticObjectMember(frame, token, tokens[index + 1]);
|
|
246
|
-
if (property)
|
|
247
|
-
frame.candidates.push(property);
|
|
248
|
-
const opening = openingSourceFrame(tokens, index, stack);
|
|
249
|
-
if (opening) {
|
|
250
|
-
stack.push(opening);
|
|
251
|
-
}
|
|
252
|
-
else if (SOURCE_CLOSING_TOKENS.has(token.value)) {
|
|
253
|
-
const closed = stack.pop();
|
|
254
|
-
if (closed?.kind === "object" &&
|
|
255
|
-
!isPatternLikeObjectClosure(tokens, index)) {
|
|
256
|
-
properties.push(...closed.candidates);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
else if (token.value === "," && frame?.kind === "object") {
|
|
260
|
-
frame.member_start = true;
|
|
261
|
-
}
|
|
262
|
-
else if (frame?.kind === "object" && token.value !== ":") {
|
|
263
|
-
frame.member_start = false;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
return properties;
|
|
267
|
-
}
|
|
268
|
-
function sourceLineStarts(source) {
|
|
269
|
-
const starts = [0];
|
|
270
|
-
for (let index = 0; index < source.length; index += 1) {
|
|
271
|
-
if (source[index] === "\n")
|
|
272
|
-
starts.push(index + 1);
|
|
273
|
-
}
|
|
274
|
-
return starts;
|
|
275
|
-
}
|
|
276
|
-
function sourceLineAtOffset(starts, offset) {
|
|
277
|
-
let low = 0;
|
|
278
|
-
let high = starts.length;
|
|
279
|
-
while (low < high) {
|
|
280
|
-
const middle = Math.floor((low + high) / 2);
|
|
281
|
-
if (starts[middle] <= offset)
|
|
282
|
-
low = middle + 1;
|
|
283
|
-
else
|
|
284
|
-
high = middle;
|
|
285
|
-
}
|
|
286
|
-
return low;
|
|
287
|
-
}
|
|
288
|
-
/** Census syntax-parsed structured-envelope producers without executing source code. */
|
|
289
|
-
export function censusPmRecoveryReferenceProducers(sources) {
|
|
290
|
-
const producers = [];
|
|
291
|
-
const findings = [];
|
|
292
|
-
for (const source of [...sources].sort((left, right) => compareCodeUnits(left.path, right.path))) {
|
|
293
|
-
const lineStarts = sourceLineStarts(source.content);
|
|
294
|
-
let properties;
|
|
295
|
-
try {
|
|
296
|
-
properties = scanSourcePropertyTokens(source.content);
|
|
297
|
-
}
|
|
298
|
-
catch (error) {
|
|
299
|
-
findings.push({
|
|
300
|
-
kind: "invalid_source",
|
|
301
|
-
subject: source.path,
|
|
302
|
-
detail: `${source.path} could not be parsed for recovery producers: ${String(error)}.`,
|
|
303
|
-
});
|
|
304
|
-
continue;
|
|
305
|
-
}
|
|
306
|
-
for (const property of properties) {
|
|
307
|
-
const field = property.field;
|
|
308
|
-
const line = sourceLineAtOffset(lineStarts, property.offset);
|
|
309
|
-
const contract = recoveryReferenceContract(field);
|
|
310
|
-
if (contract) {
|
|
311
|
-
producers.push({
|
|
312
|
-
path: source.path,
|
|
313
|
-
line,
|
|
314
|
-
field: field,
|
|
315
|
-
kind: contract.kind,
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
else if (/(?:retry_command|candidate_command|fallback_candidate|next_best_command|example|next_step|migration_hint|restore_with)/u.test(field) &&
|
|
319
|
-
!/(?:_total|_truncated)$/u.test(field)) {
|
|
320
|
-
findings.push({
|
|
321
|
-
kind: "unknown_recovery_field",
|
|
322
|
-
subject: `${source.path}:${line}:${field}`,
|
|
323
|
-
detail: `${field} resembles a recovery reference but has no typed field contract.`,
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
const producerCountByKind = Object.fromEntries(PM_RECOVERY_REFERENCE_KINDS.map((kind) => [
|
|
329
|
-
kind,
|
|
330
|
-
producers.filter((producer) => producer.kind === kind).length,
|
|
331
|
-
]));
|
|
332
|
-
for (const kind of PM_RECOVERY_REFERENCE_KINDS) {
|
|
333
|
-
if (producerCountByKind[kind] === 0) {
|
|
334
|
-
findings.push({
|
|
335
|
-
kind: "missing_kind_producer",
|
|
336
|
-
subject: kind,
|
|
337
|
-
detail: `No source producer emits the ${kind} recovery-reference kind.`,
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
producers.sort((left, right) => left.path !== right.path
|
|
342
|
-
? compareCodeUnits(left.path, right.path)
|
|
343
|
-
: left.line !== right.line
|
|
344
|
-
? left.line - right.line
|
|
345
|
-
: compareCodeUnits(left.field, right.field));
|
|
346
|
-
findings.sort((left, right) => left.subject !== right.subject
|
|
347
|
-
? compareCodeUnits(left.subject, right.subject)
|
|
348
|
-
: compareCodeUnits(left.kind, right.kind));
|
|
349
|
-
return {
|
|
350
|
-
ok: findings.length === 0,
|
|
351
|
-
scanned_file_count: sources.length,
|
|
352
|
-
producer_count: producers.length,
|
|
353
|
-
producer_count_by_kind: producerCountByKind,
|
|
354
|
-
producers,
|
|
355
|
-
findings,
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
/** Derive typed obligations from every recognized recovery field in an emitted envelope. */
|
|
359
|
-
export function derivePmRecoveryReferenceObligations(probeId, envelope) {
|
|
360
|
-
const obligations = [];
|
|
361
|
-
const visit = (value, path) => {
|
|
362
|
-
if (Array.isArray(value)) {
|
|
363
|
-
value.forEach((entry, index) => visit(entry, [...path, String(index)]));
|
|
364
|
-
return;
|
|
365
|
-
}
|
|
366
|
-
if (typeof value !== "object" || value === null)
|
|
367
|
-
return;
|
|
368
|
-
for (const [key, entry] of Object.entries(value).sort(([left], [right]) => compareCodeUnits(left, right))) {
|
|
369
|
-
const baseContract = recoveryReferenceContract(key);
|
|
370
|
-
const contract = baseContract?.kind === "migration_hint" &&
|
|
371
|
-
value.semantics === "behavior_preserving"
|
|
372
|
-
? { ...baseContract, semantics: "behavior_preserving" }
|
|
373
|
-
: baseContract;
|
|
374
|
-
const entries = [entry].flat();
|
|
375
|
-
if (contract !== undefined) {
|
|
376
|
-
entries.forEach((candidate, index) => {
|
|
377
|
-
const nestedValueField = "nested_value_field" in contract &&
|
|
378
|
-
typeof contract.nested_value_field === "string"
|
|
379
|
-
? contract.nested_value_field
|
|
380
|
-
: undefined;
|
|
381
|
-
const resolvedCandidate = nestedValueField &&
|
|
382
|
-
typeof candidate === "object" &&
|
|
383
|
-
candidate !== null &&
|
|
384
|
-
!Array.isArray(candidate)
|
|
385
|
-
? candidate[nestedValueField]
|
|
386
|
-
: candidate;
|
|
387
|
-
if (typeof resolvedCandidate !== "string" ||
|
|
388
|
-
resolvedCandidate.trim().length === 0)
|
|
389
|
-
return;
|
|
390
|
-
const coordinate = [...path, key, String(index)]
|
|
391
|
-
.map((segment) => encodeURIComponent(segment))
|
|
392
|
-
.join("/");
|
|
393
|
-
obligations.push({
|
|
394
|
-
id: `${probeId}:${contract.kind}:${coordinate}`,
|
|
395
|
-
probe_id: probeId,
|
|
396
|
-
kind: contract.kind,
|
|
397
|
-
semantics: contract.semantics,
|
|
398
|
-
value: resolvedCandidate,
|
|
399
|
-
});
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
visit(entry, [...path, key]);
|
|
403
|
-
}
|
|
404
|
-
};
|
|
405
|
-
visit(envelope, []);
|
|
406
|
-
return obligations;
|
|
407
|
-
}
|
|
408
|
-
/** Compare declared refusal states with real-entrypoint observations. */
|
|
409
|
-
export function verifyPmRefusalReachability(catalog, observations) {
|
|
410
|
-
const declarations = catalog.flatMap((contract) => (contract.owned_states ?? []).map((state) => ({ contract, state })));
|
|
411
|
-
const findings = [];
|
|
412
|
-
const observationsByProbe = new Map();
|
|
413
|
-
for (const observation of observations) {
|
|
414
|
-
if (observationsByProbe.has(observation.probe_id)) {
|
|
415
|
-
findings.push({
|
|
416
|
-
kind: "duplicate_probe",
|
|
417
|
-
probe_id: observation.probe_id,
|
|
418
|
-
detail: `Observation ${observation.probe_id} was supplied more than once.`,
|
|
419
|
-
});
|
|
420
|
-
continue;
|
|
421
|
-
}
|
|
422
|
-
observationsByProbe.set(observation.probe_id, observation);
|
|
423
|
-
}
|
|
424
|
-
const declaredProbeIds = new Set(declarations.map(({ state }) => state.probe_id));
|
|
425
|
-
for (const { contract, state } of declarations) {
|
|
426
|
-
const observation = observationsByProbe.get(state.probe_id);
|
|
427
|
-
if (!observation) {
|
|
428
|
-
findings.push({
|
|
429
|
-
kind: "missing_probe",
|
|
430
|
-
probe_id: state.probe_id,
|
|
431
|
-
detail: `No entrypoint observation was recorded for ${contract.code}.`,
|
|
432
|
-
});
|
|
433
|
-
continue;
|
|
434
|
-
}
|
|
435
|
-
if (observation.code !== contract.code) {
|
|
436
|
-
findings.push({
|
|
437
|
-
kind: "wrong_error_code",
|
|
438
|
-
probe_id: state.probe_id,
|
|
439
|
-
detail: `Expected ${contract.code}; observed ${observation.code}.`,
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
|
-
if (observation.exit_class !== state.expected_exit_class) {
|
|
443
|
-
findings.push({
|
|
444
|
-
kind: "wrong_exit_class",
|
|
445
|
-
probe_id: state.probe_id,
|
|
446
|
-
detail: `Expected ${state.expected_exit_class}; observed ${observation.exit_class}.`,
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
if (!state.entrypoints.includes(observation.entrypoint)) {
|
|
450
|
-
findings.push({
|
|
451
|
-
kind: "wrong_entrypoint",
|
|
452
|
-
probe_id: state.probe_id,
|
|
453
|
-
detail: `Expected one of ${state.entrypoints.join(", ")}; observed ${observation.entrypoint}.`,
|
|
454
|
-
});
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
for (const observation of observations) {
|
|
458
|
-
if (!declaredProbeIds.has(observation.probe_id)) {
|
|
459
|
-
findings.push({
|
|
460
|
-
kind: "undeclared_probe",
|
|
461
|
-
probe_id: observation.probe_id,
|
|
462
|
-
detail: `Observation ${observation.probe_id} has no catalog declaration.`,
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
findings.sort((left, right) => left.probe_id !== right.probe_id
|
|
467
|
-
? left.probe_id.localeCompare(right.probe_id)
|
|
468
|
-
: left.kind.localeCompare(right.kind));
|
|
469
|
-
return {
|
|
470
|
-
ok: findings.length === 0,
|
|
471
|
-
declared_probe_count: declarations.length,
|
|
472
|
-
observed_probe_count: observations.length,
|
|
473
|
-
findings,
|
|
474
|
-
};
|
|
475
|
-
}
|
|
476
|
-
/** Verify executable and declared-path proof for emitted recovery references. */
|
|
477
|
-
export function verifyPmRecoveryReferences(obligations, observations) {
|
|
478
|
-
const findings = [];
|
|
479
|
-
const declaredIds = new Set();
|
|
480
|
-
const duplicateIds = new Set();
|
|
481
|
-
for (const obligation of obligations) {
|
|
482
|
-
if (declaredIds.has(obligation.id)) {
|
|
483
|
-
duplicateIds.add(obligation.id);
|
|
484
|
-
findings.push({
|
|
485
|
-
kind: "duplicate_obligation",
|
|
486
|
-
reference_id: obligation.id,
|
|
487
|
-
detail: `Recovery obligation ${obligation.id} was declared more than once.`,
|
|
488
|
-
});
|
|
489
|
-
continue;
|
|
490
|
-
}
|
|
491
|
-
declaredIds.add(obligation.id);
|
|
492
|
-
}
|
|
493
|
-
const observationsById = new Map();
|
|
494
|
-
for (const observation of observations) {
|
|
495
|
-
if (observationsById.has(observation.id)) {
|
|
496
|
-
findings.push({
|
|
497
|
-
kind: "duplicate_observation",
|
|
498
|
-
reference_id: observation.id,
|
|
499
|
-
detail: `Recovery reference ${observation.id} was observed more than once.`,
|
|
500
|
-
});
|
|
501
|
-
continue;
|
|
502
|
-
}
|
|
503
|
-
observationsById.set(observation.id, observation);
|
|
504
|
-
if (!declaredIds.has(observation.id)) {
|
|
505
|
-
findings.push({
|
|
506
|
-
kind: "undeclared_observation",
|
|
507
|
-
reference_id: observation.id,
|
|
508
|
-
detail: `Recovery observation ${observation.id} has no emitted obligation.`,
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
for (const obligation of obligations) {
|
|
513
|
-
if (duplicateIds.has(obligation.id))
|
|
514
|
-
continue;
|
|
515
|
-
const observation = observationsById.get(obligation.id);
|
|
516
|
-
if (!observation) {
|
|
517
|
-
findings.push({
|
|
518
|
-
kind: "missing_observation",
|
|
519
|
-
reference_id: obligation.id,
|
|
520
|
-
detail: `No reachability proof was recorded for ${obligation.kind} ${obligation.value}.`,
|
|
521
|
-
});
|
|
522
|
-
}
|
|
523
|
-
else if (!observation.reachable) {
|
|
524
|
-
findings.push({
|
|
525
|
-
kind: "unreachable_reference",
|
|
526
|
-
reference_id: obligation.id,
|
|
527
|
-
detail: `Recovery reference ${obligation.value} did not reach its promised target.`,
|
|
528
|
-
});
|
|
529
|
-
}
|
|
530
|
-
else if (observation.semantics !== obligation.semantics) {
|
|
531
|
-
findings.push({
|
|
532
|
-
kind: "wrong_semantics",
|
|
533
|
-
reference_id: obligation.id,
|
|
534
|
-
detail: `Recovery reference ${obligation.value} promised ${obligation.semantics}; proof demonstrated ${observation.semantics}.`,
|
|
535
|
-
});
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
const coverageByKind = PM_RECOVERY_REFERENCE_KINDS.map((kind) => {
|
|
539
|
-
const kindObligations = obligations.filter((obligation) => obligation.kind === kind);
|
|
540
|
-
const kindObservations = kindObligations
|
|
541
|
-
.filter((obligation) => !duplicateIds.has(obligation.id))
|
|
542
|
-
.map((obligation) => observationsById.get(obligation.id))
|
|
543
|
-
.filter((observation) => observation !== undefined);
|
|
544
|
-
return {
|
|
545
|
-
kind,
|
|
546
|
-
declared: kindObligations.length,
|
|
547
|
-
observed: kindObservations.length,
|
|
548
|
-
passed: kindObligations.filter((obligation) => {
|
|
549
|
-
const observation = observationsById.get(obligation.id);
|
|
550
|
-
return (!duplicateIds.has(obligation.id) &&
|
|
551
|
-
observation?.reachable === true &&
|
|
552
|
-
observation.semantics === obligation.semantics);
|
|
553
|
-
}).length,
|
|
554
|
-
};
|
|
555
|
-
});
|
|
556
|
-
findings.sort((left, right) => left.reference_id !== right.reference_id
|
|
557
|
-
? left.reference_id.localeCompare(right.reference_id)
|
|
558
|
-
: left.kind.localeCompare(right.kind));
|
|
559
|
-
const passed = coverageByKind.reduce((total, coverage) => total + coverage.passed, 0);
|
|
560
|
-
return {
|
|
561
|
-
ok: findings.length === 0,
|
|
562
|
-
declared_reference_count: obligations.length,
|
|
563
|
-
observed_reference_count: observations.length,
|
|
564
|
-
pass_fraction: declaredIds.size === 0 ? 1 : passed / declaredIds.size,
|
|
565
|
-
coverage_by_kind: coverageByKind,
|
|
566
|
-
findings,
|
|
567
|
-
};
|
|
568
|
-
}
|
|
569
|
-
/** Join source-census counts to distinct emitted runtime values by typed kind. */
|
|
570
|
-
export function verifyPmRecoveryProducerRuntimeCoverage(census, obligations) {
|
|
571
|
-
const runtimeValuesByKind = new Map(PM_RECOVERY_REFERENCE_KINDS.map((kind) => [kind, new Set()]));
|
|
572
|
-
for (const obligation of obligations) {
|
|
573
|
-
runtimeValuesByKind.get(obligation.kind).add(obligation.value);
|
|
574
|
-
}
|
|
575
|
-
const coverageByKind = PM_RECOVERY_REFERENCE_KINDS.map((kind) => ({
|
|
576
|
-
kind,
|
|
577
|
-
source_producers: census.producer_count_by_kind[kind],
|
|
578
|
-
runtime_values: runtimeValuesByKind.get(kind).size,
|
|
579
|
-
}));
|
|
580
|
-
const missingRuntimeKinds = coverageByKind
|
|
581
|
-
.filter(({ source_producers: sourceProducers, runtime_values: runtimeValues }) => sourceProducers > 0 && runtimeValues === 0)
|
|
582
|
-
.map(({ kind }) => kind);
|
|
583
|
-
return {
|
|
584
|
-
ok: census.ok && missingRuntimeKinds.length === 0,
|
|
585
|
-
source_producer_count: census.producer_count,
|
|
586
|
-
runtime_value_count: coverageByKind.reduce((total, { runtime_values: runtimeValues }) => total + runtimeValues, 0),
|
|
587
|
-
coverage_by_kind: coverageByKind,
|
|
588
|
-
missing_runtime_kinds: missingRuntimeKinds,
|
|
589
|
-
};
|
|
590
|
-
}
|
|
591
|
-
/** Honest kind-level name for the compatibility implementation above. */
|
|
592
|
-
export const verifyPmRecoveryKindRuntimeCoverage = verifyPmRecoveryProducerRuntimeCoverage;
|
|
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]="81067f95-115f-5aee-b649-55d86c3915d4")}catch(e2){}})();import*as nodeModule from"node:module";const PM_RECOVERY_REFERENCE_KINDS=["suggested_retry","candidate_command","example","next_step","migration_hint","restore_with"];const RECOVERY_REFERENCE_FIELD_CONTRACTS={suggested_retry:{kind:"suggested_retry",semantics:"recovery"},retry_command:{kind:"suggested_retry",semantics:"recovery"},candidate_command:{kind:"candidate_command",semantics:"recovery"},candidate_commands:{kind:"candidate_command",semantics:"recovery"},fallback_candidates:{kind:"candidate_command",semantics:"recovery",nested_value_field:"command"},next_best_command:{kind:"candidate_command",semantics:"recovery"},example:{kind:"example",semantics:"recovery"},examples:{kind:"example",semantics:"recovery"},next_step:{kind:"next_step",semantics:"recovery"},next_steps:{kind:"next_step",semantics:"recovery"},suggested_next_steps:{kind:"next_step",semantics:"recovery"},migration_hint:{kind:"migration_hint",semantics:"replacement"},migration_hints:{kind:"migration_hint",semantics:"replacement"},restore_with:{kind:"restore_with",semantics:"behavior_preserving"}};const PM_RECOVERY_REFERENCE_FIELDS=Object.freeze(Object.keys(RECOVERY_REFERENCE_FIELD_CONTRACTS));function recoveryReferenceContract(field){if(!Object.hasOwn(RECOVERY_REFERENCE_FIELD_CONTRACTS,field))return void 0;return RECOVERY_REFERENCE_FIELD_CONTRACTS[field]}const SOURCE_REGEXP_PREFIX_PUNCTUATORS=new Set([..."=([{,:;!?&|+-*%^~<>","=>"]);function compareCodeUnits(left,right){return left<right?-1:left>right?1:0}function skipQuotedSourceToken(source,index){const quote=source[index];let next=index+1;let value="";while(next<source.length&&source[next]!==quote){if(source[next]==="\\")next+=2;else{value+=source[next];next+=1}}if(source[next]===quote)next+=1;return{next,value}}function canStartRegularExpression(previous){return previous===void 0||previous.kind==="punctuator"&&SOURCE_REGEXP_PREFIX_PUNCTUATORS.has(previous.value)||previous.kind==="identifier"&&["return","case","throw","else","yield"].includes(previous.value)}function sourceTriviaEnd(source,index){if(/\s/u.test(source[index]))return index+1;if(source.startsWith("//",index)){const newline=source.indexOf("\n",index+2);return newline===-1?source.length:newline+1}if(!source.startsWith("/*",index))return void 0;return source.indexOf("*/",index+2)+2}function regularExpressionEnd(source,index,previous){if(source[index]!=="/"||!canStartRegularExpression(previous))return void 0;let next=index+1;let inClass=false;while(next<source.length){if(source[next]==="\\")next+=2;else if(source[next]==="["){inClass=true;next+=1}else if(source[next]==="]"){inClass=false;next+=1}else if(source[next]==="/"&&!inClass){next+=1;while(/[A-Za-z]/u.test(source.charAt(next)))next+=1;return next}else next+=1}return next}function readSourceSyntaxToken(source,index){const character=source[index];if(character==="'"||character==='"'||character==="`"){const quoted=skipQuotedSourceToken(source,index);return character==="`"?{next:quoted.next}:{next:quoted.next,token:{kind:"string",value:quoted.value,offset:index+1}}}if(/[A-Za-z_$]/u.test(character)){let next=index+1;while(/[A-Za-z0-9_$]/u.test(source[next]??""))next+=1;return{next,token:{kind:"identifier",value:source.slice(index,next),offset:index}}}const punctuator=source.startsWith("=>",index)?"=>":character;return{next:index+punctuator.length,token:{kind:"punctuator",value:punctuator,offset:index}}}function tokenizeExecutableSource(source){const tokens=[];let index=0;while(index<source.length){const ignoredEnd=sourceTriviaEnd(source,index);if(ignoredEnd!==void 0){index=ignoredEnd;continue}const regexEnd=regularExpressionEnd(source,index,tokens.at(-1));if(regexEnd!==void 0){index=regexEnd;continue}const read=readSourceSyntaxToken(source,index);if(read.token)tokens.push(read.token);index=read.next}return tokens}const SOURCE_BRACE_FRAME_KINDS=new Set(["object","block","pattern"]);const SOURCE_PATTERN_DECLARATIONS=new Set(["const","let","var"]);const SOURCE_CLOSING_TOKENS=new Set(["}",")","]"]);const SOURCE_OBJECT_PRECEDERS=new Set(["=","(","[",",",":","?","return"]);function objectFrameKind(tokens,index,stack){const enclosingBrace=[...stack].reverse().find(frame=>SOURCE_BRACE_FRAME_KINDS.has(frame.kind));if(enclosingBrace?.kind==="pattern")return"pattern";if(stack.at(-1)?.kind==="paren"&&stack.at(-1)?.parameter_list)return"pattern";const previous=tokens[index-1];if(previous?.kind==="identifier"&&SOURCE_PATTERN_DECLARATIONS.has(previous.value)){return"pattern"}if(previous?.value==="=>"||previous?.value===")")return"block";return previous&&SOURCE_OBJECT_PRECEDERS.has(previous.value)?"object":"block"}function openingSourceFrame(tokens,index,stack){const token=tokens[index];if(token.value==="{"){const kind=objectFrameKind(tokens,index,stack);return{kind,...kind==="object"?{member_start:true,candidates:[]}:{}}}if(token.value==="[")return{kind:"array"};if(token.value!=="(")return void 0;const previous=tokens[index-1];const beforePrevious=tokens[index-2];const parameterList=previous?.value==="function"||beforePrevious?.value==="function";return{kind:"paren",...parameterList?{parameter_list:true}:{}}}function staticObjectMember(frame,token,next){if(frame?.kind!=="object"||!frame.member_start||token.kind!=="identifier"&&token.kind!=="string"||next?.value!==":"||!/^[A-Za-z][A-Za-z0-9_]*$/u.test(token.value)){return void 0}return{field:token.value,offset:token.offset}}function isPatternLikeObjectClosure(tokens,index){return tokens[index+1]?.value===")"&&tokens[index+2]?.value==="=>"||tokens[index+1]?.value==="="}function scanSourcePropertyTokens(source){const tokens=tokenizeExecutableSource(nodeModule.stripTypeScriptTypes(source,{mode:"strip"}));const properties=[];const stack=[];for(const[index,token]of tokens.entries()){const frame=stack.at(-1);const property=staticObjectMember(frame,token,tokens[index+1]);if(property)frame.candidates.push(property);const opening=openingSourceFrame(tokens,index,stack);if(opening){stack.push(opening)}else if(SOURCE_CLOSING_TOKENS.has(token.value)){const closed=stack.pop();if(closed?.kind==="object"&&!isPatternLikeObjectClosure(tokens,index)){properties.push(...closed.candidates)}}else if(token.value===","&&frame?.kind==="object"){frame.member_start=true}else if(frame?.kind==="object"&&token.value!==":"){frame.member_start=false}}return properties}function sourceLineStarts(source){const starts=[0];for(let index=0;index<source.length;index+=1){if(source[index]==="\n")starts.push(index+1)}return starts}function sourceLineAtOffset(starts,offset){let low=0;let high=starts.length;while(low<high){const middle=Math.floor((low+high)/2);if(starts[middle]<=offset)low=middle+1;else high=middle}return low}function censusPmRecoveryReferenceProducers(sources){const producers=[];const findings=[];for(const source of[...sources].sort((left,right)=>compareCodeUnits(left.path,right.path))){const lineStarts=sourceLineStarts(source.content);let properties;try{properties=scanSourcePropertyTokens(source.content)}catch(error){findings.push({kind:"invalid_source",subject:source.path,detail:`${source.path} could not be parsed for recovery producers: ${String(error)}.`});continue}for(const property of properties){const field=property.field;const line=sourceLineAtOffset(lineStarts,property.offset);const contract=recoveryReferenceContract(field);if(contract){producers.push({path:source.path,line,field,kind:contract.kind})}else if(/(?:retry_command|candidate_command|fallback_candidate|next_best_command|example|next_step|migration_hint|restore_with)/u.test(field)&&!/(?:_total|_truncated)$/u.test(field)){findings.push({kind:"unknown_recovery_field",subject:`${source.path}:${line}:${field}`,detail:`${field} resembles a recovery reference but has no typed field contract.`})}}}const producerCountByKind=Object.fromEntries(PM_RECOVERY_REFERENCE_KINDS.map(kind=>[kind,producers.filter(producer=>producer.kind===kind).length]));for(const kind of PM_RECOVERY_REFERENCE_KINDS){if(producerCountByKind[kind]===0){findings.push({kind:"missing_kind_producer",subject:kind,detail:`No source producer emits the ${kind} recovery-reference kind.`})}}producers.sort((left,right)=>left.path!==right.path?compareCodeUnits(left.path,right.path):left.line!==right.line?left.line-right.line:compareCodeUnits(left.field,right.field));findings.sort((left,right)=>left.subject!==right.subject?compareCodeUnits(left.subject,right.subject):compareCodeUnits(left.kind,right.kind));return{ok:findings.length===0,scanned_file_count:sources.length,producer_count:producers.length,producer_count_by_kind:producerCountByKind,producers,findings}}function derivePmRecoveryReferenceObligations(probeId,envelope){const obligations=[];const visit=(value,path)=>{if(Array.isArray(value)){value.forEach((entry,index)=>visit(entry,[...path,String(index)]));return}if(typeof value!=="object"||value===null)return;for(const[key,entry]of Object.entries(value).sort(([left],[right])=>compareCodeUnits(left,right))){const baseContract=recoveryReferenceContract(key);const contract=baseContract?.kind==="migration_hint"&&value.semantics==="behavior_preserving"?{...baseContract,semantics:"behavior_preserving"}:baseContract;const entries=[entry].flat();if(contract!==void 0){entries.forEach((candidate,index)=>{const nestedValueField="nested_value_field"in contract&&typeof contract.nested_value_field==="string"?contract.nested_value_field:void 0;const resolvedCandidate=nestedValueField&&typeof candidate==="object"&&candidate!==null&&!Array.isArray(candidate)?candidate[nestedValueField]:candidate;if(typeof resolvedCandidate!=="string"||resolvedCandidate.trim().length===0)return;const coordinate=[...path,key,String(index)].map(segment=>encodeURIComponent(segment)).join("/");obligations.push({id:`${probeId}:${contract.kind}:${coordinate}`,probe_id:probeId,kind:contract.kind,semantics:contract.semantics,value:resolvedCandidate})})}visit(entry,[...path,key])}};visit(envelope,[]);return obligations}function verifyPmRefusalReachability(catalog,observations){const declarations=catalog.flatMap(contract=>(contract.owned_states??[]).map(state=>({contract,state})));const findings=[];const observationsByProbe=new Map;for(const observation of observations){if(observationsByProbe.has(observation.probe_id)){findings.push({kind:"duplicate_probe",probe_id:observation.probe_id,detail:`Observation ${observation.probe_id} was supplied more than once.`});continue}observationsByProbe.set(observation.probe_id,observation)}const declaredProbeIds=new Set(declarations.map(({state})=>state.probe_id));for(const{contract,state}of declarations){const observation=observationsByProbe.get(state.probe_id);if(!observation){findings.push({kind:"missing_probe",probe_id:state.probe_id,detail:`No entrypoint observation was recorded for ${contract.code}.`});continue}if(observation.code!==contract.code){findings.push({kind:"wrong_error_code",probe_id:state.probe_id,detail:`Expected ${contract.code}; observed ${observation.code}.`})}if(observation.exit_class!==state.expected_exit_class){findings.push({kind:"wrong_exit_class",probe_id:state.probe_id,detail:`Expected ${state.expected_exit_class}; observed ${observation.exit_class}.`})}if(!state.entrypoints.includes(observation.entrypoint)){findings.push({kind:"wrong_entrypoint",probe_id:state.probe_id,detail:`Expected one of ${state.entrypoints.join(", ")}; observed ${observation.entrypoint}.`})}}for(const observation of observations){if(!declaredProbeIds.has(observation.probe_id)){findings.push({kind:"undeclared_probe",probe_id:observation.probe_id,detail:`Observation ${observation.probe_id} has no catalog declaration.`})}}findings.sort((left,right)=>left.probe_id!==right.probe_id?left.probe_id.localeCompare(right.probe_id):left.kind.localeCompare(right.kind));return{ok:findings.length===0,declared_probe_count:declarations.length,observed_probe_count:observations.length,findings}}function verifyPmRecoveryReferences(obligations,observations){const findings=[];const declaredIds=new Set;const duplicateIds=new Set;for(const obligation of obligations){if(declaredIds.has(obligation.id)){duplicateIds.add(obligation.id);findings.push({kind:"duplicate_obligation",reference_id:obligation.id,detail:`Recovery obligation ${obligation.id} was declared more than once.`});continue}declaredIds.add(obligation.id)}const observationsById=new Map;for(const observation of observations){if(observationsById.has(observation.id)){findings.push({kind:"duplicate_observation",reference_id:observation.id,detail:`Recovery reference ${observation.id} was observed more than once.`});continue}observationsById.set(observation.id,observation);if(!declaredIds.has(observation.id)){findings.push({kind:"undeclared_observation",reference_id:observation.id,detail:`Recovery observation ${observation.id} has no emitted obligation.`})}}for(const obligation of obligations){if(duplicateIds.has(obligation.id))continue;const observation=observationsById.get(obligation.id);if(!observation){findings.push({kind:"missing_observation",reference_id:obligation.id,detail:`No reachability proof was recorded for ${obligation.kind} ${obligation.value}.`})}else if(!observation.reachable){findings.push({kind:"unreachable_reference",reference_id:obligation.id,detail:`Recovery reference ${obligation.value} did not reach its promised target.`})}else if(observation.semantics!==obligation.semantics){findings.push({kind:"wrong_semantics",reference_id:obligation.id,detail:`Recovery reference ${obligation.value} promised ${obligation.semantics}; proof demonstrated ${observation.semantics}.`})}}const coverageByKind=PM_RECOVERY_REFERENCE_KINDS.map(kind=>{const kindObligations=obligations.filter(obligation=>obligation.kind===kind);const kindObservations=kindObligations.filter(obligation=>!duplicateIds.has(obligation.id)).map(obligation=>observationsById.get(obligation.id)).filter(observation=>observation!==void 0);return{kind,declared:kindObligations.length,observed:kindObservations.length,passed:kindObligations.filter(obligation=>{const observation=observationsById.get(obligation.id);return!duplicateIds.has(obligation.id)&&observation?.reachable===true&&observation.semantics===obligation.semantics}).length}});findings.sort((left,right)=>left.reference_id!==right.reference_id?left.reference_id.localeCompare(right.reference_id):left.kind.localeCompare(right.kind));const passed=coverageByKind.reduce((total,coverage)=>total+coverage.passed,0);return{ok:findings.length===0,declared_reference_count:obligations.length,observed_reference_count:observations.length,pass_fraction:declaredIds.size===0?1:passed/declaredIds.size,coverage_by_kind:coverageByKind,findings}}function verifyPmRecoveryProducerRuntimeCoverage(census,obligations){const runtimeValuesByKind=new Map(PM_RECOVERY_REFERENCE_KINDS.map(kind=>[kind,new Set]));for(const obligation of obligations){runtimeValuesByKind.get(obligation.kind).add(obligation.value)}const coverageByKind=PM_RECOVERY_REFERENCE_KINDS.map(kind=>({kind,source_producers:census.producer_count_by_kind[kind],runtime_values:runtimeValuesByKind.get(kind).size}));const missingRuntimeKinds=coverageByKind.filter(({source_producers:sourceProducers,runtime_values:runtimeValues})=>sourceProducers>0&&runtimeValues===0).map(({kind})=>kind);return{ok:census.ok&&missingRuntimeKinds.length===0,source_producer_count:census.producer_count,runtime_value_count:coverageByKind.reduce((total,{runtime_values:runtimeValues})=>total+runtimeValues,0),coverage_by_kind:coverageByKind,missing_runtime_kinds:missingRuntimeKinds}}const verifyPmRecoveryKindRuntimeCoverage=verifyPmRecoveryProducerRuntimeCoverage;export{PM_RECOVERY_REFERENCE_FIELDS,PM_RECOVERY_REFERENCE_KINDS,censusPmRecoveryReferenceProducers,derivePmRecoveryReferenceObligations,verifyPmRecoveryKindRuntimeCoverage,verifyPmRecoveryProducerRuntimeCoverage,verifyPmRecoveryReferences,verifyPmRefusalReachability};
|
|
593
2
|
//# sourceMappingURL=refusal-reachability.js.map
|
|
594
|
-
//# debugId=4f4e7daa-14aa-5dad-8a30-79a4d76159d4
|