@unbrained/pm-cli 2026.9.7 → 2026.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-developer/SKILL.md +12 -4
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
- package/.agents/skills/pm-extensions/SKILL.md +6 -0
- package/.agents/skills/pm-sdk/SKILL.md +11 -2
- package/.agents/skills/pm-user/SKILL.md +5 -0
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +211 -181
- package/dist/cli/after-command-context-usage.js +1 -48
- package/dist/cli/argv-utils.js +1 -40
- package/dist/cli/bootstrap-args.js +1 -9
- package/dist/cli/bundle-integrity.js +2 -110
- package/dist/cli/commander-usage.js +11 -771
- package/dist/cli/commands/activity.js +1 -9
- package/dist/cli/commands/aggregate.js +1 -5
- package/dist/cli/commands/append.js +1 -5
- package/dist/cli/commands/claim.js +1 -5
- package/dist/cli/commands/close-many.js +1 -5
- package/dist/cli/commands/close.js +1 -9
- package/dist/cli/commands/comments.js +1 -5
- package/dist/cli/commands/config.js +1 -9
- package/dist/cli/commands/context.js +1 -9
- package/dist/cli/commands/contracts.js +1 -5
- package/dist/cli/commands/copy.js +1 -9
- package/dist/cli/commands/create.js +1 -9
- package/dist/cli/commands/delete.js +1 -9
- package/dist/cli/commands/deps.js +1 -9
- package/dist/cli/commands/docs.js +1 -9
- package/dist/cli/commands/duplicates.js +1 -9
- package/dist/cli/commands/eval.js +1 -9
- package/dist/cli/commands/extension/describe.js +1 -5
- package/dist/cli/commands/extension/scaffold.js +1 -5
- package/dist/cli/commands/extension/shared.js +1 -5
- package/dist/cli/commands/extension.js +1 -9
- package/dist/cli/commands/files.js +1 -9
- package/dist/cli/commands/focus.js +1 -9
- package/dist/cli/commands/gc.js +1 -9
- package/dist/cli/commands/get.js +1 -9
- package/dist/cli/commands/graph.js +1 -10
- package/dist/cli/commands/health.js +1 -9
- package/dist/cli/commands/history-compact.js +1 -10
- package/dist/cli/commands/history-redact.js +1 -11
- package/dist/cli/commands/history-repair.js +1 -10
- package/dist/cli/commands/history.js +1 -5
- package/dist/cli/commands/index.js +1 -58
- package/dist/cli/commands/init-agent-guidance.js +1 -9
- package/dist/cli/commands/init.js +1 -9
- package/dist/cli/commands/learnings.js +1 -5
- package/dist/cli/commands/lifecycle-transitions.js +1 -5
- package/dist/cli/commands/list.js +1 -9
- package/dist/cli/commands/merge.js +1 -11
- package/dist/cli/commands/next.js +1 -9
- package/dist/cli/commands/notes.js +1 -5
- package/dist/cli/commands/plan.js +1 -9
- package/dist/cli/commands/profile.js +1 -9
- package/dist/cli/commands/restore.js +1 -9
- package/dist/cli/commands/scheduling-shortcuts.js +1 -9
- package/dist/cli/commands/schema.js +1 -10
- package/dist/cli/commands/search.js +1 -9
- package/dist/cli/commands/stats.js +1 -9
- package/dist/cli/commands/telemetry.js +1 -9
- package/dist/cli/commands/test-all.js +1 -9
- package/dist/cli/commands/test-runs.js +1 -9
- package/dist/cli/commands/test.js +1 -9
- package/dist/cli/commands/update-many.js +1 -5
- package/dist/cli/commands/update.js +1 -9
- package/dist/cli/commands/upgrade.js +1 -5
- package/dist/cli/commands/validate.js +1 -15
- package/dist/cli/context-intent-invocation.js +1 -20
- package/dist/cli/description-stdin.js +1 -17
- package/dist/cli/error-guidance.js +1 -1353
- package/dist/cli/extension-command-help.js +5 -636
- package/dist/cli/extension-command-options.js +1 -427
- package/dist/cli/extension-recovery.js +1 -126
- package/dist/cli/help-content.js +2 -1001
- package/dist/cli/help-json-payload.js +4 -570
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.js +5 -2573
- package/dist/cli/migration-gates.js +1 -289
- package/dist/cli/public.js +1 -20
- package/dist/cli/register-annotations.js +1 -270
- package/dist/cli/register-assurance.js +1 -62
- package/dist/cli/register-files-lookup.js +1 -56
- package/dist/cli/register-history-activity.d.ts +8 -0
- package/dist/cli/register-history-activity.js +2 -0
- package/dist/cli/register-history-author.js +1 -38
- package/dist/cli/register-history-maintenance.d.ts +9 -0
- package/dist/cli/register-history-maintenance.js +2 -0
- package/dist/cli/register-list-query.js +10 -943
- package/dist/cli/register-mutation-options.js +1 -9
- package/dist/cli/register-mutation.js +19 -1893
- package/dist/cli/register-operations.js +1 -920
- package/dist/cli/register-setup.js +1 -716
- package/dist/cli/register-structured-mutation.js +1 -196
- package/dist/cli/registration-helpers.js +1 -5
- package/dist/cli/runtime-compatibility-boundary.js +4 -42
- package/dist/cli/schema-registration-helpers.js +1 -73
- package/dist/cli/search-refresh.js +1 -13
- package/dist/cli/stats-analytics-json.js +1 -68
- package/dist/cli/telemetry-flush.js +1 -10
- package/dist/cli-bundle/bundle-manifest.json +164 -156
- package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
- package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
- package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
- package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
- package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
- package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
- package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
- package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
- package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
- package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
- package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
- package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
- package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
- package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
- package/dist/cli-bundle/main.js +20 -20
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +29 -29
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +42 -42
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/cli.js +1 -104
- package/dist/core/checkpoint/checkpoint-gc.js +1 -169
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
- package/dist/core/config/nested-settings.js +1 -534
- package/dist/core/config/positional-value.js +1 -109
- package/dist/core/diagnostics/remediation.js +1 -506
- package/dist/core/extensions/activation-summary-markdown.js +2 -145
- package/dist/core/extensions/activation-summary.js +1 -92
- package/dist/core/extensions/activation-transaction.js +1 -46
- package/dist/core/extensions/capability-usage.js +1 -173
- package/dist/core/extensions/command-hook-context.js +1 -13
- package/dist/core/extensions/command-metadata-contract.js +1 -22
- package/dist/core/extensions/command-visibility-tier.js +1 -29
- package/dist/core/extensions/contribution-inventory.js +1 -173
- package/dist/core/extensions/exporter-output-contract.js +1 -66
- package/dist/core/extensions/extension-candidate.js +1 -18
- package/dist/core/extensions/extension-capability-aliases.js +1 -158
- package/dist/core/extensions/extension-hook-runtime.js +1 -699
- package/dist/core/extensions/extension-policy.js +1 -599
- package/dist/core/extensions/extension-registries.js +1 -62
- package/dist/core/extensions/extension-runtime-helpers.js +1 -33
- package/dist/core/extensions/extension-types.js +1 -102
- package/dist/core/extensions/flag-definition-validation.js +1 -52
- package/dist/core/extensions/flag-value-types.js +1 -64
- package/dist/core/extensions/index.js +1 -526
- package/dist/core/extensions/item-field-types.js +1 -39
- package/dist/core/extensions/item-fields.js +1 -261
- package/dist/core/extensions/loader.js +1 -2223
- package/dist/core/extensions/manifest-schema.js +1 -69
- package/dist/core/extensions/module-graph-snapshot.js +1 -33
- package/dist/core/extensions/preflight-ownership.js +1 -41
- package/dist/core/extensions/registration-validation.js +1 -82
- package/dist/core/extensions/registration-values.js +1 -209
- package/dist/core/extensions/reserved-host-flags.js +1 -36
- package/dist/core/extensions/runtime-registrations.js +1 -67
- package/dist/core/extensions/service-ownership.js +1 -19
- package/dist/core/extensions/version-compat.js +1 -216
- package/dist/core/fs/fs-utils.js +2 -158
- package/dist/core/fs/host-environment-errors.js +1 -141
- package/dist/core/fs/index.js +1 -9
- package/dist/core/fs/path-utils.js +1 -17
- package/dist/core/governance/content-fields.js +1 -160
- package/dist/core/governance/issue-codes.js +1 -151
- package/dist/core/governance/metadata-coverage.js +1 -358
- package/dist/core/history/drift-cache.js +3 -72
- package/dist/core/history/drift-scan.js +1 -342
- package/dist/core/history/event-classification.js +1 -109
- package/dist/core/history/event-index.js +8 -784
- package/dist/core/history/history-compact-bulk.js +1 -104
- package/dist/core/history/history-diff.js +1 -158
- package/dist/core/history/history-rewrite.d.ts +6 -1
- package/dist/core/history/history-rewrite.js +1 -107
- package/dist/core/history/history-storage-stats.js +1 -102
- package/dist/core/history/history-stream-policy.js +1 -62
- package/dist/core/history/history.js +2 -617
- package/dist/core/history/identity.js +1 -30
- package/dist/core/history/index.js +1 -9
- package/dist/core/history/projection.js +1 -196
- package/dist/core/history/read.d.ts +9 -0
- package/dist/core/history/read.js +1 -57
- package/dist/core/history/replay.js +2 -439
- package/dist/core/history/version-address.js +1 -32
- package/dist/core/history/workspace-history.js +2 -433
- package/dist/core/io/body-file.js +1 -62
- package/dist/core/io/bulk-ids-input.js +1 -112
- package/dist/core/item/actionability.js +1 -327
- package/dist/core/item/dependency-reference.js +1 -20
- package/dist/core/item/id.js +1 -112
- package/dist/core/item/index.js +1 -12
- package/dist/core/item/item-format-version.js +1 -78
- package/dist/core/item/item-format.js +5 -1473
- package/dist/core/item/item-record.js +1 -23
- package/dist/core/item/item-type-definition.js +1 -133
- package/dist/core/item/parent-reference-policy.js +1 -57
- package/dist/core/item/parse.js +2 -603
- package/dist/core/item/plan-lifecycle.js +1 -19
- package/dist/core/item/priority.js +1 -61
- package/dist/core/item/sprint-release-format.js +1 -38
- package/dist/core/item/status-filter.js +1 -115
- package/dist/core/item/status.js +1 -43
- package/dist/core/item/toon-decode.js +1 -29
- package/dist/core/item/type-registry.js +1 -715
- package/dist/core/item/type-synonyms.js +1 -38
- package/dist/core/lock/index.js +1 -9
- package/dist/core/lock/lock-gc.js +1 -240
- package/dist/core/lock/lock.js +3 -590
- package/dist/core/output/mutation-projection.js +1 -217
- package/dist/core/output/output-control.js +1 -25
- package/dist/core/output/output.js +11 -494
- package/dist/core/output/query-summary.js +1 -58
- package/dist/core/output/tabular.js +1 -77
- package/dist/core/packages/manifest.js +1 -244
- package/dist/core/packages/root.js +1 -84
- package/dist/core/profile/profile-describe.js +1 -83
- package/dist/core/profile/profile-lint.js +1 -415
- package/dist/core/profile/profile-plan.js +0 -0
- package/dist/core/profile/profile-presets.js +1 -370
- package/dist/core/reproducibility/context.js +1 -82
- package/dist/core/schema/fields-file.js +2 -288
- package/dist/core/schema/item-types-file.js +2 -296
- package/dist/core/schema/runtime-field-filters.js +1 -49
- package/dist/core/schema/runtime-field-values.js +1 -313
- package/dist/core/schema/runtime-schema.js +2 -826
- package/dist/core/schema/status-defs-file.js +2 -227
- package/dist/core/schema/status-token.js +1 -31
- package/dist/core/schema/type-inference.js +1 -95
- package/dist/core/schema/type-presets.js +1 -87
- package/dist/core/schema/type-workflows.js +1 -104
- package/dist/core/search/background-refresh.js +2 -286
- package/dist/core/search/bm25.js +1 -146
- package/dist/core/search/cache.js +2 -534
- package/dist/core/search/corpus.js +1 -311
- package/dist/core/search/embedding-batches.js +1 -163
- package/dist/core/search/eval.js +1 -225
- package/dist/core/search/http-client.js +1 -75
- package/dist/core/search/providers.js +1 -242
- package/dist/core/search/relevance.js +1 -244
- package/dist/core/search/semantic-defaults.js +1 -199
- package/dist/core/search/staleness.js +1 -30
- package/dist/core/search/vector-stores.js +2 -664
- package/dist/core/search/vectorization-metadata.js +1 -81
- package/dist/core/sentry/helpers.js +1 -272
- package/dist/core/sentry/instrument.js +1 -387
- package/dist/core/session/session-state.js +1 -260
- package/dist/core/shared/agent-session-context.js +1 -133
- package/dist/core/shared/author.js +1 -1172
- package/dist/core/shared/command-types.js +1 -4
- package/dist/core/shared/conflict-markers.js +1 -31
- package/dist/core/shared/constants.js +1 -405
- package/dist/core/shared/errors.js +1 -20
- package/dist/core/shared/html-entity-decode.js +1 -131
- package/dist/core/shared/index.js +1 -12
- package/dist/core/shared/item-metadata-contract.js +1 -89
- package/dist/core/shared/lazy-module.js +1 -16
- package/dist/core/shared/levenshtein.js +1 -61
- package/dist/core/shared/memo.js +1 -19
- package/dist/core/shared/numeric-parsers.js +1 -20
- package/dist/core/shared/option-alias-visibility.js +1 -67
- package/dist/core/shared/primitives.js +1 -127
- package/dist/core/shared/serial-queue.js +1 -79
- package/dist/core/shared/serialization.js +1 -210
- package/dist/core/shared/split-comma-list.js +1 -30
- package/dist/core/shared/text-normalization.js +1 -38
- package/dist/core/shared/time.js +1 -306
- package/dist/core/store/index.js +1 -12
- package/dist/core/store/item-format-migration.js +1 -125
- package/dist/core/store/item-metadata-cache.js +1 -1116
- package/dist/core/store/item-metadata-query-index.js +9 -394
- package/dist/core/store/item-metadata-read-work.js +1 -43
- package/dist/core/store/item-store.js +1 -693
- package/dist/core/store/paths.d.ts +1 -1
- package/dist/core/store/paths.js +1 -214
- package/dist/core/store/settings-read-cache.js +1 -85
- package/dist/core/store/settings-validator.js +1 -421
- package/dist/core/store/settings.js +3 -1309
- package/dist/core/store/tracker-preflight.js +1 -141
- package/dist/core/telemetry/consent.js +5 -108
- package/dist/core/telemetry/observability.js +1 -246
- package/dist/core/telemetry/runtime.js +4 -1988
- package/dist/core/test/background-runs.js +4 -945
- package/dist/core/test/item-test-run-tracking.js +1 -63
- package/dist/core/test/run-selectors.js +1 -120
- package/dist/core/validate/estimate-defaults.js +1 -89
- package/dist/core/validate/fix-planning.js +1 -189
- package/dist/core/validate/linked-artifact-reference.js +1 -36
- package/dist/core/validate/missing-by-type.js +1 -34
- package/dist/core/validate/missing-link-owners.js +1 -95
- package/dist/core/validate/stale-file-classification.js +1 -82
- package/dist/mcp/http-server.js +5 -448
- package/dist/mcp/legacy-adapter.js +1 -77
- package/dist/mcp/runtime-capabilities.js +1 -200
- package/dist/mcp/server.js +4 -1233
- package/dist/mcp/tool-definitions.js +1 -804
- package/dist/sdk/actionability.js +1 -13
- package/dist/sdk/agent/closed-domain-contracts.js +1 -161
- package/dist/sdk/agent/command-recovery.js +1 -59
- package/dist/sdk/agent/command-suggestions.js +1 -66
- package/dist/sdk/agent/create-option-policy.js +1 -31
- package/dist/sdk/agent/identity-config.js +1 -106
- package/dist/sdk/agent/item-addressing.js +1 -207
- package/dist/sdk/agent/refusal-closure-census.js +1 -151
- package/dist/sdk/agent/refusal-closure.js +1 -133
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
- package/dist/sdk/agent/refusal-reachability.js +1 -593
- package/dist/sdk/agent/subcommand-recovery.js +1 -83
- package/dist/sdk/agent/task-transcript-contracts.js +1 -197
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
- package/dist/sdk/agent-capability-contracts.js +1 -428
- package/dist/sdk/agent-session-context.js +1 -9
- package/dist/sdk/annotations.js +1 -448
- package/dist/sdk/author-attribution.js +1 -468
- package/dist/sdk/authoring.js +1 -20
- package/dist/sdk/cli-bootstrap.js +1 -838
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
- package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
- package/dist/sdk/cli-contracts/command-aliases.js +1 -107
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
- package/dist/sdk/cli-contracts/commander-types.js +1 -159
- package/dist/sdk/cli-contracts/completeness.js +1 -393
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
- package/dist/sdk/cli-contracts/string-lists.js +1 -16
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
- package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -17
- package/dist/sdk/cli-program.js +1 -49
- package/dist/sdk/command-line.d.ts +2 -5
- package/dist/sdk/command-line.js +1 -78
- package/dist/sdk/comments.js +1 -133
- package/dist/sdk/compile-cache.js +1 -73
- package/dist/sdk/completion.js +157 -837
- package/dist/sdk/compose.js +1 -1090
- package/dist/sdk/config.js +1 -1204
- package/dist/sdk/context/recency.js +1 -33
- package/dist/sdk/context/semantic-session-attribution.js +1 -82
- package/dist/sdk/context/usage-egress.js +1 -29
- package/dist/sdk/context/usage-ledger.js +3 -185
- package/dist/sdk/context-intent-contracts.js +1 -709
- package/dist/sdk/context-intent-runtime.js +1 -115
- package/dist/sdk/context-packing.js +1 -218
- package/dist/sdk/context-relevance.js +1 -503
- package/dist/sdk/context-signal-store.js +2 -426
- package/dist/sdk/context-usage.js +1 -367
- package/dist/sdk/contracts.js +1 -23
- package/dist/sdk/core-governance.js +1 -14
- package/dist/sdk/core.js +1 -14
- package/dist/sdk/corpus-shape.js +1 -401
- package/dist/sdk/define.js +1 -220
- package/dist/sdk/dependencies.js +1 -718
- package/dist/sdk/dependency-flag-validation.js +1 -156
- package/dist/sdk/dependency-provenance.js +1 -135
- package/dist/sdk/docs.js +1 -14
- package/dist/sdk/duplicates.js +1 -40
- package/dist/sdk/environment/agent-environment.js +1 -466
- package/dist/sdk/environment/host-environment-errors.js +1 -8
- package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
- package/dist/sdk/environment/source-context.js +1 -28
- package/dist/sdk/environment/tracker-preflight.js +1 -9
- package/dist/sdk/error-code-catalog.js +1 -153
- package/dist/sdk/error-runtime.js +1 -58
- package/dist/sdk/errors.js +1 -58
- package/dist/sdk/eval.js +1 -190
- package/dist/sdk/extension/author-manifest.js +1 -92
- package/dist/sdk/extension/bundled-catalog.js +1 -332
- package/dist/sdk/extension/concurrency.js +1 -25
- package/dist/sdk/extension/copy-scope.d.ts +2 -0
- package/dist/sdk/extension/copy-scope.js +2 -0
- package/dist/sdk/extension/custom-field-collisions.js +1 -30
- package/dist/sdk/extension/describe.js +3 -189
- package/dist/sdk/extension/doctor.js +1 -606
- package/dist/sdk/extension/install-plan.d.ts +69 -0
- package/dist/sdk/extension/install-plan.js +2 -0
- package/dist/sdk/extension/install-receipts.d.ts +7 -0
- package/dist/sdk/extension/install-receipts.js +2 -0
- package/dist/sdk/extension/install-runtime.js +3 -313
- package/dist/sdk/extension/install-snapshot.js +1 -66
- package/dist/sdk/extension/install-sources.js +5 -1057
- package/dist/sdk/extension/managed-state.js +2 -252
- package/dist/sdk/extension/migrations.js +2 -174
- package/dist/sdk/extension/output-ownership.js +1 -25
- package/dist/sdk/extension/runtime-summary.js +1 -18
- package/dist/sdk/extension/scaffold.js +4 -2308
- package/dist/sdk/extension/shared.js +1 -147
- package/dist/sdk/extension/source-resolution.js +1 -65
- package/dist/sdk/extension/update-check.js +1 -67
- package/dist/sdk/extension-command-context.js +1 -44
- package/dist/sdk/extension-contracts.js +1 -73
- package/dist/sdk/extension.d.ts +7 -2
- package/dist/sdk/extension.js +1 -2196
- package/dist/sdk/files.js +1 -535
- package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
- package/dist/sdk/flag-invocation-contracts.js +1 -344
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
- package/dist/sdk/generated-error-code-catalog.js +1 -16
- package/dist/sdk/governance/assurance-action-contracts.js +1 -4
- package/dist/sdk/governance/assurance-action.js +1 -411
- package/dist/sdk/governance/assurance-limits.js +1 -10
- package/dist/sdk/governance/assurance-mutation-error.js +1 -81
- package/dist/sdk/governance/assurance-presets.js +1 -135
- package/dist/sdk/governance/assurance-runtime.js +1 -238
- package/dist/sdk/governance/assurance.js +4 -1182
- package/dist/sdk/governance/boundary-fixtures.js +1 -200
- package/dist/sdk/governance/coverage-assurance.js +1 -60
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
- package/dist/sdk/governance/defect-recurrence.js +1 -623
- package/dist/sdk/governance/extension-host-version.js +1 -115
- package/dist/sdk/governance/gc.js +1 -368
- package/dist/sdk/governance/health.js +1 -2367
- package/dist/sdk/governance/hierarchy-validation.js +1 -108
- package/dist/sdk/governance/linked-file-report.js +1 -71
- package/dist/sdk/governance/merge-receipt-history.js +1 -206
- package/dist/sdk/governance/provenance-health.js +1 -282
- package/dist/sdk/governance/reindex.js +4 -761
- package/dist/sdk/governance/stale-work.js +1 -82
- package/dist/sdk/governance/status-role-diagnostics.js +1 -35
- package/dist/sdk/governance/storage-integrity.js +1 -280
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
- package/dist/sdk/governance/upgrade.js +2 -327
- package/dist/sdk/governance/validate-history-drift.js +1 -81
- package/dist/sdk/governance/validate-item-reader.js +1 -17
- package/dist/sdk/governance/validate-normalization.js +1 -36
- package/dist/sdk/governance/validate.js +1 -2261
- package/dist/sdk/governance/workspace-position.js +1 -163
- package/dist/sdk/governance.d.ts +1 -0
- package/dist/sdk/governance.js +1 -31
- package/dist/sdk/graph/adapter.js +1 -181
- package/dist/sdk/graph/analytics.js +1 -474
- package/dist/sdk/graph/assembly.js +1 -377
- package/dist/sdk/graph/cache.js +1 -160
- package/dist/sdk/graph/centrality.js +1 -258
- package/dist/sdk/graph/conformance.js +1 -130
- package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
- package/dist/sdk/graph/deadline-scheduling.js +2 -0
- package/dist/sdk/graph/durable-cache.d.ts +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -361
- package/dist/sdk/graph/governance-contracts.js +1 -34
- package/dist/sdk/graph/governance.d.ts +13 -1
- package/dist/sdk/graph/governance.js +1 -735
- package/dist/sdk/graph/hierarchy-integrity.js +1 -310
- package/dist/sdk/graph/index.d.ts +3 -2
- package/dist/sdk/graph/index.js +1 -26
- package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
- package/dist/sdk/graph/lifecycle-coverage.js +2 -0
- package/dist/sdk/graph/mutation-advisory.js +1 -176
- package/dist/sdk/graph/remediation.js +1 -197
- package/dist/sdk/graph/run.d.ts +15 -1
- package/dist/sdk/graph/run.js +1 -768
- package/dist/sdk/graph/scheduling.js +1 -124
- package/dist/sdk/graph/traversal.js +1 -284
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
- package/dist/sdk/graph.js +1 -15
- package/dist/sdk/guide-topics.js +1 -707
- package/dist/sdk/guide.js +1 -279
- package/dist/sdk/history/maintenance.d.ts +71 -0
- package/dist/sdk/history/maintenance.js +2 -0
- package/dist/sdk/history/salvage.js +2 -247
- package/dist/sdk/history/subject.d.ts +19 -0
- package/dist/sdk/history/subject.js +2 -0
- package/dist/sdk/history-analytics.js +1 -282
- package/dist/sdk/history-compact.js +1 -527
- package/dist/sdk/history-mcp.js +1 -68
- package/dist/sdk/history-provenance.js +1 -182
- package/dist/sdk/history-read.js +1 -96
- package/dist/sdk/history-redact.d.ts +1 -14
- package/dist/sdk/history-redact.js +1 -643
- package/dist/sdk/history-repair.d.ts +5 -0
- package/dist/sdk/history-repair.js +1 -657
- package/dist/sdk/improvement-ledger-validation.js +1 -62
- package/dist/sdk/improvement-ledger.js +2 -257
- package/dist/sdk/index.d.ts +4 -0
- package/dist/sdk/index.js +1 -183
- package/dist/sdk/init-agent-guidance.js +2 -496
- package/dist/sdk/init.js +2 -820
- package/dist/sdk/invocation-author.js +1 -39
- package/dist/sdk/item-children.js +1 -90
- package/dist/sdk/item-metadata-index.js +1 -15
- package/dist/sdk/item-schedule.js +1 -27
- package/dist/sdk/item-transaction.js +1 -396
- package/dist/sdk/learnings.js +1 -29
- package/dist/sdk/lifecycle/append.js +2 -53
- package/dist/sdk/lifecycle/claim.d.ts +2 -0
- package/dist/sdk/lifecycle/claim.js +1 -242
- package/dist/sdk/lifecycle/close-many.js +1 -438
- package/dist/sdk/lifecycle/close.js +1 -468
- package/dist/sdk/lifecycle/copy.js +1 -212
- package/dist/sdk/lifecycle/create.js +1 -1949
- package/dist/sdk/lifecycle/delete.js +1 -45
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
- package/dist/sdk/lifecycle/focus.js +1 -91
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
- package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
- package/dist/sdk/lifecycle/mcp-actions.js +1 -51
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
- package/dist/sdk/lifecycle/plan.js +1 -1606
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
- package/dist/sdk/lifecycle/reopen.js +1 -68
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
- package/dist/sdk/lifecycle/restore.d.ts +1 -0
- package/dist/sdk/lifecycle/restore.js +1 -330
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
- package/dist/sdk/lifecycle/update-many.js +1 -861
- package/dist/sdk/lifecycle/update.js +1 -2136
- package/dist/sdk/lifecycle-completion.js +1 -92
- package/dist/sdk/lifecycle-policy.js +1 -120
- package/dist/sdk/linked-artifacts.js +1 -530
- package/dist/sdk/mcp/apps.js +4 -133
- package/dist/sdk/mcp/authorization.js +1 -404
- package/dist/sdk/mcp/discovery.js +1 -494
- package/dist/sdk/mcp/interactions.js +1 -336
- package/dist/sdk/mcp/protocol.d.ts +7 -0
- package/dist/sdk/mcp/protocol.js +1 -184
- package/dist/sdk/mcp/skills.js +1 -389
- package/dist/sdk/mcp/subscriptions.js +1 -211
- package/dist/sdk/mcp/tasks.js +2 -430
- package/dist/sdk/mcp/transport.js +1 -260
- package/dist/sdk/merge/abandoned-receipts.js +1 -46
- package/dist/sdk/merge/driver.js +1 -212
- package/dist/sdk/merge/index.js +1 -16
- package/dist/sdk/merge/install.js +3 -561
- package/dist/sdk/merge/receipt-file-boundary.js +1 -46
- package/dist/sdk/merge/receipt-operation.js +1 -96
- package/dist/sdk/merge/receipt-schema.js +1 -397
- package/dist/sdk/merge/receipts.js +4 -525
- package/dist/sdk/merge/reconcile.js +1 -352
- package/dist/sdk/merge/three-way.js +3 -775
- package/dist/sdk/merge.js +1 -10
- package/dist/sdk/mutation-events.js +1 -292
- package/dist/sdk/mutation-guard.js +1 -216
- package/dist/sdk/notes.js +1 -139
- package/dist/sdk/output-contracts.js +1 -172
- package/dist/sdk/output-projection.js +1 -430
- package/dist/sdk/output-token-accounting.js +1 -140
- package/dist/sdk/output.js +1 -64
- package/dist/sdk/ownership-source.js +1 -21
- package/dist/sdk/package-import-adapters.js +1 -442
- package/dist/sdk/package-migrations.js +1 -20
- package/dist/sdk/package-runtime-options.js +1 -80
- package/dist/sdk/pagination.js +1 -162
- package/dist/sdk/profile.js +1 -454
- package/dist/sdk/provenance.js +1 -258
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -401
- package/dist/sdk/query/aggregate.d.ts +16 -0
- package/dist/sdk/query/aggregate.js +1 -390
- package/dist/sdk/query/calendar.js +1 -964
- package/dist/sdk/query/complete-list.js +1 -215
- package/dist/sdk/query/context.js +1 -1702
- package/dist/sdk/query/duplicate-candidates.js +1 -70
- package/dist/sdk/query/get.js +1 -450
- package/dist/sdk/query/history.js +1 -186
- package/dist/sdk/query/item-filter-options.js +1 -9
- package/dist/sdk/query/light-metadata.js +1 -18
- package/dist/sdk/query/list-filter-shared.js +1 -81
- package/dist/sdk/query/list.js +1 -1304
- package/dist/sdk/query/multi-value-filters.js +1 -78
- package/dist/sdk/query/next.js +1 -513
- package/dist/sdk/query/parsers.js +1 -44
- package/dist/sdk/query/projection-contracts.js +1 -184
- package/dist/sdk/query/search-contracts.js +1 -230
- package/dist/sdk/query/search-pagination.js +1 -35
- package/dist/sdk/query/search-rendering.js +1 -105
- package/dist/sdk/query/search.js +2 -1987
- package/dist/sdk/query.js +1 -35
- package/dist/sdk/read-output/continuation.js +1 -194
- package/dist/sdk/read-output-budget.js +1 -135
- package/dist/sdk/read-output-contracts.js +1 -1225
- package/dist/sdk/read-output-rows.js +1 -186
- package/dist/sdk/read-output-session.js +1 -208
- package/dist/sdk/relationship-analytics.js +1 -410
- package/dist/sdk/relationship-context.js +1 -284
- package/dist/sdk/relationship-history.js +4 -519
- package/dist/sdk/relationship-kinds/contract.js +1 -22
- package/dist/sdk/relationship-migration.js +1 -77
- package/dist/sdk/relationships.js +1 -579
- package/dist/sdk/reproducibility/process.js +1 -87
- package/dist/sdk/runtime-action-aliases.js +1 -59
- package/dist/sdk/runtime-extended-actions.js +1 -177
- package/dist/sdk/runtime-input.js +1 -614
- package/dist/sdk/runtime-primitives.js +1 -84
- package/dist/sdk/runtime-public-contracts.js +1 -4
- package/dist/sdk/runtime-stats-options.js +1 -38
- package/dist/sdk/runtime.js +1 -1928
- package/dist/sdk/scheduling-shortcuts.js +1 -63
- package/dist/sdk/schema-migration.js +3 -856
- package/dist/sdk/schema.js +1 -1376
- package/dist/sdk/search-refresh-worker.js +1 -18
- package/dist/sdk/similarity-scoring.js +1 -53
- package/dist/sdk/similarity.js +1 -326
- package/dist/sdk/start-task-status.js +1 -14
- package/dist/sdk/stats.js +1 -270
- package/dist/sdk/structured-mutations.js +1 -580
- package/dist/sdk/telemetry-flush.js +1 -13
- package/dist/sdk/telemetry.js +1 -405
- package/dist/sdk/templates.js +2 -292
- package/dist/sdk/test/batch.js +2 -509
- package/dist/sdk/test/entry.js +1 -70
- package/dist/sdk/test/execution.js +6 -2211
- package/dist/sdk/test/linked-command-detection.js +1 -546
- package/dist/sdk/test/measurements.js +1 -91
- package/dist/sdk/test/parsers.js +1 -545
- package/dist/sdk/test/runs.js +1 -193
- package/dist/sdk/test/trust.js +2 -206
- package/dist/sdk/testing.js +4 -1391
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
- package/dist/sdk/traceability/source-traceability.js +1 -292
- package/dist/sdk/tracker-root-discovery.js +1 -9
- package/dist/sdk/workspace-contracts-cache.js +1 -28
- package/dist/sdk/workspace-contracts.js +1 -33
- package/dist/sdk/workspace-memory.js +2 -318
- package/dist/sdk/workspace-recipe.js +1 -71
- package/dist/sdk/workspace-snapshot.js +4 -613
- package/dist/sdk/workspace-transaction-gc.js +1 -149
- package/dist/sdk/workspace-transaction.js +2 -363
- package/dist/sdk/workspace.js +3 -127
- package/dist/types/index.js +1 -9
- package/dist/types.js +1 -245
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
- package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
- package/docs/EXTENSIONS.md +1 -0
- package/docs/HISTORY_MAINTENANCE.md +125 -0
- package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
- package/docs/PACKAGE_EVIDENCE.md +92 -0
- package/docs/PLANNING_MEASUREMENTS.md +183 -0
- package/docs/README.md +3 -0
- package/docs/SCRIPTING.md +21 -0
- package/docs/TESTING.md +23 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/scripts/finalize-build.mjs +45 -3
- package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
- package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
- package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
- package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
- package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
- package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
- package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
- package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
- package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
- package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
- package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
- package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
- package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
|
@@ -1,467 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module sdk/agent-environment
|
|
3
|
-
*
|
|
4
|
-
* Declares reproducible, budgeted agent observations, total verdicts, and
|
|
5
|
-
* isolated project-management episodes over adapter-provided recorded state.
|
|
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]="38cb0b88-262f-5061-b95a-f4532bc52613")}catch(e){}}();
|
|
9
|
-
import { sha256Hex, stableStringify } from "../../core/shared/serialization.js";
|
|
10
|
-
import { runWithAgentSessionContext } from "../agent-session-context.js";
|
|
11
|
-
import { defineWorkspaceRecipe, } from "../workspace-recipe.js";
|
|
12
|
-
/** Schema identifier for a portable observation contract. */
|
|
13
|
-
export const PM_OBSERVATION_SCHEMA = "pm.agent-observation/v1";
|
|
14
|
-
/** Schema identifier for a deterministic verdict contract. */
|
|
15
|
-
export const PM_VERDICT_SCHEMA = "pm.agent-verdict/v1";
|
|
16
|
-
/** Schema identifier for a bounded agent-environment episode. */
|
|
17
|
-
export const PM_EPISODE_SCHEMA = "pm.agent-episode/v1";
|
|
18
|
-
function assertPositiveInteger(value, label) {
|
|
19
|
-
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
20
|
-
throw new Error(`${label} must be a positive safe integer.`);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
/** Reject blank user-facing identifiers at the declaration boundary. */
|
|
24
|
-
function assertNonEmpty(value, label) {
|
|
25
|
-
if (value.trim().length === 0)
|
|
26
|
-
throw new Error(`${label} must not be empty.`);
|
|
27
|
-
}
|
|
28
|
-
/** Recursively freeze a structured clone without mutating caller input. */
|
|
29
|
-
function frozenCopy(value) {
|
|
30
|
-
if (value !== null && typeof value === "object" && !Object.isFrozen(value)) {
|
|
31
|
-
Object.freeze(value);
|
|
32
|
-
for (const nested of Object.values(value))
|
|
33
|
-
frozenCopy(nested);
|
|
34
|
-
}
|
|
35
|
-
return value;
|
|
36
|
-
}
|
|
37
|
-
/** Validate bounded read declarations and reject arithmetic overflow. */
|
|
38
|
-
function validateObservationReads(reads) {
|
|
39
|
-
if (reads.length === 0) {
|
|
40
|
-
throw new Error("observation.reads must declare at least one bounded read.");
|
|
41
|
-
}
|
|
42
|
-
let readCeiling = 0;
|
|
43
|
-
for (const read of reads) {
|
|
44
|
-
assertNonEmpty(read.command, "observation.reads.command");
|
|
45
|
-
assertPositiveInteger(read.budget_tokens, "observation.reads.budget_tokens");
|
|
46
|
-
readCeiling += read.budget_tokens;
|
|
47
|
-
if (!Number.isSafeInteger(readCeiling)) {
|
|
48
|
-
throw new Error("observation read ceilings exceed safe integer range.");
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/** Validate that emitted-byte expectations are supported by bounded samples. */
|
|
53
|
-
function validateObservationCalibration(calibration) {
|
|
54
|
-
if (calibration.basis !== "emitted_bytes") {
|
|
55
|
-
throw new Error("observation calibration must use emitted_bytes.");
|
|
56
|
-
}
|
|
57
|
-
for (const sample of calibration.samples) {
|
|
58
|
-
if (!Number.isSafeInteger(sample) || sample < 0) {
|
|
59
|
-
throw new Error("observation calibration samples must be non-negative safe integers.");
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (calibration.samples.length === 0) {
|
|
63
|
-
throw new Error("observation calibration must include at least one sample.");
|
|
64
|
-
}
|
|
65
|
-
assertPositiveInteger(calibration.expected_emitted_bytes, "observation.calibration.expected_emitted_bytes");
|
|
66
|
-
if (!Number.isSafeInteger(calibration.tolerance_bytes) ||
|
|
67
|
-
calibration.tolerance_bytes < 0) {
|
|
68
|
-
throw new Error("observation.calibration.tolerance_bytes must be a non-negative safe integer.");
|
|
69
|
-
}
|
|
70
|
-
const sampleMean = calibration.samples.reduce((total, sample) => total + sample, 0) /
|
|
71
|
-
calibration.samples.length;
|
|
72
|
-
if (Math.abs(sampleMean - calibration.expected_emitted_bytes) >
|
|
73
|
-
calibration.tolerance_bytes) {
|
|
74
|
-
throw new Error("observation expected_emitted_bytes is outside the calibrated sample tolerance.");
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/** Validate the ordered disclosure ladder and every projected field path. */
|
|
78
|
-
function validateObservationTiers(tiers) {
|
|
79
|
-
if (tiers.length === 0) {
|
|
80
|
-
throw new Error("observation.tiers must declare a degradation ladder.");
|
|
81
|
-
}
|
|
82
|
-
const tierIds = new Set();
|
|
83
|
-
let previousTierBudget = Number.POSITIVE_INFINITY;
|
|
84
|
-
for (const tier of tiers) {
|
|
85
|
-
assertNonEmpty(tier.id, "observation.tiers.id");
|
|
86
|
-
assertPositiveInteger(tier.max_tokens, "observation.tiers.max_tokens");
|
|
87
|
-
if (tierIds.has(tier.id))
|
|
88
|
-
throw new Error(`Duplicate observation tier: ${tier.id}.`);
|
|
89
|
-
tierIds.add(tier.id);
|
|
90
|
-
if (tier.max_tokens > previousTierBudget) {
|
|
91
|
-
throw new Error("observation tiers must be ordered from largest to smallest max_tokens.");
|
|
92
|
-
}
|
|
93
|
-
previousTierBudget = tier.max_tokens;
|
|
94
|
-
const fields = new Set();
|
|
95
|
-
for (const field of tier.fields) {
|
|
96
|
-
parseFieldPath(field, "observation.tiers.fields");
|
|
97
|
-
if (fields.has(field)) {
|
|
98
|
-
throw new Error(`Duplicate observation tier field: ${field}.`);
|
|
99
|
-
}
|
|
100
|
-
fields.add(field);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/** Validate, clone, and freeze a portable observation declaration. */
|
|
105
|
-
export function defineObservationContract(declaration) {
|
|
106
|
-
if (declaration.schema !== PM_OBSERVATION_SCHEMA) {
|
|
107
|
-
throw new Error(`observation.schema must be ${PM_OBSERVATION_SCHEMA}.`);
|
|
108
|
-
}
|
|
109
|
-
assertNonEmpty(declaration.id, "observation.id");
|
|
110
|
-
assertPositiveInteger(declaration.version, "observation.version");
|
|
111
|
-
validateObservationReads(declaration.reads);
|
|
112
|
-
validateObservationCalibration(declaration.calibration);
|
|
113
|
-
if (declaration.corpus_dependence.kind === "bounded") {
|
|
114
|
-
assertNonEmpty(declaration.corpus_dependence.dimension, "observation.corpus_dependence.dimension");
|
|
115
|
-
assertPositiveInteger(declaration.corpus_dependence.maximum, "observation.corpus_dependence.maximum");
|
|
116
|
-
}
|
|
117
|
-
validateObservationTiers(declaration.tiers);
|
|
118
|
-
return frozenCopy(structuredClone(declaration));
|
|
119
|
-
}
|
|
120
|
-
/** Describe guaranteed and calibrated observation cost before collection. */
|
|
121
|
-
export function describeObservationCost(contract) {
|
|
122
|
-
return {
|
|
123
|
-
contract_id: contract.id,
|
|
124
|
-
contract_version: contract.version,
|
|
125
|
-
guaranteed_ceiling_tokens: contract.reads.reduce((total, read) => total + read.budget_tokens, 0),
|
|
126
|
-
expected_emitted_bytes: contract.calibration.expected_emitted_bytes,
|
|
127
|
-
expected_tokens: Math.ceil(contract.calibration.expected_emitted_bytes / 4),
|
|
128
|
-
tolerance_bytes: contract.calibration.tolerance_bytes,
|
|
129
|
-
calibration_basis: "emitted_bytes",
|
|
130
|
-
corpus_dependence: contract.corpus_dependence,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
/** Serve the richest declared tier that fits both caller and tier ceilings. */
|
|
134
|
-
export async function serveDeclaredObservation(contract, collect, request) {
|
|
135
|
-
assertPositiveInteger(request.budget_tokens, "observation request budget_tokens");
|
|
136
|
-
const attempted = [];
|
|
137
|
-
for (const [index, tier] of contract.tiers.entries()) {
|
|
138
|
-
attempted.push(tier.id);
|
|
139
|
-
const payload = await collect(tier);
|
|
140
|
-
const emittedBytes = Buffer.byteLength(stableStringify(payload), "utf8");
|
|
141
|
-
const estimatedTokens = Math.ceil(emittedBytes / 4);
|
|
142
|
-
if (estimatedTokens <= Math.min(request.budget_tokens, tier.max_tokens)) {
|
|
143
|
-
return {
|
|
144
|
-
status: "served",
|
|
145
|
-
payload,
|
|
146
|
-
receipt: {
|
|
147
|
-
contract_id: contract.id,
|
|
148
|
-
contract_version: contract.version,
|
|
149
|
-
served_tier: tier.id,
|
|
150
|
-
degraded: index > 0,
|
|
151
|
-
attempted_tiers: attempted,
|
|
152
|
-
emitted_bytes: emittedBytes,
|
|
153
|
-
estimated_tokens: estimatedTokens,
|
|
154
|
-
calibration_basis: "emitted_bytes",
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
status: "refused",
|
|
161
|
-
reason: "no_declared_tier_fits_budget",
|
|
162
|
-
receipt: {
|
|
163
|
-
contract_id: contract.id,
|
|
164
|
-
contract_version: contract.version,
|
|
165
|
-
served_tier: null,
|
|
166
|
-
degraded: contract.tiers.length > 1,
|
|
167
|
-
attempted_tiers: attempted,
|
|
168
|
-
emitted_bytes: null,
|
|
169
|
-
estimated_tokens: null,
|
|
170
|
-
calibration_basis: "emitted_bytes",
|
|
171
|
-
},
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
/** Parse a safe dot path and reject prototype-mutating or ambiguous segments. */
|
|
175
|
-
function parseFieldPath(path, label) {
|
|
176
|
-
const segments = path.split(".");
|
|
177
|
-
if (segments.some((segment) => segment.length === 0 ||
|
|
178
|
-
segment === "__proto__" ||
|
|
179
|
-
segment === "prototype" ||
|
|
180
|
-
segment === "constructor")) {
|
|
181
|
-
throw new Error(`${label} must be a safe, non-empty dot-separated path.`);
|
|
182
|
-
}
|
|
183
|
-
return segments;
|
|
184
|
-
}
|
|
185
|
-
/** Read a declared field without interpreting inherited properties. */
|
|
186
|
-
function valueAtPath(root, path) {
|
|
187
|
-
let value = root;
|
|
188
|
-
for (const segment of parseFieldPath(path, "recorded field path")) {
|
|
189
|
-
if (value === null ||
|
|
190
|
-
typeof value !== "object" ||
|
|
191
|
-
!Object.hasOwn(value, segment)) {
|
|
192
|
-
return undefined;
|
|
193
|
-
}
|
|
194
|
-
value = value[segment];
|
|
195
|
-
}
|
|
196
|
-
return value;
|
|
197
|
-
}
|
|
198
|
-
/** Convert a safe dot path into an RFC 6901 evidence pointer. */
|
|
199
|
-
function jsonPointer(path) {
|
|
200
|
-
return `/${parseFieldPath(path, "verdict predicate path")
|
|
201
|
-
.map((segment) => segment.replaceAll("~", "~0").replaceAll("/", "~1"))
|
|
202
|
-
.join("/")}`;
|
|
203
|
-
}
|
|
204
|
-
/** Reject equality operands that cannot survive portable JSON storage. */
|
|
205
|
-
function assertPortableExpectedValue(predicate) {
|
|
206
|
-
if (predicate.kind !== "field_equals")
|
|
207
|
-
return;
|
|
208
|
-
let serializedExpected;
|
|
209
|
-
try {
|
|
210
|
-
serializedExpected = JSON.stringify(predicate.expected);
|
|
211
|
-
}
|
|
212
|
-
catch {
|
|
213
|
-
throw new Error(`Expected value for verdict predicate ${predicate.id} must be JSON serializable.`);
|
|
214
|
-
}
|
|
215
|
-
if (serializedExpected === undefined) {
|
|
216
|
-
throw new Error(`Expected value for verdict predicate ${predicate.id} must be JSON serializable.`);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
/** Validate, clone, and freeze a portable total-verdict declaration. */
|
|
220
|
-
export function defineVerdictContract(declaration) {
|
|
221
|
-
if (declaration.schema !== PM_VERDICT_SCHEMA) {
|
|
222
|
-
throw new Error(`verdict.schema must be ${PM_VERDICT_SCHEMA}.`);
|
|
223
|
-
}
|
|
224
|
-
assertNonEmpty(declaration.id, "verdict.id");
|
|
225
|
-
assertPositiveInteger(declaration.version, "verdict.version");
|
|
226
|
-
const predicateIds = new Set();
|
|
227
|
-
for (const predicate of declaration.predicates) {
|
|
228
|
-
assertNonEmpty(predicate.id, "verdict.predicates.id");
|
|
229
|
-
parseFieldPath(predicate.path, "verdict.predicates.path");
|
|
230
|
-
const runtimeKind = predicate.kind;
|
|
231
|
-
if (runtimeKind !== "field_equals" &&
|
|
232
|
-
runtimeKind !== "field_present" &&
|
|
233
|
-
runtimeKind !== "field_absent") {
|
|
234
|
-
throw new Error(`Unsupported verdict predicate kind for ${predicate.id}.`);
|
|
235
|
-
}
|
|
236
|
-
if (predicateIds.has(predicate.id))
|
|
237
|
-
throw new Error(`Duplicate verdict predicate: ${predicate.id}.`);
|
|
238
|
-
assertPortableExpectedValue(predicate);
|
|
239
|
-
predicateIds.add(predicate.id);
|
|
240
|
-
}
|
|
241
|
-
if (declaration.composition.operator !== "all" &&
|
|
242
|
-
declaration.composition.operator !== "any") {
|
|
243
|
-
throw new Error("verdict composition operator must be all or any.");
|
|
244
|
-
}
|
|
245
|
-
if (declaration.composition.predicate_ids.length !==
|
|
246
|
-
declaration.predicates.length) {
|
|
247
|
-
throw new Error("verdict composition must reference every predicate exactly once.");
|
|
248
|
-
}
|
|
249
|
-
const compositionIds = new Set(declaration.composition.predicate_ids);
|
|
250
|
-
if (compositionIds.size !== declaration.composition.predicate_ids.length ||
|
|
251
|
-
[...compositionIds].some((id) => !predicateIds.has(id))) {
|
|
252
|
-
throw new Error("verdict composition contains duplicate or unknown predicate ids.");
|
|
253
|
-
}
|
|
254
|
-
return frozenCopy(structuredClone(declaration));
|
|
255
|
-
}
|
|
256
|
-
/** Evaluate a total verdict exclusively from one immutable recorded snapshot. */
|
|
257
|
-
export function evaluateVerdictContract(contract, recorded) {
|
|
258
|
-
if (contract.predicates.length === 0) {
|
|
259
|
-
return {
|
|
260
|
-
contract_id: contract.id,
|
|
261
|
-
contract_version: contract.version,
|
|
262
|
-
snapshot_id: recorded.snapshot_id,
|
|
263
|
-
outcome: "not_applicable",
|
|
264
|
-
score: null,
|
|
265
|
-
policy: "verdict_only_no_reward",
|
|
266
|
-
reason: "no_predicates_declared",
|
|
267
|
-
predicates: [],
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
const byId = new Map(contract.predicates.map((predicate) => [predicate.id, predicate]));
|
|
271
|
-
const predicates = contract.composition.predicate_ids.map((id) => {
|
|
272
|
-
const predicate = byId.get(id);
|
|
273
|
-
const observed = valueAtPath(recorded.state, predicate.path);
|
|
274
|
-
const satisfied = predicate.kind === "field_present"
|
|
275
|
-
? observed !== undefined
|
|
276
|
-
: predicate.kind === "field_absent"
|
|
277
|
-
? observed === undefined
|
|
278
|
-
: stableStringify(observed) === stableStringify(predicate.expected);
|
|
279
|
-
return {
|
|
280
|
-
id,
|
|
281
|
-
outcome: satisfied ? "satisfied" : "violated",
|
|
282
|
-
evidence_pointer: `${recorded.snapshot_id}#${jsonPointer(predicate.path)}`,
|
|
283
|
-
evidence_digest: sha256Hex(stableStringify(observed)),
|
|
284
|
-
};
|
|
285
|
-
});
|
|
286
|
-
const satisfiedCount = predicates.filter((predicate) => predicate.outcome === "satisfied").length;
|
|
287
|
-
const satisfied = contract.composition.operator === "all"
|
|
288
|
-
? satisfiedCount === predicates.length
|
|
289
|
-
: satisfiedCount > 0;
|
|
290
|
-
return {
|
|
291
|
-
contract_id: contract.id,
|
|
292
|
-
contract_version: contract.version,
|
|
293
|
-
snapshot_id: recorded.snapshot_id,
|
|
294
|
-
outcome: satisfied ? "satisfied" : "violated",
|
|
295
|
-
score: satisfiedCount / predicates.length,
|
|
296
|
-
policy: "verdict_only_no_reward",
|
|
297
|
-
predicates,
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
/** Validate, clone, and freeze a portable episode specification. */
|
|
301
|
-
export function defineEpisodeSpecification(declaration) {
|
|
302
|
-
if (declaration.schema !== PM_EPISODE_SCHEMA) {
|
|
303
|
-
throw new Error(`episode.schema must be ${PM_EPISODE_SCHEMA}.`);
|
|
304
|
-
}
|
|
305
|
-
assertNonEmpty(declaration.id, "episode.id");
|
|
306
|
-
assertPositiveInteger(declaration.version, "episode.version");
|
|
307
|
-
if (!["benchmark", "evaluation", "training", "scale_transfer"].includes(declaration.mode)) {
|
|
308
|
-
throw new Error("episode.mode is not supported.");
|
|
309
|
-
}
|
|
310
|
-
if (declaration.task_item_ids.length === 0) {
|
|
311
|
-
throw new Error("episode.task_item_ids must declare at least one pm item.");
|
|
312
|
-
}
|
|
313
|
-
for (const itemId of declaration.task_item_ids) {
|
|
314
|
-
assertNonEmpty(itemId, "episode.task_item_ids");
|
|
315
|
-
}
|
|
316
|
-
assertPositiveInteger(declaration.limits.max_actions, "episode.limits.max_actions");
|
|
317
|
-
assertPositiveInteger(declaration.limits.max_observations, "episode.limits.max_observations");
|
|
318
|
-
assertPositiveInteger(declaration.limits.max_tokens_per_observation, "episode.limits.max_tokens_per_observation");
|
|
319
|
-
for (const field of declaration.observable_fields) {
|
|
320
|
-
parseFieldPath(field, "episode.observable_fields");
|
|
321
|
-
}
|
|
322
|
-
for (const field of declaration.withheld_fields) {
|
|
323
|
-
parseFieldPath(field, "episode.withheld_fields");
|
|
324
|
-
}
|
|
325
|
-
for (const observable of declaration.observable_fields) {
|
|
326
|
-
const overlap = declaration.withheld_fields.find((withheld) => observable === withheld ||
|
|
327
|
-
observable.startsWith(`${withheld}.`) ||
|
|
328
|
-
withheld.startsWith(`${observable}.`));
|
|
329
|
-
if (overlap !== undefined) {
|
|
330
|
-
throw new Error(`Observable field ${observable} overlaps withheld field ${overlap}.`);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
for (const tier of declaration.observation.tiers) {
|
|
334
|
-
for (const field of tier.fields) {
|
|
335
|
-
if (!declaration.observable_fields.includes(field)) {
|
|
336
|
-
throw new Error(`Observation tier field ${field} is not declared observable.`);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
defineObservationContract(declaration.observation);
|
|
341
|
-
defineVerdictContract(declaration.verdict);
|
|
342
|
-
defineWorkspaceRecipe(declaration.recipe);
|
|
343
|
-
return frozenCopy(structuredClone(declaration));
|
|
344
|
-
}
|
|
345
|
-
/** Copy one selected field into a null-prototype-safe projected object. */
|
|
346
|
-
function assignProjectedPath(target, path, value) {
|
|
347
|
-
const segments = parseFieldPath(path, "observation projection field");
|
|
348
|
-
let cursor = target;
|
|
349
|
-
for (const [index, segment] of segments.entries()) {
|
|
350
|
-
if (index === segments.length - 1) {
|
|
351
|
-
if (value !== undefined)
|
|
352
|
-
cursor[segment] = structuredClone(value);
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
const nested = cursor[segment];
|
|
356
|
-
if (nested === null ||
|
|
357
|
-
typeof nested !== "object" ||
|
|
358
|
-
Array.isArray(nested)) {
|
|
359
|
-
cursor[segment] = {};
|
|
360
|
-
}
|
|
361
|
-
cursor = cursor[segment];
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
/** Project only declared tier fields from recorded workspace state. */
|
|
365
|
-
function projectedState(state, fields) {
|
|
366
|
-
const result = {};
|
|
367
|
-
for (const field of fields)
|
|
368
|
-
assignProjectedPath(result, field, valueAtPath(state, field));
|
|
369
|
-
return result;
|
|
370
|
-
}
|
|
371
|
-
/** Open one isolated, deterministic episode around an adapter's ordinary actions. */
|
|
372
|
-
export async function openPmEpisode(specification, adapter) {
|
|
373
|
-
const trajectory = [];
|
|
374
|
-
let actions = 0;
|
|
375
|
-
let observations = 0;
|
|
376
|
-
let closed = false;
|
|
377
|
-
let closing;
|
|
378
|
-
const context = {
|
|
379
|
-
episode: {
|
|
380
|
-
id: specification.id,
|
|
381
|
-
label: `pm agent environment v${specification.version}`,
|
|
382
|
-
},
|
|
383
|
-
provenance: { role: specification.mode, topic: "agent-environment" },
|
|
384
|
-
};
|
|
385
|
-
const reset = await runWithAgentSessionContext(context, () => adapter.reset(specification.recipe));
|
|
386
|
-
trajectory.push({ sequence: 1, kind: "reset", state_id: reset.state_id });
|
|
387
|
-
const readObservation = async () => {
|
|
388
|
-
if (closed)
|
|
389
|
-
throw new Error("episode is already closed.");
|
|
390
|
-
if (observations >= specification.limits.max_observations) {
|
|
391
|
-
throw new Error("episode exceeded limits.max_observations.");
|
|
392
|
-
}
|
|
393
|
-
observations += 1;
|
|
394
|
-
const recorded = await adapter.readRecordedState();
|
|
395
|
-
const result = await serveDeclaredObservation(specification.observation, async (tier) => projectedState(recorded.state, tier.fields), { budget_tokens: specification.limits.max_tokens_per_observation });
|
|
396
|
-
trajectory.push({
|
|
397
|
-
sequence: trajectory.length + 1,
|
|
398
|
-
kind: "observation",
|
|
399
|
-
state_id: result.receipt.served_tier ?? recorded.snapshot_id,
|
|
400
|
-
});
|
|
401
|
-
return result;
|
|
402
|
-
};
|
|
403
|
-
const evaluate = async (reservedForClose = false) => {
|
|
404
|
-
if (closed && !reservedForClose)
|
|
405
|
-
throw new Error("episode is already closed.");
|
|
406
|
-
if (observations >= specification.limits.max_observations) {
|
|
407
|
-
throw new Error("episode exceeded limits.max_observations.");
|
|
408
|
-
}
|
|
409
|
-
observations += 1;
|
|
410
|
-
const recorded = await adapter.readRecordedState();
|
|
411
|
-
const result = evaluateVerdictContract(specification.verdict, recorded);
|
|
412
|
-
trajectory.push({
|
|
413
|
-
sequence: trajectory.length + 1,
|
|
414
|
-
kind: "verdict",
|
|
415
|
-
state_id: recorded.snapshot_id,
|
|
416
|
-
});
|
|
417
|
-
return result;
|
|
418
|
-
};
|
|
419
|
-
return {
|
|
420
|
-
observe: () => runWithAgentSessionContext(context, readObservation),
|
|
421
|
-
step: async (action) => {
|
|
422
|
-
if (closed)
|
|
423
|
-
throw new Error("episode is already closed.");
|
|
424
|
-
if (actions >= specification.limits.max_actions) {
|
|
425
|
-
throw new Error("episode exceeded limits.max_actions.");
|
|
426
|
-
}
|
|
427
|
-
actions += 1;
|
|
428
|
-
const result = await runWithAgentSessionContext(context, () => adapter.execute(action));
|
|
429
|
-
trajectory.push({
|
|
430
|
-
sequence: trajectory.length + 1,
|
|
431
|
-
kind: "action",
|
|
432
|
-
state_id: result.state_id,
|
|
433
|
-
});
|
|
434
|
-
return result;
|
|
435
|
-
},
|
|
436
|
-
score: () => runWithAgentSessionContext(context, evaluate),
|
|
437
|
-
close: () => {
|
|
438
|
-
if (closing !== undefined)
|
|
439
|
-
return closing;
|
|
440
|
-
if (closed)
|
|
441
|
-
return Promise.reject(new Error("episode is already closed."));
|
|
442
|
-
closed = true;
|
|
443
|
-
const operation = runWithAgentSessionContext(context, () => evaluate(true))
|
|
444
|
-
.then((verdict) => {
|
|
445
|
-
trajectory.push({
|
|
446
|
-
sequence: trajectory.length + 1,
|
|
447
|
-
kind: "close",
|
|
448
|
-
state_id: verdict.snapshot_id,
|
|
449
|
-
});
|
|
450
|
-
return {
|
|
451
|
-
verdict,
|
|
452
|
-
trajectory: frozenCopy(structuredClone(trajectory)),
|
|
453
|
-
};
|
|
454
|
-
})
|
|
455
|
-
.catch((error) => {
|
|
456
|
-
closed = false;
|
|
457
|
-
throw error;
|
|
458
|
-
});
|
|
459
|
-
closing = operation.finally(() => {
|
|
460
|
-
closing = undefined;
|
|
461
|
-
});
|
|
462
|
-
return closing;
|
|
463
|
-
},
|
|
464
|
-
};
|
|
465
|
-
}
|
|
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]="6e293af6-ee81-59b4-8d80-05e5c20bdcf1")}catch(e2){}})();import{sha256Hex,stableStringify}from"../../core/shared/serialization.js";import{runWithAgentSessionContext}from"../agent-session-context.js";import{defineWorkspaceRecipe}from"../workspace-recipe.js";const PM_OBSERVATION_SCHEMA="pm.agent-observation/v1";const PM_VERDICT_SCHEMA="pm.agent-verdict/v1";const PM_EPISODE_SCHEMA="pm.agent-episode/v1";function assertPositiveInteger(value,label){if(!Number.isSafeInteger(value)||value<=0){throw new Error(`${label} must be a positive safe integer.`)}}function assertNonEmpty(value,label){if(value.trim().length===0)throw new Error(`${label} must not be empty.`)}function frozenCopy(value){if(value!==null&&typeof value==="object"&&!Object.isFrozen(value)){Object.freeze(value);for(const nested of Object.values(value))frozenCopy(nested)}return value}function validateObservationReads(reads){if(reads.length===0){throw new Error("observation.reads must declare at least one bounded read.")}let readCeiling=0;for(const read of reads){assertNonEmpty(read.command,"observation.reads.command");assertPositiveInteger(read.budget_tokens,"observation.reads.budget_tokens");readCeiling+=read.budget_tokens;if(!Number.isSafeInteger(readCeiling)){throw new Error("observation read ceilings exceed safe integer range.")}}}function validateObservationCalibration(calibration){if(calibration.basis!=="emitted_bytes"){throw new Error("observation calibration must use emitted_bytes.")}for(const sample of calibration.samples){if(!Number.isSafeInteger(sample)||sample<0){throw new Error("observation calibration samples must be non-negative safe integers.")}}if(calibration.samples.length===0){throw new Error("observation calibration must include at least one sample.")}assertPositiveInteger(calibration.expected_emitted_bytes,"observation.calibration.expected_emitted_bytes");if(!Number.isSafeInteger(calibration.tolerance_bytes)||calibration.tolerance_bytes<0){throw new Error("observation.calibration.tolerance_bytes must be a non-negative safe integer.")}const sampleMean=calibration.samples.reduce((total,sample)=>total+sample,0)/calibration.samples.length;if(Math.abs(sampleMean-calibration.expected_emitted_bytes)>calibration.tolerance_bytes){throw new Error("observation expected_emitted_bytes is outside the calibrated sample tolerance.")}}function validateObservationTiers(tiers){if(tiers.length===0){throw new Error("observation.tiers must declare a degradation ladder.")}const tierIds=new Set;let previousTierBudget=Number.POSITIVE_INFINITY;for(const tier of tiers){assertNonEmpty(tier.id,"observation.tiers.id");assertPositiveInteger(tier.max_tokens,"observation.tiers.max_tokens");if(tierIds.has(tier.id))throw new Error(`Duplicate observation tier: ${tier.id}.`);tierIds.add(tier.id);if(tier.max_tokens>previousTierBudget){throw new Error("observation tiers must be ordered from largest to smallest max_tokens.")}previousTierBudget=tier.max_tokens;const fields=new Set;for(const field of tier.fields){parseFieldPath(field,"observation.tiers.fields");if(fields.has(field)){throw new Error(`Duplicate observation tier field: ${field}.`)}fields.add(field)}}}function defineObservationContract(declaration){if(declaration.schema!==PM_OBSERVATION_SCHEMA){throw new Error(`observation.schema must be ${PM_OBSERVATION_SCHEMA}.`)}assertNonEmpty(declaration.id,"observation.id");assertPositiveInteger(declaration.version,"observation.version");validateObservationReads(declaration.reads);validateObservationCalibration(declaration.calibration);if(declaration.corpus_dependence.kind==="bounded"){assertNonEmpty(declaration.corpus_dependence.dimension,"observation.corpus_dependence.dimension");assertPositiveInteger(declaration.corpus_dependence.maximum,"observation.corpus_dependence.maximum")}validateObservationTiers(declaration.tiers);return frozenCopy(structuredClone(declaration))}function describeObservationCost(contract){return{contract_id:contract.id,contract_version:contract.version,guaranteed_ceiling_tokens:contract.reads.reduce((total,read)=>total+read.budget_tokens,0),expected_emitted_bytes:contract.calibration.expected_emitted_bytes,expected_tokens:Math.ceil(contract.calibration.expected_emitted_bytes/4),tolerance_bytes:contract.calibration.tolerance_bytes,calibration_basis:"emitted_bytes",corpus_dependence:contract.corpus_dependence}}async function serveDeclaredObservation(contract,collect,request){assertPositiveInteger(request.budget_tokens,"observation request budget_tokens");const attempted=[];for(const[index,tier]of contract.tiers.entries()){attempted.push(tier.id);const payload=await collect(tier);const emittedBytes=Buffer.byteLength(stableStringify(payload),"utf8");const estimatedTokens=Math.ceil(emittedBytes/4);if(estimatedTokens<=Math.min(request.budget_tokens,tier.max_tokens)){return{status:"served",payload,receipt:{contract_id:contract.id,contract_version:contract.version,served_tier:tier.id,degraded:index>0,attempted_tiers:attempted,emitted_bytes:emittedBytes,estimated_tokens:estimatedTokens,calibration_basis:"emitted_bytes"}}}}return{status:"refused",reason:"no_declared_tier_fits_budget",receipt:{contract_id:contract.id,contract_version:contract.version,served_tier:null,degraded:contract.tiers.length>1,attempted_tiers:attempted,emitted_bytes:null,estimated_tokens:null,calibration_basis:"emitted_bytes"}}}function parseFieldPath(path,label){const segments=path.split(".");if(segments.some(segment=>segment.length===0||segment==="__proto__"||segment==="prototype"||segment==="constructor")){throw new Error(`${label} must be a safe, non-empty dot-separated path.`)}return segments}function valueAtPath(root,path){let value=root;for(const segment of parseFieldPath(path,"recorded field path")){if(value===null||typeof value!=="object"||!Object.hasOwn(value,segment)){return void 0}value=value[segment]}return value}function jsonPointer(path){return`/${parseFieldPath(path,"verdict predicate path").map(segment=>segment.replaceAll("~","~0").replaceAll("/","~1")).join("/")}`}function assertPortableExpectedValue(predicate){if(predicate.kind!=="field_equals")return;let serializedExpected;try{serializedExpected=JSON.stringify(predicate.expected)}catch{throw new Error(`Expected value for verdict predicate ${predicate.id} must be JSON serializable.`)}if(serializedExpected===void 0){throw new Error(`Expected value for verdict predicate ${predicate.id} must be JSON serializable.`)}}function defineVerdictContract(declaration){if(declaration.schema!==PM_VERDICT_SCHEMA){throw new Error(`verdict.schema must be ${PM_VERDICT_SCHEMA}.`)}assertNonEmpty(declaration.id,"verdict.id");assertPositiveInteger(declaration.version,"verdict.version");const predicateIds=new Set;for(const predicate of declaration.predicates){assertNonEmpty(predicate.id,"verdict.predicates.id");parseFieldPath(predicate.path,"verdict.predicates.path");const runtimeKind=predicate.kind;if(runtimeKind!=="field_equals"&&runtimeKind!=="field_present"&&runtimeKind!=="field_absent"){throw new Error(`Unsupported verdict predicate kind for ${predicate.id}.`)}if(predicateIds.has(predicate.id))throw new Error(`Duplicate verdict predicate: ${predicate.id}.`);assertPortableExpectedValue(predicate);predicateIds.add(predicate.id)}if(declaration.composition.operator!=="all"&&declaration.composition.operator!=="any"){throw new Error("verdict composition operator must be all or any.")}if(declaration.composition.predicate_ids.length!==declaration.predicates.length){throw new Error("verdict composition must reference every predicate exactly once.")}const compositionIds=new Set(declaration.composition.predicate_ids);if(compositionIds.size!==declaration.composition.predicate_ids.length||[...compositionIds].some(id=>!predicateIds.has(id))){throw new Error("verdict composition contains duplicate or unknown predicate ids.")}return frozenCopy(structuredClone(declaration))}function evaluateVerdictContract(contract,recorded){if(contract.predicates.length===0){return{contract_id:contract.id,contract_version:contract.version,snapshot_id:recorded.snapshot_id,outcome:"not_applicable",score:null,policy:"verdict_only_no_reward",reason:"no_predicates_declared",predicates:[]}}const byId=new Map(contract.predicates.map(predicate=>[predicate.id,predicate]));const predicates=contract.composition.predicate_ids.map(id=>{const predicate=byId.get(id);const observed=valueAtPath(recorded.state,predicate.path);const satisfied2=predicate.kind==="field_present"?observed!==void 0:predicate.kind==="field_absent"?observed===void 0:stableStringify(observed)===stableStringify(predicate.expected);return{id,outcome:satisfied2?"satisfied":"violated",evidence_pointer:`${recorded.snapshot_id}#${jsonPointer(predicate.path)}`,evidence_digest:sha256Hex(stableStringify(observed))}});const satisfiedCount=predicates.filter(predicate=>predicate.outcome==="satisfied").length;const satisfied=contract.composition.operator==="all"?satisfiedCount===predicates.length:satisfiedCount>0;return{contract_id:contract.id,contract_version:contract.version,snapshot_id:recorded.snapshot_id,outcome:satisfied?"satisfied":"violated",score:satisfiedCount/predicates.length,policy:"verdict_only_no_reward",predicates}}function defineEpisodeSpecification(declaration){if(declaration.schema!==PM_EPISODE_SCHEMA){throw new Error(`episode.schema must be ${PM_EPISODE_SCHEMA}.`)}assertNonEmpty(declaration.id,"episode.id");assertPositiveInteger(declaration.version,"episode.version");if(!["benchmark","evaluation","training","scale_transfer"].includes(declaration.mode)){throw new Error("episode.mode is not supported.")}if(declaration.task_item_ids.length===0){throw new Error("episode.task_item_ids must declare at least one pm item.")}for(const itemId of declaration.task_item_ids){assertNonEmpty(itemId,"episode.task_item_ids")}assertPositiveInteger(declaration.limits.max_actions,"episode.limits.max_actions");assertPositiveInteger(declaration.limits.max_observations,"episode.limits.max_observations");assertPositiveInteger(declaration.limits.max_tokens_per_observation,"episode.limits.max_tokens_per_observation");for(const field of declaration.observable_fields){parseFieldPath(field,"episode.observable_fields")}for(const field of declaration.withheld_fields){parseFieldPath(field,"episode.withheld_fields")}for(const observable of declaration.observable_fields){const overlap=declaration.withheld_fields.find(withheld=>observable===withheld||observable.startsWith(`${withheld}.`)||withheld.startsWith(`${observable}.`));if(overlap!==void 0){throw new Error(`Observable field ${observable} overlaps withheld field ${overlap}.`)}}for(const tier of declaration.observation.tiers){for(const field of tier.fields){if(!declaration.observable_fields.includes(field)){throw new Error(`Observation tier field ${field} is not declared observable.`)}}}defineObservationContract(declaration.observation);defineVerdictContract(declaration.verdict);defineWorkspaceRecipe(declaration.recipe);return frozenCopy(structuredClone(declaration))}function assignProjectedPath(target,path,value){const segments=parseFieldPath(path,"observation projection field");let cursor=target;for(const[index,segment]of segments.entries()){if(index===segments.length-1){if(value!==void 0)cursor[segment]=structuredClone(value);return}const nested=cursor[segment];if(nested===null||typeof nested!=="object"||Array.isArray(nested)){cursor[segment]={}}cursor=cursor[segment]}}function projectedState(state,fields){const result={};for(const field of fields)assignProjectedPath(result,field,valueAtPath(state,field));return result}async function openPmEpisode(specification,adapter){const trajectory=[];let actions=0;let observations=0;let closed=false;let closing;const context={episode:{id:specification.id,label:`pm agent environment v${specification.version}`},provenance:{role:specification.mode,topic:"agent-environment"}};const reset=await runWithAgentSessionContext(context,()=>adapter.reset(specification.recipe));trajectory.push({sequence:1,kind:"reset",state_id:reset.state_id});const readObservation=async()=>{if(closed)throw new Error("episode is already closed.");if(observations>=specification.limits.max_observations){throw new Error("episode exceeded limits.max_observations.")}observations+=1;const recorded=await adapter.readRecordedState();const result=await serveDeclaredObservation(specification.observation,async tier=>projectedState(recorded.state,tier.fields),{budget_tokens:specification.limits.max_tokens_per_observation});trajectory.push({sequence:trajectory.length+1,kind:"observation",state_id:result.receipt.served_tier??recorded.snapshot_id});return result};const evaluate=async(reservedForClose=false)=>{if(closed&&!reservedForClose)throw new Error("episode is already closed.");if(observations>=specification.limits.max_observations){throw new Error("episode exceeded limits.max_observations.")}observations+=1;const recorded=await adapter.readRecordedState();const result=evaluateVerdictContract(specification.verdict,recorded);trajectory.push({sequence:trajectory.length+1,kind:"verdict",state_id:recorded.snapshot_id});return result};return{observe:()=>runWithAgentSessionContext(context,readObservation),step:async action=>{if(closed)throw new Error("episode is already closed.");if(actions>=specification.limits.max_actions){throw new Error("episode exceeded limits.max_actions.")}actions+=1;const result=await runWithAgentSessionContext(context,()=>adapter.execute(action));trajectory.push({sequence:trajectory.length+1,kind:"action",state_id:result.state_id});return result},score:()=>runWithAgentSessionContext(context,evaluate),close:()=>{if(closing!==void 0)return closing;if(closed)return Promise.reject(new Error("episode is already closed."));closed=true;const operation=runWithAgentSessionContext(context,()=>evaluate(true)).then(verdict=>{trajectory.push({sequence:trajectory.length+1,kind:"close",state_id:verdict.snapshot_id});return{verdict,trajectory:frozenCopy(structuredClone(trajectory))}}).catch(error=>{closed=false;throw error});closing=operation.finally(()=>{closing=void 0});return closing}}}export{PM_EPISODE_SCHEMA,PM_OBSERVATION_SCHEMA,PM_VERDICT_SCHEMA,defineEpisodeSpecification,defineObservationContract,defineVerdictContract,describeObservationCost,evaluateVerdictContract,openPmEpisode,serveDeclaredObservation};
|
|
466
2
|
//# sourceMappingURL=agent-environment.js.map
|
|
467
|
-
//# debugId=38cb0b88-262f-5061-b95a-f4532bc52613
|
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/host-environment-errors
|
|
3
|
-
* Public SDK compatibility surface for path-redacted host filesystem refusals.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8a0d8f6e-f4ff-5a0c-9205-d28e03df72b9")}catch(e){}}();
|
|
7
|
-
export { classifyHostEnvironmentFault, translateHostEnvironmentFault, withHostEnvironmentBoundary, } from "../../core/fs/host-environment-errors.js";
|
|
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]="62b04ebf-f842-5a88-8817-ed9b17350034")}catch(e2){}})();import{classifyHostEnvironmentFault,translateHostEnvironmentFault,withHostEnvironmentBoundary}from"../../core/fs/host-environment-errors.js";export{classifyHostEnvironmentFault,translateHostEnvironmentFault,withHostEnvironmentBoundary};
|
|
8
2
|
//# sourceMappingURL=host-environment-errors.js.map
|
|
9
|
-
//# debugId=8a0d8f6e-f4ff-5a0c-9205-d28e03df72b9
|