@unbrained/pm-cli 2026.9.7 → 2026.9.9
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 +7 -2
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +231 -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.d.ts +0 -5
- 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-NPN5I67J.js → chunk-3IPRM75M.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-4VL5P22L.js +2 -0
- package/dist/cli-bundle/chunks/chunk-AAFBV3U3.js +29 -0
- package/dist/cli-bundle/chunks/chunk-D3YVILJJ.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-ECBLPN7B.js +3 -0
- package/dist/cli-bundle/chunks/chunk-J6ERHBV2.js +235 -0
- package/dist/cli-bundle/chunks/chunk-JUNJ5EKI.js +2 -0
- package/dist/cli-bundle/chunks/chunk-L5RCDKQ2.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-OHNLSGGV.js +79 -0
- package/dist/cli-bundle/chunks/chunk-WQKMSFBV.js +5 -0
- package/dist/cli-bundle/chunks/{chunk-BAX2BYUW.js → chunk-XZ6T7YPP.js} +256 -150
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-Z3XVXUVF.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-UIHRCS6D.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-WHWMGRVX.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-64YZYTC5.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-PERI45EM.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2W4XIYOB.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2WSBXIGF.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-5FHTCOHS.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7N6DOREF.js +26 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-7PC4R5QB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-BUCJUZVG.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-FE3BABLJ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-IWITF53W.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-OQUGRHKV.js +10 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-PNKIANFZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-QQQ4SAUO.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-TTYXF5YD.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-XNR3DM6J.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-XSS3APUF.js +9 -0
- package/dist/cli-bundle/focused-chunks/chunk-YCDQ2N23.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-YJUXGS57.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-ZTCE4UO6.js +58 -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 +37 -37
- 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/policy/workflow-policy-schema.d.ts +312 -0
- package/dist/core/policy/workflow-policy-schema.js +2 -0
- package/dist/core/policy/workflow-policy-store.d.ts +24 -0
- package/dist/core/policy/workflow-policy-store.js +2 -0
- package/dist/core/policy/workflow-policy.d.ts +139 -0
- package/dist/core/policy/workflow-policy.js +2 -0
- 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.d.ts +1 -0
- 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.d.ts +1 -1
- 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 +174 -839
- 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.d.ts +3 -1
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workflow-completeness.d.ts +32 -0
- package/dist/sdk/governance/workflow-completeness.js +2 -0
- package/dist/sdk/governance/workflow-policy.d.ts +47 -0
- package/dist/sdk/governance/workflow-policy.js +4 -0
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +2 -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 -1
- 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.d.ts +1 -1
- 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.d.ts +27 -0
- 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.d.ts +6 -4
- 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.d.ts +1 -1
- 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.d.ts +2 -1
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.d.ts +4 -0
- 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.d.ts +2 -1
- 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.d.ts +4 -0
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/COMMANDS.md +10 -0
- package/docs/CONFIGURATION.md +12 -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 +4 -0
- package/docs/READ_OUTPUT_CONTRACTS.md +5 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +33 -0
- package/docs/WORKFLOW_POLICIES.md +129 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +7 -7
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -5
- package/marketplace.json +2 -2
- package/package.json +5 -5
- 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-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-JX4DH4WC.js +0 -3
- 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-operations-I5W3KMGB.js +0 -2
- 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-PEFABF7E.js +0 -26
- 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,600 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module core/extensions/extension-policy
|
|
3
|
-
*
|
|
4
|
-
* Implements extension runtime contracts and governance for Extension Policy.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="24383c0a-592e-5105-84a3-a6cfb7801281")}catch(e){}}();
|
|
8
|
-
import { KNOWN_EXTENSION_POLICY_MODES, KNOWN_EXTENSION_POLICY_SURFACES, KNOWN_EXTENSION_SANDBOX_PROFILES, KNOWN_EXTENSION_TRUST_MODES, KNOWN_PM_MAX_VERSION_EXCEEDED_MODES, } from "./extension-types.js";
|
|
9
|
-
import { isKnownExtensionCapability } from "./extension-capability-aliases.js";
|
|
10
|
-
import { normalizeCommandName } from "./extension-runtime-helpers.js";
|
|
11
|
-
function normalizePolicyName(value) {
|
|
12
|
-
if (typeof value !== "string") {
|
|
13
|
-
return "";
|
|
14
|
-
}
|
|
15
|
-
return value.trim().toLowerCase();
|
|
16
|
-
}
|
|
17
|
-
function normalizePolicyStringSet(values) {
|
|
18
|
-
return new Set((values ?? [])
|
|
19
|
-
.map((value) => value.trim().toLowerCase())
|
|
20
|
-
.filter((value) => value.length > 0));
|
|
21
|
-
}
|
|
22
|
-
function normalizePolicySurfaceToken(value) {
|
|
23
|
-
const normalized = value.trim().toLowerCase();
|
|
24
|
-
if (normalized.length === 0) {
|
|
25
|
-
return "";
|
|
26
|
-
}
|
|
27
|
-
const segments = normalized
|
|
28
|
-
.split(/[.:/]/)
|
|
29
|
-
.map((segment) => segment.replace(/[\s_-]+/g, ""))
|
|
30
|
-
.filter((segment) => segment.length > 0);
|
|
31
|
-
if (segments.length === 0) {
|
|
32
|
-
return "";
|
|
33
|
-
}
|
|
34
|
-
if (segments.length === 1) {
|
|
35
|
-
return segments[0];
|
|
36
|
-
}
|
|
37
|
-
return `${segments[0]}.${segments.slice(1).join("")}`;
|
|
38
|
-
}
|
|
39
|
-
function normalizePolicySurfaceSet(values) {
|
|
40
|
-
return new Set((values ?? [])
|
|
41
|
-
.map((value) => normalizePolicySurfaceToken(value))
|
|
42
|
-
.filter((value) => value.length > 0));
|
|
43
|
-
}
|
|
44
|
-
function normalizePolicyMode(value) {
|
|
45
|
-
const normalized = normalizePolicyName(value);
|
|
46
|
-
if (KNOWN_EXTENSION_POLICY_MODES.includes(normalized)) {
|
|
47
|
-
return normalized;
|
|
48
|
-
}
|
|
49
|
-
return "off";
|
|
50
|
-
}
|
|
51
|
-
function normalizePolicyTrustMode(value) {
|
|
52
|
-
const normalized = normalizePolicyName(value);
|
|
53
|
-
if (KNOWN_EXTENSION_TRUST_MODES.includes(normalized)) {
|
|
54
|
-
return normalized;
|
|
55
|
-
}
|
|
56
|
-
return "off";
|
|
57
|
-
}
|
|
58
|
-
/** Implements normalize policy sandbox profile for the public runtime surface of this module. */
|
|
59
|
-
export function normalizePolicySandboxProfile(value) {
|
|
60
|
-
const normalized = normalizePolicyName(value);
|
|
61
|
-
if (KNOWN_EXTENSION_SANDBOX_PROFILES.includes(normalized)) {
|
|
62
|
-
return normalized;
|
|
63
|
-
}
|
|
64
|
-
return "none";
|
|
65
|
-
}
|
|
66
|
-
function normalizePmMaxVersionExceededModeValue(value) {
|
|
67
|
-
if (typeof value !== "string") {
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
const normalized = value.trim().toLowerCase();
|
|
71
|
-
return KNOWN_PM_MAX_VERSION_EXCEEDED_MODES.includes(normalized)
|
|
72
|
-
? normalized
|
|
73
|
-
: undefined;
|
|
74
|
-
}
|
|
75
|
-
/** Resolve `extensions.policy.pm_max_version_exceeded_mode` to a concrete per-layer mode map. Accepts a single mode string (applied to both layers) or a `{ global?, project? }` override map; anything unset or unknown defaults to the safe `"block"`. */
|
|
76
|
-
export function normalizePmMaxVersionExceededMode(value) {
|
|
77
|
-
if (typeof value === "string") {
|
|
78
|
-
const mode = normalizePmMaxVersionExceededModeValue(value) ?? "block";
|
|
79
|
-
return { global: mode, project: mode };
|
|
80
|
-
}
|
|
81
|
-
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
82
|
-
return {
|
|
83
|
-
global: normalizePmMaxVersionExceededModeValue(value.global) ?? "block",
|
|
84
|
-
project: normalizePmMaxVersionExceededModeValue(value.project) ?? "block",
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
return { global: "block", project: "block" };
|
|
88
|
-
}
|
|
89
|
-
function serializePmMaxVersionExceededMode(mode) {
|
|
90
|
-
return mode.global === mode.project
|
|
91
|
-
? mode.global
|
|
92
|
-
: { global: mode.global, project: mode.project };
|
|
93
|
-
}
|
|
94
|
-
function toSortedList(values) {
|
|
95
|
-
return [...new Set(values)].sort((left, right) => left.localeCompare(right));
|
|
96
|
-
}
|
|
97
|
-
function buildExtensionPolicyOverride(rawOverride) {
|
|
98
|
-
const name = normalizePolicyName(rawOverride.name);
|
|
99
|
-
if (name.length === 0) {
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
name,
|
|
104
|
-
normalized: {
|
|
105
|
-
name,
|
|
106
|
-
disabled: rawOverride.disabled === true,
|
|
107
|
-
requireTrusted: rawOverride.require_trusted === true,
|
|
108
|
-
requireProvenance: rawOverride.require_provenance === true,
|
|
109
|
-
sandboxProfile: rawOverride.sandbox_profile !== undefined
|
|
110
|
-
? normalizePolicySandboxProfile(rawOverride.sandbox_profile)
|
|
111
|
-
: undefined,
|
|
112
|
-
allowedCapabilities: normalizePolicyStringSet(rawOverride.allowed_capabilities),
|
|
113
|
-
blockedCapabilities: normalizePolicyStringSet(rawOverride.blocked_capabilities),
|
|
114
|
-
allowedSurfaces: normalizePolicySurfaceSet(rawOverride.allowed_surfaces),
|
|
115
|
-
blockedSurfaces: normalizePolicySurfaceSet(rawOverride.blocked_surfaces),
|
|
116
|
-
allowedCommands: normalizePolicyStringSet(rawOverride.allowed_commands),
|
|
117
|
-
blockedCommands: normalizePolicyStringSet(rawOverride.blocked_commands),
|
|
118
|
-
allowedActions: normalizePolicyStringSet(rawOverride.allowed_actions),
|
|
119
|
-
blockedActions: normalizePolicyStringSet(rawOverride.blocked_actions),
|
|
120
|
-
allowedServices: normalizePolicyStringSet(rawOverride.allowed_services),
|
|
121
|
-
blockedServices: normalizePolicyStringSet(rawOverride.blocked_services),
|
|
122
|
-
},
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
function collectExtensionPolicyOverrides(rawOverrides) {
|
|
126
|
-
const overridesByName = new Map();
|
|
127
|
-
for (const rawOverride of rawOverrides ?? []) {
|
|
128
|
-
const built = buildExtensionPolicyOverride(rawOverride);
|
|
129
|
-
if (built) {
|
|
130
|
-
overridesByName.set(built.name, built.normalized);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return overridesByName;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Collect the deduplicated, alphabetically-sorted `extension_policy_unknown_*`
|
|
137
|
-
* warnings for a normalized policy: every allow/block capability and surface
|
|
138
|
-
* token — at the top level and inside each per-extension override — that is not a
|
|
139
|
-
* recognized {@link ExtensionCapability} or known policy surface. Overrides are
|
|
140
|
-
* walked in name order and the final list is re-sorted, so the result is stable
|
|
141
|
-
* regardless of insertion order.
|
|
142
|
-
*/
|
|
143
|
-
function collectExtensionPolicyWarnings(normalized) {
|
|
144
|
-
const warnings = [];
|
|
145
|
-
const sortedOverrides = [...normalized.overridesByName.values()].sort((left, right) => left.name.localeCompare(right.name));
|
|
146
|
-
for (const capability of toSortedList([
|
|
147
|
-
...normalized.allowedCapabilities,
|
|
148
|
-
...normalized.blockedCapabilities,
|
|
149
|
-
])) {
|
|
150
|
-
if (!isKnownExtensionCapability(capability)) {
|
|
151
|
-
warnings.push(`extension_policy_unknown_capability:${capability}`);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
for (const override of sortedOverrides) {
|
|
155
|
-
for (const capability of toSortedList([
|
|
156
|
-
...override.allowedCapabilities,
|
|
157
|
-
...override.blockedCapabilities,
|
|
158
|
-
])) {
|
|
159
|
-
if (!isKnownExtensionCapability(capability)) {
|
|
160
|
-
warnings.push(`extension_policy_unknown_capability:${override.name}:${capability}`);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
const knownSurfaces = new Set(KNOWN_EXTENSION_POLICY_SURFACES);
|
|
165
|
-
for (const surface of toSortedList([
|
|
166
|
-
...normalized.allowedSurfaces,
|
|
167
|
-
...normalized.blockedSurfaces,
|
|
168
|
-
])) {
|
|
169
|
-
if (!knownSurfaces.has(surface)) {
|
|
170
|
-
warnings.push(`extension_policy_unknown_surface:${surface}`);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
for (const override of sortedOverrides) {
|
|
174
|
-
for (const surface of toSortedList([
|
|
175
|
-
...override.allowedSurfaces,
|
|
176
|
-
...override.blockedSurfaces,
|
|
177
|
-
])) {
|
|
178
|
-
if (!knownSurfaces.has(surface)) {
|
|
179
|
-
warnings.push(`extension_policy_unknown_surface:${override.name}:${surface}`);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return [...new Set(warnings)].sort((left, right) => left.localeCompare(right));
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Normalize the raw `extensions.policy` settings block into the canonical
|
|
187
|
-
* {@link NormalizedExtensionPolicy} used across loading, registration, and the
|
|
188
|
-
* doctor surface: modes/trust/sandbox coerced to known values, every allow/block
|
|
189
|
-
* list lower-cased and de-duplicated into a set, per-extension overrides indexed by
|
|
190
|
-
* name, and unknown-capability/surface tokens surfaced as warnings. A missing
|
|
191
|
-
* policy block resolves to the all-defaults policy (mode/trust `off`).
|
|
192
|
-
*/
|
|
193
|
-
export function normalizeExtensionPolicy(settings) {
|
|
194
|
-
const policy = settings.extensions?.policy ??
|
|
195
|
-
{};
|
|
196
|
-
const allowedCapabilities = normalizePolicyStringSet(policy.allowed_capabilities);
|
|
197
|
-
const blockedCapabilities = normalizePolicyStringSet(policy.blocked_capabilities);
|
|
198
|
-
const allowedSurfaces = normalizePolicySurfaceSet(policy.allowed_surfaces);
|
|
199
|
-
const blockedSurfaces = normalizePolicySurfaceSet(policy.blocked_surfaces);
|
|
200
|
-
const overridesByName = collectExtensionPolicyOverrides(policy.extension_overrides);
|
|
201
|
-
return {
|
|
202
|
-
mode: normalizePolicyMode(policy.mode),
|
|
203
|
-
trustMode: normalizePolicyTrustMode(policy.trust_mode),
|
|
204
|
-
pmMaxVersionExceededMode: normalizePmMaxVersionExceededMode(policy.pm_max_version_exceeded_mode),
|
|
205
|
-
requireProvenance: policy.require_provenance === true,
|
|
206
|
-
trustedExtensions: normalizePolicyStringSet(policy.trusted_extensions),
|
|
207
|
-
defaultSandboxProfile: normalizePolicySandboxProfile(policy.default_sandbox_profile),
|
|
208
|
-
allowedExtensions: normalizePolicyStringSet(policy.allowed_extensions),
|
|
209
|
-
blockedExtensions: normalizePolicyStringSet(policy.blocked_extensions),
|
|
210
|
-
allowedCapabilities,
|
|
211
|
-
blockedCapabilities,
|
|
212
|
-
allowedSurfaces,
|
|
213
|
-
blockedSurfaces,
|
|
214
|
-
allowedCommands: normalizePolicyStringSet(policy.allowed_commands),
|
|
215
|
-
blockedCommands: normalizePolicyStringSet(policy.blocked_commands),
|
|
216
|
-
allowedActions: normalizePolicyStringSet(policy.allowed_actions),
|
|
217
|
-
blockedActions: normalizePolicyStringSet(policy.blocked_actions),
|
|
218
|
-
allowedServices: normalizePolicyStringSet(policy.allowed_services),
|
|
219
|
-
blockedServices: normalizePolicyStringSet(policy.blocked_services),
|
|
220
|
-
overridesByName,
|
|
221
|
-
warnings: collectExtensionPolicyWarnings({
|
|
222
|
-
allowedCapabilities,
|
|
223
|
-
blockedCapabilities,
|
|
224
|
-
allowedSurfaces,
|
|
225
|
-
blockedSurfaces,
|
|
226
|
-
overridesByName,
|
|
227
|
-
}),
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
/** Implements serialize extension policy for the public runtime surface of this module. */
|
|
231
|
-
export function serializeExtensionPolicy(policy) {
|
|
232
|
-
const overrides = [...policy.overridesByName.values()]
|
|
233
|
-
.sort((left, right) => left.name.localeCompare(right.name))
|
|
234
|
-
.map((override) => ({
|
|
235
|
-
name: override.name,
|
|
236
|
-
...(override.disabled ? { disabled: true } : {}),
|
|
237
|
-
...(override.requireTrusted ? { require_trusted: true } : {}),
|
|
238
|
-
...(override.requireProvenance ? { require_provenance: true } : {}),
|
|
239
|
-
...(override.sandboxProfile
|
|
240
|
-
? { sandbox_profile: override.sandboxProfile }
|
|
241
|
-
: {}),
|
|
242
|
-
...(override.allowedCapabilities.size > 0
|
|
243
|
-
? { allowed_capabilities: toSortedList(override.allowedCapabilities) }
|
|
244
|
-
: {}),
|
|
245
|
-
...(override.blockedCapabilities.size > 0
|
|
246
|
-
? { blocked_capabilities: toSortedList(override.blockedCapabilities) }
|
|
247
|
-
: {}),
|
|
248
|
-
...(override.allowedSurfaces.size > 0
|
|
249
|
-
? { allowed_surfaces: toSortedList(override.allowedSurfaces) }
|
|
250
|
-
: {}),
|
|
251
|
-
...(override.blockedSurfaces.size > 0
|
|
252
|
-
? { blocked_surfaces: toSortedList(override.blockedSurfaces) }
|
|
253
|
-
: {}),
|
|
254
|
-
...(override.allowedCommands.size > 0
|
|
255
|
-
? { allowed_commands: toSortedList(override.allowedCommands) }
|
|
256
|
-
: {}),
|
|
257
|
-
...(override.blockedCommands.size > 0
|
|
258
|
-
? { blocked_commands: toSortedList(override.blockedCommands) }
|
|
259
|
-
: {}),
|
|
260
|
-
...(override.allowedActions.size > 0
|
|
261
|
-
? { allowed_actions: toSortedList(override.allowedActions) }
|
|
262
|
-
: {}),
|
|
263
|
-
...(override.blockedActions.size > 0
|
|
264
|
-
? { blocked_actions: toSortedList(override.blockedActions) }
|
|
265
|
-
: {}),
|
|
266
|
-
...(override.allowedServices.size > 0
|
|
267
|
-
? { allowed_services: toSortedList(override.allowedServices) }
|
|
268
|
-
: {}),
|
|
269
|
-
...(override.blockedServices.size > 0
|
|
270
|
-
? { blocked_services: toSortedList(override.blockedServices) }
|
|
271
|
-
: {}),
|
|
272
|
-
}));
|
|
273
|
-
return {
|
|
274
|
-
mode: policy.mode,
|
|
275
|
-
trust_mode: policy.trustMode,
|
|
276
|
-
pm_max_version_exceeded_mode: serializePmMaxVersionExceededMode(policy.pmMaxVersionExceededMode),
|
|
277
|
-
require_provenance: policy.requireProvenance,
|
|
278
|
-
trusted_extensions: toSortedList(policy.trustedExtensions),
|
|
279
|
-
default_sandbox_profile: policy.defaultSandboxProfile,
|
|
280
|
-
allowed_extensions: toSortedList(policy.allowedExtensions),
|
|
281
|
-
blocked_extensions: toSortedList(policy.blockedExtensions),
|
|
282
|
-
allowed_capabilities: toSortedList(policy.allowedCapabilities),
|
|
283
|
-
blocked_capabilities: toSortedList(policy.blockedCapabilities),
|
|
284
|
-
allowed_surfaces: toSortedList(policy.allowedSurfaces),
|
|
285
|
-
blocked_surfaces: toSortedList(policy.blockedSurfaces),
|
|
286
|
-
allowed_commands: toSortedList(policy.allowedCommands),
|
|
287
|
-
blocked_commands: toSortedList(policy.blockedCommands),
|
|
288
|
-
allowed_actions: toSortedList(policy.allowedActions),
|
|
289
|
-
blocked_actions: toSortedList(policy.blockedActions),
|
|
290
|
-
allowed_services: toSortedList(policy.allowedServices),
|
|
291
|
-
blocked_services: toSortedList(policy.blockedServices),
|
|
292
|
-
extension_overrides: overrides,
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
/** Implements hydrate extension policy for the public runtime surface of this module. */
|
|
296
|
-
export function hydrateExtensionPolicy(policy) {
|
|
297
|
-
const overridesByName = collectExtensionPolicyOverrides(policy.extension_overrides);
|
|
298
|
-
return {
|
|
299
|
-
mode: normalizePolicyMode(policy.mode),
|
|
300
|
-
trustMode: normalizePolicyTrustMode(policy.trust_mode),
|
|
301
|
-
pmMaxVersionExceededMode: normalizePmMaxVersionExceededMode(policy.pm_max_version_exceeded_mode),
|
|
302
|
-
requireProvenance: policy.require_provenance === true,
|
|
303
|
-
trustedExtensions: normalizePolicyStringSet(policy.trusted_extensions),
|
|
304
|
-
defaultSandboxProfile: normalizePolicySandboxProfile(policy.default_sandbox_profile),
|
|
305
|
-
allowedExtensions: normalizePolicyStringSet(policy.allowed_extensions),
|
|
306
|
-
blockedExtensions: normalizePolicyStringSet(policy.blocked_extensions),
|
|
307
|
-
allowedCapabilities: normalizePolicyStringSet(policy.allowed_capabilities),
|
|
308
|
-
blockedCapabilities: normalizePolicyStringSet(policy.blocked_capabilities),
|
|
309
|
-
allowedSurfaces: normalizePolicySurfaceSet(policy.allowed_surfaces),
|
|
310
|
-
blockedSurfaces: normalizePolicySurfaceSet(policy.blocked_surfaces),
|
|
311
|
-
allowedCommands: normalizePolicyStringSet(policy.allowed_commands),
|
|
312
|
-
blockedCommands: normalizePolicyStringSet(policy.blocked_commands),
|
|
313
|
-
allowedActions: normalizePolicyStringSet(policy.allowed_actions),
|
|
314
|
-
blockedActions: normalizePolicyStringSet(policy.blocked_actions),
|
|
315
|
-
allowedServices: normalizePolicyStringSet(policy.allowed_services),
|
|
316
|
-
blockedServices: normalizePolicyStringSet(policy.blocked_services),
|
|
317
|
-
overridesByName,
|
|
318
|
-
warnings: [],
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
function resolvePolicyOverride(policy, extensionName) {
|
|
322
|
-
return policy.overridesByName.get(normalizePolicyName(extensionName)) ?? null;
|
|
323
|
-
}
|
|
324
|
-
function evaluatePolicySet(allowed, blocked, value, notAllowlistedReason, blockedReason) {
|
|
325
|
-
if (blocked.has(value)) {
|
|
326
|
-
return blockedReason;
|
|
327
|
-
}
|
|
328
|
-
if (allowed.size > 0 && !allowed.has(value)) {
|
|
329
|
-
return notAllowlistedReason;
|
|
330
|
-
}
|
|
331
|
-
return null;
|
|
332
|
-
}
|
|
333
|
-
function resolvePolicyCapabilityReason(policy, extension, capability) {
|
|
334
|
-
const normalizedCapability = capability.trim().toLowerCase();
|
|
335
|
-
const override = resolvePolicyOverride(policy, extension.name);
|
|
336
|
-
const allowed = override && override.allowedCapabilities.size > 0
|
|
337
|
-
? override.allowedCapabilities
|
|
338
|
-
: policy.allowedCapabilities;
|
|
339
|
-
const blocked = new Set([
|
|
340
|
-
...policy.blockedCapabilities,
|
|
341
|
-
...(override ? override.blockedCapabilities : []),
|
|
342
|
-
]);
|
|
343
|
-
return evaluatePolicySet(allowed, blocked, normalizedCapability, "capability_not_allowlisted", "capability_blocked");
|
|
344
|
-
}
|
|
345
|
-
function resolvePolicySurfaceReason(policy, extension, surface) {
|
|
346
|
-
const override = resolvePolicyOverride(policy, extension.name);
|
|
347
|
-
const allowed = override && override.allowedSurfaces.size > 0
|
|
348
|
-
? override.allowedSurfaces
|
|
349
|
-
: policy.allowedSurfaces;
|
|
350
|
-
const blocked = new Set([
|
|
351
|
-
...policy.blockedSurfaces,
|
|
352
|
-
...(override ? override.blockedSurfaces : []),
|
|
353
|
-
]);
|
|
354
|
-
return evaluatePolicySet(allowed, blocked, surface, "surface_not_allowlisted", "surface_blocked");
|
|
355
|
-
}
|
|
356
|
-
function resolvePolicyCommandReason(policy, extension, command) {
|
|
357
|
-
const normalizedCommand = normalizeCommandName(command);
|
|
358
|
-
if (normalizedCommand.length === 0) {
|
|
359
|
-
return null;
|
|
360
|
-
}
|
|
361
|
-
const override = resolvePolicyOverride(policy, extension.name);
|
|
362
|
-
const allowed = override && override.allowedCommands.size > 0
|
|
363
|
-
? override.allowedCommands
|
|
364
|
-
: policy.allowedCommands;
|
|
365
|
-
const blocked = new Set([
|
|
366
|
-
...policy.blockedCommands,
|
|
367
|
-
...(override ? override.blockedCommands : []),
|
|
368
|
-
]);
|
|
369
|
-
return evaluatePolicySet(allowed, blocked, normalizedCommand, "command_not_allowlisted", "command_blocked");
|
|
370
|
-
}
|
|
371
|
-
function resolvePolicyActionReason(policy, extension, action) {
|
|
372
|
-
const normalizedAction = normalizePolicyName(action).replace(/\s+/g, "-");
|
|
373
|
-
if (normalizedAction.length === 0) {
|
|
374
|
-
return null;
|
|
375
|
-
}
|
|
376
|
-
const override = resolvePolicyOverride(policy, extension.name);
|
|
377
|
-
const allowed = override && override.allowedActions.size > 0
|
|
378
|
-
? override.allowedActions
|
|
379
|
-
: policy.allowedActions;
|
|
380
|
-
const blocked = new Set([
|
|
381
|
-
...policy.blockedActions,
|
|
382
|
-
...(override ? override.blockedActions : []),
|
|
383
|
-
]);
|
|
384
|
-
return evaluatePolicySet(allowed, blocked, normalizedAction, "action_not_allowlisted", "action_blocked");
|
|
385
|
-
}
|
|
386
|
-
function resolvePolicyServiceReason(policy, extension, service) {
|
|
387
|
-
const normalizedService = normalizePolicyName(service);
|
|
388
|
-
if (normalizedService.length === 0) {
|
|
389
|
-
return null;
|
|
390
|
-
}
|
|
391
|
-
const override = resolvePolicyOverride(policy, extension.name);
|
|
392
|
-
const allowed = override && override.allowedServices.size > 0
|
|
393
|
-
? override.allowedServices
|
|
394
|
-
: policy.allowedServices;
|
|
395
|
-
const blocked = new Set([
|
|
396
|
-
...policy.blockedServices,
|
|
397
|
-
...(override ? override.blockedServices : []),
|
|
398
|
-
]);
|
|
399
|
-
return evaluatePolicySet(allowed, blocked, normalizedService, "service_not_allowlisted", "service_blocked");
|
|
400
|
-
}
|
|
401
|
-
function resolvePolicyExtensionReason(policy, extension) {
|
|
402
|
-
const name = normalizePolicyName(extension.name);
|
|
403
|
-
const override = resolvePolicyOverride(policy, extension.name);
|
|
404
|
-
if (override?.disabled === true) {
|
|
405
|
-
return "extension_override_disabled";
|
|
406
|
-
}
|
|
407
|
-
return evaluatePolicySet(policy.allowedExtensions, policy.blockedExtensions, name, "extension_not_allowlisted", "extension_blocked");
|
|
408
|
-
}
|
|
409
|
-
function resolvePolicyTrustReason(policy, extension) {
|
|
410
|
-
if (policy.trustMode === "off") {
|
|
411
|
-
return null;
|
|
412
|
-
}
|
|
413
|
-
const override = resolvePolicyOverride(policy, extension.name);
|
|
414
|
-
const name = normalizePolicyName(extension.name);
|
|
415
|
-
const trusted = extension.trusted === true;
|
|
416
|
-
const provenanceVerified = extension.provenanceVerified === true;
|
|
417
|
-
if (policy.trustedExtensions.size > 0 &&
|
|
418
|
-
!policy.trustedExtensions.has(name)) {
|
|
419
|
-
return "extension_not_trusted";
|
|
420
|
-
}
|
|
421
|
-
if ((override?.requireTrusted === true ||
|
|
422
|
-
policy.trustMode === "warn" ||
|
|
423
|
-
policy.trustMode === "enforce") &&
|
|
424
|
-
!trusted) {
|
|
425
|
-
return "extension_untrusted";
|
|
426
|
-
}
|
|
427
|
-
if ((policy.requireProvenance || override?.requireProvenance === true) &&
|
|
428
|
-
!provenanceVerified) {
|
|
429
|
-
return "provenance_missing_or_unverified";
|
|
430
|
-
}
|
|
431
|
-
return null;
|
|
432
|
-
}
|
|
433
|
-
function resolvePolicySandboxReason(policy, extension) {
|
|
434
|
-
if (policy.mode === "off") {
|
|
435
|
-
return null;
|
|
436
|
-
}
|
|
437
|
-
const override = resolvePolicyOverride(policy, extension.name);
|
|
438
|
-
const profile = override?.sandboxProfile ??
|
|
439
|
-
extension.sandboxProfile ??
|
|
440
|
-
policy.defaultSandboxProfile;
|
|
441
|
-
if (profile === "none") {
|
|
442
|
-
return null;
|
|
443
|
-
}
|
|
444
|
-
const permissions = extension.permissions;
|
|
445
|
-
if (!permissions) {
|
|
446
|
-
return "sandbox_permissions_missing";
|
|
447
|
-
}
|
|
448
|
-
const hasPermission = (name) => permissions[name] === true;
|
|
449
|
-
if (profile === "restricted") {
|
|
450
|
-
if (hasPermission("process_spawn")) {
|
|
451
|
-
return "sandbox_restricted_disallows_process_spawn";
|
|
452
|
-
}
|
|
453
|
-
if (hasPermission("env_write")) {
|
|
454
|
-
return "sandbox_restricted_disallows_env_write";
|
|
455
|
-
}
|
|
456
|
-
return null;
|
|
457
|
-
}
|
|
458
|
-
// Remaining profile branch is strict (none/restricted returned above).
|
|
459
|
-
if (hasPermission("process_spawn")) {
|
|
460
|
-
return "sandbox_strict_disallows_process_spawn";
|
|
461
|
-
}
|
|
462
|
-
if (hasPermission("network")) {
|
|
463
|
-
return "sandbox_strict_disallows_network";
|
|
464
|
-
}
|
|
465
|
-
if (hasPermission("fs_write")) {
|
|
466
|
-
return "sandbox_strict_disallows_fs_write";
|
|
467
|
-
}
|
|
468
|
-
if (hasPermission("env_write")) {
|
|
469
|
-
return "sandbox_strict_disallows_env_write";
|
|
470
|
-
}
|
|
471
|
-
return null;
|
|
472
|
-
}
|
|
473
|
-
function buildPolicyWarning(mode, scope, extension, reason, details = {}) {
|
|
474
|
-
const tokens = Object.entries(details)
|
|
475
|
-
.sort((left, right) => left[0].localeCompare(right[0]))
|
|
476
|
-
.map(([key, value]) => `${key}=${value}`)
|
|
477
|
-
.join(":");
|
|
478
|
-
const suffix = tokens.length > 0 ? `:${tokens}` : "";
|
|
479
|
-
return `extension_policy_${mode}_${scope}:${extension.layer}:${extension.name}:reason=${reason}${suffix}`;
|
|
480
|
-
}
|
|
481
|
-
/** Evaluate the layer-level governance policy for one extension by combining the extension allow/block decision, the trust-mode decision, and the sandbox-profile decision. Reasons are weighed in extension → trust → sandbox order: the first reason whose governing mode is `enforce` blocks the extension; otherwise the first whose mode is `warn` surfaces a non-blocking violation warning; otherwise the extension is allowed. The all-`off` short-circuit skips reason resolution entirely. */
|
|
482
|
-
export function evaluateExtensionPolicyForExtension(policy, extension) {
|
|
483
|
-
if (policy.mode === "off" && policy.trustMode === "off") {
|
|
484
|
-
return { allowed: true, warning: null };
|
|
485
|
-
}
|
|
486
|
-
const violations = [];
|
|
487
|
-
const reason = resolvePolicyExtensionReason(policy, extension);
|
|
488
|
-
if (reason) {
|
|
489
|
-
violations.push({ reason, scope: "extension", mode: policy.mode });
|
|
490
|
-
}
|
|
491
|
-
const trustReason = resolvePolicyTrustReason(policy, extension);
|
|
492
|
-
if (trustReason) {
|
|
493
|
-
violations.push({
|
|
494
|
-
reason: trustReason,
|
|
495
|
-
scope: "trust",
|
|
496
|
-
mode: policy.trustMode,
|
|
497
|
-
});
|
|
498
|
-
}
|
|
499
|
-
const sandboxReason = resolvePolicySandboxReason(policy, extension);
|
|
500
|
-
if (sandboxReason) {
|
|
501
|
-
violations.push({
|
|
502
|
-
reason: sandboxReason,
|
|
503
|
-
scope: "extension",
|
|
504
|
-
mode: policy.mode,
|
|
505
|
-
});
|
|
506
|
-
}
|
|
507
|
-
const enforced = violations.find((violation) => violation.mode === "enforce");
|
|
508
|
-
if (enforced) {
|
|
509
|
-
return {
|
|
510
|
-
allowed: false,
|
|
511
|
-
warning: buildPolicyWarning("blocked", enforced.scope, extension, enforced.reason),
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
const warned = violations.find((violation) => violation.mode === "warn");
|
|
515
|
-
if (warned) {
|
|
516
|
-
return {
|
|
517
|
-
allowed: true,
|
|
518
|
-
warning: buildPolicyWarning("violation", warned.scope, extension, warned.reason),
|
|
519
|
-
};
|
|
520
|
-
}
|
|
521
|
-
return { allowed: true, warning: null };
|
|
522
|
-
}
|
|
523
|
-
/** Implements evaluate extension policy for capability for the public runtime surface of this module. */
|
|
524
|
-
export function evaluateExtensionPolicyForCapability(policy, extension, capability) {
|
|
525
|
-
if (policy.mode === "off") {
|
|
526
|
-
return { allowed: true, warning: null };
|
|
527
|
-
}
|
|
528
|
-
const reason = resolvePolicyCapabilityReason(policy, extension, capability);
|
|
529
|
-
if (!reason) {
|
|
530
|
-
return { allowed: true, warning: null };
|
|
531
|
-
}
|
|
532
|
-
return {
|
|
533
|
-
allowed: policy.mode === "warn",
|
|
534
|
-
warning: buildPolicyWarning(policy.mode === "warn" ? "violation" : "blocked", "capability", extension, reason, { capability: capability.trim().toLowerCase() }),
|
|
535
|
-
};
|
|
536
|
-
}
|
|
537
|
-
/** Resolve the first applicable registration-policy reason for a surface registration, weighed in capability → surface → command → action → service precedence. Returns `null` when the registration violates no allow/block rule. */
|
|
538
|
-
function resolveRegistrationPolicyReason(policy, extension, surface, capability, detail) {
|
|
539
|
-
const capabilityReason = typeof capability === "string"
|
|
540
|
-
? resolvePolicyCapabilityReason(policy, extension, capability)
|
|
541
|
-
: null;
|
|
542
|
-
const surfaceReason = resolvePolicySurfaceReason(policy, extension, surface);
|
|
543
|
-
const commandReason = detail.command
|
|
544
|
-
? resolvePolicyCommandReason(policy, extension, detail.command)
|
|
545
|
-
: null;
|
|
546
|
-
const actionReason = detail.action
|
|
547
|
-
? resolvePolicyActionReason(policy, extension, detail.action)
|
|
548
|
-
: null;
|
|
549
|
-
const serviceReason = detail.service
|
|
550
|
-
? resolvePolicyServiceReason(policy, extension, detail.service)
|
|
551
|
-
: null;
|
|
552
|
-
return (capabilityReason ??
|
|
553
|
-
surfaceReason ??
|
|
554
|
-
commandReason ??
|
|
555
|
-
actionReason ??
|
|
556
|
-
serviceReason);
|
|
557
|
-
}
|
|
558
|
-
/**
|
|
559
|
-
* Build the detail token map attached to a registration-policy warning: the
|
|
560
|
-
* normalized method and surface plus whichever of capability/command/action/service
|
|
561
|
-
* the registration carries. {@link buildPolicyWarning} sorts and joins these into
|
|
562
|
-
* the warning's `key=value` suffix.
|
|
563
|
-
*/
|
|
564
|
-
function buildRegistrationPolicyWarningDetails(method, surface, capability, detail) {
|
|
565
|
-
const warningDetails = {
|
|
566
|
-
method: normalizePolicyName(method).replace(/\s+/g, "_"),
|
|
567
|
-
surface,
|
|
568
|
-
};
|
|
569
|
-
if (capability) {
|
|
570
|
-
warningDetails.capability = capability;
|
|
571
|
-
}
|
|
572
|
-
if (detail.command) {
|
|
573
|
-
warningDetails.command = normalizeCommandName(detail.command);
|
|
574
|
-
}
|
|
575
|
-
if (detail.action) {
|
|
576
|
-
warningDetails.action = normalizePolicyName(detail.action).replace(/\s+/g, "-");
|
|
577
|
-
}
|
|
578
|
-
if (detail.service) {
|
|
579
|
-
warningDetails.service = normalizePolicyName(detail.service);
|
|
580
|
-
}
|
|
581
|
-
return warningDetails;
|
|
582
|
-
}
|
|
583
|
-
/** Evaluate the governance policy for a single capability/surface registration an extension performs during activation. When `mode` is `off` the registration is always allowed; otherwise the first allow/block reason (capability → surface → command → action → service) blocks the registration under `enforce` or surfaces a non-blocking violation warning under `warn`. */
|
|
584
|
-
export function evaluateExtensionPolicyForRegistration(policy, extension, surface, method, capability, details) {
|
|
585
|
-
if (policy.mode === "off") {
|
|
586
|
-
return { allowed: true, warning: null };
|
|
587
|
-
}
|
|
588
|
-
const detail = details ?? {};
|
|
589
|
-
const reason = resolveRegistrationPolicyReason(policy, extension, surface, capability, detail);
|
|
590
|
-
if (!reason) {
|
|
591
|
-
return { allowed: true, warning: null };
|
|
592
|
-
}
|
|
593
|
-
const warning = buildPolicyWarning(policy.mode === "warn" ? "violation" : "blocked", "registration", extension, reason, buildRegistrationPolicyWarningDetails(method, surface, capability, detail));
|
|
594
|
-
return {
|
|
595
|
-
allowed: policy.mode === "warn",
|
|
596
|
-
warning,
|
|
597
|
-
};
|
|
598
|
-
}
|
|
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]="8ea4597b-6a2b-5061-b490-d8aff3fbe7aa")}catch(e2){}})();import{KNOWN_EXTENSION_POLICY_MODES,KNOWN_EXTENSION_POLICY_SURFACES,KNOWN_EXTENSION_SANDBOX_PROFILES,KNOWN_EXTENSION_TRUST_MODES,KNOWN_PM_MAX_VERSION_EXCEEDED_MODES}from"./extension-types.js";import{isKnownExtensionCapability}from"./extension-capability-aliases.js";import{normalizeCommandName}from"./extension-runtime-helpers.js";function normalizePolicyName(value){if(typeof value!=="string"){return""}return value.trim().toLowerCase()}function normalizePolicyStringSet(values){return new Set((values??[]).map(value=>value.trim().toLowerCase()).filter(value=>value.length>0))}function normalizePolicySurfaceToken(value){const normalized=value.trim().toLowerCase();if(normalized.length===0){return""}const segments=normalized.split(/[.:/]/).map(segment=>segment.replace(/[\s_-]+/g,"")).filter(segment=>segment.length>0);if(segments.length===0){return""}if(segments.length===1){return segments[0]}return`${segments[0]}.${segments.slice(1).join("")}`}function normalizePolicySurfaceSet(values){return new Set((values??[]).map(value=>normalizePolicySurfaceToken(value)).filter(value=>value.length>0))}function normalizePolicyMode(value){const normalized=normalizePolicyName(value);if(KNOWN_EXTENSION_POLICY_MODES.includes(normalized)){return normalized}return"off"}function normalizePolicyTrustMode(value){const normalized=normalizePolicyName(value);if(KNOWN_EXTENSION_TRUST_MODES.includes(normalized)){return normalized}return"off"}function normalizePolicySandboxProfile(value){const normalized=normalizePolicyName(value);if(KNOWN_EXTENSION_SANDBOX_PROFILES.includes(normalized)){return normalized}return"none"}function normalizePmMaxVersionExceededModeValue(value){if(typeof value!=="string"){return void 0}const normalized=value.trim().toLowerCase();return KNOWN_PM_MAX_VERSION_EXCEEDED_MODES.includes(normalized)?normalized:void 0}function normalizePmMaxVersionExceededMode(value){if(typeof value==="string"){const mode=normalizePmMaxVersionExceededModeValue(value)??"block";return{global:mode,project:mode}}if(typeof value==="object"&&value!==null&&!Array.isArray(value)){return{global:normalizePmMaxVersionExceededModeValue(value.global)??"block",project:normalizePmMaxVersionExceededModeValue(value.project)??"block"}}return{global:"block",project:"block"}}function serializePmMaxVersionExceededMode(mode){return mode.global===mode.project?mode.global:{global:mode.global,project:mode.project}}function toSortedList(values){return[...new Set(values)].sort((left,right)=>left.localeCompare(right))}function buildExtensionPolicyOverride(rawOverride){const name=normalizePolicyName(rawOverride.name);if(name.length===0){return null}return{name,normalized:{name,disabled:rawOverride.disabled===true,requireTrusted:rawOverride.require_trusted===true,requireProvenance:rawOverride.require_provenance===true,sandboxProfile:rawOverride.sandbox_profile!==void 0?normalizePolicySandboxProfile(rawOverride.sandbox_profile):void 0,allowedCapabilities:normalizePolicyStringSet(rawOverride.allowed_capabilities),blockedCapabilities:normalizePolicyStringSet(rawOverride.blocked_capabilities),allowedSurfaces:normalizePolicySurfaceSet(rawOverride.allowed_surfaces),blockedSurfaces:normalizePolicySurfaceSet(rawOverride.blocked_surfaces),allowedCommands:normalizePolicyStringSet(rawOverride.allowed_commands),blockedCommands:normalizePolicyStringSet(rawOverride.blocked_commands),allowedActions:normalizePolicyStringSet(rawOverride.allowed_actions),blockedActions:normalizePolicyStringSet(rawOverride.blocked_actions),allowedServices:normalizePolicyStringSet(rawOverride.allowed_services),blockedServices:normalizePolicyStringSet(rawOverride.blocked_services)}}}function collectExtensionPolicyOverrides(rawOverrides){const overridesByName=new Map;for(const rawOverride of rawOverrides??[]){const built=buildExtensionPolicyOverride(rawOverride);if(built){overridesByName.set(built.name,built.normalized)}}return overridesByName}function collectExtensionPolicyWarnings(normalized){const warnings=[];const sortedOverrides=[...normalized.overridesByName.values()].sort((left,right)=>left.name.localeCompare(right.name));for(const capability of toSortedList([...normalized.allowedCapabilities,...normalized.blockedCapabilities])){if(!isKnownExtensionCapability(capability)){warnings.push(`extension_policy_unknown_capability:${capability}`)}}for(const override of sortedOverrides){for(const capability of toSortedList([...override.allowedCapabilities,...override.blockedCapabilities])){if(!isKnownExtensionCapability(capability)){warnings.push(`extension_policy_unknown_capability:${override.name}:${capability}`)}}}const knownSurfaces=new Set(KNOWN_EXTENSION_POLICY_SURFACES);for(const surface of toSortedList([...normalized.allowedSurfaces,...normalized.blockedSurfaces])){if(!knownSurfaces.has(surface)){warnings.push(`extension_policy_unknown_surface:${surface}`)}}for(const override of sortedOverrides){for(const surface of toSortedList([...override.allowedSurfaces,...override.blockedSurfaces])){if(!knownSurfaces.has(surface)){warnings.push(`extension_policy_unknown_surface:${override.name}:${surface}`)}}}return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}function normalizeExtensionPolicy(settings){const policy=settings.extensions?.policy??{};const allowedCapabilities=normalizePolicyStringSet(policy.allowed_capabilities);const blockedCapabilities=normalizePolicyStringSet(policy.blocked_capabilities);const allowedSurfaces=normalizePolicySurfaceSet(policy.allowed_surfaces);const blockedSurfaces=normalizePolicySurfaceSet(policy.blocked_surfaces);const overridesByName=collectExtensionPolicyOverrides(policy.extension_overrides);return{mode:normalizePolicyMode(policy.mode),trustMode:normalizePolicyTrustMode(policy.trust_mode),pmMaxVersionExceededMode:normalizePmMaxVersionExceededMode(policy.pm_max_version_exceeded_mode),requireProvenance:policy.require_provenance===true,trustedExtensions:normalizePolicyStringSet(policy.trusted_extensions),defaultSandboxProfile:normalizePolicySandboxProfile(policy.default_sandbox_profile),allowedExtensions:normalizePolicyStringSet(policy.allowed_extensions),blockedExtensions:normalizePolicyStringSet(policy.blocked_extensions),allowedCapabilities,blockedCapabilities,allowedSurfaces,blockedSurfaces,allowedCommands:normalizePolicyStringSet(policy.allowed_commands),blockedCommands:normalizePolicyStringSet(policy.blocked_commands),allowedActions:normalizePolicyStringSet(policy.allowed_actions),blockedActions:normalizePolicyStringSet(policy.blocked_actions),allowedServices:normalizePolicyStringSet(policy.allowed_services),blockedServices:normalizePolicyStringSet(policy.blocked_services),overridesByName,warnings:collectExtensionPolicyWarnings({allowedCapabilities,blockedCapabilities,allowedSurfaces,blockedSurfaces,overridesByName})}}function serializeExtensionPolicy(policy){const overrides=[...policy.overridesByName.values()].sort((left,right)=>left.name.localeCompare(right.name)).map(override=>({name:override.name,...override.disabled?{disabled:true}:{},...override.requireTrusted?{require_trusted:true}:{},...override.requireProvenance?{require_provenance:true}:{},...override.sandboxProfile?{sandbox_profile:override.sandboxProfile}:{},...override.allowedCapabilities.size>0?{allowed_capabilities:toSortedList(override.allowedCapabilities)}:{},...override.blockedCapabilities.size>0?{blocked_capabilities:toSortedList(override.blockedCapabilities)}:{},...override.allowedSurfaces.size>0?{allowed_surfaces:toSortedList(override.allowedSurfaces)}:{},...override.blockedSurfaces.size>0?{blocked_surfaces:toSortedList(override.blockedSurfaces)}:{},...override.allowedCommands.size>0?{allowed_commands:toSortedList(override.allowedCommands)}:{},...override.blockedCommands.size>0?{blocked_commands:toSortedList(override.blockedCommands)}:{},...override.allowedActions.size>0?{allowed_actions:toSortedList(override.allowedActions)}:{},...override.blockedActions.size>0?{blocked_actions:toSortedList(override.blockedActions)}:{},...override.allowedServices.size>0?{allowed_services:toSortedList(override.allowedServices)}:{},...override.blockedServices.size>0?{blocked_services:toSortedList(override.blockedServices)}:{}}));return{mode:policy.mode,trust_mode:policy.trustMode,pm_max_version_exceeded_mode:serializePmMaxVersionExceededMode(policy.pmMaxVersionExceededMode),require_provenance:policy.requireProvenance,trusted_extensions:toSortedList(policy.trustedExtensions),default_sandbox_profile:policy.defaultSandboxProfile,allowed_extensions:toSortedList(policy.allowedExtensions),blocked_extensions:toSortedList(policy.blockedExtensions),allowed_capabilities:toSortedList(policy.allowedCapabilities),blocked_capabilities:toSortedList(policy.blockedCapabilities),allowed_surfaces:toSortedList(policy.allowedSurfaces),blocked_surfaces:toSortedList(policy.blockedSurfaces),allowed_commands:toSortedList(policy.allowedCommands),blocked_commands:toSortedList(policy.blockedCommands),allowed_actions:toSortedList(policy.allowedActions),blocked_actions:toSortedList(policy.blockedActions),allowed_services:toSortedList(policy.allowedServices),blocked_services:toSortedList(policy.blockedServices),extension_overrides:overrides}}function hydrateExtensionPolicy(policy){const overridesByName=collectExtensionPolicyOverrides(policy.extension_overrides);return{mode:normalizePolicyMode(policy.mode),trustMode:normalizePolicyTrustMode(policy.trust_mode),pmMaxVersionExceededMode:normalizePmMaxVersionExceededMode(policy.pm_max_version_exceeded_mode),requireProvenance:policy.require_provenance===true,trustedExtensions:normalizePolicyStringSet(policy.trusted_extensions),defaultSandboxProfile:normalizePolicySandboxProfile(policy.default_sandbox_profile),allowedExtensions:normalizePolicyStringSet(policy.allowed_extensions),blockedExtensions:normalizePolicyStringSet(policy.blocked_extensions),allowedCapabilities:normalizePolicyStringSet(policy.allowed_capabilities),blockedCapabilities:normalizePolicyStringSet(policy.blocked_capabilities),allowedSurfaces:normalizePolicySurfaceSet(policy.allowed_surfaces),blockedSurfaces:normalizePolicySurfaceSet(policy.blocked_surfaces),allowedCommands:normalizePolicyStringSet(policy.allowed_commands),blockedCommands:normalizePolicyStringSet(policy.blocked_commands),allowedActions:normalizePolicyStringSet(policy.allowed_actions),blockedActions:normalizePolicyStringSet(policy.blocked_actions),allowedServices:normalizePolicyStringSet(policy.allowed_services),blockedServices:normalizePolicyStringSet(policy.blocked_services),overridesByName,warnings:[]}}function resolvePolicyOverride(policy,extensionName){return policy.overridesByName.get(normalizePolicyName(extensionName))??null}function evaluatePolicySet(allowed,blocked,value,notAllowlistedReason,blockedReason){if(blocked.has(value)){return blockedReason}if(allowed.size>0&&!allowed.has(value)){return notAllowlistedReason}return null}function resolvePolicyCapabilityReason(policy,extension,capability){const normalizedCapability=capability.trim().toLowerCase();const override=resolvePolicyOverride(policy,extension.name);const allowed=override&&override.allowedCapabilities.size>0?override.allowedCapabilities:policy.allowedCapabilities;const blocked=new Set([...policy.blockedCapabilities,...override?override.blockedCapabilities:[]]);return evaluatePolicySet(allowed,blocked,normalizedCapability,"capability_not_allowlisted","capability_blocked")}function resolvePolicySurfaceReason(policy,extension,surface){const override=resolvePolicyOverride(policy,extension.name);const allowed=override&&override.allowedSurfaces.size>0?override.allowedSurfaces:policy.allowedSurfaces;const blocked=new Set([...policy.blockedSurfaces,...override?override.blockedSurfaces:[]]);return evaluatePolicySet(allowed,blocked,surface,"surface_not_allowlisted","surface_blocked")}function resolvePolicyCommandReason(policy,extension,command){const normalizedCommand=normalizeCommandName(command);if(normalizedCommand.length===0){return null}const override=resolvePolicyOverride(policy,extension.name);const allowed=override&&override.allowedCommands.size>0?override.allowedCommands:policy.allowedCommands;const blocked=new Set([...policy.blockedCommands,...override?override.blockedCommands:[]]);return evaluatePolicySet(allowed,blocked,normalizedCommand,"command_not_allowlisted","command_blocked")}function resolvePolicyActionReason(policy,extension,action){const normalizedAction=normalizePolicyName(action).replace(/\s+/g,"-");if(normalizedAction.length===0){return null}const override=resolvePolicyOverride(policy,extension.name);const allowed=override&&override.allowedActions.size>0?override.allowedActions:policy.allowedActions;const blocked=new Set([...policy.blockedActions,...override?override.blockedActions:[]]);return evaluatePolicySet(allowed,blocked,normalizedAction,"action_not_allowlisted","action_blocked")}function resolvePolicyServiceReason(policy,extension,service){const normalizedService=normalizePolicyName(service);if(normalizedService.length===0){return null}const override=resolvePolicyOverride(policy,extension.name);const allowed=override&&override.allowedServices.size>0?override.allowedServices:policy.allowedServices;const blocked=new Set([...policy.blockedServices,...override?override.blockedServices:[]]);return evaluatePolicySet(allowed,blocked,normalizedService,"service_not_allowlisted","service_blocked")}function resolvePolicyExtensionReason(policy,extension){const name=normalizePolicyName(extension.name);const override=resolvePolicyOverride(policy,extension.name);if(override?.disabled===true){return"extension_override_disabled"}return evaluatePolicySet(policy.allowedExtensions,policy.blockedExtensions,name,"extension_not_allowlisted","extension_blocked")}function resolvePolicyTrustReason(policy,extension){if(policy.trustMode==="off"){return null}const override=resolvePolicyOverride(policy,extension.name);const name=normalizePolicyName(extension.name);const trusted=extension.trusted===true;const provenanceVerified=extension.provenanceVerified===true;if(policy.trustedExtensions.size>0&&!policy.trustedExtensions.has(name)){return"extension_not_trusted"}if((override?.requireTrusted===true||policy.trustMode==="warn"||policy.trustMode==="enforce")&&!trusted){return"extension_untrusted"}if((policy.requireProvenance||override?.requireProvenance===true)&&!provenanceVerified){return"provenance_missing_or_unverified"}return null}function resolvePolicySandboxReason(policy,extension){if(policy.mode==="off"){return null}const override=resolvePolicyOverride(policy,extension.name);const profile=override?.sandboxProfile??extension.sandboxProfile??policy.defaultSandboxProfile;if(profile==="none"){return null}const permissions=extension.permissions;if(!permissions){return"sandbox_permissions_missing"}const hasPermission=name=>permissions[name]===true;if(profile==="restricted"){if(hasPermission("process_spawn")){return"sandbox_restricted_disallows_process_spawn"}if(hasPermission("env_write")){return"sandbox_restricted_disallows_env_write"}return null}if(hasPermission("process_spawn")){return"sandbox_strict_disallows_process_spawn"}if(hasPermission("network")){return"sandbox_strict_disallows_network"}if(hasPermission("fs_write")){return"sandbox_strict_disallows_fs_write"}if(hasPermission("env_write")){return"sandbox_strict_disallows_env_write"}return null}function buildPolicyWarning(mode,scope,extension,reason,details={}){const tokens=Object.entries(details).sort((left,right)=>left[0].localeCompare(right[0])).map(([key,value])=>`${key}=${value}`).join(":");const suffix=tokens.length>0?`:${tokens}`:"";return`extension_policy_${mode}_${scope}:${extension.layer}:${extension.name}:reason=${reason}${suffix}`}function evaluateExtensionPolicyForExtension(policy,extension){if(policy.mode==="off"&&policy.trustMode==="off"){return{allowed:true,warning:null}}const violations=[];const reason=resolvePolicyExtensionReason(policy,extension);if(reason){violations.push({reason,scope:"extension",mode:policy.mode})}const trustReason=resolvePolicyTrustReason(policy,extension);if(trustReason){violations.push({reason:trustReason,scope:"trust",mode:policy.trustMode})}const sandboxReason=resolvePolicySandboxReason(policy,extension);if(sandboxReason){violations.push({reason:sandboxReason,scope:"extension",mode:policy.mode})}const enforced=violations.find(violation=>violation.mode==="enforce");if(enforced){return{allowed:false,warning:buildPolicyWarning("blocked",enforced.scope,extension,enforced.reason)}}const warned=violations.find(violation=>violation.mode==="warn");if(warned){return{allowed:true,warning:buildPolicyWarning("violation",warned.scope,extension,warned.reason)}}return{allowed:true,warning:null}}function evaluateExtensionPolicyForCapability(policy,extension,capability){if(policy.mode==="off"){return{allowed:true,warning:null}}const reason=resolvePolicyCapabilityReason(policy,extension,capability);if(!reason){return{allowed:true,warning:null}}return{allowed:policy.mode==="warn",warning:buildPolicyWarning(policy.mode==="warn"?"violation":"blocked","capability",extension,reason,{capability:capability.trim().toLowerCase()})}}function resolveRegistrationPolicyReason(policy,extension,surface,capability,detail){const capabilityReason=typeof capability==="string"?resolvePolicyCapabilityReason(policy,extension,capability):null;const surfaceReason=resolvePolicySurfaceReason(policy,extension,surface);const commandReason=detail.command?resolvePolicyCommandReason(policy,extension,detail.command):null;const actionReason=detail.action?resolvePolicyActionReason(policy,extension,detail.action):null;const serviceReason=detail.service?resolvePolicyServiceReason(policy,extension,detail.service):null;return capabilityReason??surfaceReason??commandReason??actionReason??serviceReason}function buildRegistrationPolicyWarningDetails(method,surface,capability,detail){const warningDetails={method:normalizePolicyName(method).replace(/\s+/g,"_"),surface};if(capability){warningDetails.capability=capability}if(detail.command){warningDetails.command=normalizeCommandName(detail.command)}if(detail.action){warningDetails.action=normalizePolicyName(detail.action).replace(/\s+/g,"-")}if(detail.service){warningDetails.service=normalizePolicyName(detail.service)}return warningDetails}function evaluateExtensionPolicyForRegistration(policy,extension,surface,method,capability,details){if(policy.mode==="off"){return{allowed:true,warning:null}}const detail=details??{};const reason=resolveRegistrationPolicyReason(policy,extension,surface,capability,detail);if(!reason){return{allowed:true,warning:null}}const warning=buildPolicyWarning(policy.mode==="warn"?"violation":"blocked","registration",extension,reason,buildRegistrationPolicyWarningDetails(method,surface,capability,detail));return{allowed:policy.mode==="warn",warning}}export{evaluateExtensionPolicyForCapability,evaluateExtensionPolicyForExtension,evaluateExtensionPolicyForRegistration,hydrateExtensionPolicy,normalizeExtensionPolicy,normalizePmMaxVersionExceededMode,normalizePolicySandboxProfile,serializeExtensionPolicy};
|
|
599
2
|
//# sourceMappingURL=extension-policy.js.map
|
|
600
|
-
//# debugId=24383c0a-592e-5105-84a3-a6cfb7801281
|