@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,319 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Builds compact, cursor-bound historical rollups for large workspaces.
|
|
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]="ad77a79d-54da-55f1-8ac8-935366880d90")}catch(e){}}();
|
|
8
|
-
import path from "node:path";
|
|
9
|
-
import { createHash } from "node:crypto";
|
|
10
|
-
import { isFileAbsentError, writeFileAtomic } from "../core/fs/fs-utils.js";
|
|
11
|
-
import { normalizeStatusForRegistry } from "../core/item/status.js";
|
|
12
|
-
import { stableStringify } from "../core/shared/serialization.js";
|
|
13
|
-
import { readItemMetadataDerivedIndexState } from "../core/store/item-metadata-cache.js";
|
|
14
|
-
import { resolveCompletionTimestamp, } from "./lifecycle-completion.js";
|
|
15
|
-
import fs from "node:fs/promises";
|
|
16
|
-
const WORKSPACE_MEMORY_FORMAT_VERSION = 1;
|
|
17
|
-
/** Default corpus size at which historical rollups become more useful than raw closed rows. */
|
|
18
|
-
export const DEFAULT_WORKSPACE_MEMORY_MINIMUM_ITEMS = 10_000;
|
|
19
|
-
const DEFAULT_ROLLUP_LIMIT = 12;
|
|
20
|
-
function quarterKey(timestamp) {
|
|
21
|
-
const date = new Date(timestamp);
|
|
22
|
-
return `${date.getUTCFullYear()}-Q${Math.floor(date.getUTCMonth() / 3) + 1}`;
|
|
23
|
-
}
|
|
24
|
-
function nearestEpic(item, itemsById) {
|
|
25
|
-
const visited = new Set();
|
|
26
|
-
let parentId = item.parent;
|
|
27
|
-
while (parentId && !visited.has(parentId)) {
|
|
28
|
-
visited.add(parentId);
|
|
29
|
-
const parent = itemsById.get(parentId);
|
|
30
|
-
if (!parent)
|
|
31
|
-
return undefined;
|
|
32
|
-
if (parent.type.toLowerCase() === "epic")
|
|
33
|
-
return parent;
|
|
34
|
-
parentId = parent.parent;
|
|
35
|
-
}
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
function finalizeRollup(rollup) {
|
|
39
|
-
const ordered = [...rollup.items].sort((left, right) => {
|
|
40
|
-
const timestampOrder = right.completion.timestamp.localeCompare(left.completion.timestamp);
|
|
41
|
-
return timestampOrder || left.item.id.localeCompare(right.item.id);
|
|
42
|
-
});
|
|
43
|
-
const outcomes = new Set();
|
|
44
|
-
let knowledgeEntries = 0;
|
|
45
|
-
for (const { item } of ordered) {
|
|
46
|
-
const outcome = item.resolution ?? item.close_reason;
|
|
47
|
-
if (outcome?.trim())
|
|
48
|
-
outcomes.add(outcome.trim());
|
|
49
|
-
knowledgeEntries +=
|
|
50
|
-
(item.notes?.length ?? 0) + (item.learnings?.length ?? 0);
|
|
51
|
-
}
|
|
52
|
-
return {
|
|
53
|
-
kind: rollup.kind,
|
|
54
|
-
key: rollup.key,
|
|
55
|
-
label: rollup.label,
|
|
56
|
-
item_count: ordered.length,
|
|
57
|
-
first_closed_at: ordered.at(-1).completion.timestamp,
|
|
58
|
-
last_closed_at: ordered[0].completion.timestamp,
|
|
59
|
-
representative_items: ordered
|
|
60
|
-
.slice(0, 5)
|
|
61
|
-
.map(({ item: { id, title } }) => ({ id, title })),
|
|
62
|
-
outcomes: [...outcomes].sort().slice(0, 5),
|
|
63
|
-
knowledge_entries: knowledgeEntries,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Fold completed history into deterministic calendar-epoch and epic-lineage
|
|
68
|
-
* rollups. The projection contains only rebuildable summaries and bounded item
|
|
69
|
-
* references; authoritative item documents and history remain untouched.
|
|
70
|
-
*/
|
|
71
|
-
export function buildWorkspaceMemorySnapshot(items, options) {
|
|
72
|
-
if (!options.sourceCursor.trim()) {
|
|
73
|
-
throw new TypeError("Workspace memory source cursor must be non-empty");
|
|
74
|
-
}
|
|
75
|
-
if (!Number.isFinite(Date.parse(options.now))) {
|
|
76
|
-
throw new TypeError("Workspace memory clock must be a valid timestamp");
|
|
77
|
-
}
|
|
78
|
-
const completed = items
|
|
79
|
-
.filter((item) => options.statusRegistry.terminal_done_statuses.has(normalizeStatusForRegistry(item.status, options.statusRegistry)))
|
|
80
|
-
.map((item) => {
|
|
81
|
-
const completion = resolveCompletionTimestamp(item);
|
|
82
|
-
if (!completion.resolved) {
|
|
83
|
-
throw new TypeError(`Completed item ${item.id} has no reporting timestamp`);
|
|
84
|
-
}
|
|
85
|
-
return { item, completion };
|
|
86
|
-
});
|
|
87
|
-
const itemsById = new Map(items.map((item) => [item.id, item]));
|
|
88
|
-
const groups = new Map();
|
|
89
|
-
for (const completedItem of completed) {
|
|
90
|
-
const { item, completion } = completedItem;
|
|
91
|
-
const epoch = quarterKey(completion.timestamp);
|
|
92
|
-
const epochKey = `epoch:${epoch}`;
|
|
93
|
-
const epochRollup = groups.get(epochKey) ?? {
|
|
94
|
-
kind: "epoch",
|
|
95
|
-
key: epoch,
|
|
96
|
-
label: epoch,
|
|
97
|
-
items: [],
|
|
98
|
-
};
|
|
99
|
-
epochRollup.items.push(completedItem);
|
|
100
|
-
groups.set(epochKey, epochRollup);
|
|
101
|
-
const epic = nearestEpic(item, itemsById);
|
|
102
|
-
if (epic) {
|
|
103
|
-
const epicKey = `epic:${epic.id}`;
|
|
104
|
-
const epicRollup = groups.get(epicKey) ?? {
|
|
105
|
-
kind: "epic",
|
|
106
|
-
key: epic.id,
|
|
107
|
-
label: epic.title,
|
|
108
|
-
items: [],
|
|
109
|
-
};
|
|
110
|
-
epicRollup.items.push(completedItem);
|
|
111
|
-
groups.set(epicKey, epicRollup);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return {
|
|
115
|
-
format_version: WORKSPACE_MEMORY_FORMAT_VERSION,
|
|
116
|
-
source_cursor: options.sourceCursor,
|
|
117
|
-
source_item_count: items.length,
|
|
118
|
-
generated_at: options.now,
|
|
119
|
-
completion_time_sources: completed.reduce((counts, { completion }) => {
|
|
120
|
-
counts[completion.source] += 1;
|
|
121
|
-
return counts;
|
|
122
|
-
}, { completed_at: 0, closed_at: 0, updated_at: 0 }),
|
|
123
|
-
rollups: [...groups.values()]
|
|
124
|
-
.map(finalizeRollup)
|
|
125
|
-
.sort((left, right) => right.last_closed_at.localeCompare(left.last_closed_at) ||
|
|
126
|
-
left.kind.localeCompare(right.kind) ||
|
|
127
|
-
left.key.localeCompare(right.key)),
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
function isWorkspaceMemoryItemReference(value) {
|
|
131
|
-
return (typeof value === "object" &&
|
|
132
|
-
value !== null &&
|
|
133
|
-
"id" in value &&
|
|
134
|
-
typeof value.id === "string" &&
|
|
135
|
-
value.id.length > 0 &&
|
|
136
|
-
"title" in value &&
|
|
137
|
-
typeof value.title === "string");
|
|
138
|
-
}
|
|
139
|
-
function isWorkspaceMemoryRollup(value) {
|
|
140
|
-
if (typeof value !== "object" || value === null)
|
|
141
|
-
return false;
|
|
142
|
-
const rollup = value;
|
|
143
|
-
const textFields = [rollup.key, rollup.label].every((field) => typeof field === "string" && field.length > 0);
|
|
144
|
-
const timestamps = [rollup.first_closed_at, rollup.last_closed_at].every((timestamp) => typeof timestamp === "string" && Number.isFinite(Date.parse(timestamp)));
|
|
145
|
-
return ((rollup.kind === "epoch" || rollup.kind === "epic") &&
|
|
146
|
-
textFields &&
|
|
147
|
-
Number.isSafeInteger(rollup.item_count) &&
|
|
148
|
-
rollup.item_count > 0 &&
|
|
149
|
-
timestamps &&
|
|
150
|
-
Array.isArray(rollup.representative_items) &&
|
|
151
|
-
rollup.representative_items.every(isWorkspaceMemoryItemReference) &&
|
|
152
|
-
Array.isArray(rollup.outcomes) &&
|
|
153
|
-
rollup.outcomes.every((outcome) => typeof outcome === "string") &&
|
|
154
|
-
Number.isSafeInteger(rollup.knowledge_entries) &&
|
|
155
|
-
rollup.knowledge_entries >= 0);
|
|
156
|
-
}
|
|
157
|
-
function parseWorkspaceMemorySnapshot(value) {
|
|
158
|
-
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
159
|
-
return null;
|
|
160
|
-
}
|
|
161
|
-
const snapshot = value;
|
|
162
|
-
if (snapshot.format_version !== WORKSPACE_MEMORY_FORMAT_VERSION ||
|
|
163
|
-
typeof snapshot.source_cursor !== "string" ||
|
|
164
|
-
!snapshot.source_cursor.trim() ||
|
|
165
|
-
!Number.isSafeInteger(snapshot.source_item_count) ||
|
|
166
|
-
snapshot.source_item_count < 0 ||
|
|
167
|
-
typeof snapshot.generated_at !== "string" ||
|
|
168
|
-
!Number.isFinite(Date.parse(snapshot.generated_at)) ||
|
|
169
|
-
!Array.isArray(snapshot.rollups)) {
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
const valid = snapshot.rollups.every(isWorkspaceMemoryRollup);
|
|
173
|
-
return valid ? snapshot : null;
|
|
174
|
-
}
|
|
175
|
-
function fallbackSourceCursor(items) {
|
|
176
|
-
return `scan:${createHash("sha256")
|
|
177
|
-
.update(stableStringify(items
|
|
178
|
-
.map((item) => [item.id, item.updated_at, item.status, item.parent])
|
|
179
|
-
.sort(([left], [right]) => String(left).localeCompare(String(right)))))
|
|
180
|
-
.digest("hex")}`;
|
|
181
|
-
}
|
|
182
|
-
async function resolveWorkspaceMemorySourceCursor(items, pmRoot, explicitCursor) {
|
|
183
|
-
if (explicitCursor !== undefined)
|
|
184
|
-
return explicitCursor;
|
|
185
|
-
const indexState = await readItemMetadataDerivedIndexState(pmRoot);
|
|
186
|
-
return indexState?.source_cursor ?? fallbackSourceCursor(items);
|
|
187
|
-
}
|
|
188
|
-
async function readPersistedWorkspaceMemory(filePath) {
|
|
189
|
-
try {
|
|
190
|
-
const snapshot = parseWorkspaceMemorySnapshot(JSON.parse(await fs.readFile(filePath, "utf8")));
|
|
191
|
-
return { snapshot, invalid: snapshot === null };
|
|
192
|
-
}
|
|
193
|
-
catch (error) {
|
|
194
|
-
const missing = typeof error === "object" &&
|
|
195
|
-
error !== null &&
|
|
196
|
-
"code" in error &&
|
|
197
|
-
isFileAbsentError(error);
|
|
198
|
-
return { snapshot: null, invalid: !missing };
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/** Read a fresh cursor-bound projection or rebuild it from authoritative items. */
|
|
202
|
-
export async function readWorkspaceMemory(items, options) {
|
|
203
|
-
const minimumItems = Math.max(1, Math.floor(options.minimumItems ?? DEFAULT_WORKSPACE_MEMORY_MINIMUM_ITEMS));
|
|
204
|
-
if (items.length < minimumItems) {
|
|
205
|
-
return { snapshot: null, cache_status: "skipped", warnings: [] };
|
|
206
|
-
}
|
|
207
|
-
const sourceCursor = await resolveWorkspaceMemorySourceCursor(items, options.pmRoot, options.sourceCursor);
|
|
208
|
-
const filePath = path.join(options.pmRoot, "runtime", "workspace-memory.json");
|
|
209
|
-
const warnings = [];
|
|
210
|
-
const persisted = await readPersistedWorkspaceMemory(filePath);
|
|
211
|
-
const parsed = persisted.snapshot;
|
|
212
|
-
if (persisted.invalid)
|
|
213
|
-
warnings.push("workspace_memory_invalid");
|
|
214
|
-
if (parsed?.source_cursor === sourceCursor &&
|
|
215
|
-
parsed.source_item_count === items.length) {
|
|
216
|
-
return { snapshot: parsed, cache_status: "fresh", warnings };
|
|
217
|
-
}
|
|
218
|
-
if (parsed)
|
|
219
|
-
warnings.push("workspace_memory_stale");
|
|
220
|
-
const snapshot = buildWorkspaceMemorySnapshot(items, {
|
|
221
|
-
statusRegistry: options.statusRegistry,
|
|
222
|
-
sourceCursor,
|
|
223
|
-
now: options.now,
|
|
224
|
-
});
|
|
225
|
-
try {
|
|
226
|
-
await writeFileAtomic(filePath, `${JSON.stringify(snapshot)}\n`);
|
|
227
|
-
}
|
|
228
|
-
catch {
|
|
229
|
-
warnings.push("workspace_memory_write_failed");
|
|
230
|
-
}
|
|
231
|
-
return { snapshot, cache_status: "rebuilt", warnings };
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Select recent rollups within an approximate agent-token budget. Epoch and
|
|
235
|
-
* epic rows are interleaved by recency because snapshot order is deterministic.
|
|
236
|
-
*/
|
|
237
|
-
export function selectWorkspaceMemoryRollups(snapshot, tokenBudget, limit = DEFAULT_ROLLUP_LIMIT) {
|
|
238
|
-
const boundedBudget = Math.max(0, Math.floor(tokenBudget));
|
|
239
|
-
let consumed = 0;
|
|
240
|
-
const selected = [];
|
|
241
|
-
for (const rollup of snapshot.rollups) {
|
|
242
|
-
if (selected.length >= Math.max(0, Math.floor(limit)))
|
|
243
|
-
break;
|
|
244
|
-
const tokens = Math.ceil(JSON.stringify(rollup).length / 4);
|
|
245
|
-
if (consumed + tokens > boundedBudget)
|
|
246
|
-
continue;
|
|
247
|
-
selected.push(rollup);
|
|
248
|
-
consumed += tokens;
|
|
249
|
-
}
|
|
250
|
-
return selected;
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Convert a persisted read into a token-bounded context section. Small
|
|
254
|
-
* workspaces and empty token windows intentionally return no section.
|
|
255
|
-
*/
|
|
256
|
-
export function selectWorkspaceMemory(memory, tokenBudget, limit = DEFAULT_ROLLUP_LIMIT) {
|
|
257
|
-
if (memory.snapshot === null)
|
|
258
|
-
return undefined;
|
|
259
|
-
const rollups = selectWorkspaceMemoryRollups(memory.snapshot, tokenBudget, limit);
|
|
260
|
-
if (rollups.length === 0)
|
|
261
|
-
return undefined;
|
|
262
|
-
return {
|
|
263
|
-
cache_status: memory.cache_status === "fresh" ? "fresh" : "rebuilt",
|
|
264
|
-
source_cursor: memory.snapshot.source_cursor,
|
|
265
|
-
...(memory.snapshot.completion_time_sources
|
|
266
|
-
? {
|
|
267
|
-
completion_time_sources: {
|
|
268
|
-
...memory.snapshot.completion_time_sources,
|
|
269
|
-
},
|
|
270
|
-
}
|
|
271
|
-
: {}),
|
|
272
|
-
rollups,
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
/** Search derived rollups without expanding the authoritative closed corpus. */
|
|
276
|
-
export function searchWorkspaceMemory(snapshot, query, limit = 5) {
|
|
277
|
-
if (snapshot === null)
|
|
278
|
-
return [];
|
|
279
|
-
const tokens = query.trim().toLowerCase().split(/\s+/u).filter(Boolean);
|
|
280
|
-
if (tokens.length === 0)
|
|
281
|
-
return [];
|
|
282
|
-
return snapshot.rollups
|
|
283
|
-
.map((rollup) => ({
|
|
284
|
-
rollup,
|
|
285
|
-
score: tokens.filter((token) => [
|
|
286
|
-
rollup.key,
|
|
287
|
-
rollup.label,
|
|
288
|
-
...rollup.outcomes,
|
|
289
|
-
...rollup.representative_items.flatMap((item) => [
|
|
290
|
-
item.id,
|
|
291
|
-
item.title,
|
|
292
|
-
]),
|
|
293
|
-
]
|
|
294
|
-
.join(" ")
|
|
295
|
-
.toLowerCase()
|
|
296
|
-
.includes(token)).length,
|
|
297
|
-
}))
|
|
298
|
-
.filter(({ score }) => score > 0)
|
|
299
|
-
.sort((left, right) => right.score - left.score ||
|
|
300
|
-
right.rollup.last_closed_at.localeCompare(left.rollup.last_closed_at) ||
|
|
301
|
-
left.rollup.key.localeCompare(right.rollup.key))
|
|
302
|
-
.slice(0, Math.max(0, Math.floor(limit)))
|
|
303
|
-
.map(({ rollup }) => rollup);
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Convert a persisted read into bounded query matches. Small workspaces and
|
|
307
|
-
* unmatched queries intentionally return no section.
|
|
308
|
-
*/
|
|
309
|
-
export function searchWorkspaceMemoryReadResult(memory, query, limit = 5) {
|
|
310
|
-
const matches = searchWorkspaceMemory(memory.snapshot, query, limit);
|
|
311
|
-
if (matches.length === 0)
|
|
312
|
-
return undefined;
|
|
313
|
-
return {
|
|
314
|
-
cache_status: memory.cache_status === "fresh" ? "fresh" : "rebuilt",
|
|
315
|
-
matches,
|
|
316
|
-
};
|
|
317
|
-
}
|
|
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]="51bac04a-5a6e-53b3-806f-fa0bf6f8e7b4")}catch(e2){}})();import path from"node:path";import{createHash}from"node:crypto";import{isFileAbsentError,writeFileAtomic}from"../core/fs/fs-utils.js";import{normalizeStatusForRegistry}from"../core/item/status.js";import{stableStringify}from"../core/shared/serialization.js";import{readItemMetadataDerivedIndexState}from"../core/store/item-metadata-cache.js";import{resolveCompletionTimestamp}from"./lifecycle-completion.js";import fs from"node:fs/promises";const WORKSPACE_MEMORY_FORMAT_VERSION=1;const DEFAULT_WORKSPACE_MEMORY_MINIMUM_ITEMS=1e4;const DEFAULT_ROLLUP_LIMIT=12;function quarterKey(timestamp){const date=new Date(timestamp);return`${date.getUTCFullYear()}-Q${Math.floor(date.getUTCMonth()/3)+1}`}function nearestEpic(item,itemsById){const visited=new Set;let parentId=item.parent;while(parentId&&!visited.has(parentId)){visited.add(parentId);const parent=itemsById.get(parentId);if(!parent)return void 0;if(parent.type.toLowerCase()==="epic")return parent;parentId=parent.parent}return void 0}function finalizeRollup(rollup){const ordered=[...rollup.items].sort((left,right)=>{const timestampOrder=right.completion.timestamp.localeCompare(left.completion.timestamp);return timestampOrder||left.item.id.localeCompare(right.item.id)});const outcomes=new Set;let knowledgeEntries=0;for(const{item}of ordered){const outcome=item.resolution??item.close_reason;if(outcome?.trim())outcomes.add(outcome.trim());knowledgeEntries+=(item.notes?.length??0)+(item.learnings?.length??0)}return{kind:rollup.kind,key:rollup.key,label:rollup.label,item_count:ordered.length,first_closed_at:ordered.at(-1).completion.timestamp,last_closed_at:ordered[0].completion.timestamp,representative_items:ordered.slice(0,5).map(({item:{id,title}})=>({id,title})),outcomes:[...outcomes].sort().slice(0,5),knowledge_entries:knowledgeEntries}}function buildWorkspaceMemorySnapshot(items,options){if(!options.sourceCursor.trim()){throw new TypeError("Workspace memory source cursor must be non-empty")}if(!Number.isFinite(Date.parse(options.now))){throw new TypeError("Workspace memory clock must be a valid timestamp")}const completed=items.filter(item=>options.statusRegistry.terminal_done_statuses.has(normalizeStatusForRegistry(item.status,options.statusRegistry))).map(item=>{const completion=resolveCompletionTimestamp(item);if(!completion.resolved){throw new TypeError(`Completed item ${item.id} has no reporting timestamp`)}return{item,completion}});const itemsById=new Map(items.map(item=>[item.id,item]));const groups=new Map;for(const completedItem of completed){const{item,completion}=completedItem;const epoch=quarterKey(completion.timestamp);const epochKey=`epoch:${epoch}`;const epochRollup=groups.get(epochKey)??{kind:"epoch",key:epoch,label:epoch,items:[]};epochRollup.items.push(completedItem);groups.set(epochKey,epochRollup);const epic=nearestEpic(item,itemsById);if(epic){const epicKey=`epic:${epic.id}`;const epicRollup=groups.get(epicKey)??{kind:"epic",key:epic.id,label:epic.title,items:[]};epicRollup.items.push(completedItem);groups.set(epicKey,epicRollup)}}return{format_version:WORKSPACE_MEMORY_FORMAT_VERSION,source_cursor:options.sourceCursor,source_item_count:items.length,generated_at:options.now,completion_time_sources:completed.reduce((counts,{completion})=>{counts[completion.source]+=1;return counts},{completed_at:0,closed_at:0,updated_at:0}),rollups:[...groups.values()].map(finalizeRollup).sort((left,right)=>right.last_closed_at.localeCompare(left.last_closed_at)||left.kind.localeCompare(right.kind)||left.key.localeCompare(right.key))}}function isWorkspaceMemoryItemReference(value){return typeof value==="object"&&value!==null&&"id"in value&&typeof value.id==="string"&&value.id.length>0&&"title"in value&&typeof value.title==="string"}function isWorkspaceMemoryRollup(value){if(typeof value!=="object"||value===null)return false;const rollup=value;const textFields=[rollup.key,rollup.label].every(field=>typeof field==="string"&&field.length>0);const timestamps=[rollup.first_closed_at,rollup.last_closed_at].every(timestamp=>typeof timestamp==="string"&&Number.isFinite(Date.parse(timestamp)));return(rollup.kind==="epoch"||rollup.kind==="epic")&&textFields&&Number.isSafeInteger(rollup.item_count)&&rollup.item_count>0&×tamps&&Array.isArray(rollup.representative_items)&&rollup.representative_items.every(isWorkspaceMemoryItemReference)&&Array.isArray(rollup.outcomes)&&rollup.outcomes.every(outcome=>typeof outcome==="string")&&Number.isSafeInteger(rollup.knowledge_entries)&&rollup.knowledge_entries>=0}function parseWorkspaceMemorySnapshot(value){if(typeof value!=="object"||value===null||Array.isArray(value)){return null}const snapshot=value;if(snapshot.format_version!==WORKSPACE_MEMORY_FORMAT_VERSION||typeof snapshot.source_cursor!=="string"||!snapshot.source_cursor.trim()||!Number.isSafeInteger(snapshot.source_item_count)||snapshot.source_item_count<0||typeof snapshot.generated_at!=="string"||!Number.isFinite(Date.parse(snapshot.generated_at))||!Array.isArray(snapshot.rollups)){return null}const valid=snapshot.rollups.every(isWorkspaceMemoryRollup);return valid?snapshot:null}function fallbackSourceCursor(items){return`scan:${createHash("sha256").update(stableStringify(items.map(item=>[item.id,item.updated_at,item.status,item.parent]).sort(([left],[right])=>String(left).localeCompare(String(right))))).digest("hex")}`}async function resolveWorkspaceMemorySourceCursor(items,pmRoot,explicitCursor){if(explicitCursor!==void 0)return explicitCursor;const indexState=await readItemMetadataDerivedIndexState(pmRoot);return indexState?.source_cursor??fallbackSourceCursor(items)}async function readPersistedWorkspaceMemory(filePath){try{const snapshot=parseWorkspaceMemorySnapshot(JSON.parse(await fs.readFile(filePath,"utf8")));return{snapshot,invalid:snapshot===null}}catch(error){const missing=typeof error==="object"&&error!==null&&"code"in error&&isFileAbsentError(error);return{snapshot:null,invalid:!missing}}}async function readWorkspaceMemory(items,options){const minimumItems=Math.max(1,Math.floor(options.minimumItems??DEFAULT_WORKSPACE_MEMORY_MINIMUM_ITEMS));if(items.length<minimumItems){return{snapshot:null,cache_status:"skipped",warnings:[]}}const sourceCursor=await resolveWorkspaceMemorySourceCursor(items,options.pmRoot,options.sourceCursor);const filePath=path.join(options.pmRoot,"runtime","workspace-memory.json");const warnings=[];const persisted=await readPersistedWorkspaceMemory(filePath);const parsed=persisted.snapshot;if(persisted.invalid)warnings.push("workspace_memory_invalid");if(parsed?.source_cursor===sourceCursor&&parsed.source_item_count===items.length){return{snapshot:parsed,cache_status:"fresh",warnings}}if(parsed)warnings.push("workspace_memory_stale");const snapshot=buildWorkspaceMemorySnapshot(items,{statusRegistry:options.statusRegistry,sourceCursor,now:options.now});try{await writeFileAtomic(filePath,`${JSON.stringify(snapshot)}
|
|
2
|
+
`)}catch{warnings.push("workspace_memory_write_failed")}return{snapshot,cache_status:"rebuilt",warnings}}function selectWorkspaceMemoryRollups(snapshot,tokenBudget,limit=DEFAULT_ROLLUP_LIMIT){const boundedBudget=Math.max(0,Math.floor(tokenBudget));let consumed=0;const selected=[];for(const rollup of snapshot.rollups){if(selected.length>=Math.max(0,Math.floor(limit)))break;const tokens=Math.ceil(JSON.stringify(rollup).length/4);if(consumed+tokens>boundedBudget)continue;selected.push(rollup);consumed+=tokens}return selected}function selectWorkspaceMemory(memory,tokenBudget,limit=DEFAULT_ROLLUP_LIMIT){if(memory.snapshot===null)return void 0;const rollups=selectWorkspaceMemoryRollups(memory.snapshot,tokenBudget,limit);if(rollups.length===0)return void 0;return{cache_status:memory.cache_status==="fresh"?"fresh":"rebuilt",source_cursor:memory.snapshot.source_cursor,...memory.snapshot.completion_time_sources?{completion_time_sources:{...memory.snapshot.completion_time_sources}}:{},rollups}}function searchWorkspaceMemory(snapshot,query,limit=5){if(snapshot===null)return[];const tokens=query.trim().toLowerCase().split(/\s+/u).filter(Boolean);if(tokens.length===0)return[];return snapshot.rollups.map(rollup=>({rollup,score:tokens.filter(token=>[rollup.key,rollup.label,...rollup.outcomes,...rollup.representative_items.flatMap(item=>[item.id,item.title])].join(" ").toLowerCase().includes(token)).length})).filter(({score})=>score>0).sort((left,right)=>right.score-left.score||right.rollup.last_closed_at.localeCompare(left.rollup.last_closed_at)||left.rollup.key.localeCompare(right.rollup.key)).slice(0,Math.max(0,Math.floor(limit))).map(({rollup})=>rollup)}function searchWorkspaceMemoryReadResult(memory,query,limit=5){const matches=searchWorkspaceMemory(memory.snapshot,query,limit);if(matches.length===0)return void 0;return{cache_status:memory.cache_status==="fresh"?"fresh":"rebuilt",matches}}export{DEFAULT_WORKSPACE_MEMORY_MINIMUM_ITEMS,buildWorkspaceMemorySnapshot,readWorkspaceMemory,searchWorkspaceMemory,searchWorkspaceMemoryReadResult,selectWorkspaceMemory,selectWorkspaceMemoryRollups};
|
|
318
3
|
//# sourceMappingURL=workspace-memory.js.map
|
|
319
|
-
//# debugId=ad77a79d-54da-55f1-8ac8-935366880d90
|
|
@@ -1,72 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* @module sdk/workspace-recipe
|
|
3
|
-
*
|
|
4
|
-
* Defines serializable, versioned recipes for byte-reproducible pm workspace
|
|
5
|
-
* executions in tests, examples, migrations, and package-author tooling.
|
|
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]="f48b9002-59dc-54d3-95de-36bf0d11b39a")}catch(e){}}();
|
|
9
|
-
import { runWithReproducibleExecution, validateReproducibleExecutionSettings, } from "../core/reproducibility/context.js";
|
|
10
|
-
/** Current workspace recipe schema identifier. */
|
|
11
|
-
export const PM_WORKSPACE_RECIPE_SCHEMA = "https://schema.unbrained.dev/pm/workspace-recipe/v1";
|
|
12
|
-
function cloneAndFreezeRecipeJson(value, location) {
|
|
13
|
-
if (value === null ||
|
|
14
|
-
typeof value === "boolean" ||
|
|
15
|
-
typeof value === "string") {
|
|
16
|
-
return value;
|
|
17
|
-
}
|
|
18
|
-
if (typeof value === "number") {
|
|
19
|
-
if (!Number.isFinite(value)) {
|
|
20
|
-
throw new Error(`Workspace recipe JSON number must be finite at ${location}`);
|
|
21
|
-
}
|
|
22
|
-
return value;
|
|
23
|
-
}
|
|
24
|
-
if (Array.isArray(value)) {
|
|
25
|
-
return Object.freeze(value.map((entry, index) => cloneAndFreezeRecipeJson(entry, `${location}[${index}]`)));
|
|
26
|
-
}
|
|
27
|
-
if (typeof value !== "object" ||
|
|
28
|
-
(Object.getPrototypeOf(value) !== Object.prototype &&
|
|
29
|
-
Object.getPrototypeOf(value) !== null)) {
|
|
30
|
-
throw new Error(`Workspace recipe input must contain JSON values at ${location}`);
|
|
31
|
-
}
|
|
32
|
-
return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, entry]) => [
|
|
33
|
-
key,
|
|
34
|
-
cloneAndFreezeRecipeJson(entry, `${location}.${key}`),
|
|
35
|
-
])));
|
|
36
|
-
}
|
|
37
|
-
/** Validate and freeze a caller-authored reproducible workspace recipe. */
|
|
38
|
-
export function defineWorkspaceRecipe(recipe) {
|
|
39
|
-
if (recipe.schema !== PM_WORKSPACE_RECIPE_SCHEMA) {
|
|
40
|
-
throw new Error(`Unsupported workspace recipe schema: ${recipe.schema}`);
|
|
41
|
-
}
|
|
42
|
-
const normalized = validateReproducibleExecutionSettings(recipe);
|
|
43
|
-
if (recipe.operations.some((operation) => operation.action.trim().length === 0 ||
|
|
44
|
-
operation.input === null ||
|
|
45
|
-
Array.isArray(operation.input))) {
|
|
46
|
-
throw new Error("Workspace recipe operations require an action and object input");
|
|
47
|
-
}
|
|
48
|
-
return Object.freeze({
|
|
49
|
-
...normalized,
|
|
50
|
-
operations: Object.freeze(recipe.operations.map((operation, index) => Object.freeze({
|
|
51
|
-
action: operation.action,
|
|
52
|
-
input: cloneAndFreezeRecipeJson(operation.input, `operations[${index}].input`),
|
|
53
|
-
}))),
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
/** Run arbitrary SDK work under the recipe's deterministic clock and entropy. */
|
|
57
|
-
export async function runWithWorkspaceRecipe(recipe, operation) {
|
|
58
|
-
const defined = defineWorkspaceRecipe(recipe);
|
|
59
|
-
return runWithReproducibleExecution(defined, operation);
|
|
60
|
-
}
|
|
61
|
-
/** Replay every declared recipe operation with a caller-provided dispatcher. */
|
|
62
|
-
export async function executeWorkspaceRecipe(recipe, execute) {
|
|
63
|
-
return runWithWorkspaceRecipe(recipe, async () => {
|
|
64
|
-
const results = [];
|
|
65
|
-
for (const [index, operation] of recipe.operations.entries()) {
|
|
66
|
-
results.push(await execute(operation, index));
|
|
67
|
-
}
|
|
68
|
-
return results;
|
|
69
|
-
});
|
|
70
|
-
}
|
|
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]="76fdc288-42b3-52b9-adc7-81e504f23ae3")}catch(e2){}})();import{runWithReproducibleExecution,validateReproducibleExecutionSettings}from"../core/reproducibility/context.js";const PM_WORKSPACE_RECIPE_SCHEMA="https://schema.unbrained.dev/pm/workspace-recipe/v1";function cloneAndFreezeRecipeJson(value,location){if(value===null||typeof value==="boolean"||typeof value==="string"){return value}if(typeof value==="number"){if(!Number.isFinite(value)){throw new Error(`Workspace recipe JSON number must be finite at ${location}`)}return value}if(Array.isArray(value)){return Object.freeze(value.map((entry,index)=>cloneAndFreezeRecipeJson(entry,`${location}[${index}]`)))}if(typeof value!=="object"||Object.getPrototypeOf(value)!==Object.prototype&&Object.getPrototypeOf(value)!==null){throw new Error(`Workspace recipe input must contain JSON values at ${location}`)}return Object.freeze(Object.fromEntries(Object.entries(value).map(([key,entry])=>[key,cloneAndFreezeRecipeJson(entry,`${location}.${key}`)])))}function defineWorkspaceRecipe(recipe){if(recipe.schema!==PM_WORKSPACE_RECIPE_SCHEMA){throw new Error(`Unsupported workspace recipe schema: ${recipe.schema}`)}const normalized=validateReproducibleExecutionSettings(recipe);if(recipe.operations.some(operation=>operation.action.trim().length===0||operation.input===null||Array.isArray(operation.input))){throw new Error("Workspace recipe operations require an action and object input")}return Object.freeze({...normalized,operations:Object.freeze(recipe.operations.map((operation,index)=>Object.freeze({action:operation.action,input:cloneAndFreezeRecipeJson(operation.input,`operations[${index}].input`)})))})}async function runWithWorkspaceRecipe(recipe,operation){const defined=defineWorkspaceRecipe(recipe);return runWithReproducibleExecution(defined,operation)}async function executeWorkspaceRecipe(recipe,execute){return runWithWorkspaceRecipe(recipe,async()=>{const results=[];for(const[index,operation]of recipe.operations.entries()){results.push(await execute(operation,index))}return results})}export{PM_WORKSPACE_RECIPE_SCHEMA,defineWorkspaceRecipe,executeWorkspaceRecipe,runWithWorkspaceRecipe};
|
|
71
2
|
//# sourceMappingURL=workspace-recipe.js.map
|
|
72
|
-
//# debugId=f48b9002-59dc-54d3-95de-36bf0d11b39a
|