@unbrained/pm-cli 2026.9.12 → 2026.9.13

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.
Files changed (100) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +20 -0
  3. package/dist/cli/command-namespaces.js +1 -1
  4. package/dist/cli/commander-usage.js +2 -2
  5. package/dist/cli/error-guidance.js +1 -1
  6. package/dist/cli/main.js +2 -2
  7. package/dist/cli-bundle/bundle-manifest.json +151 -151
  8. package/dist/cli-bundle/chunks/{chunk-2JAY4LFI.js → chunk-3DWX3CKN.js} +2 -2
  9. package/dist/cli-bundle/chunks/chunk-6KHYW3FH.js +235 -0
  10. package/dist/cli-bundle/chunks/chunk-AKTBOX6U.js +2 -0
  11. package/dist/cli-bundle/chunks/{chunk-X6POOZKD.js → chunk-GBK5MV6N.js} +29 -29
  12. package/dist/cli-bundle/chunks/{chunk-I6VQUHK6.js → chunk-GQQR6JAL.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-3ZJDGTYC.js → chunk-KM4XVZR7.js} +2 -2
  14. package/dist/cli-bundle/chunks/{chunk-TAGDYARO.js → chunk-LA44JECQ.js} +2 -2
  15. package/dist/cli-bundle/chunks/{chunk-67H4PKQ5.js → chunk-XEZOGC3P.js} +2 -2
  16. package/dist/cli-bundle/chunks/{chunk-YU75JRTW.js → chunk-XM7RWQLM.js} +43 -43
  17. package/dist/cli-bundle/chunks/{chunk-GKY655T7.js → chunk-YDSV4QIQ.js} +2 -2
  18. package/dist/cli-bundle/chunks/{chunk-7KF6HCRC.js → chunk-YQTJACN5.js} +2 -2
  19. package/dist/cli-bundle/chunks/{chunk-7H33WPDF.js → chunk-ZZI7IHMM.js} +2 -2
  20. package/dist/cli-bundle/chunks/{register-list-query-KEZPDR6X.js → register-list-query-WMJTBWNW.js} +2 -2
  21. package/dist/cli-bundle/chunks/{register-mutation-HEXA3ZDM.js → register-mutation-EXGOXP3D.js} +2 -2
  22. package/dist/cli-bundle/chunks/{register-operations-TEZT65JF.js → register-operations-2H4CDRGU.js} +2 -2
  23. package/dist/cli-bundle/chunks/{register-setup-IIL74WUG.js → register-setup-NYBWGPOS.js} +2 -2
  24. package/dist/cli-bundle/focused-chunks/{chunk-BIOWOU6S.js → chunk-7JR6M2JR.js} +2 -2
  25. package/dist/cli-bundle/focused-chunks/{chunk-PERRTPIY.js → chunk-B6JAANOH.js} +2 -2
  26. package/dist/cli-bundle/focused-chunks/{chunk-KK7KSXUP.js → chunk-DSJYL4VP.js} +2 -2
  27. package/dist/cli-bundle/focused-chunks/{chunk-2BQ4JSJQ.js → chunk-F66QJWI4.js} +2 -2
  28. package/dist/cli-bundle/focused-chunks/{chunk-LWJBBM6X.js → chunk-FBCLVOBE.js} +2 -2
  29. package/dist/cli-bundle/focused-chunks/{chunk-IURELABV.js → chunk-FPNI4U2B.js} +2 -2
  30. package/dist/cli-bundle/focused-chunks/{chunk-5PSYV3AT.js → chunk-KP3N6PVZ.js} +2 -2
  31. package/dist/cli-bundle/focused-chunks/{chunk-MFVABYEU.js → chunk-LQ67C7ZO.js} +2 -2
  32. package/dist/cli-bundle/focused-chunks/{chunk-TTRB47KM.js → chunk-OENAWWP4.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/{chunk-7EKXAUKF.js → chunk-SDQCJF4H.js} +53 -53
  34. package/dist/cli-bundle/focused-chunks/{chunk-YNBACVQ2.js → chunk-TUHRUFID.js} +2 -2
  35. package/dist/cli-bundle/focused-chunks/{chunk-EIXGDI77.js → chunk-V7PSTKHD.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-SDQOOL34.js → chunk-XCCM7P7V.js} +2 -2
  37. package/dist/cli-bundle/focused-chunks/chunk-YUXBHIUV.js +20 -0
  38. package/dist/cli-bundle/focused-chunks/{chunk-5CRND7UA.js → chunk-ZAMG7HBB.js} +2 -2
  39. package/dist/cli-bundle/focused-chunks/chunk-ZF5PXK6A.js +2 -0
  40. package/dist/cli-bundle/main.js +20 -20
  41. package/dist/cli-bundle/sdk-authoring.js +1 -1
  42. package/dist/cli-bundle/sdk-contracts.js +2 -2
  43. package/dist/cli-bundle/sdk-core.js +28 -28
  44. package/dist/cli-bundle/sdk-governance.js +1 -1
  45. package/dist/cli-bundle/sdk-graph.js +1 -1
  46. package/dist/cli-bundle/sdk-merge.js +42 -42
  47. package/dist/cli-bundle/sdk-query.js +1 -1
  48. package/dist/cli-bundle/sdk-runtime.js +1 -1
  49. package/dist/cli-bundle/sdk-testing.js +1 -1
  50. package/dist/cli-bundle/sdk.js +6 -6
  51. package/dist/core/sentry/instrument.js +1 -1
  52. package/dist/core/telemetry/consent.d.ts +1 -1
  53. package/dist/core/telemetry/consent.js +2 -2
  54. package/dist/core/telemetry/policy.d.ts +10 -0
  55. package/dist/core/telemetry/policy.js +2 -0
  56. package/dist/core/telemetry/runtime.d.ts +11 -9
  57. package/dist/core/telemetry/runtime.js +3 -3
  58. package/dist/sdk/agent/command-suggestions.js +1 -1
  59. package/dist/sdk/agent/item-addressing.js +1 -1
  60. package/dist/sdk/agent-capability-contracts.js +1 -1
  61. package/dist/sdk/cli-bootstrap.js +1 -1
  62. package/dist/sdk/cli-contracts/command-aliases.js +1 -1
  63. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
  64. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -1
  65. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
  66. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
  67. package/dist/sdk/completion.js +1 -1
  68. package/dist/sdk/governance/health.js +1 -1
  69. package/dist/sdk/public-surface.json +1 -1
  70. package/dist/sdk/telemetry.d.ts +5 -0
  71. package/dist/sdk/telemetry.js +1 -1
  72. package/docs/CLI_GRAMMAR.md +31 -0
  73. package/docs/COMMAND_NAMESPACES.md +7 -4
  74. package/docs/CONFIGURATION.md +13 -2
  75. package/docs/generated/AGENT_CAPABILITY_ROUTING.md +4 -4
  76. package/docs/generated/AGENT_COMMAND_SURFACE.md +10 -0
  77. package/docs/generated/FLAG_LEXICON_BUDGETS.md +11 -1
  78. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
  79. package/marketplace.json +2 -2
  80. package/package.json +1 -1
  81. package/packages/pm-beads/package.json +1 -1
  82. package/packages/pm-calendar/package.json +1 -1
  83. package/packages/pm-command-kit/package.json +1 -1
  84. package/packages/pm-digital-twin/package.json +1 -1
  85. package/packages/pm-governance-audit/package.json +1 -1
  86. package/packages/pm-guide-shell/extensions/guide-shell/index.ts +13 -26
  87. package/packages/pm-guide-shell/package.json +1 -1
  88. package/packages/pm-kanban/package.json +1 -1
  89. package/packages/pm-lifecycle-hooks/package.json +1 -1
  90. package/packages/pm-linked-test-adapters/package.json +1 -1
  91. package/packages/pm-search-advanced/package.json +1 -1
  92. package/packages/pm-templates/package.json +1 -1
  93. package/packages/pm-todos/package.json +1 -1
  94. package/packages/pm-vcs/package.json +1 -1
  95. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  96. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  97. package/dist/cli-bundle/chunks/chunk-DEGRLB6Y.js +0 -235
  98. package/dist/cli-bundle/chunks/chunk-PTX2JRFR.js +0 -2
  99. package/dist/cli-bundle/focused-chunks/chunk-GAKFECOQ.js +0 -2
  100. package/dist/cli-bundle/focused-chunks/chunk-VWMP6W7Y.js +0 -20
@@ -1,4 +1,4 @@
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]="e647e6ab-8b0b-599a-afa5-334a20354f1b")}catch(e2){}})();import{PM_COMMAND_DESTINATION_CONTRACTS}from"./cli-contracts/grammar-contracts.js";import{WORKFLOW_POLICY_ACTIONS}from"./cli-contracts/enum-contracts.js";import{EXIT_CODE,PmCliError}from"./runtime-primitives.js";import{listPmCommandsForTier}from"./agent-capability-contracts.js";import{SCAFFOLD_CAPABILITIES}from"./extension/scaffold.js";import{AGGREGATE_FLAG_CONTRACTS,APPEND_FLAG_CONTRACTS,CALENDAR_FLAG_CONTRACTS,CLOSE_MANY_FLAG_CONTRACTS,COMPLETION_FLAG_CONTRACTS,CONTRACTS_FLAG_CONTRACTS,CONTEXT_FLAG_CONTRACTS,COPY_FLAG_CONTRACTS,FOCUS_FLAG_CONTRACTS,MEET_FLAG_CONTRACTS,REMIND_FLAG_CONTRACTS,CREATE_FLAG_CONTRACTS,DEPS_FLAG_CONTRACTS,DUPLICATES_FLAG_CONTRACTS,EXTENSION_FLAG_CONTRACTS,GRAPH_FLAG_CONTRACTS,GET_FLAG_CONTRACTS,GUIDE_FLAG_CONTRACTS,GLOBAL_FLAG_CONTRACTS,HEALTH_FLAG_CONTRACTS,HISTORY_AUTHOR_ACKNOWLEDGE_FLAG_CONTRACTS,HISTORY_FLAG_CONTRACTS,INIT_FLAG_CONTRACTS,LIST_FILTER_FLAG_CONTRACTS,NEXT_FLAG_CONTRACTS,PM_COMMAND_ALIAS_CONTRACTS,resolvePmCommandOperation,PM_NAMESPACED_COMMAND_ALIASES,resolveSubcommandFlagContractsForCommand,PACKAGE_FLAG_CONTRACTS,PLAN_FLAG_CONTRACTS,SEARCH_FLAG_CONTRACTS,STATS_FLAG_CONTRACTS,EVENTS_FLAG_CONTRACTS,UPDATE_FLAG_CONTRACTS,UPDATE_MANY_FLAG_CONTRACTS,UPGRADE_FLAG_CONTRACTS,toCompletionFlagString}from"./cli-contracts.js";import{BUILTIN_ITEM_TYPE_VALUES,STATUS_VALUES}from"../types/index.js";import{listGuideTopicIds}from"./guide-topics.js";import{enrichCliFlagInvocationContracts}from"./flag-invocation-contracts.js";import{GLOBAL_VALUE_CONSUMING_FLAGS}from"./cli-contracts/bootstrap-command-scanner.js";const VALID_SHELLS=["bash","zsh","fish"];const DEFAULT_ITEM_TYPES=[...BUILTIN_ITEM_TYPE_VALUES];const DEFAULT_STATUS_VALUES=[...STATUS_VALUES];const HIDDEN_COMMAND_ALIASES=new Set(PM_COMMAND_ALIAS_CONTRACTS.filter(contract=>contract.hidden).map(contract=>contract.alias));const ALL_COMMANDS=listPmCommandsForTier("full").filter(command=>!command.includes(" ")&&!HIDDEN_COMMAND_ALIASES.has(command));const LIST_FLAGS=toCompletionFlagString(LIST_FILTER_FLAG_CONTRACTS);const AGGREGATE_FLAGS=toCompletionFlagString(AGGREGATE_FLAG_CONTRACTS);const APPEND_FLAGS=toCompletionFlagString(APPEND_FLAG_CONTRACTS);const COPY_FLAGS=toCompletionFlagString(COPY_FLAG_CONTRACTS);const RESTORE_INVOCATIONS=enrichCliFlagInvocationContracts("restore",resolveSubcommandFlagContractsForCommand("restore"));const ATTEST_INVOCATIONS=enrichCliFlagInvocationContracts("history-attest",resolveSubcommandFlagContractsForCommand("history-attest"));const FOCUS_FLAGS=toCompletionFlagString(FOCUS_FLAG_CONTRACTS);const MEET_FLAGS=toCompletionFlagString(MEET_FLAG_CONTRACTS);const REMIND_FLAGS=toCompletionFlagString(REMIND_FLAG_CONTRACTS);const CREATE_FLAGS=toCompletionFlagString(CREATE_FLAG_CONTRACTS);const GET_FLAGS=toCompletionFlagString(GET_FLAG_CONTRACTS);const UPDATE_FLAGS=toCompletionFlagString(UPDATE_FLAG_CONTRACTS);const UPDATE_MANY_FLAGS=toCompletionFlagString(UPDATE_MANY_FLAG_CONTRACTS);const CLOSE_MANY_FLAGS=toCompletionFlagString(CLOSE_MANY_FLAG_CONTRACTS);const NAMESPACE_NOUNS=[...new Set(PM_NAMESPACED_COMMAND_ALIASES.map(entry=>entry.canonical_argv[0]))];const NAMESPACE_PREFIXES=[...new Set(PM_NAMESPACED_COMMAND_ALIASES.flatMap(entry=>entry.canonical_argv.slice(0,-1).map((_,index)=>entry.canonical_argv.slice(0,index+1).join(" "))))];const PACKAGE_NAMESPACE_OPERATIONS=new Set(PM_COMMAND_DESTINATION_CONTRACTS.filter(entry=>entry.disposition==="package_owned").map(entry=>resolvePmCommandOperation(entry.command)));const HISTORY_COMPLETION_ALIASES=PM_NAMESPACED_COMMAND_ALIASES.filter(entry=>entry.canonical_argv[0]==="history");const HISTORY_LEAVES=HISTORY_COMPLETION_ALIASES.map(entry=>entry.canonical_argv[1]).join(" ");function completionNamespaceLeaves(runtime){const available=new Set((runtime.namespace_commands??[]).map(resolvePmCommandOperation));const aliases=PM_NAMESPACED_COMMAND_ALIASES.filter(entry=>!PACKAGE_NAMESPACE_OPERATIONS.has(entry.alias)||available.has(entry.alias));return Object.fromEntries(NAMESPACE_PREFIXES.map(prefix=>[prefix,[...new Set(aliases.filter(entry=>entry.canonical.startsWith(`${prefix} `)).map(entry=>entry.canonical_argv[prefix.split(" ").length]))].join(" ")]))}const HISTORY_OPERATION_FLAGS=HISTORY_COMPLETION_ALIASES.map(entry=>({...entry,flags:toCompletionFlagString(resolveSubcommandFlagContractsForCommand(entry.alias))}));const HISTORY_FLAGS=toCompletionFlagString(HISTORY_FLAG_CONTRACTS);const HISTORY_AUTHOR_ACKNOWLEDGE_FLAGS=toCompletionFlagString(HISTORY_AUTHOR_ACKNOWLEDGE_FLAG_CONTRACTS,false);const EVENTS_FLAGS=toCompletionFlagString(EVENTS_FLAG_CONTRACTS);const CALENDAR_FLAGS=toCompletionFlagString(CALENDAR_FLAG_CONTRACTS);const CONTEXT_FLAGS=toCompletionFlagString(CONTEXT_FLAG_CONTRACTS);const NEXT_FLAGS=toCompletionFlagString(NEXT_FLAG_CONTRACTS);const DEPS_FLAGS=toCompletionFlagString(DEPS_FLAG_CONTRACTS);const DUPLICATES_FLAGS=toCompletionFlagString(DUPLICATES_FLAG_CONTRACTS);const GRAPH_FLAGS=toCompletionFlagString(GRAPH_FLAG_CONTRACTS);const GUIDE_FLAGS=toCompletionFlagString(GUIDE_FLAG_CONTRACTS);const SEARCH_FLAGS=toCompletionFlagString(SEARCH_FLAG_CONTRACTS);const STATS_FLAGS=toCompletionFlagString(STATS_FLAG_CONTRACTS);const HEALTH_FLAGS=toCompletionFlagString(HEALTH_FLAG_CONTRACTS);const INIT_FLAGS=toCompletionFlagString(INIT_FLAG_CONTRACTS);const CONTRACTS_FLAGS=toCompletionFlagString(CONTRACTS_FLAG_CONTRACTS);const PLAN_FLAGS=toCompletionFlagString(PLAN_FLAG_CONTRACTS);const SCHEMA_SUBCOMMAND_CHOICES=`${WORKFLOW_POLICY_ACTIONS.join(" ")} list show show-status add-type remove-type add-status remove-status add-field remove-field list-fields show-field apply-preset rename-type rename-field remap-status`;const PLAN_SUBCOMMANDS_LIST="create show add-step update-step complete-step block-step reorder-step remove-step link unlink decision discovery validation resume approve materialize";const COMPLETION_FLAGS=toCompletionFlagString(COMPLETION_FLAG_CONTRACTS);const COMPLETION_SHELL_CHOICES=`${COMPLETION_FLAGS} bash zsh fish`;const GUIDE_TOPIC_CHOICES=joinCompletionValues(listGuideTopicIds());const EXTENSION_LIFECYCLE_ACTIONS="init scaffold install uninstall explore manage describe reload doctor catalog adopt adopt-all activate deactivate migrate";const PACKAGE_LIFECYCLE_ACTIONS=`${EXTENSION_LIFECYCLE_ACTIONS} upgrade`;const EXTENSION_LIFECYCLE_FLAGS=toCompletionFlagString(EXTENSION_FLAG_CONTRACTS);const PACKAGE_LIFECYCLE_FLAGS=toCompletionFlagString(PACKAGE_FLAG_CONTRACTS);const UPGRADE_FLAGS=toCompletionFlagString(UPGRADE_FLAG_CONTRACTS);const MUTATION_FLAGS="--author --message --force --json --quiet --no-changed-fields --id-only --pm-path --path --no-extensions --no-pager --profile --help";const DELETE_MUTATION_FLAGS="--dry-run --author --message --force --json --quiet --no-changed-fields --id-only --pm-path --path --no-extensions --no-pager --profile --help";const CLOSE_MUTATION_FLAGS=toCompletionFlagString(resolveSubcommandFlagContractsForCommand("close"));const CLOSE_TASK_MUTATION_FLAGS=toCompletionFlagString(resolveSubcommandFlagContractsForCommand("close-task"));const RELEASE_MUTATION_FLAGS=toCompletionFlagString(resolveSubcommandFlagContractsForCommand("release"));const CLAIM_MUTATION_FLAGS=toCompletionFlagString(resolveSubcommandFlagContractsForCommand("claim"));const COMMAND_COMPLETION_DESCRIPTIONS=[["init","Initialize pm storage for the current workspace"],["config","Read or update pm settings"],["package","Manage package lifecycle operations"],["packages","Alias for package"],["create","Create a new project management item"],["copy","Copy an existing item to a new ID"],["focus","Set/clear/show the session focused parent for new items"],["list","List active items with optional filters"],["aggregate","Aggregate grouped item counts and numeric stats for governance queries"],["duplicates","Find bounded duplicate clusters across lifecycle statuses"],["guide","Browse local progressive-disclosure guides"],["calendar","Show calendar views for deadlines and reminders"],["cal","Alias for calendar"],["context","Show a token-efficient project context snapshot"],["ctx","Alias for context"],["get","Show item details by ID"],["next","Recommend the next actionable (unblocked, ready) work item"],["search","Search items with keyword, semantic, or hybrid modes"],["reindex","Rebuild search artifacts"],["history","Show item history entries"],["history-compact","Compact history streams into a synthetic baseline + retained tail"],["history-redact","Redact sensitive literals/patterns and recompute history hashes"],["history-repair","Re-anchor a drifted history chain so pm health/validate report ok"],["schema","Manage custom item types and statuses in .agents/pm/schema/*.json"],["profile","List, show, apply, and lint project profiles (archetype schema/config/template/package bundles)"],["plan","Agent-optimized Plan item workflow (create/show/add-step/update-step/complete-step/link/approve/materialize)"],["activity","Show recent activity across items"],["restore","Restore an item to an earlier state"],["update","Update item fields and metadata"],["update-many","Bulk-update matched items with dry-run and rollback checkpoints"],["close","Close an item (reason requirement follows governance settings)"],["close-many","Bulk-close matched items with an optional shared reason and rollback checkpoint"],["delete","Delete an item and record the change"],["append","Append text to an item body"],["comments","List or add comments for an item"],["notes","List or add notes for an item"],["learnings","List or add learnings for an item"],["files","Manage linked files"],["docs","Manage linked docs"],["deps","Show dependency relationships for an item"],["graph","Bounded graph traversal, analytics, and governance-audit queries"],["test","Manage linked tests and optionally run them"],["test-all","Run linked tests across matching items"],["test-runs","Manage background linked-test runs"],["stats","Show project tracker statistics"],["health","Show project tracker health checks"],["validate","Run standalone validation checks"],["gc","Clean optional cache artifacts"],["contracts","Show machine-readable command and schema contracts"],["claim","Claim an item for active work"],["release","Release the active claim for an item"],["start-task","Lifecycle alias to claim and set in_progress"],["pause-task","Lifecycle alias to reopen and release claim"],["close-task","Lifecycle alias to close and release claim"],["meet","Shortcut to create a Meeting with scheduling defaults"],["event","Shortcut to create an Event with scheduling defaults"],["remind","Shortcut to create a Reminder from a point in time"],["templates","Manage reusable create templates"],["completion","Generate shell completion"],["help","Display help for a command"]];const FISH_COMMAND_DESCRIPTION_OVERRIDES=new Map([["calendar","Show deadline/reminder calendar views"],["schema","Inspect and manage runtime schema"],["profile","List, show, apply, and lint project profiles (archetype bundles)"],["plan","Agent-optimized Plan workflow (create/show/add-step/update-step/complete-step/link/approve/materialize)"],["start-task","Lifecycle alias to claim and set in-progress"]]);const GLOBAL_FLAGS=GLOBAL_FLAG_CONTRACTS.flatMap(entry=>[entry.short,entry.flag,...entry.aliases??[]]).filter(value=>Boolean(value)).join(" ");const GLOBAL_COMPLETION_VALUE_PATTERNS=[...GLOBAL_VALUE_CONSUMING_FLAGS].join("|");const GLOBAL_COMPLETION_INLINE_PATTERNS=[...GLOBAL_VALUE_CONSUMING_FLAGS].map(flag=>`${flag}=*`).join("|");const GLOBAL_COMPLETION_SWITCH_PATTERNS=[...GLOBAL_FLAGS.split(" ").filter(flag=>!GLOBAL_VALUE_CONSUMING_FLAGS.has(flag)),"-h","-V"].join("|");function joinCompletionValues(values){return[...new Set(values.map(value=>value.trim()).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right)).join(" ")}function joinCompletionValuesInOrder(values){return[...new Set(values.map(value=>value.trim()).filter(value=>value.length>0))].join(" ")}function shellDoubleQuote(value){return value.replaceAll("\\","\\\\").replaceAll('"','\\"').replaceAll("$","\\$").replaceAll("`","\\`")}function completionTypeValues(itemTypes,runtime){return joinCompletionValuesInOrder(itemTypes.length>0?itemTypes:runtime.item_types??DEFAULT_ITEM_TYPES)}function completionStatusValues(runtime){return joinCompletionValues(runtime.statuses??DEFAULT_STATUS_VALUES)}function mergeFlagStrings(baseFlags,runtimeFlags){const merged=[...baseFlags.split(/\s+/u).filter(value=>value.length>0),...runtimeFlags??[]];return joinCompletionValues(merged)}function normalizeRuntimeCompletionFlags(runtimeFlags){const normalized=(runtimeFlags??[]).map(value=>value.trim()).filter(value=>value.startsWith("--")&&value.length>2).map(value=>`--${value.slice(2).replaceAll("_","-")}`);return[...new Set(normalized)].sort((left,right)=>left.localeCompare(right))}function renderZshRuntimeFieldFlagSpecs(runtimeFlags){const normalized=normalizeRuntimeCompletionFlags(runtimeFlags);if(normalized.length===0){return""}return`${normalized.map(flag=>` '${flag}[Runtime schema field flag]:value' \\`).join("\n")}
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]="6fd6ac84-b8ce-5b8c-8dc5-c94783671f12")}catch(e2){}})();import{PM_COMMAND_DESTINATION_CONTRACTS}from"./cli-contracts/grammar-contracts.js";import{WORKFLOW_POLICY_ACTIONS}from"./cli-contracts/enum-contracts.js";import{EXIT_CODE,PmCliError}from"./runtime-primitives.js";import{listPmCommandsForTier,resolvePmCommandVisibilityTier}from"./agent-capability-contracts.js";import{SCAFFOLD_CAPABILITIES}from"./extension/scaffold.js";import{AGGREGATE_FLAG_CONTRACTS,APPEND_FLAG_CONTRACTS,CALENDAR_FLAG_CONTRACTS,CLOSE_MANY_FLAG_CONTRACTS,COMPLETION_FLAG_CONTRACTS,CONTRACTS_FLAG_CONTRACTS,CONTEXT_FLAG_CONTRACTS,COPY_FLAG_CONTRACTS,FOCUS_FLAG_CONTRACTS,MEET_FLAG_CONTRACTS,REMIND_FLAG_CONTRACTS,CREATE_FLAG_CONTRACTS,DEPS_FLAG_CONTRACTS,DUPLICATES_FLAG_CONTRACTS,EXTENSION_FLAG_CONTRACTS,GRAPH_FLAG_CONTRACTS,GET_FLAG_CONTRACTS,GUIDE_FLAG_CONTRACTS,GLOBAL_FLAG_CONTRACTS,HEALTH_FLAG_CONTRACTS,HISTORY_AUTHOR_ACKNOWLEDGE_FLAG_CONTRACTS,HISTORY_FLAG_CONTRACTS,INIT_FLAG_CONTRACTS,LIST_FILTER_FLAG_CONTRACTS,NEXT_FLAG_CONTRACTS,PM_COMMAND_ALIAS_CONTRACTS,resolvePmCommandOperation,PM_NAMESPACED_COMMAND_ALIASES,resolveSubcommandFlagContractsForCommand,PACKAGE_FLAG_CONTRACTS,PLAN_FLAG_CONTRACTS,SEARCH_FLAG_CONTRACTS,STATS_FLAG_CONTRACTS,EVENTS_FLAG_CONTRACTS,UPDATE_FLAG_CONTRACTS,UPDATE_MANY_FLAG_CONTRACTS,UPGRADE_FLAG_CONTRACTS,toCompletionFlagString}from"./cli-contracts.js";import{BUILTIN_ITEM_TYPE_VALUES,STATUS_VALUES}from"../types/index.js";import{listGuideTopicIds}from"./guide-topics.js";import{enrichCliFlagInvocationContracts}from"./flag-invocation-contracts.js";import{GLOBAL_VALUE_CONSUMING_FLAGS}from"./cli-contracts/bootstrap-command-scanner.js";const VALID_SHELLS=["bash","zsh","fish"];const DEFAULT_ITEM_TYPES=[...BUILTIN_ITEM_TYPE_VALUES];const DEFAULT_STATUS_VALUES=[...STATUS_VALUES];const HIDDEN_COMMAND_ALIASES=new Set(PM_COMMAND_ALIAS_CONTRACTS.filter(contract=>contract.hidden).map(contract=>contract.alias));const ALL_COMMANDS=listPmCommandsForTier("full").filter(command=>!command.includes(" ")&&!HIDDEN_COMMAND_ALIASES.has(command));const LIST_FLAGS=toCompletionFlagString(LIST_FILTER_FLAG_CONTRACTS);const AGGREGATE_FLAGS=toCompletionFlagString(AGGREGATE_FLAG_CONTRACTS);const APPEND_FLAGS=toCompletionFlagString(APPEND_FLAG_CONTRACTS);const COPY_FLAGS=toCompletionFlagString(COPY_FLAG_CONTRACTS);const RESTORE_INVOCATIONS=enrichCliFlagInvocationContracts("restore",resolveSubcommandFlagContractsForCommand("restore"));const ATTEST_INVOCATIONS=enrichCliFlagInvocationContracts("history-attest",resolveSubcommandFlagContractsForCommand("history-attest"));const FOCUS_FLAGS=toCompletionFlagString(FOCUS_FLAG_CONTRACTS);const MEET_FLAGS=toCompletionFlagString(MEET_FLAG_CONTRACTS);const REMIND_FLAGS=toCompletionFlagString(REMIND_FLAG_CONTRACTS);const CREATE_FLAGS=toCompletionFlagString(CREATE_FLAG_CONTRACTS);const GET_FLAGS=toCompletionFlagString(GET_FLAG_CONTRACTS);const UPDATE_FLAGS=toCompletionFlagString(UPDATE_FLAG_CONTRACTS);const UPDATE_MANY_FLAGS=toCompletionFlagString(UPDATE_MANY_FLAG_CONTRACTS);const CLOSE_MANY_FLAGS=toCompletionFlagString(CLOSE_MANY_FLAG_CONTRACTS);const NAMESPACE_NOUNS=[...new Set(PM_NAMESPACED_COMMAND_ALIASES.map(entry=>entry.canonical_argv[0]))];const NAMESPACE_PREFIXES=[...new Set(PM_NAMESPACED_COMMAND_ALIASES.flatMap(entry=>entry.canonical_argv.slice(0,-1).map((_,index)=>entry.canonical_argv.slice(0,index+1).join(" "))))];const PACKAGE_NAMESPACE_OPERATIONS=new Set(PM_COMMAND_DESTINATION_CONTRACTS.filter(entry=>entry.disposition==="package_owned").map(entry=>resolvePmCommandOperation(entry.command)));const HISTORY_COMPLETION_ALIASES=PM_NAMESPACED_COMMAND_ALIASES.filter(entry=>entry.canonical_argv[0]==="history");const HISTORY_LEAVES=HISTORY_COMPLETION_ALIASES.map(entry=>entry.canonical_argv[1]).join(" ");function completionNamespaceLeaves(runtime){const available=new Set((runtime.namespace_commands??[]).map(resolvePmCommandOperation));const aliases=PM_NAMESPACED_COMMAND_ALIASES.filter(entry=>resolvePmCommandVisibilityTier(entry.canonical)!=="internal"&&(!PACKAGE_NAMESPACE_OPERATIONS.has(entry.alias)||available.has(entry.alias)));return Object.fromEntries(NAMESPACE_PREFIXES.map(prefix=>[prefix,[...new Set(aliases.filter(entry=>entry.canonical.startsWith(`${prefix} `)).map(entry=>entry.canonical_argv[prefix.split(" ").length]))].join(" ")]))}const HISTORY_OPERATION_FLAGS=HISTORY_COMPLETION_ALIASES.map(entry=>({...entry,flags:toCompletionFlagString(resolveSubcommandFlagContractsForCommand(entry.alias))}));const HISTORY_FLAGS=toCompletionFlagString(HISTORY_FLAG_CONTRACTS);const HISTORY_AUTHOR_ACKNOWLEDGE_FLAGS=toCompletionFlagString(HISTORY_AUTHOR_ACKNOWLEDGE_FLAG_CONTRACTS,false);const EVENTS_FLAGS=toCompletionFlagString(EVENTS_FLAG_CONTRACTS);const CALENDAR_FLAGS=toCompletionFlagString(CALENDAR_FLAG_CONTRACTS);const CONTEXT_FLAGS=toCompletionFlagString(CONTEXT_FLAG_CONTRACTS);const NEXT_FLAGS=toCompletionFlagString(NEXT_FLAG_CONTRACTS);const DEPS_FLAGS=toCompletionFlagString(DEPS_FLAG_CONTRACTS);const DUPLICATES_FLAGS=toCompletionFlagString(DUPLICATES_FLAG_CONTRACTS);const GRAPH_FLAGS=toCompletionFlagString(GRAPH_FLAG_CONTRACTS);const GUIDE_FLAGS=toCompletionFlagString(GUIDE_FLAG_CONTRACTS);const SEARCH_FLAGS=toCompletionFlagString(SEARCH_FLAG_CONTRACTS);const STATS_FLAGS=toCompletionFlagString(STATS_FLAG_CONTRACTS);const HEALTH_FLAGS=toCompletionFlagString(HEALTH_FLAG_CONTRACTS);const INIT_FLAGS=toCompletionFlagString(INIT_FLAG_CONTRACTS);const CONTRACTS_FLAGS=toCompletionFlagString(CONTRACTS_FLAG_CONTRACTS);const PLAN_FLAGS=toCompletionFlagString(PLAN_FLAG_CONTRACTS);const SCHEMA_SUBCOMMAND_CHOICES=`${WORKFLOW_POLICY_ACTIONS.join(" ")} list show show-status add-type remove-type add-status remove-status add-field remove-field list-fields show-field apply-preset rename-type rename-field remap-status`;const PLAN_SUBCOMMANDS_LIST="create show add-step update-step complete-step block-step reorder-step remove-step link unlink decision discovery validation resume approve materialize";const COMPLETION_FLAGS=toCompletionFlagString(COMPLETION_FLAG_CONTRACTS);const COMPLETION_SHELL_CHOICES=`${COMPLETION_FLAGS} bash zsh fish`;const GUIDE_TOPIC_CHOICES=joinCompletionValues(listGuideTopicIds());const EXTENSION_LIFECYCLE_ACTIONS="init scaffold install uninstall explore manage describe reload doctor catalog adopt adopt-all activate deactivate migrate";const PACKAGE_LIFECYCLE_ACTIONS=`${EXTENSION_LIFECYCLE_ACTIONS} upgrade`;const EXTENSION_LIFECYCLE_FLAGS=toCompletionFlagString(EXTENSION_FLAG_CONTRACTS);const PACKAGE_LIFECYCLE_FLAGS=toCompletionFlagString(PACKAGE_FLAG_CONTRACTS);const UPGRADE_FLAGS=toCompletionFlagString(UPGRADE_FLAG_CONTRACTS);const MUTATION_FLAGS="--author --message --force --json --quiet --no-changed-fields --id-only --pm-path --path --no-extensions --no-pager --profile --help";const DELETE_MUTATION_FLAGS="--dry-run --author --message --force --json --quiet --no-changed-fields --id-only --pm-path --path --no-extensions --no-pager --profile --help";const CLOSE_MUTATION_FLAGS=toCompletionFlagString(resolveSubcommandFlagContractsForCommand("close"));const CLOSE_TASK_MUTATION_FLAGS=toCompletionFlagString(resolveSubcommandFlagContractsForCommand("close-task"));const RELEASE_MUTATION_FLAGS=toCompletionFlagString(resolveSubcommandFlagContractsForCommand("release"));const CLAIM_MUTATION_FLAGS=toCompletionFlagString(resolveSubcommandFlagContractsForCommand("claim"));const COMMAND_COMPLETION_DESCRIPTIONS=[["init","Initialize pm storage for the current workspace"],["config","Read or update pm settings"],["package","Manage package lifecycle operations"],["packages","Alias for package"],["create","Create a new project management item"],["item","Manage item evidence, links, tests, and duplication"],["copy","Copy an existing item to a new ID"],["focus","Set/clear/show the session focused parent for new items"],["list","List active items with optional filters"],["aggregate","Aggregate grouped item counts and numeric stats for governance queries"],["duplicates","Find bounded duplicate clusters across lifecycle statuses"],["guide","Browse local progressive-disclosure guides"],["calendar","Show calendar views for deadlines and reminders"],["cal","Alias for calendar"],["context","Show a token-efficient project context snapshot"],["ctx","Alias for context"],["get","Show item details by ID"],["next","Recommend the next actionable (unblocked, ready) work item"],["search","Search items with keyword, semantic, or hybrid modes"],["reindex","Rebuild search artifacts"],["history","Show item history entries"],["history-compact","Compact history streams into a synthetic baseline + retained tail"],["history-redact","Redact sensitive literals/patterns and recompute history hashes"],["history-repair","Re-anchor a drifted history chain so pm health/validate report ok"],["schema","Manage custom item types and statuses in .agents/pm/schema/*.json"],["profile","List, show, apply, and lint project profiles (archetype schema/config/template/package bundles)"],["plan","Agent-optimized Plan item workflow (create/show/add-step/update-step/complete-step/link/approve/materialize)"],["activity","Show recent activity across items"],["restore","Restore an item to an earlier state"],["update","Update item fields and metadata"],["update-many","Bulk-update matched items with dry-run and rollback checkpoints"],["close","Close an item (reason requirement follows governance settings)"],["close-many","Bulk-close matched items with an optional shared reason and rollback checkpoint"],["delete","Delete an item and record the change"],["append","Append text to an item body"],["comments","List or add comments for an item"],["notes","List or add notes for an item"],["learnings","List or add learnings for an item"],["files","Manage linked files"],["docs","Manage linked docs"],["deps","Show dependency relationships for an item"],["graph","Bounded graph traversal, analytics, and governance-audit queries"],["test","Manage linked tests and optionally run them"],["test-all","Run linked tests across matching items"],["test-runs","Manage background linked-test runs"],["stats","Show project tracker statistics"],["health","Show project tracker health checks"],["validate","Run standalone validation checks"],["gc","Clean optional cache artifacts"],["contracts","Show machine-readable command and schema contracts"],["claim","Claim an item for active work"],["release","Release the active claim for an item"],["start-task","Lifecycle alias to claim and set in_progress"],["pause-task","Lifecycle alias to reopen and release claim"],["close-task","Lifecycle alias to close and release claim"],["meet","Shortcut to create a Meeting with scheduling defaults"],["event","Shortcut to create an Event with scheduling defaults"],["remind","Shortcut to create a Reminder from a point in time"],["templates","Manage reusable create templates"],["completion","Generate shell completion"],["help","Display help for a command"]];const FISH_COMMAND_DESCRIPTION_OVERRIDES=new Map([["calendar","Show deadline/reminder calendar views"],["schema","Inspect and manage runtime schema"],["profile","List, show, apply, and lint project profiles (archetype bundles)"],["plan","Agent-optimized Plan workflow (create/show/add-step/update-step/complete-step/link/approve/materialize)"],["start-task","Lifecycle alias to claim and set in-progress"]]);const GLOBAL_FLAGS=GLOBAL_FLAG_CONTRACTS.flatMap(entry=>[entry.short,entry.flag,...entry.aliases??[]]).filter(value=>Boolean(value)).join(" ");const GLOBAL_COMPLETION_VALUE_PATTERNS=[...GLOBAL_VALUE_CONSUMING_FLAGS].join("|");const GLOBAL_COMPLETION_INLINE_PATTERNS=[...GLOBAL_VALUE_CONSUMING_FLAGS].map(flag=>`${flag}=*`).join("|");const GLOBAL_COMPLETION_SWITCH_PATTERNS=[...GLOBAL_FLAGS.split(" ").filter(flag=>!GLOBAL_VALUE_CONSUMING_FLAGS.has(flag)),"-h","-V"].join("|");function joinCompletionValues(values){return[...new Set(values.map(value=>value.trim()).filter(value=>value.length>0))].sort((left,right)=>left.localeCompare(right)).join(" ")}function joinCompletionValuesInOrder(values){return[...new Set(values.map(value=>value.trim()).filter(value=>value.length>0))].join(" ")}function shellDoubleQuote(value){return value.replaceAll("\\","\\\\").replaceAll('"','\\"').replaceAll("$","\\$").replaceAll("`","\\`")}function completionTypeValues(itemTypes,runtime){return joinCompletionValuesInOrder(itemTypes.length>0?itemTypes:runtime.item_types??DEFAULT_ITEM_TYPES)}function completionStatusValues(runtime){return joinCompletionValues(runtime.statuses??DEFAULT_STATUS_VALUES)}function mergeFlagStrings(baseFlags,runtimeFlags){const merged=[...baseFlags.split(/\s+/u).filter(value=>value.length>0),...runtimeFlags??[]];return joinCompletionValues(merged)}function normalizeRuntimeCompletionFlags(runtimeFlags){const normalized=(runtimeFlags??[]).map(value=>value.trim()).filter(value=>value.startsWith("--")&&value.length>2).map(value=>`--${value.slice(2).replaceAll("_","-")}`);return[...new Set(normalized)].sort((left,right)=>left.localeCompare(right))}function renderZshRuntimeFieldFlagSpecs(runtimeFlags){const normalized=normalizeRuntimeCompletionFlags(runtimeFlags);if(normalized.length===0){return""}return`${normalized.map(flag=>` '${flag}[Runtime schema field flag]:value' \\`).join("\n")}
2
2
  `}function renderZshArgumentSpecs(specs,options={}){const trailingContinuation=options.trailingContinuation??true;const lastSpecIndex=specs.length-1;return specs.map((spec,index)=>` ${spec}${trailingContinuation||index!==lastSpecIndex?" \\":""}`).join("\n")}function renderZshCommandDescriptions(){return[...COMMAND_COMPLETION_DESCRIPTIONS,["ops","Workspace maintenance and diagnostics"]].filter(([command])=>!HIDDEN_COMMAND_ALIASES.has(command)).map(([command,description])=>` '${command}:${description}'`).join("\n")}function renderFishCommandDescriptions(){return[...COMMAND_COMPLETION_DESCRIPTIONS,["ops","Workspace maintenance and diagnostics"]].filter(([command])=>command!=="help"&&!HIDDEN_COMMAND_ALIASES.has(command)).map(([command,description])=>{const fishDescription=FISH_COMMAND_DESCRIPTION_OVERRIDES.get(command)??description;return`complete -c pm -n __pm_no_subcommand -a ${command.padEnd(16)} -d '${fishDescription}'`}).join("\n")}function renderZshPresenceFilterSpecs(options){const missingSpecs=["reviewer-missing[Select only items missing reviewer]","risk-missing[Select only items missing risk]","confidence-missing[Select only items missing confidence]","sprint-missing[Select only items missing sprint]","release-missing[Select only items missing release]"];const contentMissingAliasSpecs=options.includeContentMissingAliases===true?["files-missing[Alias for --no-files]","docs-missing[Alias for --no-docs]"]:[];const pairedSpecs=[["has-notes[Select only items that have notes]","no-notes[Select only items with no notes]"],["has-learnings[Select only items that have learnings]","no-learnings[Select only items with no learnings]"],["has-files[Select only items that have linked files]","no-files[Select only items with no linked files]"],["has-docs[Select only items that have linked docs]","no-docs[Select only items with no linked docs]"],["has-tests[Select only items that have linked tests]","no-tests[Select only items with no linked tests]"],["has-comments[Select only items that have comments]","no-comments[Select only items with no comments]"],["has-deps[Select only items that have dependencies]","no-deps[Select only items with no dependencies]"],["has-body[Select only items with non-empty body]","empty-body[Select only items with empty body]"],["has-linked-command[Select only items that have a linked command]","no-linked-command[Select only items with no linked command]"]];return renderZshArgumentSpecs([...[...missingSpecs,...contentMissingAliasSpecs].map(spec=>`'--${options.missingPrefix}${spec}'`),...pairedSpecs.flatMap(([positive,negative])=>[`'--${options.pairedPrefix}${positive}'`,`'--${options.pairedPrefix}${negative}'`])])}const ZSH_MUTATION_COLLECTION_ARGUMENT_SPECS=["'--comment[Comment seed author=<value>,created_at=<iso|now>,text=<value>]:comment'","'--note[Note seed author=<value>,created_at=<iso|now>,text=<value>]:note'","'--learning[Learning seed author=<value>,created_at=<iso|now>,text=<value>]:learning'","'--file[Linked file path=<value>,scope=<project|global>,note=<text>]:file'","'--test[Linked test command=<value>,path=<value>,scope=<project|global>]:test'","'--doc[Linked doc path=<value>,scope=<project|global>,note=<text>]:doc'","'--reminder[Reminder entry at=<iso|relative>|date=<iso|relative>,text=<text>|title=<text>]:reminder'","'--event[Event entry start=<iso|relative>,end=<iso|relative>,recur_*]:event'","'--type-option[Type option key=value or key=<name>,value=<value>]:type_option'","'--unset[Clear scalar metadata field by name]:field'","'--replace-files[Atomically replace linked files with provided --file values]'","'--replace-docs[Atomically replace linked docs with provided --doc values]'","'--clear-deps[Clear dependency entries]'","'--clear-comments[Clear comments]'","'--clear-notes[Clear notes]'","'--clear-learnings[Clear learnings]'","'--clear-files[Clear linked files]'","'--clear-tests[Clear linked tests]'","'--clear-docs[Clear linked docs]'","'--clear-reminders[Clear reminders]'","'--clear-events[Clear events]'","'--clear-type-options[Clear type options]'"];function renderZshScheduleItemSpecs(kind){const leadingSpecs=kind==="reminder"?["'--at[Reminder time (default +1d)]:at'","'--text[Reminder text (defaults to title)]:text'"]:["'--start[Start time (ISO, now, or relative)]:start'","'--duration[Duration from start (default 1h)]:duration'","'--end[End time (overrides --duration)]:end'","'--location[Location]:location'","'--timezone[IANA timezone]:timezone'","'--all-day[Mark as an all-day event]'"];return renderZshArgumentSpecs([...leadingSpecs,"'--parent[Parent item id]:parent'","'--allow-missing-parent[Permit a parent id that does not exist yet]'","'--tags[Comma-separated tags]:tags'","'(-p --priority)'{-p,--priority}'[Priority (0-4)]:(0 1 2 3 4)'","'(-b --body)'{-b,--body}'[Item body]:body'","'(-d --description)'{-d,--description}'[Short description]:description'","'--author[Mutation author]:author'","'--message[History message]:message'","'--json[Output JSON]'","'--quiet[Suppress stdout]'"],{trailingContinuation:false})}function renderZshBulkSelectionFilterSpecs(action,statusChoices,typeChoices,tagChoices){return renderZshArgumentSpecs([`'--filter-status[Filter by status before ${action}]:(${statusChoices})'`,`'--filter-type[Filter by type before ${action}]:(${typeChoices})'`,`'--filter-tag[Filter by tag before ${action}]:(${tagChoices})'`,`'--filter-priority[Filter by priority before ${action}]:(0 1 2 3 4)'`,"'--filter-deadline-before[Filter by deadline upper bound]:deadline'","'--filter-deadline-after[Filter by deadline lower bound]:deadline'","'--filter-updated-after[Filter by updated_at lower bound (ISO/relative)]:timestamp'","'--filter-updated-before[Filter by updated_at upper bound (ISO/relative)]:timestamp'","'--filter-created-after[Filter by created_at lower bound (ISO/relative)]:timestamp'","'--filter-created-before[Filter by created_at upper bound (ISO/relative)]:timestamp'",`'--filter-assignee[Filter by assignee before ${action}]:assignee'`,"'--filter-assignee-filter[Filter assignee presence]:(assigned unassigned)'","'--filter-parent[Filter by parent item ID]:parent'","'--filter-sprint[Filter by sprint]:sprint'","'--filter-release[Filter by release]:release'"])}function renderFishRuntimeFieldFlagSpecs(commands,runtimeFlags){const normalizedFlags=normalizeRuntimeCompletionFlags(runtimeFlags).map(flag=>flag.slice(2));if(commands.length===0||normalizedFlags.length===0){return""}const lines=[];for(const command of commands){const predicate=NAMESPACE_NOUNS.includes(command)||PM_NAMESPACED_COMMAND_ALIASES.some(entry=>entry.alias===command)?"__pm_history_operation":"__fish_seen_subcommand_from";for(const flag of normalizedFlags){lines.push(`complete -c pm -n '${predicate} ${command}' -l ${flag} -d 'Runtime schema field flag' -r`)}}return`${lines.join("\n")}
3
3
  `}function renderBashDynamicChoiceResolver(kind,command,fallback){const envKind=kind.toUpperCase();const cacheVar=`PM_COMPLETION_${envKind}_CACHE`;const cacheTsVar=`PM_COMPLETION_${envKind}_CACHE_TS`;const ttlVar=`PM_COMPLETION_${envKind}_TTL`;const escapedFallback=shellDoubleQuote(fallback);return[`_pm_completion_${kind}_choices() {`," local now ttl cache_ts resolved",' now="$(date +%s 2>/dev/null || echo 0)"',` ttl="\${${ttlVar}:-120}"`,` cache_ts="\${${cacheTsVar}:-0}"`,` if [[ -n "\${${cacheVar}:-}" && "$now" -ne 0 && $((now - cache_ts)) -lt "$ttl" ]]; then`,` printf '%s\\n' "$${cacheVar}"`," return 0"," fi",` resolved="$(pm ${command} 2>/dev/null)"`,' if [[ -z "$resolved" ]]; then',` resolved="${escapedFallback}"`," fi",` ${cacheVar}="$resolved"`,` ${cacheTsVar}="$now"`,` printf '%s\\n' "$${cacheVar}"`,"}"]}function renderZshDynamicChoiceResolver(kind,command,fallback){const envKind=kind.toUpperCase();const cacheVar=`PM_COMPLETION_${envKind}_CACHE`;const cacheTsVar=`PM_COMPLETION_${envKind}_CACHE_TS`;const ttlVar=`PM_COMPLETION_${envKind}_TTL`;const escapedFallback=shellDoubleQuote(fallback);return`
4
4
  _pm_${kind}_choices() {
@@ -1,2 +1,2 @@
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]="205d2dd3-72e4-5ed2-b4c9-cf5000ea8e5f")}catch(e2){}})();import fs from"node:fs/promises";import path from"node:path";import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{isTerminalStatus}from"../../core/item/status.js";import{resolveItemTypeRegistry}from"../../core/item/type-registry.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{isFileMissingError,readFileIfExists}from"../../core/fs/fs-utils.js";import{activateExtensions,getActiveExtensionRegistrations,loadExtensions,runActiveOnReadHooks}from"../../core/extensions/index.js";import{collectRegisteredItemFieldNames}from"../../core/extensions/item-fields.js";import{KNOWN_EXTENSION_CAPABILITIES}from"../../core/extensions/loader.js";import{enforceHistoryStreamPolicyForItems}from"../../core/history/history-stream-policy.js";import{scanHistoryDrift}from"../../core/history/drift-scan.js";import{scanLockHealth}from"../../core/lock/lock-gc.js";import{readVectorizationStatusLedger,refreshSemanticEmbeddingsForMutatedItems}from"../../core/search/cache.js";import{resolveEmbeddingProviders,resolveProviderConfigSource}from"../../core/search/providers.js";import{resolveSettingsWithSemanticRuntimeDefaults}from"../../core/search/semantic-defaults.js";import{collectStaleVectorizationIds}from"../../core/search/staleness.js";import{buildVectorizationEmbeddingIdentity,hasVectorizationEmbeddingIdentityChanged}from"../../core/search/vectorization-metadata.js";import{resolveVectorStores}from"../../core/search/vector-stores.js";import{EXIT_CODE,PM_CORE_REQUIRED_SUBDIRS,TYPE_TO_FOLDER}from"../../core/shared/constants.js";import{findFirstMergeConflictMarker}from"../../core/shared/conflict-markers.js";import{PmCliError}from"../../core/shared/errors.js";import{toNonEmptyStringOrUndefined}from"../../core/shared/primitives.js";import{nowIso}from"../../core/shared/time.js";import{parseItemDocument}from"../../core/item/item-format.js";import{effectiveItemFormatVersion,scanItemFormatVersions}from"../../core/item/item-format-version.js";import{listAllItemMetadataLight,listAllItemMetadataWithBody}from"../../core/store/item-store.js";import{PM_TELEMETRY_SOURCE_CONTEXT_VALUES,TELEMETRY_MAX_QUEUE_ENTRY_ATTEMPTS,TELEMETRY_SCHEMA_VERSION}from"../../core/telemetry/runtime.js";import{getItemFormatFromPath,getSettingsPath,ITEM_FILE_EXTENSIONS,resolveGlobalPmRoot,resolvePmRoot,resolveWorkspaceRoot}from"../../core/store/paths.js";import{readSettingsWithMetadata}from"../../core/store/settings.js";import{buildRemediationMap,resolveRemediation}from"../../core/diagnostics/remediation.js";import{scanExtensionHostVersions}from"./extension-host-version.js";import{scanHistoryAuthorAttribution}from"../author-attribution.js";import{readManagedExtensionState}from"../extension.js";import{scanProvenanceResolverHealth}from"./provenance-health.js";import{applyStoredExtensionMigrationState}from"../extension/migrations.js";import{inspectExtensionAuthorManifest}from"../extension/author-manifest.js";import{buildCapabilityContractMetadata,buildRegistrationCollisionRemediation,collectUnknownCapabilityGuidance}from"../extension/doctor.js";import{scanStaleInProgressItems}from"./stale-work.js";import{scanTrackedRuntimeCache}from"./tracked-runtime-cache.js";import{auditMergeDriverConfiguration,findGitWorkspaceRoot}from"../merge/install.js";import{inspectMergeReceiptEvidence,partitionMergeReceipts}from"../merge/receipts.js";import{classifyHistoryMergeReceiptReferences,extractHistoryMergeReceiptDispositions,extractHistoryMergeReceiptReferences}from"./merge-receipt-history.js";import{runHistoryRepair}from"../history-repair.js";import{resolveWorkspaceRelationshipKindRegistry}from"../graph/assembly.js";import{analyzeHierarchyIntegrity}from"../graph/hierarchy-integrity.js";import{buildStatusRoleWarnings,inspectStatusRoleAssignments}from"./status-role-diagnostics.js";const PM_TELEMETRY_SOURCE_CONTEXT_SET=new Set(PM_TELEMETRY_SOURCE_CONTEXT_VALUES);const STALE_VECTORIZATION_SUMMARY_LIMIT=25;const BRIEF_HEALTH_DETAIL_LIMIT=8;const HEALTH_WARNING_LIMIT=100;const TELEMETRY_QUEUE_RELATIVE_PATH=path.join("runtime","telemetry","events.jsonl");const TELEMETRY_STATE_RELATIVE_PATH=path.join("runtime","telemetry","state.json");const TELEMETRY_ENDPOINT_PROBE_TIMEOUT_MS=2500;const TELEMETRY_QUEUE_HIGH_WATER_MARK=500;const TELEMETRY_QUEUE_HIGH_RETRY_THRESHOLD=TELEMETRY_MAX_QUEUE_ENTRY_ATTEMPTS-3;const TELEMETRY_SERVER_MAX_SCHEMA_VERSION_HEADERS=["x-pm-telemetry-max-schema-version","x-pm-telemetry-max-version"];function isAdvisoryHealthWarning(warning,requireMergeDrivers=false){return warning.startsWith("telemetry_")||warning.startsWith("history_stream_over_compact_threshold:")||warning.startsWith("integrity_legacy_hierarchy_")||warning.startsWith("stale_in_progress_items:")||warning.startsWith("provenance_resolver_zero_success:")||warning.startsWith("provenance_value_domain_invalid:")||!requireMergeDrivers&&warning.startsWith("merge_driver_configuration_missing:")}function warningCode(value){const normalized=value.trim();const separator=normalized.indexOf(":");if(separator===-1){return normalized}return normalized.slice(0,separator)}function normalizeExtensionNameForMatch(value){return value.trim().toLowerCase()}function isExpectedUnmanagedExtension(name,directory){const normalizedName=normalizeExtensionNameForMatch(name);const normalizedDirectory=normalizeExtensionNameForMatch(directory);if(normalizedName.startsWith("builtin-")){return true}return normalizedDirectory==="beads"||normalizedDirectory==="todos"}async function isDirectory(targetPath){try{const stats=await fs.stat(targetPath);return stats.isDirectory()}catch{return false}}async function listStoredItemDocumentIds(pmRoot){const directories=(await fs.readdir(pmRoot,{withFileTypes:true})).filter(entry=>entry.isDirectory());const filesByDirectory=await Promise.all(directories.map(entry=>fs.readdir(path.join(pmRoot,entry.name),{withFileTypes:true})));return new Set(filesByDirectory.flatMap(entries=>entries.filter(entry=>entry.isFile()).filter(entry=>ITEM_FILE_EXTENSIONS.some(extension=>entry.name.endsWith(extension))).map(entry=>path.parse(entry.name).name)))}async function inspectHistoryStream(streamPath,itemId,compactPolicy,liveItemIds){const warnings=await runActiveOnReadHooks({path:streamPath,scope:"project"});const needsClassification=itemId!=="_workspace"&&!liveItemIds.has(itemId);if(!compactPolicy.enabled&&!needsClassification){return{warnings,overThreshold:false,classification:"live"}}let raw;try{raw=await fs.readFile(streamPath,"utf8")}catch{return{warnings,overThreshold:false,classification:"unreadable"}}let classification="live";if(needsClassification){const lastLine=raw.split(/\r?\n/).map(line=>line.trim()).filter(Boolean).at(-1);try{const lastEntry=JSON.parse(lastLine??"{}");classification=lastEntry.op==="delete"?"tombstone":"orphaned"}catch{classification="orphaned"}}const entryCount=compactPolicy.enabled?raw.split(/\r?\n/).filter(line=>line.trim().length>0).length:0;return{warnings,overThreshold:compactPolicy.enabled&&entryCount>compactPolicy.max_entries,classification}}async function countHistoryStreams(pmRoot,compactPolicy,liveItemIds){const historyDir=path.join(pmRoot,"history");if(!await isDirectory(historyDir)){return{count:0,warnings:[],over_threshold:[],max_entries:null,tombstones:[],orphaned:[]}}const historyFiles=(await fs.readdir(historyDir)).filter(entry=>entry.endsWith(".jsonl")).sort((left,right)=>left.localeCompare(right));const policyActive=compactPolicy.enabled;const maxEntries=policyActive?compactPolicy.max_entries:null;const warnings=[];const overThreshold=[];const tombstones=[];const orphaned=[];for(const fileName of historyFiles){const streamPath=path.join(historyDir,fileName);const itemId=fileName.slice(0,-".jsonl".length);const inspection=await inspectHistoryStream(streamPath,itemId,compactPolicy,liveItemIds);warnings.push(...inspection.warnings);if(inspection.classification==="tombstone")tombstones.push(itemId);if(inspection.classification==="orphaned")orphaned.push(itemId);if(inspection.overThreshold)overThreshold.push(itemId)}return{count:historyFiles.length,warnings:[...warnings,...overThreshold.map(id=>`history_stream_over_compact_threshold:${id}`),...orphaned.map(id=>`history_orphaned_stream:${id}`)],over_threshold:overThreshold,max_entries:maxEntries,tombstones,orphaned}}function normalizeRelativePath(pmRoot,targetPath){return path.relative(pmRoot,targetPath).replaceAll("\\","/")}async function listItemDocumentPaths(pmRoot,typeToFolder){const folders=[...new Set(Object.values(typeToFolder))].sort((left,right)=>left.localeCompare(right));const itemPaths=[];for(const folder of folders){const directoryPath=path.join(pmRoot,folder);let entries=[];try{entries=await fs.readdir(directoryPath)}catch(error){if(typeof error==="object"&&error!==null&&"code"in error&&isFileMissingError(error)){continue}continue}for(const entry of entries){if(!ITEM_FILE_EXTENSIONS.some(extension=>entry.toLowerCase().endsWith(extension))){continue}itemPaths.push(path.join(directoryPath,entry))}}itemPaths.sort((left,right)=>normalizeRelativePath(pmRoot,left).localeCompare(normalizeRelativePath(pmRoot,right)));return itemPaths}function shouldReportHistoryDirectoryUnreadable(error){return!(typeof error==="object"&&error!==null&&"code"in error&&isFileMissingError(error))}async function scanItemIntegrity(pmRoot,typeToFolder,schema){const paths=await listItemDocumentPaths(pmRoot,typeToFolder);const unreadable=[];const conflictMarkers=[];const parseFailures=[];const formatVersions=[];const extensionFieldNames=collectRegisteredItemFieldNames(getActiveExtensionRegistrations());for(const itemPath of paths){const relativePath=normalizeRelativePath(pmRoot,itemPath);let raw;try{raw=await fs.readFile(itemPath,"utf8")}catch{unreadable.push(relativePath);continue}const conflictMarker=findFirstMergeConflictMarker(raw);if(conflictMarker){conflictMarkers.push({path:relativePath,...conflictMarker});continue}try{const parsed=parseItemDocument(raw,{format:getItemFormatFromPath(itemPath),schema,extensionFieldNames});formatVersions.push({ref:relativePath,version:effectiveItemFormatVersion(parsed.metadata)})}catch{parseFailures.push(relativePath)}}return{paths,unreadable,conflictMarkers,parseFailures,formatVersions}}async function scanHistoryIntegrity(pmRoot){const historyDir=path.join(pmRoot,"history");const unreadable=[];const conflictMarkers=[];const invalidJson=[];const mergeReceiptReferences=[];const mergeReceiptDispositions=[];let files=[];try{files=(await fs.readdir(historyDir)).filter(entry=>entry.endsWith(".jsonl")).sort((left,right)=>left.localeCompare(right))}catch(error){if(shouldReportHistoryDirectoryUnreadable(error))unreadable.push("history")}for(const fileName of files){const itemId=fileName.slice(0,-".jsonl".length);let raw;try{raw=await fs.readFile(path.join(historyDir,fileName),"utf8")}catch{unreadable.push(itemId);continue}const conflictMarker=findFirstMergeConflictMarker(raw);if(conflictMarker){conflictMarkers.push({id:itemId,...conflictMarker});continue}raw.split(/\r?\n/).forEach((line,index)=>{if(!line.trim())return;try{const parsed=JSON.parse(line);mergeReceiptReferences.push(...extractHistoryMergeReceiptReferences(parsed,itemId).map(reference=>({itemId,line:index+1,...reference})));mergeReceiptDispositions.push(...extractHistoryMergeReceiptDispositions(parsed,itemId,index+1))}catch{invalidJson.push({id:itemId,line:index+1})}})}return{files,unreadable,conflictMarkers,invalidJson,mergeReceiptReferences,mergeReceiptDispositions}}function buildHierarchyIntegrityWarnings(analysis){return[...analysis.cycles.map(cycle=>cycle.legacy_terminal?`integrity_legacy_hierarchy_cycle:${cycle.item_ids.join(",")}`:`integrity_hierarchy_cycle:${cycle.item_ids.join(",")}`),...analysis.cardinality_violations.map(finding=>finding.legacy_terminal?`integrity_legacy_hierarchy_cardinality:${finding.child_id}`:`integrity_hierarchy_cardinality:${finding.child_id}`),...analysis.divergences.map(finding=>finding.legacy_terminal?`integrity_legacy_hierarchy_divergence:${finding.child_id}`:`integrity_hierarchy_divergence:${finding.child_id}`)]}function buildMergeReceiptEvidenceWarnings(params){const warnings=[];if(params.invalidEvidenceCount>0){warnings.push(`merge_receipt_evidence_invalid:${params.invalidEvidenceCount}`)}if(params.missingHistoryReferenceCount>0){warnings.push(`merge_receipt_history_reference_missing:${params.missingHistoryReferenceCount}`)}return warnings}async function buildIntegrityCheck(pmRoot,typeToFolder,schema,requireMergeDrivers,items){const itemScan=await scanItemIntegrity(pmRoot,typeToFolder,schema);const historyScan=await scanHistoryIntegrity(pmRoot);const formatVersionScan=scanItemFormatVersions(itemScan.formatVersions);const statusRegistry=resolveRuntimeStatusRegistry(schema);const hierarchyIntegrity=analyzeHierarchyIntegrity(items,status=>isTerminalStatus(status,statusRegistry),resolveWorkspaceRelationshipKindRegistry());const trackedRuntimeCache=await scanTrackedRuntimeCache(pmRoot);const gitWorkspaceRoot=await findGitWorkspaceRoot(pmRoot);const mergeDriverAudit=gitWorkspaceRoot===null?null:await auditMergeDriverConfiguration(gitWorkspaceRoot);const mergeReceiptEvidence=await inspectMergeReceiptEvidence(gitWorkspaceRoot??pmRoot,{includeReconciled:true,includeLossless:true,pmRoot});const availableMergeReceiptIds=new Set(mergeReceiptEvidence.receipts.map(receipt=>receipt.id));const historyReceiptClassification=classifyHistoryMergeReceiptReferences(historyScan.mergeReceiptReferences,availableMergeReceiptIds,historyScan.mergeReceiptDispositions);const missingMergeReceiptReferences=historyReceiptClassification.missing;const pendingMergeReceipts=mergeReceiptEvidence.receipts.filter(receipt=>receipt.state==="pending");const{pendingDecisions:pendingMergeDecisions,lossless:losslessMergeReceipts}=partitionMergeReceipts(pendingMergeReceipts);const mergeDriverInstallationMissing=mergeDriverAudit?.status==="missing"&&mergeDriverAudit.missing_keys.length===5&&mergeDriverAudit.drifted_keys.length===0;const warnings=[...itemScan.unreadable.map(entry=>`integrity_item_unreadable:${entry}`),...itemScan.conflictMarkers.map(entry=>`integrity_item_conflict_marker:${entry.path}:L${entry.line}`),...itemScan.parseFailures.map(entry=>`integrity_item_parse_failed:${entry}`),...historyScan.unreadable.map(entry=>`integrity_history_unreadable:${entry}`),...historyScan.conflictMarkers.map(entry=>`integrity_history_conflict_marker:${entry.id}:L${entry.line}`),...historyScan.invalidJson.map(entry=>`integrity_history_invalid_json:${entry.id}:L${entry.line}`),...formatVersionScan.outdated.map(entry=>`integrity_item_outdated_format_version:${entry}`),...formatVersionScan.ahead.map(entry=>`integrity_item_ahead_format_version:${entry}`),...buildHierarchyIntegrityWarnings(hierarchyIntegrity),...trackedRuntimeCache.tracked_path_count>0?[`tracked_runtime_cache_files:${trackedRuntimeCache.tracked_path_count}`]:[],...mergeDriverAudit!==null&&mergeDriverAudit.status!=="ok"?[`merge_driver_configuration_${mergeDriverInstallationMissing?"missing":"drift"}:${mergeDriverAudit.missing_keys.length+mergeDriverAudit.drifted_keys.length}`]:[],...pendingMergeDecisions.length>0?[`merge_decisions_unreviewed:${pendingMergeDecisions.length}`]:[],...losslessMergeReceipts.length>0?[`merge_receipts_pending:${losslessMergeReceipts.length}`]:[],...buildMergeReceiptEvidenceWarnings({invalidEvidenceCount:mergeReceiptEvidence.invalid_evidence_count,missingHistoryReferenceCount:missingMergeReceiptReferences.length})];const normalizedWarnings=[...new Set(warnings)].sort((left,right)=>left.localeCompare(right));const actionableWarnings=normalizedWarnings.filter(warning=>!warning.startsWith("integrity_legacy_hierarchy_"));return{check:{name:"integrity",status:actionableWarnings.length===0?"ok":"warn",ok:actionableWarnings.length===0,details:{checked_item_files:itemScan.paths.length,checked_history_streams:historyScan.files.length,counts:{item_unreadable:itemScan.unreadable.length,item_conflict_markers:itemScan.conflictMarkers.length,item_parse_failures:itemScan.parseFailures.length,history_unreadable:historyScan.unreadable.length,history_conflict_markers:historyScan.conflictMarkers.length,history_invalid_json:historyScan.invalidJson.length,item_outdated_format_version:formatVersionScan.outdated.length,item_ahead_format_version:formatVersionScan.ahead.length,hierarchy_cycles:hierarchyIntegrity.cycles.length,hierarchy_cardinality_violations:hierarchyIntegrity.cardinality_violations.length,hierarchy_parent_divergences:hierarchyIntegrity.divergences.length,tracked_runtime_cache_files:trackedRuntimeCache.tracked_path_count,merge_driver_configuration:mergeDriverAudit===null||mergeDriverAudit.status==="ok"?0:mergeDriverAudit.missing_keys.length+mergeDriverAudit.drifted_keys.length,pending_merge_decisions:pendingMergeDecisions.length,lossless_merge_receipts:losslessMergeReceipts.length,invalid_merge_receipt_evidence:mergeReceiptEvidence.invalid_evidence_count,missing_merge_receipt_history_references:missingMergeReceiptReferences.length,accepted_legacy_merge_receipt_references:historyReceiptClassification.acceptedLegacyCount,accepted_missing_merge_receipt_dispositions:historyReceiptClassification.acceptedDispositionCount},item_unreadable:itemScan.unreadable,item_conflict_markers:itemScan.conflictMarkers,item_parse_failures:itemScan.parseFailures,item_outdated_format_version:formatVersionScan.outdated,item_ahead_format_version:formatVersionScan.ahead,hierarchy_integrity:{...hierarchyIntegrity,relations:summarizeRecordList(hierarchyIntegrity.relations,BRIEF_HEALTH_DETAIL_LIMIT)},history_unreadable:historyScan.unreadable,history_conflict_markers:historyScan.conflictMarkers,history_invalid_json:historyScan.invalidJson,tracked_runtime_cache:{tracker_relative_root:trackedRuntimeCache.tracker_relative_root,tracked_paths:trackedRuntimeCache.tracked_paths,tracked_path_count:trackedRuntimeCache.tracked_path_count,remediation_command:trackedRuntimeCache.remediation_command},merge_driver_configuration:mergeDriverAudit===null?null:{...mergeDriverAudit,required:requireMergeDrivers},pending_merge_decision_items:[...new Set(pendingMergeDecisions.map(receipt=>receipt.item_id))].sort((left,right)=>left.localeCompare(right)),lossless_merge_receipt_items:[...new Set(losslessMergeReceipts.map(receipt=>receipt.item_id))].sort((left,right)=>left.localeCompare(right)),invalid_merge_receipt_evidence_details:mergeReceiptEvidence.invalid_evidence,invalid_merge_receipt_evidence_details_truncated:mergeReceiptEvidence.invalid_evidence_truncated,missing_merge_receipt_history_reference_details:missingMergeReceiptReferences.slice(0,HEALTH_WARNING_LIMIT),missing_merge_receipt_history_reference_details_truncated:missingMergeReceiptReferences.length>HEALTH_WARNING_LIMIT}},warnings:normalizedWarnings,gitWorkspaceRoot,pendingMergeReceipts}}function hasActivateExport(moduleRecord){if(typeof moduleRecord.activate==="function"){return true}const defaultExport=moduleRecord.default;if(typeof defaultExport!=="object"||defaultExport===null){return false}return typeof defaultExport.activate==="function"}function summarizeLoadedExtension(extension){const summary={layer:extension.layer,directory:extension.directory,manifest_path:extension.manifest_path,name:extension.name,version:extension.version,entry:extension.entry,priority:extension.priority,entry_path:extension.entry_path,has_activate:hasActivateExport(extension.module)};if(Array.isArray(extension.capabilities)){summary.capabilities=[...extension.capabilities]}return summary}function resolveMigrationId(definition,fallbackIndex){const explicitId=toNonEmptyStringOrUndefined(definition.id);if(explicitId){return explicitId}return`migration-${String(fallbackIndex+1).padStart(3,"0")}`}function resolveMigrationStatus(definition){const rawStatus=toNonEmptyStringOrUndefined(definition.status);const normalized=rawStatus?.toLowerCase();if(normalized==="failed"){return"failed"}if(normalized==="applied"){return"applied"}return"pending"}function resolveMigrationFailureReason(definition){return toNonEmptyStringOrUndefined(definition.reason)??toNonEmptyStringOrUndefined(definition.error)??toNonEmptyStringOrUndefined(definition.message)}function compareMigrationEntries(left,right){const byLayer=(left.layer??"").localeCompare(right.layer??"");if(byLayer!==0){return byLayer}const byName=(left.name??"").localeCompare(right.name??"");if(byName!==0){return byName}return(left.id??"").localeCompare(right.id??"")}function summarizeMigrationStatuses(migrations){const applied=[];const pending=[];const failed=[];migrations.forEach((migration,index)=>{const id=resolveMigrationId(migration.definition,index);const status=resolveMigrationStatus(migration.definition);if(status==="applied"){applied.push({layer:migration.layer,name:migration.name,id,status});return}if(status==="failed"){failed.push({layer:migration.layer,name:migration.name,id,status,reason:resolveMigrationFailureReason(migration.definition)});return}pending.push({layer:migration.layer,name:migration.name,id,status})});applied.sort(compareMigrationEntries);pending.sort(compareMigrationEntries);failed.sort(compareMigrationEntries);const warnings=[...failed.map(entry=>`extension_migration_failed:${entry.layer}:${entry.name}:${entry.id}`),...pending.map(entry=>`extension_migration_pending:${entry.layer}:${entry.name}:${entry.id}`)];return{summary:{applied,pending,failed,applied_count:applied.length,pending_count:pending.length,failed_count:failed.length},warnings}}function buildExtensionHealthTriageSummary(warnings,loadFailureCount,activationFailureCount,migrationStatus,managedStateWarningCount,managedExtensionEntriesCount,unmanagedLoadedExtensions,unmanagedExpectedExtensions,unmanagedActionRequiredExtensions){const normalizedWarnings=[...new Set(warnings)].sort((left,right)=>left.localeCompare(right));const warningCodes=[...new Set(normalizedWarnings.map(value=>warningCode(value)))].sort((left,right)=>left.localeCompare(right));const unknownCapabilityCount=normalizedWarnings.filter(warning=>warning.startsWith("extension_capability_unknown:")).length;const updateHealthPartial=unmanagedActionRequiredExtensions.length>0;const updateHealthCoverage=updateHealthPartial?"partial":"full";const remediation=[];const registrationCollisionRemediation=buildRegistrationCollisionRemediation(normalizedWarnings,{deactivate:"pm extension --deactivate <name> --project/--global",doctor:"pm extension --doctor --project/--global --detail deep --trace"});if(registrationCollisionRemediation){remediation.push(registrationCollisionRemediation)}if(loadFailureCount>0){remediation.push("Run pm extension --explore --project and pm extension --explore --global to inspect load failures.")}if(activationFailureCount>0){remediation.push("Review checks[name=extensions].details.activation.failed in pm health --json for activation error details.")}if(migrationStatus.failed_count>0||migrationStatus.pending_count>0){remediation.push("Resolve pending/failed extension migrations before write commands; use --force only when policy allows.")}if(managedStateWarningCount>0){remediation.push("Run pm extension --manage --project and pm extension --manage --global to refresh managed-state diagnostics.")}if(unknownCapabilityCount>0){remediation.push(`Unknown extension capabilities detected. Allowed capabilities: ${KNOWN_EXTENSION_CAPABILITIES.join(", ")}. Review extension_capability_unknown warning details for suggested replacements.`)}if(normalizedWarnings.some(warning=>warning.startsWith("extension_capability_legacy_alias:"))){remediation.push("Legacy extension capability aliases were auto-remapped to canonical capabilities. Update manifests to canonical names (migration/validation -> schema).")}if(normalizedWarnings.some(warning=>warning.startsWith("extension_command_definition_legacy_handler_alias:"))){remediation.push("Extension command definitions using legacy handler were auto-remapped. Update command definitions to use run: (context) => ... for forward compatibility.")}if(updateHealthPartial){remediation.push("Update-check coverage is partial because unmanaged extensions need adoption. Adopt existing installs via pm extension --manage --project/--global --fix-managed-state, pm extension --adopt-all --project/--global, or pm extension --adopt <name>.")}else if(unmanagedLoadedExtensions.length>0){remediation.push("Loaded unmanaged extensions are currently treated as informational. Use pm extension --manage --project/--global --fix-managed-state to adopt them for update checks.")}if(remediation.length===0){remediation.push("No immediate action required. Re-run pm health after extension configuration changes.")}return{status:normalizedWarnings.length===0?"ok":"warn",warning_count:normalizedWarnings.length,warning_codes:warningCodes,load_failure_count:loadFailureCount,activation_failure_count:activationFailureCount,migration_failed_count:migrationStatus.failed_count,migration_pending_count:migrationStatus.pending_count,managed_state_warning_count:managedStateWarningCount,managed_extension_entries_count:managedExtensionEntriesCount,unmanaged_loaded_extension_count:unmanagedLoadedExtensions.length,unmanaged_loaded_extensions:unmanagedLoadedExtensions,unmanaged_expected_extension_count:unmanagedExpectedExtensions.length,unmanaged_expected_extensions:unmanagedExpectedExtensions,unmanaged_action_required_extension_count:unmanagedActionRequiredExtensions.length,unmanaged_action_required_extensions:unmanagedActionRequiredExtensions,update_health_coverage:updateHealthCoverage,update_health_partial:updateHealthPartial,unknown_capability_count:unknownCapabilityCount,top_warnings:normalizedWarnings.slice(0,8),remediation}}async function buildExtensionCheck(pmRoot,settings,noExtensionsFlag){const authorManifest=await inspectExtensionAuthorManifest(resolveWorkspaceRoot(pmRoot));const loadResult=await loadExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:noExtensionsFlag});const loadedSummaries=loadResult.loaded.map(extension=>summarizeLoadedExtension(extension));const hostVersionCensus=await scanExtensionHostVersions(loadResult.loaded,resolveWorkspaceRoot(pmRoot));const activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded});const[projectManagedState,globalManagedState]=await Promise.all([readManagedExtensionState(loadResult.roots.project),readManagedExtensionState(loadResult.roots.global)]);await applyStoredExtensionMigrationState(pmRoot,activationResult.registrations.migrations);const migrationStatus=summarizeMigrationStatuses(activationResult.registrations.migrations);const activationDetails={failed:activationResult.failed,warnings:activationResult.warnings,hook_counts:activationResult.hook_counts,command_override_count:activationResult.command_override_count,command_handler_count:activationResult.command_handler_count,parser_override_count:activationResult.parser_override_count,preflight_override_count:activationResult.preflight_override_count,service_override_count:activationResult.service_override_count,renderer_override_count:activationResult.renderer_override_count,registration_counts:activationResult.registration_counts,registrations:activationResult.registrations,migration_status:migrationStatus.summary,managed_extensions:{project:{path:projectManagedState.path,count:projectManagedState.state.entries.length,entries:projectManagedState.state.entries},global:{path:globalManagedState.path,count:globalManagedState.state.entries.length,entries:globalManagedState.state.entries}}};const managedProjectNames=new Set(projectManagedState.state.entries.map(entry=>normalizeExtensionNameForMatch(entry.name)));const managedGlobalNames=new Set(globalManagedState.state.entries.map(entry=>normalizeExtensionNameForMatch(entry.name)));const unmanagedLoadedEntries=[...new Map(loadResult.loaded.filter(entry=>{const managedNames=entry.layer==="project"?managedProjectNames:managedGlobalNames;return!managedNames.has(normalizeExtensionNameForMatch(entry.name))}).map(entry=>[`${entry.layer}:${entry.name}`,{layer:entry.layer,name:entry.name,directory:entry.directory}])).values()].sort((left,right)=>{const leftKey=`${left.layer}:${left.name}`;const rightKey=`${right.layer}:${right.name}`;return leftKey.localeCompare(rightKey)});const unmanagedLoadedExtensions=unmanagedLoadedEntries.map(entry=>`${entry.layer}:${entry.name}`).sort((left,right)=>left.localeCompare(right));const unmanagedExpectedExtensions=unmanagedLoadedEntries.filter(entry=>isExpectedUnmanagedExtension(entry.name,entry.directory)).map(entry=>`${entry.layer}:${entry.name}`).sort((left,right)=>left.localeCompare(right));const unmanagedActionRequiredExtensions=unmanagedLoadedEntries.filter(entry=>!isExpectedUnmanagedExtension(entry.name,entry.directory)).map(entry=>`${entry.layer}:${entry.name}`).sort((left,right)=>left.localeCompare(right));const updateCoverageWarnings=unmanagedActionRequiredExtensions.length>0?[`extension_update_health_partial_coverage:skipped_unmanaged:${unmanagedActionRequiredExtensions.length}`]:[];const extensionWarnings=[...authorManifest.warnings,...loadResult.warnings,...activationDetails.warnings,...migrationStatus.warnings,...projectManagedState.warnings,...globalManagedState.warnings,...updateCoverageWarnings,...hostVersionCensus.warnings];const capabilityGuidance=collectUnknownCapabilityGuidance(extensionWarnings);const capabilityContract=buildCapabilityContractMetadata();const extensionTriage=buildExtensionHealthTriageSummary(extensionWarnings,loadResult.failed.length,activationResult.failed.length,migrationStatus.summary,projectManagedState.warnings.length+globalManagedState.warnings.length,projectManagedState.state.entries.length+globalManagedState.state.entries.length,unmanagedLoadedExtensions,unmanagedExpectedExtensions,unmanagedActionRequiredExtensions);return{check:{name:"extensions",status:extensionWarnings.length===0?"ok":"warn",ok:extensionWarnings.length===0,details:{...loadResult,loaded:loadedSummaries,warnings:extensionWarnings,activation:activationDetails,author_manifest:authorManifest,triage:extensionTriage,...migrationStatus.summary.pending_count>0?{remediation_map:{extension_migration_pending:"pm extension migrate --project"}}:{},capability_contract:capabilityContract,capability_guidance:capabilityGuidance,host_version_census:hostVersionCensus}},warnings:extensionWarnings}}function summarizeList(values,limit){if(values.length<=limit){return{values,truncated:false}}return{values:values.slice(0,limit),truncated:true}}function summarizeRecordList(value,limit){if(!Array.isArray(value)){return{count:0,sample:[],truncated:false}}return{count:value.length,sample:value.slice(0,limit),truncated:value.length>limit}}function summarizeExtensionRecord(value){if(typeof value!=="object"||value===null||Array.isArray(value)){return{}}const record=value;return{layer:record.layer,directory:record.directory,name:record.name,version:record.version,enabled:record.enabled,status:record.status,has_activate:record.has_activate,capabilities:record.capabilities}}function summarizeExtensionList(value,limit){const summary=summarizeRecordList(value,limit);return{...summary,sample:summary.sample.map(entry=>summarizeExtensionRecord(entry))}}function summarizeStringList(value,limit){if(!Array.isArray(value)){return{count:0,sample:[],truncated:false}}const strings=value.filter(entry=>typeof entry==="string");return{count:strings.length,sample:strings.slice(0,limit),truncated:strings.length>limit}}function summarizeActivationMigrationStatus(value){if(typeof value!=="object"||value===null){return null}const status=value;return{applied_count:status.applied_count,pending_count:status.pending_count,failed_count:status.failed_count}}const HEALTH_DETAIL_SUMMARIZERS={settings:(details,limit)=>({version:details.version,id_prefix:details.id_prefix,locks_ttl_seconds:details.locks_ttl_seconds,warnings:summarizeStringList(details.warnings,limit)}),directories:(details,limit)=>({required_count:Array.isArray(details.required)?details.required.length:0,optional_count:Array.isArray(details.optional)?details.optional.length:0,missing_required:summarizeStringList(details.missing_required,limit),missing_optional:summarizeStringList(details.missing_optional,limit),missing:summarizeStringList(details.missing,limit),strict_directories:details.strict_directories}),settings_values:(details,limit)=>({warnings:summarizeStringList(details.warnings,limit)}),telemetry:details=>({enabled:details.enabled,capture_level:details.capture_level,endpoint:details.endpoint,queue_exists:details.queue_exists,queue_entries:details.queue_entries,queue_draining:details.queue_draining,queue_invalid_rows:details.queue_invalid_rows,queue_rows_total:details.queue_rows_total,last_successful_flush_at:details.last_successful_flush_at,last_failed_flush_at:details.last_failed_flush_at,endpoint_probe:details.endpoint_probe,env_overrides:details.env_overrides}),extensions:(details,limit)=>{const activation=typeof details.activation==="object"&&details.activation!==null?details.activation:{};return{disabled_by_flag:details.disabled_by_flag,discovered:summarizeExtensionList(details.discovered,limit),effective:summarizeExtensionList(details.effective,limit),loaded:summarizeExtensionList(details.loaded,limit),failed:summarizeRecordList(details.failed,limit),warnings:summarizeStringList(details.warnings,limit),activation:{failed:summarizeRecordList(activation.failed,limit),warnings:summarizeStringList(activation.warnings,limit),hook_counts:activation.hook_counts,command_handler_count:activation.command_handler_count,service_override_count:activation.service_override_count,renderer_override_count:activation.renderer_override_count,registration_counts:activation.registration_counts,migration_status:summarizeActivationMigrationStatus(activation.migration_status)},author_manifest:details.author_manifest,triage:details.triage,capability_contract:details.capability_contract,capability_guidance:summarizeRecordList(details.capability_guidance,limit),host_version_census:details.host_version_census}},storage:(details,limit)=>{const authorAttribution=typeof details.author_attribution==="object"&&details.author_attribution!==null?details.author_attribution:void 0;return{...details,...authorAttribution?{author_attribution:{...authorAttribution,affected_item_ids:summarizeStringList(authorAttribution.affected_item_ids,limit),samples:summarizeRecordList(authorAttribution.samples,limit)}}:{}}},locks:details=>({active_lock_count:details.active_lock_count,stale_lock_count:details.stale_lock_count,unreadable_lock_count:details.unreadable_lock_count,unparseable_lock_count:details.unparseable_lock_count}),integrity:(details,limit)=>{const trackedRuntimeCache=typeof details.tracked_runtime_cache==="object"&&details.tracked_runtime_cache!==null?details.tracked_runtime_cache:void 0;return{checked_item_files:details.checked_item_files,checked_history_streams:details.checked_history_streams,counts:details.counts,item_unreadable:summarizeStringList(details.item_unreadable,limit),item_conflict_markers:summarizeRecordList(details.item_conflict_markers,limit),item_parse_failures:summarizeStringList(details.item_parse_failures,limit),tracked_runtime_cache:trackedRuntimeCache===void 0?details.tracked_runtime_cache:{...trackedRuntimeCache,tracked_paths:summarizeStringList(trackedRuntimeCache.tracked_paths,limit)},history_unreadable:summarizeStringList(details.history_unreadable,limit),history_conflict_markers:summarizeRecordList(details.history_conflict_markers,limit),history_invalid_json:summarizeRecordList(details.history_invalid_json,limit),skipped:details.skipped}},history_drift:(details,limit)=>{const cacheConfirmation=typeof details.cache_confirmation==="object"&&details.cache_confirmation!==null?details.cache_confirmation:void 0;return{checked_items:details.checked_items,cache_hit_verification:details.cache_hit_verification,cache_confirmation:cacheConfirmation===void 0?details.cache_confirmation:{...cacheConfirmation,candidate_items:summarizeStringList(cacheConfirmation.candidate_items,limit),confirmed_items:summarizeStringList(cacheConfirmation.confirmed_items,limit),resolved_false_positive_items:summarizeStringList(cacheConfirmation.resolved_false_positive_items,limit)},counts:details.counts,drifted_items:summarizeStringList(details.drifted_items,limit),merge_receipt_attributed_items:summarizeStringList(details.merge_receipt_attributed_items,limit),missing_streams:summarizeStringList(details.missing_streams,limit),unreadable_streams:summarizeStringList(details.unreadable_streams,limit),hash_mismatches:summarizeStringList(details.hash_mismatches,limit),chain_mismatches:summarizeStringList(details.chain_mismatches,limit),version_skews:summarizeStringList(details.version_skews,limit),workspace_state_mismatches:summarizeStringList(details.workspace_state_mismatches,limit),workspace_state_missing:summarizeStringList(details.workspace_state_missing,limit),workspace_state_unreadable:summarizeStringList(details.workspace_state_unreadable,limit),skipped:details.skipped}},vectorization:(details,limit)=>({semantic_runtime_available:details.semantic_runtime_available,compatibility_mode_auto_defaults:details.compatibility_mode_auto_defaults,auto_ollama_defaults_applied:details.auto_ollama_defaults_applied,auto_ollama_defaults_skipped_reason:details.auto_ollama_defaults_skipped_reason,auto_ollama_defaults_remediation:details.auto_ollama_defaults_remediation,refresh_policy:details.refresh_policy,provider_active:details.provider_active,vector_store_active:details.vector_store_active,items:details.items,ledger_entries_before:details.ledger_entries_before,stale_items_before_total:details.stale_items_before_total,stale_items_before:summarizeStringList(details.stale_items_before,limit),refresh_attempted:details.refresh_attempted,refresh_skipped_reason:details.refresh_skipped_reason,refresh_result:details.refresh_result,ledger_entries_after:details.ledger_entries_after,stale_items_after_total:details.stale_items_after_total,stale_items_after:summarizeStringList(details.stale_items_after,limit),skipped:details.skipped})};function summarizeHealthCheckDetails(check,limit){const summarize=HEALTH_DETAIL_SUMMARIZERS[check.name];return summarize?summarize(check.details,limit):check.details}function applyBriefHealthProjection(result){const warningsSummary=summarizeStringList(result.warnings,BRIEF_HEALTH_DETAIL_LIMIT);return{ok:result.ok,...result.verdict?{verdict:result.verdict}:{},checks:result.checks.map(check=>({name:check.name,status:check.status,ok:check.ok,details:summarizeHealthCheckDetails(check,BRIEF_HEALTH_DETAIL_LIMIT)})),warnings:warningsSummary.sample,findings:result.findings.filter(finding=>warningsSummary.sample.includes(finding.warning)||result.failed_because.includes(finding.warning)),failed_because:result.failed_because,projection:{mode:"brief",warning_count:warningsSummary.count,warnings_truncated:warningsSummary.truncated,detail_limit:BRIEF_HEALTH_DETAIL_LIMIT},generated_at:result.generated_at}}function isSkippedHealthCheck(check){return check.details.skipped===true}function applySummaryHealthProjection(result){const warningsSummary=summarizeStringList(result.warnings,BRIEF_HEALTH_DETAIL_LIMIT);const omittedChecks=result.checks.filter(isSkippedHealthCheck).map(check=>check.name);return{ok:result.ok,...result.verdict?{verdict:result.verdict}:{},checks:result.checks.filter(check=>!isSkippedHealthCheck(check)).map(check=>({name:check.name,status:check.status,ok:check.ok,details:{}})),warning_count:warningsSummary.count,warnings:warningsSummary.sample,findings:result.findings.filter(finding=>warningsSummary.sample.includes(finding.warning)||result.failed_because.includes(finding.warning)),failed_because:result.failed_because,projection:{mode:"summary",warning_count:warningsSummary.count,warnings_truncated:warningsSummary.truncated,detail_limit:BRIEF_HEALTH_DETAIL_LIMIT,omitted_checks:omittedChecks},generated_at:result.generated_at}}function selectStaleItemDetail(values,verboseStaleItems){if(verboseStaleItems){return{values,truncated:false,total:values.length}}const summary=summarizeList(values,STALE_VECTORIZATION_SUMMARY_LIMIT);return{values:summary.values,truncated:summary.truncated,total:values.length}}function telemetryEnvFlagEnabled(envKey){const value=(process.env[envKey]??"").trim().toLowerCase();return value==="1"||value==="true"||value==="yes"||value==="on"}function telemetrySourceContextOverride(){const value=(process.env.PM_TELEMETRY_SOURCE_CONTEXT??"").trim().toLowerCase();return PM_TELEMETRY_SOURCE_CONTEXT_SET.has(value)?value:null}function normalizeEndpointForDisplay(rawEndpoint){const trimmed=rawEndpoint.trim();if(trimmed.length===0){return""}try{const parsed=new URL(trimmed);parsed.username="";parsed.password="";parsed.search="";parsed.hash="";return parsed.toString()}catch{return trimmed}}function parseTelemetryQueue(raw){let validEntries=0;let invalidRows=0;let totalRows=0;let highRetryEntries=0;let maxAttempts=0;for(const line of raw.split("\n")){const trimmed=line.trim();if(trimmed.length===0){continue}totalRows+=1;try{const parsed=JSON.parse(trimmed);if(typeof parsed==="object"&&parsed!==null&&typeof parsed.attempts==="number"&&Number.isFinite(parsed.attempts)){const attempts=Math.max(0,Math.trunc(parsed.attempts));validEntries+=1;maxAttempts=Math.max(maxAttempts,attempts);if(attempts>=TELEMETRY_QUEUE_HIGH_RETRY_THRESHOLD){highRetryEntries+=1}}else{invalidRows+=1}}catch{invalidRows+=1}}return{validEntries,invalidRows,totalRows,highRetryEntries,maxAttempts}}function emptyTelemetryQueueSummary(){return{validEntries:0,invalidRows:0,totalRows:0,highRetryEntries:0,maxAttempts:0}}function parseTelemetryRuntimeState(stateRaw){if(!stateRaw||stateRaw.trim().length===0){return{runtimeState:{},stateParseFailed:false}}try{const parsed=JSON.parse(stateRaw);if(typeof parsed==="object"&&parsed!==null&&!Array.isArray(parsed)){return{runtimeState:parsed,stateParseFailed:false}}return{runtimeState:{},stateParseFailed:true}}catch{return{runtimeState:{},stateParseFailed:true}}}async function maybeProbeTelemetryEndpoint(settings,checkTelemetry){const endpoint=settings.telemetry.endpoint.trim();if(!checkTelemetry||!settings.telemetry.enabled||endpoint.length===0){return void 0}const probe=await probeTelemetryEndpointHealth(endpoint);return{attempted:true,...probe}}function collectTelemetryQueueWarnings(settings,queueSummary,runtimeState){const warnings=[];if(queueSummary.invalidRows>0){warnings.push(`telemetry_queue_invalid_rows:${queueSummary.invalidRows}`)}if(!settings.telemetry.enabled||queueSummary.validEntries===0){return warnings}const lastSuccess=runtimeState.last_successful_flush_at;const lastFailure=runtimeState.last_failed_flush_at;const activeFailure=lastFailure&&(!lastSuccess||lastFailure>lastSuccess);const neverFlushed=!lastSuccess;const highWater=queueSummary.validEntries>=TELEMETRY_QUEUE_HIGH_WATER_MARK;if(activeFailure||neverFlushed||highWater){warnings.push(`telemetry_queue_pending:${queueSummary.validEntries}`)}if(queueSummary.highRetryEntries>0){warnings.push(`telemetry_queue_high_retries:${queueSummary.highRetryEntries}`)}return warnings}function collectTelemetryEndpointWarnings(endpointProbe){if(!endpointProbe||endpointProbe.ok!==false){return[]}return typeof endpointProbe.status==="number"?[`telemetry_endpoint_probe_http_status:${endpointProbe.status}`]:["telemetry_endpoint_probe_failed"]}function collectTelemetrySchemaWarnings(endpointProbe){const parsedMaxSchemaVersion=Number.parseInt(endpointProbe?.max_schema_version??"",10);if(endpointProbe?.ok===true&&Number.isInteger(parsedMaxSchemaVersion)&&parsedMaxSchemaVersion>TELEMETRY_SCHEMA_VERSION){return[`telemetry_schema_version_behind:${parsedMaxSchemaVersion}`]}return[]}function collectTelemetryOtelWarnings(settings,runtimeState){const pendingOtelSpans=typeof runtimeState.pending_otel_spans==="number"?runtimeState.pending_otel_spans:0;const lastOtelSuccess=runtimeState.last_otel_success_at;const lastOtelFailure=runtimeState.last_otel_failure_at;const otelExportFailing=settings.telemetry.enabled&&pendingOtelSpans>0&&Boolean(lastOtelFailure)&&(!lastOtelSuccess||lastOtelFailure>=lastOtelSuccess);return otelExportFailing?[`telemetry_otel_export_failing:${pendingOtelSpans}`]:[]}function buildTelemetryEnvOverrideDetails(){return{telemetry_disabled:telemetryEnvFlagEnabled("PM_TELEMETRY_DISABLED")||telemetryEnvFlagEnabled("PM_NO_TELEMETRY"),pm_no_telemetry:telemetryEnvFlagEnabled("PM_NO_TELEMETRY"),telemetry_otel_disabled:telemetryEnvFlagEnabled("PM_TELEMETRY_OTEL_DISABLED"),telemetry_inline_flush:telemetryEnvFlagEnabled("PM_TELEMETRY_INLINE_FLUSH"),telemetry_source_context:telemetrySourceContextOverride()}}function telemetryQueueHasEntries(settings,queueSummary){return settings.telemetry.enabled&&queueSummary.validEntries>0}function isTelemetryQueueDraining(queueHasEntries,warnings){return queueHasEntries&&warnings.every(warning=>!warning.startsWith("telemetry_queue_pending:")&&!warning.startsWith("telemetry_queue_high_retries:"))}async function probeTelemetryEndpointHealth(endpoint){let probeUrl=endpoint;try{const parsed=new URL(endpoint);parsed.pathname="/healthz";parsed.search="";parsed.hash="";probeUrl=parsed.toString()}catch{}try{const response=await fetch(probeUrl,{method:"GET",signal:AbortSignal.timeout(TELEMETRY_ENDPOINT_PROBE_TIMEOUT_MS)});return{probe_url:normalizeEndpointForDisplay(probeUrl),ok:response.ok,status:response.status,max_schema_version:(()=>{for(const headerName of TELEMETRY_SERVER_MAX_SCHEMA_VERSION_HEADERS){const value=response.headers.get(headerName)?.trim();if(value&&value.length>0){return value}}return void 0})()}}catch(error){return{probe_url:normalizeEndpointForDisplay(probeUrl),ok:false,error:error instanceof Error?error.message:"probe_failed"}}}async function buildTelemetryCheck(settings,options){const globalPmRoot=resolveGlobalPmRoot(process.cwd());const queuePath=path.join(globalPmRoot,TELEMETRY_QUEUE_RELATIVE_PATH);const statePath=path.join(globalPmRoot,TELEMETRY_STATE_RELATIVE_PATH);const queueRaw=await readFileIfExists(queuePath);const queueExists=queueRaw!==null;const queueSizeBytes=queueRaw?Buffer.byteLength(queueRaw,"utf8"):0;const queueSummary=queueRaw?parseTelemetryQueue(queueRaw):emptyTelemetryQueueSummary();const stateRaw=await readFileIfExists(statePath);const{runtimeState,stateParseFailed}=parseTelemetryRuntimeState(stateRaw);const endpoint=settings.telemetry.endpoint.trim();const endpointDisplay=normalizeEndpointForDisplay(endpoint);const endpointProbe=await maybeProbeTelemetryEndpoint(settings,options.checkTelemetry);const warnings=[];if(stateParseFailed){warnings.push("telemetry_state_invalid_json")}warnings.push(...collectTelemetryQueueWarnings(settings,queueSummary,runtimeState),...collectTelemetryEndpointWarnings(endpointProbe),...collectTelemetrySchemaWarnings(endpointProbe),...collectTelemetryOtelWarnings(settings,runtimeState));const queueHasEntries=telemetryQueueHasEntries(settings,queueSummary);const pendingOtelSpans=typeof runtimeState.pending_otel_spans==="number"?runtimeState.pending_otel_spans:0;return{check:{name:"telemetry",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{enabled:settings.telemetry.enabled,capture_level:settings.telemetry.capture_level,endpoint:endpointDisplay,global_pm_root:globalPmRoot,queue_path:queuePath,queue_exists:queueExists,queue_entries:queueSummary.validEntries,queue_draining:isTelemetryQueueDraining(queueHasEntries,warnings),queue_invalid_rows:queueSummary.invalidRows,queue_rows_total:queueSummary.totalRows,queue_size_bytes:queueSizeBytes,queue_high_retry_entries:queueSummary.highRetryEntries,queue_high_retry_threshold:TELEMETRY_QUEUE_HIGH_RETRY_THRESHOLD,queue_max_attempts:queueSummary.maxAttempts,runtime_state_path:statePath,last_attempted_flush_at:runtimeState.last_attempted_flush_at??null,last_successful_flush_at:runtimeState.last_successful_flush_at??null,last_failed_flush_at:runtimeState.last_failed_flush_at??null,last_failed_flush_error:runtimeState.last_failed_flush_error??null,pending_otel_spans:pendingOtelSpans,last_otel_attempt_at:runtimeState.last_otel_attempt_at??null,last_otel_success_at:runtimeState.last_otel_success_at??null,last_otel_failure_at:runtimeState.last_otel_failure_at??null,last_otel_failure_error:runtimeState.last_otel_failure_error??null,endpoint_probe:endpointProbe??{attempted:false},env_overrides:buildTelemetryEnvOverrideDetails()}},warnings}}async function buildLocksCheck(pmRoot){let scan;try{scan=await scanLockHealth(pmRoot)}catch(error){const message=error instanceof Error?error.message:String(error);return{check:{name:"locks",status:"warn",ok:false,details:{active_lock_count:0,stale_lock_count:0,unreadable_lock_count:0,unparseable_lock_count:0,scan_failed:true,error:message,pm_root:pmRoot}},warnings:[`locks_scan_failed:${message}`]}}const warnings=[];if(scan.stale_lock_count>0){warnings.push(`locks_stale_count:${scan.stale_lock_count}`)}if(scan.unreadable_lock_count>0){warnings.push(`locks_unreadable:${scan.unreadable_lock_count}`)}return{check:{name:"locks",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{active_lock_count:scan.active_lock_count,stale_lock_count:scan.stale_lock_count,unreadable_lock_count:scan.unreadable_lock_count,unparseable_lock_count:scan.unparseable_lock_count}},warnings}}async function buildHistoryDriftCheck(params){const cacheHitVerification="metadata";let items=params.items;let drift=await scanHistoryDrift(params.pmRoot,items,{cacheHitVerification});const cacheConfirmationCandidates=[...new Set([...drift.hashMismatches,...drift.chainMismatches,...drift.versionSkews])].sort((left,right)=>left.localeCompare(right));let confirmedItems=[];let resolvedFalsePositiveItems=[];if(cacheConfirmationCandidates.length>0){items=await listAllItemMetadataWithBody(params.pmRoot,params.settings.item_format,params.typeRegistry.type_to_folder,params.itemReadWarnings,params.settings.schema,{forceSourceScan:true});drift=await scanHistoryDrift(params.pmRoot,items);confirmedItems=[...new Set([...drift.hashMismatches,...drift.chainMismatches,...drift.versionSkews])].sort((left,right)=>left.localeCompare(right));const confirmedSet=new Set(confirmedItems);resolvedFalsePositiveItems=cacheConfirmationCandidates.filter(id=>!confirmedSet.has(id))}const{missingStreams,unreadableStreams,hashMismatches,chainMismatches,versionSkews,driftedItems,workspaceStateMismatches,workspaceStateMissing,workspaceStateUnreadable}=drift;const warnings=[...missingStreams.map(id=>`history_drift_missing_stream:${id}`),...unreadableStreams.map(id=>`history_drift_unreadable_stream:${id}`),...hashMismatches.map(id=>`history_drift_hash_mismatch:${id}`),...chainMismatches.map(id=>`history_drift_chain_mismatch:${id}`),...versionSkews.map(id=>`history_drift_version_skew:${id}`),...workspaceStateMismatches.map(documentPath=>`history_drift_workspace_state_mismatch:${documentPath}`),...workspaceStateMissing.map(documentPath=>`history_drift_workspace_state_missing:${documentPath}`),...workspaceStateUnreadable.map(documentPath=>`history_drift_workspace_state_unreadable:${documentPath}`)];return{check:{name:"history_drift",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{checked_items:items.length,cache_hit_verification:cacheConfirmationCandidates.length>0?"metadata_then_content_hash":cacheHitVerification,cache_confirmation:{triggered:cacheConfirmationCandidates.length>0,reason:cacheConfirmationCandidates.length>0?"cached_corruption_candidate":null,candidate_items:cacheConfirmationCandidates,confirmed_items:confirmedItems,resolved_false_positive_items:resolvedFalsePositiveItems,authoritative_item_source:cacheConfirmationCandidates.length>0},drifted_items:driftedItems,counts:{drifted:driftedItems.length,missing_streams:missingStreams.length,unreadable_streams:unreadableStreams.length,hash_mismatches:hashMismatches.length,chain_mismatches:chainMismatches.length,version_skews:versionSkews.length,workspace_state_mismatches:workspaceStateMismatches.length,workspace_state_missing:workspaceStateMissing.length,workspace_state_unreadable:workspaceStateUnreadable.length},missing_streams:missingStreams,unreadable_streams:unreadableStreams,hash_mismatches:hashMismatches,chain_mismatches:chainMismatches,version_skews:versionSkews,workspace_state_mismatches:workspaceStateMismatches,workspace_state_missing:workspaceStateMissing,workspace_state_unreadable:workspaceStateUnreadable}},warnings}}function buildVectorizationRuntimeSnapshot(settings,pmRoot){const runtimeDefaults=resolveSettingsWithSemanticRuntimeDefaults(settings);const providerResolution=resolveEmbeddingProviders(runtimeDefaults.settings);const vectorStoreResolution=resolveVectorStores(runtimeDefaults.settings,pmRoot);const runtimeEmbeddingIdentity=providerResolution.active?buildVectorizationEmbeddingIdentity(providerResolution.active.name,providerResolution.active.model):null;return{runtimeDefaults,providerResolution,vectorStoreResolution,runtimeEmbeddingIdentity,semanticRuntimeAvailable:Boolean(providerResolution.active&&vectorStoreResolution.active)}}function emptyVectorizationRefreshResult(){return{refreshed:[],skipped:[],warnings:[]}}async function refreshStaleVectorizationItems(params){if(!params.refreshPolicy.enabled||!params.snapshot.semanticRuntimeAvailable||params.staleBefore.length===0){return emptyVectorizationRefreshResult()}return refreshSemanticEmbeddingsForMutatedItems(params.pmRoot,params.staleBefore,{settings:params.snapshot.runtimeDefaults.settings,apply_runtime_defaults:false})}function vectorizationEmbeddingIdentityChanged(params){return params.strictVectorizationWarnings&&params.semanticRuntimeAvailable&&Boolean(params.ledgerBefore.embedding&&params.runtimeEmbeddingIdentity&&hasVectorizationEmbeddingIdentityChanged(params.ledgerBefore.embedding,params.runtimeEmbeddingIdentity))}function collectVectorizationWarnings(params){const warningSet=new Set([...params.ledgerBefore.warnings,...params.ledgerAfter.warnings]);if(params.strictVectorizationWarnings){for(const warning of params.refreshResult.warnings){warningSet.add(warning)}}if(params.embeddingIdentityChanged){warningSet.add("vectorization_embedding_identity_changed")}if(params.strictVectorizationWarnings&&params.semanticRuntimeAvailable&&params.staleAfter.length>0){warningSet.add(`vectorization_stale_items_remaining:${params.staleAfter.length}`)}return[...warningSet].sort((left,right)=>left.localeCompare(right))}function resolveVectorizationRefreshSkippedReason(refreshPolicy,semanticRuntimeAvailable,staleBefore){if(refreshPolicy.enabled&&semanticRuntimeAvailable&&staleBefore.length>0){return null}if(!refreshPolicy.enabled){return"refresh_disabled"}return semanticRuntimeAvailable?"no_stale_items":"semantic_runtime_unavailable"}function buildVectorizationProviderDetails(settings,snapshot){const activeProvider=snapshot.providerResolution.active?.name??null;const activeVectorStore=snapshot.vectorStoreResolution.active?.name??null;return{provider_active:activeProvider,provider_configured:typeof settings.search?.provider==="string"?settings.search.provider:null,provider_source:resolveProviderConfigSource(activeProvider,settings.search?.provider??null),vector_store_active:activeVectorStore,vector_store_configured:typeof settings.vector_store?.adapter==="string"?settings.vector_store.adapter:null,vector_store_source:resolveProviderConfigSource(activeVectorStore,settings.vector_store?.adapter??null)}}function buildVectorizationRefreshPolicyDetails(refreshPolicy){return{enabled:refreshPolicy.enabled,check_only:refreshPolicy.checkOnly,no_refresh:refreshPolicy.noRefresh,refresh_vectors:refreshPolicy.refreshVectors}}function vectorizationRefreshAttempted(refreshPolicy,semanticRuntimeAvailable,staleBefore){return refreshPolicy.enabled&&staleBefore.length>0&&semanticRuntimeAvailable}async function buildVectorizationCheck(pmRoot,settings,items,refreshPolicy,verboseStaleItems){const snapshot=buildVectorizationRuntimeSnapshot(settings,pmRoot);const ledgerBefore=await readVectorizationStatusLedger(pmRoot);const staleBefore=snapshot.semanticRuntimeAvailable?collectStaleVectorizationIds(items,ledgerBefore.entries):[];const refreshResult=await refreshStaleVectorizationItems({pmRoot,snapshot,refreshPolicy,staleBefore});const ledgerAfter=await readVectorizationStatusLedger(pmRoot);const staleAfter=snapshot.semanticRuntimeAvailable?collectStaleVectorizationIds(items,ledgerAfter.entries):[];const strictVectorizationWarnings=!snapshot.runtimeDefaults.auto_ollama_defaults_applied;const embeddingIdentityChanged=vectorizationEmbeddingIdentityChanged({strictVectorizationWarnings,semanticRuntimeAvailable:snapshot.semanticRuntimeAvailable,ledgerBefore,runtimeEmbeddingIdentity:snapshot.runtimeEmbeddingIdentity});const warnings=collectVectorizationWarnings({ledgerBefore,ledgerAfter,refreshResult,strictVectorizationWarnings,semanticRuntimeAvailable:snapshot.semanticRuntimeAvailable,embeddingIdentityChanged,staleAfter});const staleBeforeDetail=selectStaleItemDetail(staleBefore,verboseStaleItems);const staleAfterDetail=selectStaleItemDetail(staleAfter,verboseStaleItems);const refreshAttempted=vectorizationRefreshAttempted(refreshPolicy,snapshot.semanticRuntimeAvailable,staleBefore);return{check:{name:"vectorization",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{semantic_runtime_available:snapshot.semanticRuntimeAvailable,compatibility_mode_auto_defaults:snapshot.runtimeDefaults.auto_ollama_defaults_applied,auto_ollama_defaults_applied:snapshot.runtimeDefaults.auto_ollama_defaults_applied,auto_ollama_defaults_skipped_reason:snapshot.runtimeDefaults.auto_ollama_defaults_skipped_reason??null,auto_ollama_defaults_remediation:snapshot.runtimeDefaults.auto_ollama_defaults_remediation??null,refresh_policy:buildVectorizationRefreshPolicyDetails(refreshPolicy),...buildVectorizationProviderDetails(settings,snapshot),embedding_identity_changed:embeddingIdentityChanged,embedding_identity_before:ledgerBefore.embedding??null,embedding_identity_runtime:snapshot.runtimeEmbeddingIdentity??null,items:items.length,ledger_entries_before:Object.keys(ledgerBefore.entries).length,stale_items_detail_mode:verboseStaleItems?"full":"summary",stale_items_summary_limit:STALE_VECTORIZATION_SUMMARY_LIMIT,stale_items_before_total:staleBeforeDetail.total,stale_items_before:staleBeforeDetail.values,stale_items_before_truncated:staleBeforeDetail.truncated,refresh_attempted:refreshAttempted,refresh_skipped_reason:resolveVectorizationRefreshSkippedReason(refreshPolicy,snapshot.semanticRuntimeAvailable,staleBefore),refresh_result:refreshResult,ledger_entries_after:Object.keys(ledgerAfter.entries).length,stale_items_after_total:staleAfterDetail.total,stale_items_after:staleAfterDetail.values,stale_items_after_truncated:staleAfterDetail.truncated}},warnings}}function validateSettingsValues(settings){const warnings=[];if(settings.id_prefix.trim().length===0){warnings.push("settings:id_prefix_empty")}if(settings.locks.ttl_seconds<=0){warnings.push("settings:locks_ttl_non_positive")}return warnings}function resolveVectorRefreshPolicy(options){const checkOnly=options.checkOnly===true;const refreshVectors=options.refreshVectors===true;if(refreshVectors&&checkOnly){throw new PmCliError("--check-only cannot be combined with --refresh-vectors",EXIT_CODE.USAGE)}if(refreshVectors&&options.noRefresh===true){throw new PmCliError("--no-refresh cannot be combined with --refresh-vectors",EXIT_CODE.USAGE)}return{enabled:refreshVectors,checkOnly,noRefresh:!refreshVectors,refreshVectors}}const HEALTH_CLONE_OPTIONAL_DIRECTORIES=new Set(["extensions","locks","search"]);function resolveHealthDirectoryLists(typeRegistry){const requiredDirSet=new Set(PM_CORE_REQUIRED_SUBDIRS.filter(entry=>entry.length>0));const optionalDirSet=new Set;const builtinItemFolderSet=new Set(Object.values(TYPE_TO_FOLDER));for(const folder of typeRegistry.folders){if(requiredDirSet.has(folder)&&!builtinItemFolderSet.has(folder)){continue}requiredDirSet.delete(folder);optionalDirSet.add(folder)}for(const folder of HEALTH_CLONE_OPTIONAL_DIRECTORIES){requiredDirSet.delete(folder);optionalDirSet.add(folder)}return{requiredDirs:[...requiredDirSet].sort((left,right)=>left.localeCompare(right)),optionalDirs:[...optionalDirSet].sort((left,right)=>left.localeCompare(right)),optionalDirSet}}async function scanHealthDirectories(pmRoot,typeRegistry,strictDirectories){const{requiredDirs,optionalDirs,optionalDirSet}=resolveHealthDirectoryLists(typeRegistry);const missingRequiredDirs=[];const missingOptionalDirs=[];const hookWarnings=[];for(const relativeDir of[...requiredDirs,...optionalDirs]){const directoryPath=path.join(pmRoot,relativeDir);hookWarnings.push(...await runActiveOnReadHooks({path:directoryPath,scope:"project"}));if(await isDirectory(directoryPath)){continue}if(optionalDirSet.has(relativeDir)){missingOptionalDirs.push(relativeDir)}else{missingRequiredDirs.push(relativeDir)}}return{requiredDirs,optionalDirs,missingRequiredDirs,missingOptionalDirs,missingDirs:strictDirectories?[...missingRequiredDirs,...missingOptionalDirs]:[...missingRequiredDirs],hookWarnings}}function resolveHealthSkipPolicy(options){const checkOnlyDefaultSummary=options.checkOnly===true&&options.brief!==true&&options.summary!==true&&options.full!==true;const summaryMode=(options.summary===true||checkOnlyDefaultSummary)&&options.full!==true;const fastProjectionCheckOnly=options.checkOnly===true&&(options.brief===true||options.summary===true)&&options.full!==true;return{summaryMode,skipIntegrity:(options.skipIntegrity===true||fastProjectionCheckOnly)&&options.full!==true,skipDrift:(options.skipDrift===true||fastProjectionCheckOnly)&&options.full!==true,skipVectors:(options.skipVectors===true||fastProjectionCheckOnly)&&options.full!==true}}async function readHealthItems(params){if(params.skipPolicy.skipDrift&&params.skipPolicy.skipVectors){return listAllItemMetadataLight(params.pmRoot,params.settings.item_format,params.typeRegistry.type_to_folder,params.itemReadWarnings,params.settings.schema)}return listAllItemMetadataWithBody(params.pmRoot,params.settings.item_format,params.typeRegistry.type_to_folder,params.itemReadWarnings,params.settings.schema)}function buildSkippedHealthCheck(name){return{check:{name,status:"ok",ok:true,details:{skipped:true}},warnings:[]}}function buildSettingsHealthCheck(settingsPath,settings,normalizedSettingsReadWarnings){return{name:"settings",status:normalizedSettingsReadWarnings.length===0?"ok":"warn",ok:normalizedSettingsReadWarnings.length===0,details:{path:settingsPath,version:settings.version,id_prefix:settings.id_prefix,locks_ttl_seconds:settings.locks.ttl_seconds,warnings:normalizedSettingsReadWarnings}}}function buildDirectoriesHealthCheck(directoryState,strictDirectories){return{name:"directories",status:directoryState.missingDirs.length===0?"ok":"warn",ok:directoryState.missingDirs.length===0,details:{required:directoryState.requiredDirs,optional:directoryState.optionalDirs,missing_required:directoryState.missingRequiredDirs,missing_optional:directoryState.missingOptionalDirs,missing:directoryState.missingDirs,strict_directories:strictDirectories}}}function buildSettingsValuesHealthCheck(settingWarnings,statusRoleDiagnostics){return{name:"settings_values",status:settingWarnings.length===0?"ok":"warn",ok:settingWarnings.length===0,details:{warnings:settingWarnings,...statusRoleDiagnostics.roleless_status_count>0?{lifecycle_status_roles:statusRoleDiagnostics}:{}}}}const resolveUnknownAuthorEventCount=authorAttribution=>authorAttribution.unknown_event_count??0;const resolveActionableUnknownAuthorEventCount=authorAttribution=>authorAttribution.actionable_unknown_event_count??resolveUnknownAuthorEventCount(authorAttribution);function buildStorageHealthCheck(items,settings,historySummary,authorAttribution,staleInProgress,provenanceResolverOutcomes,provenanceInvalidValues){const unknownAuthorEventCount=resolveUnknownAuthorEventCount(authorAttribution);const actionableUnknownAuthorEventCount=resolveActionableUnknownAuthorEventCount(authorAttribution);const hasAuthorEvents=unknownAuthorEventCount>0;const hasActionableAuthorWarnings=actionableUnknownAuthorEventCount>0;const hasStaleInProgressItems=staleInProgress.count>0;return{name:"storage",status:historySummary.over_threshold.length===0&&historySummary.orphaned.length===0&&!hasActionableAuthorWarnings&&!hasStaleInProgressItems?"ok":"warn",ok:historySummary.over_threshold.length===0&&historySummary.orphaned.length===0&&!hasActionableAuthorWarnings&&!hasStaleInProgressItems,details:{items:items.length,history_streams:historySummary.count,tombstones:{retention_policy:"retain_append_only",gc_enabled:false,count:historySummary.tombstones.length,ids:historySummary.tombstones.slice(0,25),truncated:historySummary.tombstones.length>25},orphaned_history_streams:{count:historySummary.orphaned.length,ids:historySummary.orphaned.slice(0,25),truncated:historySummary.orphaned.length>25},...hasAuthorEvents?{author_attribution:authorAttribution}:{},...hasStaleInProgressItems?{stale_in_progress:staleInProgress}:{},...provenanceResolverOutcomes.length>0?{provenance_resolver_outcomes:provenanceResolverOutcomes}:{},...provenanceInvalidValues.length>0?{provenance_invalid_values:provenanceInvalidValues}:{},...historySummary.max_entries!==null?{compact_policy:{enabled:settings.history.compact_policy.enabled,max_entries:historySummary.max_entries,trigger:settings.history.compact_policy.trigger,over_threshold_count:historySummary.over_threshold.length,over_threshold:historySummary.over_threshold}}:{}}}}function buildStaleInProgressHealthSummary(scan){const warnings=scan.count===0?[]:[`stale_in_progress_items:${scan.count}`];return{scan,warnings}}function collectHealthWarnings(params){const warnings=[...params.directoryState.missingDirs.map(dir=>`missing_directory:${dir}`),...params.normalizedSettingsReadWarnings,...params.settingWarnings,...params.normalizedItemReadWarnings,...params.telemetryCheck.warnings,...params.extensionCheck.warnings,...params.historyPolicyWarnings,...params.historySummary.warnings,...params.authorAttributionWarnings,...params.staleInProgressWarnings,...params.provenanceWarnings,...params.locksCheck.warnings,...params.integrityCheck.warnings,...params.historyDriftCheck.warnings,...params.vectorizationCheck.warnings,...params.directoryState.hookWarnings];return[...new Set(warnings)]}function extractHistoryDriftedCount(historyDriftCheck){const counts=historyDriftCheck.check.details.counts;return typeof counts?.drifted==="number"?counts.drifted:0}function buildHealthRemediationSources(params){return{settings:params.normalizedSettingsReadWarnings,directories:params.directoryState.missingDirs.map(dir=>`missing_directory:${dir}`).concat(params.directoryState.hookWarnings),settings_values:params.settingWarnings,telemetry:params.telemetryCheck.warnings,extensions:params.extensionCheck.warnings,storage:[...params.historyPolicyWarnings,...params.historySummary.warnings,...params.authorAttributionWarnings,...params.staleInProgressWarnings,...params.provenanceWarnings],locks:params.locksCheck.warnings,integrity:[...params.normalizedItemReadWarnings,...params.integrityCheck.warnings],history_drift:params.historyDriftCheck.warnings,vectorization:params.vectorizationCheck.warnings}}function buildHealthFindings(params){const owners=new Map;for(const[check,warnings]of Object.entries(params.remediationSources)){for(const warning of warnings){if(!owners.has(warning))owners.set(warning,check)}}const checksByName=new Map(params.checks.map(check=>[check.name,check]));const findings=params.warnings.map(warning=>{const check=owners.get(warning)??"integrity";const code=resolveRemediation(warning)?.code??warningCode(warning);const details=checksByName.get(check)?.details;const remediationMap=typeof details?.remediation_map==="object"&&details.remediation_map!==null?details.remediation_map:{};const remediation=remediationMap[code];const severity=isAdvisoryHealthWarning(warning,params.requireMergeDrivers)?"advisory":"gate_failing";return{warning,code,check,severity,...typeof remediation==="string"?{remediation}:severity==="gate_failing"?{disposition:"no_safe_automatic_remediation"}:{}}});return findings}function rewriteBulkHealthRemediation(params){if(params.check.name==="history_drift"&&params.historyDriftedCount>1){for(const code of Object.keys(params.remediationMap)){if(code!=="history_drift_merge_receipt"&&code!=="history_drift_version_skew"){params.remediationMap[code]="pm history-repair --all"}}}if(params.check.name==="storage"&&params.overThresholdCount>1){for(const code of Object.keys(params.remediationMap)){params.remediationMap[code]="pm history-compact --all-streams"}}}function attachHealthRemediationMaps(params){for(const check of params.checks){const remediationMap=buildRemediationMap(params.remediationSources[check.name]);rewriteBulkHealthRemediation({check,remediationMap,historyDriftedCount:params.historyDriftedCount,overThresholdCount:params.overThresholdCount});if(Object.keys(remediationMap).length>0){check.details={...check.details,remediation_map:remediationMap}}}}async function correlateMergeReceiptHistoryDriftItems(params){if(params.gitWorkspaceRoot===null||params.pendingMergeReceipts.length===0){return[]}const details=params.historyDriftCheck.check.details;const hashMismatches=Array.isArray(details.hash_mismatches)?details.hash_mismatches.filter(entry=>typeof entry==="string"):[];const unsafeStreamIds=new Set([details.missing_streams,details.unreadable_streams,details.chain_mismatches].flatMap(value=>Array.isArray(value)?value:[]));const cloneLocalReceiptsByItem=new Map;for(const receipt of params.pendingMergeReceipts){if(receipt.evidence_source!=="clone_local")continue;const receipts=cloneLocalReceiptsByItem.get(receipt.item_id)??[];receipts.push(receipt);cloneLocalReceiptsByItem.set(receipt.item_id,receipts)}const attributed=[];for(const id of hashMismatches){if(unsafeStreamIds.has(id))continue;const receipts=cloneLocalReceiptsByItem.get(id);if(!receipts||receipts.length===0)continue;try{await runHistoryRepair(id,{dryRun:true,mergeReceiptProof:{gitWorkspaceRoot:params.gitWorkspaceRoot,receipts}},params.global);attributed.push(id)}catch{}}return[...new Set(attributed)].sort((left,right)=>left.localeCompare(right))}function applyMergeReceiptHistoryDriftAttribution(historyDriftCheck,attributedItems){const attributed=new Set(attributedItems);historyDriftCheck.warnings=[...historyDriftCheck.warnings.filter(warning=>{if(!warning.startsWith("history_drift_hash_mismatch:"))return true;return!attributed.has(warning.slice(warning.indexOf(":")+1))}),...attributedItems.map(id=>`history_drift_merge_receipt:${id}`)].sort((left,right)=>left.localeCompare(right));historyDriftCheck.check.details={...historyDriftCheck.check.details,merge_receipt_attributed_items:attributedItems}}function projectHealthResult(result,options,summaryMode){const warningCount=result.warning_count??result.warnings.length;const boundedResult={...result,warning_count:warningCount,warning_limit:HEALTH_WARNING_LIMIT,warnings_truncated:warningCount>HEALTH_WARNING_LIMIT,warnings:result.warnings.slice(0,HEALTH_WARNING_LIMIT),findings:(result.findings??[]).filter(finding=>result.warnings.slice(0,HEALTH_WARNING_LIMIT).includes(finding.warning)||result.failed_because.includes(finding.warning))};const projected=summaryMode?applySummaryHealthProjection(boundedResult):options.brief===true?applyBriefHealthProjection(boundedResult):boundedResult;return{...projected,warning_count:warningCount,warning_limit:HEALTH_WARNING_LIMIT,warnings_truncated:warningCount>projected.warnings.length,...projected.projection?{projection:{...projected.projection,warning_count:warningCount,warnings_truncated:warningCount>projected.warnings.length}}:{}}}async function runHealth(global2,options={}){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settingsPath=getSettingsPath(pmRoot);const{settings,warnings:settingsReadWarnings}=await readSettingsWithMetadata(pmRoot);const normalizedSettingsReadWarnings=[...new Set(settingsReadWarnings)];const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const strictDirectories=options.strictDirectories===true;const strictExit=options.strictExit===true||options.failOnWarn===true;const requireMergeDrivers=options.requireMergeDrivers===true||strictExit;const refreshPolicy=resolveVectorRefreshPolicy(options);const directoryState=await scanHealthDirectories(pmRoot,typeRegistry,strictDirectories);const settingsValueWarnings=validateSettingsValues(settings);const telemetryCheck=await buildTelemetryCheck(settings,{checkTelemetry:options.checkTelemetry===true});const extensionCheck=await buildExtensionCheck(pmRoot,settings,Boolean(global2.noExtensions));const skipPolicy=resolveHealthSkipPolicy(options);const itemReadWarnings=[];const items=await readHealthItems({pmRoot,settings,typeRegistry,skipPolicy,itemReadWarnings});const itemsWithBody=items;const statusRoleDiagnostics=inspectStatusRoleAssignments(resolveRuntimeStatusRegistry(settings.schema),items);const settingWarnings=[...settingsValueWarnings,...buildStatusRoleWarnings(statusRoleDiagnostics)];const historyPolicy=skipPolicy.skipDrift?{warnings:[]}:await enforceHistoryStreamPolicyForItems({pmRoot,settings,itemIds:items.map(item=>item.id),commandLabel:"health"});const historySummary=await countHistoryStreams(pmRoot,settings.history.compact_policy,await listStoredItemDocumentIds(pmRoot));const authorAttribution=await scanHistoryAuthorAttribution(pmRoot,20,options.verboseAuthorEvents===true);const actionableUnknownAuthorEventCount=resolveActionableUnknownAuthorEventCount(authorAttribution);const authorAttributionWarnings=actionableUnknownAuthorEventCount>0?[`history_unknown_author_events:${actionableUnknownAuthorEventCount}`]:[];const staleInProgress=buildStaleInProgressHealthSummary(await scanStaleInProgressItems(pmRoot,items,{in_progress_status:settings.schema.workflow.in_progress_status,threshold_hours:settings.mutation_guard.stale_in_progress_hours}));const provenanceResolverHealth=await scanProvenanceResolverHealth(pmRoot);const provenanceResolverOutcomes=provenanceResolverHealth.outcomes;const provenanceInvalidValues=provenanceResolverHealth.invalid_values;const provenanceWarnings=provenanceResolverHealth.warnings;const locksCheck=await buildLocksCheck(pmRoot);const integrityCheck=skipPolicy.skipIntegrity&&!requireMergeDrivers?{...buildSkippedHealthCheck("integrity"),gitWorkspaceRoot:null,pendingMergeReceipts:[]}:await buildIntegrityCheck(pmRoot,typeRegistry.type_to_folder,settings.schema,requireMergeDrivers,items);const historyDriftCheck=skipPolicy.skipDrift?buildSkippedHealthCheck("history_drift"):await buildHistoryDriftCheck({pmRoot,items:itemsWithBody,settings,typeRegistry,itemReadWarnings});const normalizedItemReadWarnings=[...new Set(itemReadWarnings)];const mergeReceiptAttributedHistoryDriftItems=await correlateMergeReceiptHistoryDriftItems({gitWorkspaceRoot:integrityCheck.gitWorkspaceRoot,pendingMergeReceipts:integrityCheck.pendingMergeReceipts,historyDriftCheck,global:global2});applyMergeReceiptHistoryDriftAttribution(historyDriftCheck,mergeReceiptAttributedHistoryDriftItems);const vectorizationCheck=skipPolicy.skipVectors?buildSkippedHealthCheck("vectorization"):await buildVectorizationCheck(pmRoot,settings,itemsWithBody,refreshPolicy,options.verboseStaleItems===true);const checks=[buildSettingsHealthCheck(settingsPath,settings,normalizedSettingsReadWarnings),buildDirectoriesHealthCheck(directoryState,strictDirectories),buildSettingsValuesHealthCheck(settingWarnings,statusRoleDiagnostics),telemetryCheck.check,extensionCheck.check,buildStorageHealthCheck(items,settings,historySummary,authorAttribution,staleInProgress.scan,provenanceResolverOutcomes,provenanceInvalidValues),locksCheck.check,integrityCheck.check,historyDriftCheck.check,vectorizationCheck.check];const normalizedWarnings=collectHealthWarnings({directoryState,normalizedSettingsReadWarnings,settingWarnings,normalizedItemReadWarnings,telemetryCheck,extensionCheck,historyPolicyWarnings:historyPolicy.warnings,historySummary,authorAttributionWarnings,staleInProgressWarnings:staleInProgress.warnings,provenanceWarnings,locksCheck,integrityCheck,historyDriftCheck,vectorizationCheck});const remediationSources=buildHealthRemediationSources({directoryState,normalizedSettingsReadWarnings,settingWarnings,normalizedItemReadWarnings,telemetryCheck,extensionCheck,historyPolicyWarnings:historyPolicy.warnings,historySummary,authorAttributionWarnings,staleInProgressWarnings:staleInProgress.warnings,provenanceWarnings,locksCheck,integrityCheck,historyDriftCheck,vectorizationCheck});attachHealthRemediationMaps({checks,remediationSources,historyDriftedCount:extractHistoryDriftedCount(historyDriftCheck),overThresholdCount:historySummary.over_threshold.length});const blockingWarnings=normalizedWarnings.filter(warning=>!isAdvisoryHealthWarning(warning,requireMergeDrivers));const findings=buildHealthFindings({warnings:normalizedWarnings,checks,remediationSources,requireMergeDrivers});const failingChecks=new Set(findings.filter(finding=>finding.severity==="gate_failing").map(finding=>finding.check));const warningChecks=new Set(findings.map(finding=>finding.check));for(const check of checks){check.ok=!failingChecks.has(check.name);if(warningChecks.has(check.name))check.status="warn"}const result={ok:blockingWarnings.length===0,verdict:{authority:"ok",...strictExit?{strict_exit:true}:{},...requireMergeDrivers?{require_merge_drivers:true}:{},exit_code:strictExit&&blockingWarnings.length>0?EXIT_CODE.GENERIC_FAILURE:0},checks,warnings:normalizedWarnings,findings,failed_because:blockingWarnings,generated_at:nowIso()};return projectHealthResult(result,options,skipPolicy.summaryMode)}const _testOnlyHealthCommand={buildHierarchyIntegrityWarnings,buildExtensionHealthTriageSummary,buildHealthFindings,buildCapabilityContractMetadata,buildStaleInProgressHealthSummary,buildVectorizationProviderDetails,collectUnknownCapabilityGuidance,isAdvisoryHealthWarning,isDirectory,isExpectedUnmanagedExtension,listItemDocumentPaths,normalizeEndpointForDisplay,normalizeExtensionNameForMatch,parseTelemetryQueue,probeTelemetryEndpointHealth,projectHealthResult,resolveActionableUnknownAuthorEventCount,resolveHealthSkipPolicy,resolveUnknownAuthorEventCount,resolveVectorRefreshPolicy,selectStaleItemDetail,summarizeHealthCheckDetails,summarizeExtensionList,summarizeRecordList,summarizeStringList,telemetryEnvFlagEnabled,warningCode};export{_testOnlyHealthCommand,runHealth};
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]="62ab21f2-2dc9-5007-a70b-f2dbb45b1f8e")}catch(e2){}})();import fs from"node:fs/promises";import path from"node:path";import{resolveTelemetryEnvironmentPolicy}from"../../core/telemetry/policy.js";import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{isTerminalStatus}from"../../core/item/status.js";import{resolveItemTypeRegistry}from"../../core/item/type-registry.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{isFileMissingError,readFileIfExists}from"../../core/fs/fs-utils.js";import{activateExtensions,getActiveExtensionRegistrations,loadExtensions,runActiveOnReadHooks}from"../../core/extensions/index.js";import{collectRegisteredItemFieldNames}from"../../core/extensions/item-fields.js";import{KNOWN_EXTENSION_CAPABILITIES}from"../../core/extensions/loader.js";import{enforceHistoryStreamPolicyForItems}from"../../core/history/history-stream-policy.js";import{scanHistoryDrift}from"../../core/history/drift-scan.js";import{scanLockHealth}from"../../core/lock/lock-gc.js";import{readVectorizationStatusLedger,refreshSemanticEmbeddingsForMutatedItems}from"../../core/search/cache.js";import{resolveEmbeddingProviders,resolveProviderConfigSource}from"../../core/search/providers.js";import{resolveSettingsWithSemanticRuntimeDefaults}from"../../core/search/semantic-defaults.js";import{collectStaleVectorizationIds}from"../../core/search/staleness.js";import{buildVectorizationEmbeddingIdentity,hasVectorizationEmbeddingIdentityChanged}from"../../core/search/vectorization-metadata.js";import{resolveVectorStores}from"../../core/search/vector-stores.js";import{EXIT_CODE,PM_CORE_REQUIRED_SUBDIRS,TYPE_TO_FOLDER}from"../../core/shared/constants.js";import{findFirstMergeConflictMarker}from"../../core/shared/conflict-markers.js";import{PmCliError}from"../../core/shared/errors.js";import{toNonEmptyStringOrUndefined}from"../../core/shared/primitives.js";import{nowIso}from"../../core/shared/time.js";import{parseItemDocument}from"../../core/item/item-format.js";import{effectiveItemFormatVersion,scanItemFormatVersions}from"../../core/item/item-format-version.js";import{listAllItemMetadataLight,listAllItemMetadataWithBody}from"../../core/store/item-store.js";import{PM_TELEMETRY_SOURCE_CONTEXT_VALUES,TELEMETRY_MAX_QUEUE_ENTRY_ATTEMPTS,TELEMETRY_SCHEMA_VERSION}from"../../core/telemetry/runtime.js";import{getItemFormatFromPath,getSettingsPath,ITEM_FILE_EXTENSIONS,resolveGlobalPmRoot,resolvePmRoot,resolveWorkspaceRoot}from"../../core/store/paths.js";import{readSettingsWithMetadata}from"../../core/store/settings.js";import{buildRemediationMap,resolveRemediation}from"../../core/diagnostics/remediation.js";import{scanExtensionHostVersions}from"./extension-host-version.js";import{scanHistoryAuthorAttribution}from"../author-attribution.js";import{readManagedExtensionState}from"../extension.js";import{scanProvenanceResolverHealth}from"./provenance-health.js";import{applyStoredExtensionMigrationState}from"../extension/migrations.js";import{inspectExtensionAuthorManifest}from"../extension/author-manifest.js";import{buildCapabilityContractMetadata,buildRegistrationCollisionRemediation,collectUnknownCapabilityGuidance}from"../extension/doctor.js";import{scanStaleInProgressItems}from"./stale-work.js";import{scanTrackedRuntimeCache}from"./tracked-runtime-cache.js";import{auditMergeDriverConfiguration,findGitWorkspaceRoot}from"../merge/install.js";import{inspectMergeReceiptEvidence,partitionMergeReceipts}from"../merge/receipts.js";import{classifyHistoryMergeReceiptReferences,extractHistoryMergeReceiptDispositions,extractHistoryMergeReceiptReferences}from"./merge-receipt-history.js";import{runHistoryRepair}from"../history-repair.js";import{resolveWorkspaceRelationshipKindRegistry}from"../graph/assembly.js";import{analyzeHierarchyIntegrity}from"../graph/hierarchy-integrity.js";import{buildStatusRoleWarnings,inspectStatusRoleAssignments}from"./status-role-diagnostics.js";const PM_TELEMETRY_SOURCE_CONTEXT_SET=new Set(PM_TELEMETRY_SOURCE_CONTEXT_VALUES);const STALE_VECTORIZATION_SUMMARY_LIMIT=25;const BRIEF_HEALTH_DETAIL_LIMIT=8;const HEALTH_WARNING_LIMIT=100;const TELEMETRY_QUEUE_RELATIVE_PATH=path.join("runtime","telemetry","events.jsonl");const TELEMETRY_STATE_RELATIVE_PATH=path.join("runtime","telemetry","state.json");const TELEMETRY_ENDPOINT_PROBE_TIMEOUT_MS=2500;const TELEMETRY_QUEUE_HIGH_WATER_MARK=500;const TELEMETRY_QUEUE_HIGH_RETRY_THRESHOLD=TELEMETRY_MAX_QUEUE_ENTRY_ATTEMPTS-3;const TELEMETRY_SERVER_MAX_SCHEMA_VERSION_HEADERS=["x-pm-telemetry-max-schema-version","x-pm-telemetry-max-version"];function isAdvisoryHealthWarning(warning,requireMergeDrivers=false){return warning.startsWith("telemetry_")||warning.startsWith("history_stream_over_compact_threshold:")||warning.startsWith("integrity_legacy_hierarchy_")||warning.startsWith("stale_in_progress_items:")||warning.startsWith("provenance_resolver_zero_success:")||warning.startsWith("provenance_value_domain_invalid:")||!requireMergeDrivers&&warning.startsWith("merge_driver_configuration_missing:")}function warningCode(value){const normalized=value.trim();const separator=normalized.indexOf(":");if(separator===-1){return normalized}return normalized.slice(0,separator)}function normalizeExtensionNameForMatch(value){return value.trim().toLowerCase()}function isExpectedUnmanagedExtension(name,directory){const normalizedName=normalizeExtensionNameForMatch(name);const normalizedDirectory=normalizeExtensionNameForMatch(directory);if(normalizedName.startsWith("builtin-")){return true}return normalizedDirectory==="beads"||normalizedDirectory==="todos"}async function isDirectory(targetPath){try{const stats=await fs.stat(targetPath);return stats.isDirectory()}catch{return false}}async function listStoredItemDocumentIds(pmRoot){const directories=(await fs.readdir(pmRoot,{withFileTypes:true})).filter(entry=>entry.isDirectory());const filesByDirectory=await Promise.all(directories.map(entry=>fs.readdir(path.join(pmRoot,entry.name),{withFileTypes:true})));return new Set(filesByDirectory.flatMap(entries=>entries.filter(entry=>entry.isFile()).filter(entry=>ITEM_FILE_EXTENSIONS.some(extension=>entry.name.endsWith(extension))).map(entry=>path.parse(entry.name).name)))}async function inspectHistoryStream(streamPath,itemId,compactPolicy,liveItemIds){const warnings=await runActiveOnReadHooks({path:streamPath,scope:"project"});const needsClassification=itemId!=="_workspace"&&!liveItemIds.has(itemId);if(!compactPolicy.enabled&&!needsClassification){return{warnings,overThreshold:false,classification:"live"}}let raw;try{raw=await fs.readFile(streamPath,"utf8")}catch{return{warnings,overThreshold:false,classification:"unreadable"}}let classification="live";if(needsClassification){const lastLine=raw.split(/\r?\n/).map(line=>line.trim()).filter(Boolean).at(-1);try{const lastEntry=JSON.parse(lastLine??"{}");classification=lastEntry.op==="delete"?"tombstone":"orphaned"}catch{classification="orphaned"}}const entryCount=compactPolicy.enabled?raw.split(/\r?\n/).filter(line=>line.trim().length>0).length:0;return{warnings,overThreshold:compactPolicy.enabled&&entryCount>compactPolicy.max_entries,classification}}async function countHistoryStreams(pmRoot,compactPolicy,liveItemIds){const historyDir=path.join(pmRoot,"history");if(!await isDirectory(historyDir)){return{count:0,warnings:[],over_threshold:[],max_entries:null,tombstones:[],orphaned:[]}}const historyFiles=(await fs.readdir(historyDir)).filter(entry=>entry.endsWith(".jsonl")).sort((left,right)=>left.localeCompare(right));const policyActive=compactPolicy.enabled;const maxEntries=policyActive?compactPolicy.max_entries:null;const warnings=[];const overThreshold=[];const tombstones=[];const orphaned=[];for(const fileName of historyFiles){const streamPath=path.join(historyDir,fileName);const itemId=fileName.slice(0,-".jsonl".length);const inspection=await inspectHistoryStream(streamPath,itemId,compactPolicy,liveItemIds);warnings.push(...inspection.warnings);if(inspection.classification==="tombstone")tombstones.push(itemId);if(inspection.classification==="orphaned")orphaned.push(itemId);if(inspection.overThreshold)overThreshold.push(itemId)}return{count:historyFiles.length,warnings:[...warnings,...overThreshold.map(id=>`history_stream_over_compact_threshold:${id}`),...orphaned.map(id=>`history_orphaned_stream:${id}`)],over_threshold:overThreshold,max_entries:maxEntries,tombstones,orphaned}}function normalizeRelativePath(pmRoot,targetPath){return path.relative(pmRoot,targetPath).replaceAll("\\","/")}async function listItemDocumentPaths(pmRoot,typeToFolder){const folders=[...new Set(Object.values(typeToFolder))].sort((left,right)=>left.localeCompare(right));const itemPaths=[];for(const folder of folders){const directoryPath=path.join(pmRoot,folder);let entries=[];try{entries=await fs.readdir(directoryPath)}catch(error){if(typeof error==="object"&&error!==null&&"code"in error&&isFileMissingError(error)){continue}continue}for(const entry of entries){if(!ITEM_FILE_EXTENSIONS.some(extension=>entry.toLowerCase().endsWith(extension))){continue}itemPaths.push(path.join(directoryPath,entry))}}itemPaths.sort((left,right)=>normalizeRelativePath(pmRoot,left).localeCompare(normalizeRelativePath(pmRoot,right)));return itemPaths}function shouldReportHistoryDirectoryUnreadable(error){return!(typeof error==="object"&&error!==null&&"code"in error&&isFileMissingError(error))}async function scanItemIntegrity(pmRoot,typeToFolder,schema){const paths=await listItemDocumentPaths(pmRoot,typeToFolder);const unreadable=[];const conflictMarkers=[];const parseFailures=[];const formatVersions=[];const extensionFieldNames=collectRegisteredItemFieldNames(getActiveExtensionRegistrations());for(const itemPath of paths){const relativePath=normalizeRelativePath(pmRoot,itemPath);let raw;try{raw=await fs.readFile(itemPath,"utf8")}catch{unreadable.push(relativePath);continue}const conflictMarker=findFirstMergeConflictMarker(raw);if(conflictMarker){conflictMarkers.push({path:relativePath,...conflictMarker});continue}try{const parsed=parseItemDocument(raw,{format:getItemFormatFromPath(itemPath),schema,extensionFieldNames});formatVersions.push({ref:relativePath,version:effectiveItemFormatVersion(parsed.metadata)})}catch{parseFailures.push(relativePath)}}return{paths,unreadable,conflictMarkers,parseFailures,formatVersions}}async function scanHistoryIntegrity(pmRoot){const historyDir=path.join(pmRoot,"history");const unreadable=[];const conflictMarkers=[];const invalidJson=[];const mergeReceiptReferences=[];const mergeReceiptDispositions=[];let files=[];try{files=(await fs.readdir(historyDir)).filter(entry=>entry.endsWith(".jsonl")).sort((left,right)=>left.localeCompare(right))}catch(error){if(shouldReportHistoryDirectoryUnreadable(error))unreadable.push("history")}for(const fileName of files){const itemId=fileName.slice(0,-".jsonl".length);let raw;try{raw=await fs.readFile(path.join(historyDir,fileName),"utf8")}catch{unreadable.push(itemId);continue}const conflictMarker=findFirstMergeConflictMarker(raw);if(conflictMarker){conflictMarkers.push({id:itemId,...conflictMarker});continue}raw.split(/\r?\n/).forEach((line,index)=>{if(!line.trim())return;try{const parsed=JSON.parse(line);mergeReceiptReferences.push(...extractHistoryMergeReceiptReferences(parsed,itemId).map(reference=>({itemId,line:index+1,...reference})));mergeReceiptDispositions.push(...extractHistoryMergeReceiptDispositions(parsed,itemId,index+1))}catch{invalidJson.push({id:itemId,line:index+1})}})}return{files,unreadable,conflictMarkers,invalidJson,mergeReceiptReferences,mergeReceiptDispositions}}function buildHierarchyIntegrityWarnings(analysis){return[...analysis.cycles.map(cycle=>cycle.legacy_terminal?`integrity_legacy_hierarchy_cycle:${cycle.item_ids.join(",")}`:`integrity_hierarchy_cycle:${cycle.item_ids.join(",")}`),...analysis.cardinality_violations.map(finding=>finding.legacy_terminal?`integrity_legacy_hierarchy_cardinality:${finding.child_id}`:`integrity_hierarchy_cardinality:${finding.child_id}`),...analysis.divergences.map(finding=>finding.legacy_terminal?`integrity_legacy_hierarchy_divergence:${finding.child_id}`:`integrity_hierarchy_divergence:${finding.child_id}`)]}function buildMergeReceiptEvidenceWarnings(params){const warnings=[];if(params.invalidEvidenceCount>0){warnings.push(`merge_receipt_evidence_invalid:${params.invalidEvidenceCount}`)}if(params.missingHistoryReferenceCount>0){warnings.push(`merge_receipt_history_reference_missing:${params.missingHistoryReferenceCount}`)}return warnings}async function buildIntegrityCheck(pmRoot,typeToFolder,schema,requireMergeDrivers,items){const itemScan=await scanItemIntegrity(pmRoot,typeToFolder,schema);const historyScan=await scanHistoryIntegrity(pmRoot);const formatVersionScan=scanItemFormatVersions(itemScan.formatVersions);const statusRegistry=resolveRuntimeStatusRegistry(schema);const hierarchyIntegrity=analyzeHierarchyIntegrity(items,status=>isTerminalStatus(status,statusRegistry),resolveWorkspaceRelationshipKindRegistry());const trackedRuntimeCache=await scanTrackedRuntimeCache(pmRoot);const gitWorkspaceRoot=await findGitWorkspaceRoot(pmRoot);const mergeDriverAudit=gitWorkspaceRoot===null?null:await auditMergeDriverConfiguration(gitWorkspaceRoot);const mergeReceiptEvidence=await inspectMergeReceiptEvidence(gitWorkspaceRoot??pmRoot,{includeReconciled:true,includeLossless:true,pmRoot});const availableMergeReceiptIds=new Set(mergeReceiptEvidence.receipts.map(receipt=>receipt.id));const historyReceiptClassification=classifyHistoryMergeReceiptReferences(historyScan.mergeReceiptReferences,availableMergeReceiptIds,historyScan.mergeReceiptDispositions);const missingMergeReceiptReferences=historyReceiptClassification.missing;const pendingMergeReceipts=mergeReceiptEvidence.receipts.filter(receipt=>receipt.state==="pending");const{pendingDecisions:pendingMergeDecisions,lossless:losslessMergeReceipts}=partitionMergeReceipts(pendingMergeReceipts);const mergeDriverInstallationMissing=mergeDriverAudit?.status==="missing"&&mergeDriverAudit.missing_keys.length===5&&mergeDriverAudit.drifted_keys.length===0;const warnings=[...itemScan.unreadable.map(entry=>`integrity_item_unreadable:${entry}`),...itemScan.conflictMarkers.map(entry=>`integrity_item_conflict_marker:${entry.path}:L${entry.line}`),...itemScan.parseFailures.map(entry=>`integrity_item_parse_failed:${entry}`),...historyScan.unreadable.map(entry=>`integrity_history_unreadable:${entry}`),...historyScan.conflictMarkers.map(entry=>`integrity_history_conflict_marker:${entry.id}:L${entry.line}`),...historyScan.invalidJson.map(entry=>`integrity_history_invalid_json:${entry.id}:L${entry.line}`),...formatVersionScan.outdated.map(entry=>`integrity_item_outdated_format_version:${entry}`),...formatVersionScan.ahead.map(entry=>`integrity_item_ahead_format_version:${entry}`),...buildHierarchyIntegrityWarnings(hierarchyIntegrity),...trackedRuntimeCache.tracked_path_count>0?[`tracked_runtime_cache_files:${trackedRuntimeCache.tracked_path_count}`]:[],...mergeDriverAudit!==null&&mergeDriverAudit.status!=="ok"?[`merge_driver_configuration_${mergeDriverInstallationMissing?"missing":"drift"}:${mergeDriverAudit.missing_keys.length+mergeDriverAudit.drifted_keys.length}`]:[],...pendingMergeDecisions.length>0?[`merge_decisions_unreviewed:${pendingMergeDecisions.length}`]:[],...losslessMergeReceipts.length>0?[`merge_receipts_pending:${losslessMergeReceipts.length}`]:[],...buildMergeReceiptEvidenceWarnings({invalidEvidenceCount:mergeReceiptEvidence.invalid_evidence_count,missingHistoryReferenceCount:missingMergeReceiptReferences.length})];const normalizedWarnings=[...new Set(warnings)].sort((left,right)=>left.localeCompare(right));const actionableWarnings=normalizedWarnings.filter(warning=>!warning.startsWith("integrity_legacy_hierarchy_"));return{check:{name:"integrity",status:actionableWarnings.length===0?"ok":"warn",ok:actionableWarnings.length===0,details:{checked_item_files:itemScan.paths.length,checked_history_streams:historyScan.files.length,counts:{item_unreadable:itemScan.unreadable.length,item_conflict_markers:itemScan.conflictMarkers.length,item_parse_failures:itemScan.parseFailures.length,history_unreadable:historyScan.unreadable.length,history_conflict_markers:historyScan.conflictMarkers.length,history_invalid_json:historyScan.invalidJson.length,item_outdated_format_version:formatVersionScan.outdated.length,item_ahead_format_version:formatVersionScan.ahead.length,hierarchy_cycles:hierarchyIntegrity.cycles.length,hierarchy_cardinality_violations:hierarchyIntegrity.cardinality_violations.length,hierarchy_parent_divergences:hierarchyIntegrity.divergences.length,tracked_runtime_cache_files:trackedRuntimeCache.tracked_path_count,merge_driver_configuration:mergeDriverAudit===null||mergeDriverAudit.status==="ok"?0:mergeDriverAudit.missing_keys.length+mergeDriverAudit.drifted_keys.length,pending_merge_decisions:pendingMergeDecisions.length,lossless_merge_receipts:losslessMergeReceipts.length,invalid_merge_receipt_evidence:mergeReceiptEvidence.invalid_evidence_count,missing_merge_receipt_history_references:missingMergeReceiptReferences.length,accepted_legacy_merge_receipt_references:historyReceiptClassification.acceptedLegacyCount,accepted_missing_merge_receipt_dispositions:historyReceiptClassification.acceptedDispositionCount},item_unreadable:itemScan.unreadable,item_conflict_markers:itemScan.conflictMarkers,item_parse_failures:itemScan.parseFailures,item_outdated_format_version:formatVersionScan.outdated,item_ahead_format_version:formatVersionScan.ahead,hierarchy_integrity:{...hierarchyIntegrity,relations:summarizeRecordList(hierarchyIntegrity.relations,BRIEF_HEALTH_DETAIL_LIMIT)},history_unreadable:historyScan.unreadable,history_conflict_markers:historyScan.conflictMarkers,history_invalid_json:historyScan.invalidJson,tracked_runtime_cache:{tracker_relative_root:trackedRuntimeCache.tracker_relative_root,tracked_paths:trackedRuntimeCache.tracked_paths,tracked_path_count:trackedRuntimeCache.tracked_path_count,remediation_command:trackedRuntimeCache.remediation_command},merge_driver_configuration:mergeDriverAudit===null?null:{...mergeDriverAudit,required:requireMergeDrivers},pending_merge_decision_items:[...new Set(pendingMergeDecisions.map(receipt=>receipt.item_id))].sort((left,right)=>left.localeCompare(right)),lossless_merge_receipt_items:[...new Set(losslessMergeReceipts.map(receipt=>receipt.item_id))].sort((left,right)=>left.localeCompare(right)),invalid_merge_receipt_evidence_details:mergeReceiptEvidence.invalid_evidence,invalid_merge_receipt_evidence_details_truncated:mergeReceiptEvidence.invalid_evidence_truncated,missing_merge_receipt_history_reference_details:missingMergeReceiptReferences.slice(0,HEALTH_WARNING_LIMIT),missing_merge_receipt_history_reference_details_truncated:missingMergeReceiptReferences.length>HEALTH_WARNING_LIMIT}},warnings:normalizedWarnings,gitWorkspaceRoot,pendingMergeReceipts}}function hasActivateExport(moduleRecord){if(typeof moduleRecord.activate==="function"){return true}const defaultExport=moduleRecord.default;if(typeof defaultExport!=="object"||defaultExport===null){return false}return typeof defaultExport.activate==="function"}function summarizeLoadedExtension(extension){const summary={layer:extension.layer,directory:extension.directory,manifest_path:extension.manifest_path,name:extension.name,version:extension.version,entry:extension.entry,priority:extension.priority,entry_path:extension.entry_path,has_activate:hasActivateExport(extension.module)};if(Array.isArray(extension.capabilities)){summary.capabilities=[...extension.capabilities]}return summary}function resolveMigrationId(definition,fallbackIndex){const explicitId=toNonEmptyStringOrUndefined(definition.id);if(explicitId){return explicitId}return`migration-${String(fallbackIndex+1).padStart(3,"0")}`}function resolveMigrationStatus(definition){const rawStatus=toNonEmptyStringOrUndefined(definition.status);const normalized=rawStatus?.toLowerCase();if(normalized==="failed"){return"failed"}if(normalized==="applied"){return"applied"}return"pending"}function resolveMigrationFailureReason(definition){return toNonEmptyStringOrUndefined(definition.reason)??toNonEmptyStringOrUndefined(definition.error)??toNonEmptyStringOrUndefined(definition.message)}function compareMigrationEntries(left,right){const byLayer=(left.layer??"").localeCompare(right.layer??"");if(byLayer!==0){return byLayer}const byName=(left.name??"").localeCompare(right.name??"");if(byName!==0){return byName}return(left.id??"").localeCompare(right.id??"")}function summarizeMigrationStatuses(migrations){const applied=[];const pending=[];const failed=[];migrations.forEach((migration,index)=>{const id=resolveMigrationId(migration.definition,index);const status=resolveMigrationStatus(migration.definition);if(status==="applied"){applied.push({layer:migration.layer,name:migration.name,id,status});return}if(status==="failed"){failed.push({layer:migration.layer,name:migration.name,id,status,reason:resolveMigrationFailureReason(migration.definition)});return}pending.push({layer:migration.layer,name:migration.name,id,status})});applied.sort(compareMigrationEntries);pending.sort(compareMigrationEntries);failed.sort(compareMigrationEntries);const warnings=[...failed.map(entry=>`extension_migration_failed:${entry.layer}:${entry.name}:${entry.id}`),...pending.map(entry=>`extension_migration_pending:${entry.layer}:${entry.name}:${entry.id}`)];return{summary:{applied,pending,failed,applied_count:applied.length,pending_count:pending.length,failed_count:failed.length},warnings}}function buildExtensionHealthTriageSummary(warnings,loadFailureCount,activationFailureCount,migrationStatus,managedStateWarningCount,managedExtensionEntriesCount,unmanagedLoadedExtensions,unmanagedExpectedExtensions,unmanagedActionRequiredExtensions){const normalizedWarnings=[...new Set(warnings)].sort((left,right)=>left.localeCompare(right));const warningCodes=[...new Set(normalizedWarnings.map(value=>warningCode(value)))].sort((left,right)=>left.localeCompare(right));const unknownCapabilityCount=normalizedWarnings.filter(warning=>warning.startsWith("extension_capability_unknown:")).length;const updateHealthPartial=unmanagedActionRequiredExtensions.length>0;const updateHealthCoverage=updateHealthPartial?"partial":"full";const remediation=[];const registrationCollisionRemediation=buildRegistrationCollisionRemediation(normalizedWarnings,{deactivate:"pm extension --deactivate <name> --project/--global",doctor:"pm extension --doctor --project/--global --detail deep --trace"});if(registrationCollisionRemediation){remediation.push(registrationCollisionRemediation)}if(loadFailureCount>0){remediation.push("Run pm extension --explore --project and pm extension --explore --global to inspect load failures.")}if(activationFailureCount>0){remediation.push("Review checks[name=extensions].details.activation.failed in pm health --json for activation error details.")}if(migrationStatus.failed_count>0||migrationStatus.pending_count>0){remediation.push("Resolve pending/failed extension migrations before write commands; use --force only when policy allows.")}if(managedStateWarningCount>0){remediation.push("Run pm extension --manage --project and pm extension --manage --global to refresh managed-state diagnostics.")}if(unknownCapabilityCount>0){remediation.push(`Unknown extension capabilities detected. Allowed capabilities: ${KNOWN_EXTENSION_CAPABILITIES.join(", ")}. Review extension_capability_unknown warning details for suggested replacements.`)}if(normalizedWarnings.some(warning=>warning.startsWith("extension_capability_legacy_alias:"))){remediation.push("Legacy extension capability aliases were auto-remapped to canonical capabilities. Update manifests to canonical names (migration/validation -> schema).")}if(normalizedWarnings.some(warning=>warning.startsWith("extension_command_definition_legacy_handler_alias:"))){remediation.push("Extension command definitions using legacy handler were auto-remapped. Update command definitions to use run: (context) => ... for forward compatibility.")}if(updateHealthPartial){remediation.push("Update-check coverage is partial because unmanaged extensions need adoption. Adopt existing installs via pm extension --manage --project/--global --fix-managed-state, pm extension --adopt-all --project/--global, or pm extension --adopt <name>.")}else if(unmanagedLoadedExtensions.length>0){remediation.push("Loaded unmanaged extensions are currently treated as informational. Use pm extension --manage --project/--global --fix-managed-state to adopt them for update checks.")}if(remediation.length===0){remediation.push("No immediate action required. Re-run pm health after extension configuration changes.")}return{status:normalizedWarnings.length===0?"ok":"warn",warning_count:normalizedWarnings.length,warning_codes:warningCodes,load_failure_count:loadFailureCount,activation_failure_count:activationFailureCount,migration_failed_count:migrationStatus.failed_count,migration_pending_count:migrationStatus.pending_count,managed_state_warning_count:managedStateWarningCount,managed_extension_entries_count:managedExtensionEntriesCount,unmanaged_loaded_extension_count:unmanagedLoadedExtensions.length,unmanaged_loaded_extensions:unmanagedLoadedExtensions,unmanaged_expected_extension_count:unmanagedExpectedExtensions.length,unmanaged_expected_extensions:unmanagedExpectedExtensions,unmanaged_action_required_extension_count:unmanagedActionRequiredExtensions.length,unmanaged_action_required_extensions:unmanagedActionRequiredExtensions,update_health_coverage:updateHealthCoverage,update_health_partial:updateHealthPartial,unknown_capability_count:unknownCapabilityCount,top_warnings:normalizedWarnings.slice(0,8),remediation}}async function buildExtensionCheck(pmRoot,settings,noExtensionsFlag){const authorManifest=await inspectExtensionAuthorManifest(resolveWorkspaceRoot(pmRoot));const loadResult=await loadExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:noExtensionsFlag});const loadedSummaries=loadResult.loaded.map(extension=>summarizeLoadedExtension(extension));const hostVersionCensus=await scanExtensionHostVersions(loadResult.loaded,resolveWorkspaceRoot(pmRoot));const activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded});const[projectManagedState,globalManagedState]=await Promise.all([readManagedExtensionState(loadResult.roots.project),readManagedExtensionState(loadResult.roots.global)]);await applyStoredExtensionMigrationState(pmRoot,activationResult.registrations.migrations);const migrationStatus=summarizeMigrationStatuses(activationResult.registrations.migrations);const activationDetails={failed:activationResult.failed,warnings:activationResult.warnings,hook_counts:activationResult.hook_counts,command_override_count:activationResult.command_override_count,command_handler_count:activationResult.command_handler_count,parser_override_count:activationResult.parser_override_count,preflight_override_count:activationResult.preflight_override_count,service_override_count:activationResult.service_override_count,renderer_override_count:activationResult.renderer_override_count,registration_counts:activationResult.registration_counts,registrations:activationResult.registrations,migration_status:migrationStatus.summary,managed_extensions:{project:{path:projectManagedState.path,count:projectManagedState.state.entries.length,entries:projectManagedState.state.entries},global:{path:globalManagedState.path,count:globalManagedState.state.entries.length,entries:globalManagedState.state.entries}}};const managedProjectNames=new Set(projectManagedState.state.entries.map(entry=>normalizeExtensionNameForMatch(entry.name)));const managedGlobalNames=new Set(globalManagedState.state.entries.map(entry=>normalizeExtensionNameForMatch(entry.name)));const unmanagedLoadedEntries=[...new Map(loadResult.loaded.filter(entry=>{const managedNames=entry.layer==="project"?managedProjectNames:managedGlobalNames;return!managedNames.has(normalizeExtensionNameForMatch(entry.name))}).map(entry=>[`${entry.layer}:${entry.name}`,{layer:entry.layer,name:entry.name,directory:entry.directory}])).values()].sort((left,right)=>{const leftKey=`${left.layer}:${left.name}`;const rightKey=`${right.layer}:${right.name}`;return leftKey.localeCompare(rightKey)});const unmanagedLoadedExtensions=unmanagedLoadedEntries.map(entry=>`${entry.layer}:${entry.name}`).sort((left,right)=>left.localeCompare(right));const unmanagedExpectedExtensions=unmanagedLoadedEntries.filter(entry=>isExpectedUnmanagedExtension(entry.name,entry.directory)).map(entry=>`${entry.layer}:${entry.name}`).sort((left,right)=>left.localeCompare(right));const unmanagedActionRequiredExtensions=unmanagedLoadedEntries.filter(entry=>!isExpectedUnmanagedExtension(entry.name,entry.directory)).map(entry=>`${entry.layer}:${entry.name}`).sort((left,right)=>left.localeCompare(right));const updateCoverageWarnings=unmanagedActionRequiredExtensions.length>0?[`extension_update_health_partial_coverage:skipped_unmanaged:${unmanagedActionRequiredExtensions.length}`]:[];const extensionWarnings=[...authorManifest.warnings,...loadResult.warnings,...activationDetails.warnings,...migrationStatus.warnings,...projectManagedState.warnings,...globalManagedState.warnings,...updateCoverageWarnings,...hostVersionCensus.warnings];const capabilityGuidance=collectUnknownCapabilityGuidance(extensionWarnings);const capabilityContract=buildCapabilityContractMetadata();const extensionTriage=buildExtensionHealthTriageSummary(extensionWarnings,loadResult.failed.length,activationResult.failed.length,migrationStatus.summary,projectManagedState.warnings.length+globalManagedState.warnings.length,projectManagedState.state.entries.length+globalManagedState.state.entries.length,unmanagedLoadedExtensions,unmanagedExpectedExtensions,unmanagedActionRequiredExtensions);return{check:{name:"extensions",status:extensionWarnings.length===0?"ok":"warn",ok:extensionWarnings.length===0,details:{...loadResult,loaded:loadedSummaries,warnings:extensionWarnings,activation:activationDetails,author_manifest:authorManifest,triage:extensionTriage,...migrationStatus.summary.pending_count>0?{remediation_map:{extension_migration_pending:"pm extension migrate --project"}}:{},capability_contract:capabilityContract,capability_guidance:capabilityGuidance,host_version_census:hostVersionCensus}},warnings:extensionWarnings}}function summarizeList(values,limit){if(values.length<=limit){return{values,truncated:false}}return{values:values.slice(0,limit),truncated:true}}function summarizeRecordList(value,limit){if(!Array.isArray(value)){return{count:0,sample:[],truncated:false}}return{count:value.length,sample:value.slice(0,limit),truncated:value.length>limit}}function summarizeExtensionRecord(value){if(typeof value!=="object"||value===null||Array.isArray(value)){return{}}const record=value;return{layer:record.layer,directory:record.directory,name:record.name,version:record.version,enabled:record.enabled,status:record.status,has_activate:record.has_activate,capabilities:record.capabilities}}function summarizeExtensionList(value,limit){const summary=summarizeRecordList(value,limit);return{...summary,sample:summary.sample.map(entry=>summarizeExtensionRecord(entry))}}function summarizeStringList(value,limit){if(!Array.isArray(value)){return{count:0,sample:[],truncated:false}}const strings=value.filter(entry=>typeof entry==="string");return{count:strings.length,sample:strings.slice(0,limit),truncated:strings.length>limit}}function summarizeActivationMigrationStatus(value){if(typeof value!=="object"||value===null){return null}const status=value;return{applied_count:status.applied_count,pending_count:status.pending_count,failed_count:status.failed_count}}const HEALTH_DETAIL_SUMMARIZERS={settings:(details,limit)=>({version:details.version,id_prefix:details.id_prefix,locks_ttl_seconds:details.locks_ttl_seconds,warnings:summarizeStringList(details.warnings,limit)}),directories:(details,limit)=>({required_count:Array.isArray(details.required)?details.required.length:0,optional_count:Array.isArray(details.optional)?details.optional.length:0,missing_required:summarizeStringList(details.missing_required,limit),missing_optional:summarizeStringList(details.missing_optional,limit),missing:summarizeStringList(details.missing,limit),strict_directories:details.strict_directories}),settings_values:(details,limit)=>({warnings:summarizeStringList(details.warnings,limit)}),telemetry:details=>({enabled:details.enabled,capture_level:details.capture_level,endpoint:details.endpoint,queue_exists:details.queue_exists,queue_entries:details.queue_entries,queue_draining:details.queue_draining,queue_invalid_rows:details.queue_invalid_rows,queue_rows_total:details.queue_rows_total,last_successful_flush_at:details.last_successful_flush_at,last_failed_flush_at:details.last_failed_flush_at,endpoint_probe:details.endpoint_probe,env_overrides:details.env_overrides}),extensions:(details,limit)=>{const activation=typeof details.activation==="object"&&details.activation!==null?details.activation:{};return{disabled_by_flag:details.disabled_by_flag,discovered:summarizeExtensionList(details.discovered,limit),effective:summarizeExtensionList(details.effective,limit),loaded:summarizeExtensionList(details.loaded,limit),failed:summarizeRecordList(details.failed,limit),warnings:summarizeStringList(details.warnings,limit),activation:{failed:summarizeRecordList(activation.failed,limit),warnings:summarizeStringList(activation.warnings,limit),hook_counts:activation.hook_counts,command_handler_count:activation.command_handler_count,service_override_count:activation.service_override_count,renderer_override_count:activation.renderer_override_count,registration_counts:activation.registration_counts,migration_status:summarizeActivationMigrationStatus(activation.migration_status)},author_manifest:details.author_manifest,triage:details.triage,capability_contract:details.capability_contract,capability_guidance:summarizeRecordList(details.capability_guidance,limit),host_version_census:details.host_version_census}},storage:(details,limit)=>{const authorAttribution=typeof details.author_attribution==="object"&&details.author_attribution!==null?details.author_attribution:void 0;return{...details,...authorAttribution?{author_attribution:{...authorAttribution,affected_item_ids:summarizeStringList(authorAttribution.affected_item_ids,limit),samples:summarizeRecordList(authorAttribution.samples,limit)}}:{}}},locks:details=>({active_lock_count:details.active_lock_count,stale_lock_count:details.stale_lock_count,unreadable_lock_count:details.unreadable_lock_count,unparseable_lock_count:details.unparseable_lock_count}),integrity:(details,limit)=>{const trackedRuntimeCache=typeof details.tracked_runtime_cache==="object"&&details.tracked_runtime_cache!==null?details.tracked_runtime_cache:void 0;return{checked_item_files:details.checked_item_files,checked_history_streams:details.checked_history_streams,counts:details.counts,item_unreadable:summarizeStringList(details.item_unreadable,limit),item_conflict_markers:summarizeRecordList(details.item_conflict_markers,limit),item_parse_failures:summarizeStringList(details.item_parse_failures,limit),tracked_runtime_cache:trackedRuntimeCache===void 0?details.tracked_runtime_cache:{...trackedRuntimeCache,tracked_paths:summarizeStringList(trackedRuntimeCache.tracked_paths,limit)},history_unreadable:summarizeStringList(details.history_unreadable,limit),history_conflict_markers:summarizeRecordList(details.history_conflict_markers,limit),history_invalid_json:summarizeRecordList(details.history_invalid_json,limit),skipped:details.skipped}},history_drift:(details,limit)=>{const cacheConfirmation=typeof details.cache_confirmation==="object"&&details.cache_confirmation!==null?details.cache_confirmation:void 0;return{checked_items:details.checked_items,cache_hit_verification:details.cache_hit_verification,cache_confirmation:cacheConfirmation===void 0?details.cache_confirmation:{...cacheConfirmation,candidate_items:summarizeStringList(cacheConfirmation.candidate_items,limit),confirmed_items:summarizeStringList(cacheConfirmation.confirmed_items,limit),resolved_false_positive_items:summarizeStringList(cacheConfirmation.resolved_false_positive_items,limit)},counts:details.counts,drifted_items:summarizeStringList(details.drifted_items,limit),merge_receipt_attributed_items:summarizeStringList(details.merge_receipt_attributed_items,limit),missing_streams:summarizeStringList(details.missing_streams,limit),unreadable_streams:summarizeStringList(details.unreadable_streams,limit),hash_mismatches:summarizeStringList(details.hash_mismatches,limit),chain_mismatches:summarizeStringList(details.chain_mismatches,limit),version_skews:summarizeStringList(details.version_skews,limit),workspace_state_mismatches:summarizeStringList(details.workspace_state_mismatches,limit),workspace_state_missing:summarizeStringList(details.workspace_state_missing,limit),workspace_state_unreadable:summarizeStringList(details.workspace_state_unreadable,limit),skipped:details.skipped}},vectorization:(details,limit)=>({semantic_runtime_available:details.semantic_runtime_available,compatibility_mode_auto_defaults:details.compatibility_mode_auto_defaults,auto_ollama_defaults_applied:details.auto_ollama_defaults_applied,auto_ollama_defaults_skipped_reason:details.auto_ollama_defaults_skipped_reason,auto_ollama_defaults_remediation:details.auto_ollama_defaults_remediation,refresh_policy:details.refresh_policy,provider_active:details.provider_active,vector_store_active:details.vector_store_active,items:details.items,ledger_entries_before:details.ledger_entries_before,stale_items_before_total:details.stale_items_before_total,stale_items_before:summarizeStringList(details.stale_items_before,limit),refresh_attempted:details.refresh_attempted,refresh_skipped_reason:details.refresh_skipped_reason,refresh_result:details.refresh_result,ledger_entries_after:details.ledger_entries_after,stale_items_after_total:details.stale_items_after_total,stale_items_after:summarizeStringList(details.stale_items_after,limit),skipped:details.skipped})};function summarizeHealthCheckDetails(check,limit){const summarize=HEALTH_DETAIL_SUMMARIZERS[check.name];return summarize?summarize(check.details,limit):check.details}function applyBriefHealthProjection(result){const warningsSummary=summarizeStringList(result.warnings,BRIEF_HEALTH_DETAIL_LIMIT);return{ok:result.ok,...result.verdict?{verdict:result.verdict}:{},checks:result.checks.map(check=>({name:check.name,status:check.status,ok:check.ok,details:summarizeHealthCheckDetails(check,BRIEF_HEALTH_DETAIL_LIMIT)})),warnings:warningsSummary.sample,findings:result.findings.filter(finding=>warningsSummary.sample.includes(finding.warning)||result.failed_because.includes(finding.warning)),failed_because:result.failed_because,projection:{mode:"brief",warning_count:warningsSummary.count,warnings_truncated:warningsSummary.truncated,detail_limit:BRIEF_HEALTH_DETAIL_LIMIT},generated_at:result.generated_at}}function isSkippedHealthCheck(check){return check.details.skipped===true}function applySummaryHealthProjection(result){const warningsSummary=summarizeStringList(result.warnings,BRIEF_HEALTH_DETAIL_LIMIT);const omittedChecks=result.checks.filter(isSkippedHealthCheck).map(check=>check.name);return{ok:result.ok,...result.verdict?{verdict:result.verdict}:{},checks:result.checks.filter(check=>!isSkippedHealthCheck(check)).map(check=>({name:check.name,status:check.status,ok:check.ok,details:{}})),warning_count:warningsSummary.count,warnings:warningsSummary.sample,findings:result.findings.filter(finding=>warningsSummary.sample.includes(finding.warning)||result.failed_because.includes(finding.warning)),failed_because:result.failed_because,projection:{mode:"summary",warning_count:warningsSummary.count,warnings_truncated:warningsSummary.truncated,detail_limit:BRIEF_HEALTH_DETAIL_LIMIT,omitted_checks:omittedChecks},generated_at:result.generated_at}}function selectStaleItemDetail(values,verboseStaleItems){if(verboseStaleItems){return{values,truncated:false,total:values.length}}const summary=summarizeList(values,STALE_VECTORIZATION_SUMMARY_LIMIT);return{values:summary.values,truncated:summary.truncated,total:values.length}}function telemetryEnvFlagEnabled(envKey){const value=(process.env[envKey]??"").trim().toLowerCase();return value==="1"||value==="true"||value==="yes"||value==="on"}function telemetrySourceContextOverride(){const value=(process.env.PM_TELEMETRY_SOURCE_CONTEXT??"").trim().toLowerCase();return PM_TELEMETRY_SOURCE_CONTEXT_SET.has(value)?value:null}function normalizeEndpointForDisplay(rawEndpoint){const trimmed=rawEndpoint.trim();if(trimmed.length===0){return""}try{const parsed=new URL(trimmed);parsed.username="";parsed.password="";parsed.search="";parsed.hash="";return parsed.toString()}catch{return trimmed}}function parseTelemetryQueue(raw){let validEntries=0;let invalidRows=0;let totalRows=0;let highRetryEntries=0;let maxAttempts=0;for(const line of raw.split("\n")){const trimmed=line.trim();if(trimmed.length===0){continue}totalRows+=1;try{const parsed=JSON.parse(trimmed);if(typeof parsed==="object"&&parsed!==null&&typeof parsed.attempts==="number"&&Number.isFinite(parsed.attempts)){const attempts=Math.max(0,Math.trunc(parsed.attempts));validEntries+=1;maxAttempts=Math.max(maxAttempts,attempts);if(attempts>=TELEMETRY_QUEUE_HIGH_RETRY_THRESHOLD){highRetryEntries+=1}}else{invalidRows+=1}}catch{invalidRows+=1}}return{validEntries,invalidRows,totalRows,highRetryEntries,maxAttempts}}function emptyTelemetryQueueSummary(){return{validEntries:0,invalidRows:0,totalRows:0,highRetryEntries:0,maxAttempts:0}}function parseTelemetryRuntimeState(stateRaw){if(!stateRaw||stateRaw.trim().length===0){return{runtimeState:{},stateParseFailed:false}}try{const parsed=JSON.parse(stateRaw);if(typeof parsed==="object"&&parsed!==null&&!Array.isArray(parsed)){return{runtimeState:parsed,stateParseFailed:false}}return{runtimeState:{},stateParseFailed:true}}catch{return{runtimeState:{},stateParseFailed:true}}}async function maybeProbeTelemetryEndpoint(settings,checkTelemetry){const endpoint=settings.telemetry.endpoint.trim();if(!checkTelemetry||!settings.telemetry.enabled||endpoint.length===0||resolveTelemetryEnvironmentPolicy().telemetry_disabled){return void 0}const probe=await probeTelemetryEndpointHealth(endpoint);return{attempted:true,...probe}}function collectTelemetryQueueWarnings(settings,queueSummary,runtimeState){const warnings=[];if(queueSummary.invalidRows>0){warnings.push(`telemetry_queue_invalid_rows:${queueSummary.invalidRows}`)}if(!settings.telemetry.enabled||queueSummary.validEntries===0){return warnings}const lastSuccess=runtimeState.last_successful_flush_at;const lastFailure=runtimeState.last_failed_flush_at;const activeFailure=lastFailure&&(!lastSuccess||lastFailure>lastSuccess);const neverFlushed=!lastSuccess;const highWater=queueSummary.validEntries>=TELEMETRY_QUEUE_HIGH_WATER_MARK;if(activeFailure||neverFlushed||highWater){warnings.push(`telemetry_queue_pending:${queueSummary.validEntries}`)}if(queueSummary.highRetryEntries>0){warnings.push(`telemetry_queue_high_retries:${queueSummary.highRetryEntries}`)}return warnings}function collectTelemetryEndpointWarnings(endpointProbe){if(!endpointProbe||endpointProbe.ok!==false){return[]}return typeof endpointProbe.status==="number"?[`telemetry_endpoint_probe_http_status:${endpointProbe.status}`]:["telemetry_endpoint_probe_failed"]}function collectTelemetrySchemaWarnings(endpointProbe){const parsedMaxSchemaVersion=Number.parseInt(endpointProbe?.max_schema_version??"",10);if(endpointProbe?.ok===true&&Number.isInteger(parsedMaxSchemaVersion)&&parsedMaxSchemaVersion>TELEMETRY_SCHEMA_VERSION){return[`telemetry_schema_version_behind:${parsedMaxSchemaVersion}`]}return[]}function collectTelemetryOtelWarnings(settings,runtimeState){const pendingOtelSpans=typeof runtimeState.pending_otel_spans==="number"?runtimeState.pending_otel_spans:0;const lastOtelSuccess=runtimeState.last_otel_success_at;const lastOtelFailure=runtimeState.last_otel_failure_at;const otelExportFailing=settings.telemetry.enabled&&pendingOtelSpans>0&&Boolean(lastOtelFailure)&&(!lastOtelSuccess||lastOtelFailure>=lastOtelSuccess);return otelExportFailing?[`telemetry_otel_export_failing:${pendingOtelSpans}`]:[]}function buildTelemetryEnvOverrideDetails(){return{...resolveTelemetryEnvironmentPolicy(),pm_no_telemetry:telemetryEnvFlagEnabled("PM_NO_TELEMETRY"),telemetry_otel_disabled:telemetryEnvFlagEnabled("PM_TELEMETRY_OTEL_DISABLED"),telemetry_inline_flush:telemetryEnvFlagEnabled("PM_TELEMETRY_INLINE_FLUSH"),telemetry_source_context:telemetrySourceContextOverride()}}function telemetryQueueHasEntries(settings,queueSummary){return settings.telemetry.enabled&&queueSummary.validEntries>0}function isTelemetryQueueDraining(queueHasEntries,warnings){return queueHasEntries&&warnings.every(warning=>!warning.startsWith("telemetry_queue_pending:")&&!warning.startsWith("telemetry_queue_high_retries:"))}async function probeTelemetryEndpointHealth(endpoint){let probeUrl=endpoint;try{const parsed=new URL(endpoint);parsed.pathname="/healthz";parsed.search="";parsed.hash="";probeUrl=parsed.toString()}catch{}try{const response=await fetch(probeUrl,{method:"GET",signal:AbortSignal.timeout(TELEMETRY_ENDPOINT_PROBE_TIMEOUT_MS)});return{probe_url:normalizeEndpointForDisplay(probeUrl),ok:response.ok,status:response.status,max_schema_version:(()=>{for(const headerName of TELEMETRY_SERVER_MAX_SCHEMA_VERSION_HEADERS){const value=response.headers.get(headerName)?.trim();if(value&&value.length>0){return value}}return void 0})()}}catch(error){return{probe_url:normalizeEndpointForDisplay(probeUrl),ok:false,error:error instanceof Error?error.message:"probe_failed"}}}async function buildTelemetryCheck(settings,options){const globalPmRoot=resolveGlobalPmRoot(process.cwd());const queuePath=path.join(globalPmRoot,TELEMETRY_QUEUE_RELATIVE_PATH);const statePath=path.join(globalPmRoot,TELEMETRY_STATE_RELATIVE_PATH);const queueRaw=await readFileIfExists(queuePath);const queueExists=queueRaw!==null;const queueSizeBytes=queueRaw?Buffer.byteLength(queueRaw,"utf8"):0;const queueSummary=queueRaw?parseTelemetryQueue(queueRaw):emptyTelemetryQueueSummary();const stateRaw=await readFileIfExists(statePath);const{runtimeState,stateParseFailed}=parseTelemetryRuntimeState(stateRaw);const endpoint=settings.telemetry.endpoint.trim();const endpointDisplay=normalizeEndpointForDisplay(endpoint);const endpointProbe=await maybeProbeTelemetryEndpoint(settings,options.checkTelemetry);const warnings=[];if(stateParseFailed){warnings.push("telemetry_state_invalid_json")}warnings.push(...collectTelemetryQueueWarnings(settings,queueSummary,runtimeState),...collectTelemetryEndpointWarnings(endpointProbe),...collectTelemetrySchemaWarnings(endpointProbe),...collectTelemetryOtelWarnings(settings,runtimeState));const queueHasEntries=telemetryQueueHasEntries(settings,queueSummary);const pendingOtelSpans=typeof runtimeState.pending_otel_spans==="number"?runtimeState.pending_otel_spans:0;return{check:{name:"telemetry",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{enabled:settings.telemetry.enabled,capture_level:settings.telemetry.capture_level,endpoint:endpointDisplay,global_pm_root:globalPmRoot,queue_path:queuePath,queue_exists:queueExists,queue_entries:queueSummary.validEntries,queue_draining:isTelemetryQueueDraining(queueHasEntries,warnings),queue_invalid_rows:queueSummary.invalidRows,queue_rows_total:queueSummary.totalRows,queue_size_bytes:queueSizeBytes,queue_high_retry_entries:queueSummary.highRetryEntries,queue_high_retry_threshold:TELEMETRY_QUEUE_HIGH_RETRY_THRESHOLD,queue_max_attempts:queueSummary.maxAttempts,runtime_state_path:statePath,last_attempted_flush_at:runtimeState.last_attempted_flush_at??null,last_successful_flush_at:runtimeState.last_successful_flush_at??null,last_failed_flush_at:runtimeState.last_failed_flush_at??null,last_failed_flush_error:runtimeState.last_failed_flush_error??null,pending_otel_spans:pendingOtelSpans,last_otel_attempt_at:runtimeState.last_otel_attempt_at??null,last_otel_success_at:runtimeState.last_otel_success_at??null,last_otel_failure_at:runtimeState.last_otel_failure_at??null,last_otel_failure_error:runtimeState.last_otel_failure_error??null,endpoint_probe:endpointProbe??{attempted:false},env_overrides:buildTelemetryEnvOverrideDetails()}},warnings}}async function buildLocksCheck(pmRoot){let scan;try{scan=await scanLockHealth(pmRoot)}catch(error){const message=error instanceof Error?error.message:String(error);return{check:{name:"locks",status:"warn",ok:false,details:{active_lock_count:0,stale_lock_count:0,unreadable_lock_count:0,unparseable_lock_count:0,scan_failed:true,error:message,pm_root:pmRoot}},warnings:[`locks_scan_failed:${message}`]}}const warnings=[];if(scan.stale_lock_count>0){warnings.push(`locks_stale_count:${scan.stale_lock_count}`)}if(scan.unreadable_lock_count>0){warnings.push(`locks_unreadable:${scan.unreadable_lock_count}`)}return{check:{name:"locks",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{active_lock_count:scan.active_lock_count,stale_lock_count:scan.stale_lock_count,unreadable_lock_count:scan.unreadable_lock_count,unparseable_lock_count:scan.unparseable_lock_count}},warnings}}async function buildHistoryDriftCheck(params){const cacheHitVerification="metadata";let items=params.items;let drift=await scanHistoryDrift(params.pmRoot,items,{cacheHitVerification});const cacheConfirmationCandidates=[...new Set([...drift.hashMismatches,...drift.chainMismatches,...drift.versionSkews])].sort((left,right)=>left.localeCompare(right));let confirmedItems=[];let resolvedFalsePositiveItems=[];if(cacheConfirmationCandidates.length>0){items=await listAllItemMetadataWithBody(params.pmRoot,params.settings.item_format,params.typeRegistry.type_to_folder,params.itemReadWarnings,params.settings.schema,{forceSourceScan:true});drift=await scanHistoryDrift(params.pmRoot,items);confirmedItems=[...new Set([...drift.hashMismatches,...drift.chainMismatches,...drift.versionSkews])].sort((left,right)=>left.localeCompare(right));const confirmedSet=new Set(confirmedItems);resolvedFalsePositiveItems=cacheConfirmationCandidates.filter(id=>!confirmedSet.has(id))}const{missingStreams,unreadableStreams,hashMismatches,chainMismatches,versionSkews,driftedItems,workspaceStateMismatches,workspaceStateMissing,workspaceStateUnreadable}=drift;const warnings=[...missingStreams.map(id=>`history_drift_missing_stream:${id}`),...unreadableStreams.map(id=>`history_drift_unreadable_stream:${id}`),...hashMismatches.map(id=>`history_drift_hash_mismatch:${id}`),...chainMismatches.map(id=>`history_drift_chain_mismatch:${id}`),...versionSkews.map(id=>`history_drift_version_skew:${id}`),...workspaceStateMismatches.map(documentPath=>`history_drift_workspace_state_mismatch:${documentPath}`),...workspaceStateMissing.map(documentPath=>`history_drift_workspace_state_missing:${documentPath}`),...workspaceStateUnreadable.map(documentPath=>`history_drift_workspace_state_unreadable:${documentPath}`)];return{check:{name:"history_drift",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{checked_items:items.length,cache_hit_verification:cacheConfirmationCandidates.length>0?"metadata_then_content_hash":cacheHitVerification,cache_confirmation:{triggered:cacheConfirmationCandidates.length>0,reason:cacheConfirmationCandidates.length>0?"cached_corruption_candidate":null,candidate_items:cacheConfirmationCandidates,confirmed_items:confirmedItems,resolved_false_positive_items:resolvedFalsePositiveItems,authoritative_item_source:cacheConfirmationCandidates.length>0},drifted_items:driftedItems,counts:{drifted:driftedItems.length,missing_streams:missingStreams.length,unreadable_streams:unreadableStreams.length,hash_mismatches:hashMismatches.length,chain_mismatches:chainMismatches.length,version_skews:versionSkews.length,workspace_state_mismatches:workspaceStateMismatches.length,workspace_state_missing:workspaceStateMissing.length,workspace_state_unreadable:workspaceStateUnreadable.length},missing_streams:missingStreams,unreadable_streams:unreadableStreams,hash_mismatches:hashMismatches,chain_mismatches:chainMismatches,version_skews:versionSkews,workspace_state_mismatches:workspaceStateMismatches,workspace_state_missing:workspaceStateMissing,workspace_state_unreadable:workspaceStateUnreadable}},warnings}}function buildVectorizationRuntimeSnapshot(settings,pmRoot){const runtimeDefaults=resolveSettingsWithSemanticRuntimeDefaults(settings);const providerResolution=resolveEmbeddingProviders(runtimeDefaults.settings);const vectorStoreResolution=resolveVectorStores(runtimeDefaults.settings,pmRoot);const runtimeEmbeddingIdentity=providerResolution.active?buildVectorizationEmbeddingIdentity(providerResolution.active.name,providerResolution.active.model):null;return{runtimeDefaults,providerResolution,vectorStoreResolution,runtimeEmbeddingIdentity,semanticRuntimeAvailable:Boolean(providerResolution.active&&vectorStoreResolution.active)}}function emptyVectorizationRefreshResult(){return{refreshed:[],skipped:[],warnings:[]}}async function refreshStaleVectorizationItems(params){if(!params.refreshPolicy.enabled||!params.snapshot.semanticRuntimeAvailable||params.staleBefore.length===0){return emptyVectorizationRefreshResult()}return refreshSemanticEmbeddingsForMutatedItems(params.pmRoot,params.staleBefore,{settings:params.snapshot.runtimeDefaults.settings,apply_runtime_defaults:false})}function vectorizationEmbeddingIdentityChanged(params){return params.strictVectorizationWarnings&&params.semanticRuntimeAvailable&&Boolean(params.ledgerBefore.embedding&&params.runtimeEmbeddingIdentity&&hasVectorizationEmbeddingIdentityChanged(params.ledgerBefore.embedding,params.runtimeEmbeddingIdentity))}function collectVectorizationWarnings(params){const warningSet=new Set([...params.ledgerBefore.warnings,...params.ledgerAfter.warnings]);if(params.strictVectorizationWarnings){for(const warning of params.refreshResult.warnings){warningSet.add(warning)}}if(params.embeddingIdentityChanged){warningSet.add("vectorization_embedding_identity_changed")}if(params.strictVectorizationWarnings&&params.semanticRuntimeAvailable&&params.staleAfter.length>0){warningSet.add(`vectorization_stale_items_remaining:${params.staleAfter.length}`)}return[...warningSet].sort((left,right)=>left.localeCompare(right))}function resolveVectorizationRefreshSkippedReason(refreshPolicy,semanticRuntimeAvailable,staleBefore){if(refreshPolicy.enabled&&semanticRuntimeAvailable&&staleBefore.length>0){return null}if(!refreshPolicy.enabled){return"refresh_disabled"}return semanticRuntimeAvailable?"no_stale_items":"semantic_runtime_unavailable"}function buildVectorizationProviderDetails(settings,snapshot){const activeProvider=snapshot.providerResolution.active?.name??null;const activeVectorStore=snapshot.vectorStoreResolution.active?.name??null;return{provider_active:activeProvider,provider_configured:typeof settings.search?.provider==="string"?settings.search.provider:null,provider_source:resolveProviderConfigSource(activeProvider,settings.search?.provider??null),vector_store_active:activeVectorStore,vector_store_configured:typeof settings.vector_store?.adapter==="string"?settings.vector_store.adapter:null,vector_store_source:resolveProviderConfigSource(activeVectorStore,settings.vector_store?.adapter??null)}}function buildVectorizationRefreshPolicyDetails(refreshPolicy){return{enabled:refreshPolicy.enabled,check_only:refreshPolicy.checkOnly,no_refresh:refreshPolicy.noRefresh,refresh_vectors:refreshPolicy.refreshVectors}}function vectorizationRefreshAttempted(refreshPolicy,semanticRuntimeAvailable,staleBefore){return refreshPolicy.enabled&&staleBefore.length>0&&semanticRuntimeAvailable}async function buildVectorizationCheck(pmRoot,settings,items,refreshPolicy,verboseStaleItems){const snapshot=buildVectorizationRuntimeSnapshot(settings,pmRoot);const ledgerBefore=await readVectorizationStatusLedger(pmRoot);const staleBefore=snapshot.semanticRuntimeAvailable?collectStaleVectorizationIds(items,ledgerBefore.entries):[];const refreshResult=await refreshStaleVectorizationItems({pmRoot,snapshot,refreshPolicy,staleBefore});const ledgerAfter=await readVectorizationStatusLedger(pmRoot);const staleAfter=snapshot.semanticRuntimeAvailable?collectStaleVectorizationIds(items,ledgerAfter.entries):[];const strictVectorizationWarnings=!snapshot.runtimeDefaults.auto_ollama_defaults_applied;const embeddingIdentityChanged=vectorizationEmbeddingIdentityChanged({strictVectorizationWarnings,semanticRuntimeAvailable:snapshot.semanticRuntimeAvailable,ledgerBefore,runtimeEmbeddingIdentity:snapshot.runtimeEmbeddingIdentity});const warnings=collectVectorizationWarnings({ledgerBefore,ledgerAfter,refreshResult,strictVectorizationWarnings,semanticRuntimeAvailable:snapshot.semanticRuntimeAvailable,embeddingIdentityChanged,staleAfter});const staleBeforeDetail=selectStaleItemDetail(staleBefore,verboseStaleItems);const staleAfterDetail=selectStaleItemDetail(staleAfter,verboseStaleItems);const refreshAttempted=vectorizationRefreshAttempted(refreshPolicy,snapshot.semanticRuntimeAvailable,staleBefore);return{check:{name:"vectorization",status:warnings.length===0?"ok":"warn",ok:warnings.length===0,details:{semantic_runtime_available:snapshot.semanticRuntimeAvailable,compatibility_mode_auto_defaults:snapshot.runtimeDefaults.auto_ollama_defaults_applied,auto_ollama_defaults_applied:snapshot.runtimeDefaults.auto_ollama_defaults_applied,auto_ollama_defaults_skipped_reason:snapshot.runtimeDefaults.auto_ollama_defaults_skipped_reason??null,auto_ollama_defaults_remediation:snapshot.runtimeDefaults.auto_ollama_defaults_remediation??null,refresh_policy:buildVectorizationRefreshPolicyDetails(refreshPolicy),...buildVectorizationProviderDetails(settings,snapshot),embedding_identity_changed:embeddingIdentityChanged,embedding_identity_before:ledgerBefore.embedding??null,embedding_identity_runtime:snapshot.runtimeEmbeddingIdentity??null,items:items.length,ledger_entries_before:Object.keys(ledgerBefore.entries).length,stale_items_detail_mode:verboseStaleItems?"full":"summary",stale_items_summary_limit:STALE_VECTORIZATION_SUMMARY_LIMIT,stale_items_before_total:staleBeforeDetail.total,stale_items_before:staleBeforeDetail.values,stale_items_before_truncated:staleBeforeDetail.truncated,refresh_attempted:refreshAttempted,refresh_skipped_reason:resolveVectorizationRefreshSkippedReason(refreshPolicy,snapshot.semanticRuntimeAvailable,staleBefore),refresh_result:refreshResult,ledger_entries_after:Object.keys(ledgerAfter.entries).length,stale_items_after_total:staleAfterDetail.total,stale_items_after:staleAfterDetail.values,stale_items_after_truncated:staleAfterDetail.truncated}},warnings}}function validateSettingsValues(settings){const warnings=[];if(settings.id_prefix.trim().length===0){warnings.push("settings:id_prefix_empty")}if(settings.locks.ttl_seconds<=0){warnings.push("settings:locks_ttl_non_positive")}return warnings}function resolveVectorRefreshPolicy(options){const checkOnly=options.checkOnly===true;const refreshVectors=options.refreshVectors===true;if(refreshVectors&&checkOnly){throw new PmCliError("--check-only cannot be combined with --refresh-vectors",EXIT_CODE.USAGE)}if(refreshVectors&&options.noRefresh===true){throw new PmCliError("--no-refresh cannot be combined with --refresh-vectors",EXIT_CODE.USAGE)}return{enabled:refreshVectors,checkOnly,noRefresh:!refreshVectors,refreshVectors}}const HEALTH_CLONE_OPTIONAL_DIRECTORIES=new Set(["extensions","locks","search"]);function resolveHealthDirectoryLists(typeRegistry){const requiredDirSet=new Set(PM_CORE_REQUIRED_SUBDIRS.filter(entry=>entry.length>0));const optionalDirSet=new Set;const builtinItemFolderSet=new Set(Object.values(TYPE_TO_FOLDER));for(const folder of typeRegistry.folders){if(requiredDirSet.has(folder)&&!builtinItemFolderSet.has(folder)){continue}requiredDirSet.delete(folder);optionalDirSet.add(folder)}for(const folder of HEALTH_CLONE_OPTIONAL_DIRECTORIES){requiredDirSet.delete(folder);optionalDirSet.add(folder)}return{requiredDirs:[...requiredDirSet].sort((left,right)=>left.localeCompare(right)),optionalDirs:[...optionalDirSet].sort((left,right)=>left.localeCompare(right)),optionalDirSet}}async function scanHealthDirectories(pmRoot,typeRegistry,strictDirectories){const{requiredDirs,optionalDirs,optionalDirSet}=resolveHealthDirectoryLists(typeRegistry);const missingRequiredDirs=[];const missingOptionalDirs=[];const hookWarnings=[];for(const relativeDir of[...requiredDirs,...optionalDirs]){const directoryPath=path.join(pmRoot,relativeDir);hookWarnings.push(...await runActiveOnReadHooks({path:directoryPath,scope:"project"}));if(await isDirectory(directoryPath)){continue}if(optionalDirSet.has(relativeDir)){missingOptionalDirs.push(relativeDir)}else{missingRequiredDirs.push(relativeDir)}}return{requiredDirs,optionalDirs,missingRequiredDirs,missingOptionalDirs,missingDirs:strictDirectories?[...missingRequiredDirs,...missingOptionalDirs]:[...missingRequiredDirs],hookWarnings}}function resolveHealthSkipPolicy(options){const checkOnlyDefaultSummary=options.checkOnly===true&&options.brief!==true&&options.summary!==true&&options.full!==true;const summaryMode=(options.summary===true||checkOnlyDefaultSummary)&&options.full!==true;const fastProjectionCheckOnly=options.checkOnly===true&&(options.brief===true||options.summary===true)&&options.full!==true;return{summaryMode,skipIntegrity:(options.skipIntegrity===true||fastProjectionCheckOnly)&&options.full!==true,skipDrift:(options.skipDrift===true||fastProjectionCheckOnly)&&options.full!==true,skipVectors:(options.skipVectors===true||fastProjectionCheckOnly)&&options.full!==true}}async function readHealthItems(params){if(params.skipPolicy.skipDrift&&params.skipPolicy.skipVectors){return listAllItemMetadataLight(params.pmRoot,params.settings.item_format,params.typeRegistry.type_to_folder,params.itemReadWarnings,params.settings.schema)}return listAllItemMetadataWithBody(params.pmRoot,params.settings.item_format,params.typeRegistry.type_to_folder,params.itemReadWarnings,params.settings.schema)}function buildSkippedHealthCheck(name){return{check:{name,status:"ok",ok:true,details:{skipped:true}},warnings:[]}}function buildSettingsHealthCheck(settingsPath,settings,normalizedSettingsReadWarnings){return{name:"settings",status:normalizedSettingsReadWarnings.length===0?"ok":"warn",ok:normalizedSettingsReadWarnings.length===0,details:{path:settingsPath,version:settings.version,id_prefix:settings.id_prefix,locks_ttl_seconds:settings.locks.ttl_seconds,warnings:normalizedSettingsReadWarnings}}}function buildDirectoriesHealthCheck(directoryState,strictDirectories){return{name:"directories",status:directoryState.missingDirs.length===0?"ok":"warn",ok:directoryState.missingDirs.length===0,details:{required:directoryState.requiredDirs,optional:directoryState.optionalDirs,missing_required:directoryState.missingRequiredDirs,missing_optional:directoryState.missingOptionalDirs,missing:directoryState.missingDirs,strict_directories:strictDirectories}}}function buildSettingsValuesHealthCheck(settingWarnings,statusRoleDiagnostics){return{name:"settings_values",status:settingWarnings.length===0?"ok":"warn",ok:settingWarnings.length===0,details:{warnings:settingWarnings,...statusRoleDiagnostics.roleless_status_count>0?{lifecycle_status_roles:statusRoleDiagnostics}:{}}}}const resolveUnknownAuthorEventCount=authorAttribution=>authorAttribution.unknown_event_count??0;const resolveActionableUnknownAuthorEventCount=authorAttribution=>authorAttribution.actionable_unknown_event_count??resolveUnknownAuthorEventCount(authorAttribution);function buildStorageHealthCheck(items,settings,historySummary,authorAttribution,staleInProgress,provenanceResolverOutcomes,provenanceInvalidValues){const unknownAuthorEventCount=resolveUnknownAuthorEventCount(authorAttribution);const actionableUnknownAuthorEventCount=resolveActionableUnknownAuthorEventCount(authorAttribution);const hasAuthorEvents=unknownAuthorEventCount>0;const hasActionableAuthorWarnings=actionableUnknownAuthorEventCount>0;const hasStaleInProgressItems=staleInProgress.count>0;return{name:"storage",status:historySummary.over_threshold.length===0&&historySummary.orphaned.length===0&&!hasActionableAuthorWarnings&&!hasStaleInProgressItems?"ok":"warn",ok:historySummary.over_threshold.length===0&&historySummary.orphaned.length===0&&!hasActionableAuthorWarnings&&!hasStaleInProgressItems,details:{items:items.length,history_streams:historySummary.count,tombstones:{retention_policy:"retain_append_only",gc_enabled:false,count:historySummary.tombstones.length,ids:historySummary.tombstones.slice(0,25),truncated:historySummary.tombstones.length>25},orphaned_history_streams:{count:historySummary.orphaned.length,ids:historySummary.orphaned.slice(0,25),truncated:historySummary.orphaned.length>25},...hasAuthorEvents?{author_attribution:authorAttribution}:{},...hasStaleInProgressItems?{stale_in_progress:staleInProgress}:{},...provenanceResolverOutcomes.length>0?{provenance_resolver_outcomes:provenanceResolverOutcomes}:{},...provenanceInvalidValues.length>0?{provenance_invalid_values:provenanceInvalidValues}:{},...historySummary.max_entries!==null?{compact_policy:{enabled:settings.history.compact_policy.enabled,max_entries:historySummary.max_entries,trigger:settings.history.compact_policy.trigger,over_threshold_count:historySummary.over_threshold.length,over_threshold:historySummary.over_threshold}}:{}}}}function buildStaleInProgressHealthSummary(scan){const warnings=scan.count===0?[]:[`stale_in_progress_items:${scan.count}`];return{scan,warnings}}function collectHealthWarnings(params){const warnings=[...params.directoryState.missingDirs.map(dir=>`missing_directory:${dir}`),...params.normalizedSettingsReadWarnings,...params.settingWarnings,...params.normalizedItemReadWarnings,...params.telemetryCheck.warnings,...params.extensionCheck.warnings,...params.historyPolicyWarnings,...params.historySummary.warnings,...params.authorAttributionWarnings,...params.staleInProgressWarnings,...params.provenanceWarnings,...params.locksCheck.warnings,...params.integrityCheck.warnings,...params.historyDriftCheck.warnings,...params.vectorizationCheck.warnings,...params.directoryState.hookWarnings];return[...new Set(warnings)]}function extractHistoryDriftedCount(historyDriftCheck){const counts=historyDriftCheck.check.details.counts;return typeof counts?.drifted==="number"?counts.drifted:0}function buildHealthRemediationSources(params){return{settings:params.normalizedSettingsReadWarnings,directories:params.directoryState.missingDirs.map(dir=>`missing_directory:${dir}`).concat(params.directoryState.hookWarnings),settings_values:params.settingWarnings,telemetry:params.telemetryCheck.warnings,extensions:params.extensionCheck.warnings,storage:[...params.historyPolicyWarnings,...params.historySummary.warnings,...params.authorAttributionWarnings,...params.staleInProgressWarnings,...params.provenanceWarnings],locks:params.locksCheck.warnings,integrity:[...params.normalizedItemReadWarnings,...params.integrityCheck.warnings],history_drift:params.historyDriftCheck.warnings,vectorization:params.vectorizationCheck.warnings}}function buildHealthFindings(params){const owners=new Map;for(const[check,warnings]of Object.entries(params.remediationSources)){for(const warning of warnings){if(!owners.has(warning))owners.set(warning,check)}}const checksByName=new Map(params.checks.map(check=>[check.name,check]));const findings=params.warnings.map(warning=>{const check=owners.get(warning)??"integrity";const code=resolveRemediation(warning)?.code??warningCode(warning);const details=checksByName.get(check)?.details;const remediationMap=typeof details?.remediation_map==="object"&&details.remediation_map!==null?details.remediation_map:{};const remediation=remediationMap[code];const severity=isAdvisoryHealthWarning(warning,params.requireMergeDrivers)?"advisory":"gate_failing";return{warning,code,check,severity,...typeof remediation==="string"?{remediation}:severity==="gate_failing"?{disposition:"no_safe_automatic_remediation"}:{}}});return findings}function rewriteBulkHealthRemediation(params){if(params.check.name==="history_drift"&&params.historyDriftedCount>1){for(const code of Object.keys(params.remediationMap)){if(code!=="history_drift_merge_receipt"&&code!=="history_drift_version_skew"){params.remediationMap[code]="pm history-repair --all"}}}if(params.check.name==="storage"&&params.overThresholdCount>1){for(const code of Object.keys(params.remediationMap)){params.remediationMap[code]="pm history-compact --all-streams"}}}function attachHealthRemediationMaps(params){for(const check of params.checks){const remediationMap=buildRemediationMap(params.remediationSources[check.name]);rewriteBulkHealthRemediation({check,remediationMap,historyDriftedCount:params.historyDriftedCount,overThresholdCount:params.overThresholdCount});if(Object.keys(remediationMap).length>0){check.details={...check.details,remediation_map:remediationMap}}}}async function correlateMergeReceiptHistoryDriftItems(params){if(params.gitWorkspaceRoot===null||params.pendingMergeReceipts.length===0){return[]}const details=params.historyDriftCheck.check.details;const hashMismatches=Array.isArray(details.hash_mismatches)?details.hash_mismatches.filter(entry=>typeof entry==="string"):[];const unsafeStreamIds=new Set([details.missing_streams,details.unreadable_streams,details.chain_mismatches].flatMap(value=>Array.isArray(value)?value:[]));const cloneLocalReceiptsByItem=new Map;for(const receipt of params.pendingMergeReceipts){if(receipt.evidence_source!=="clone_local")continue;const receipts=cloneLocalReceiptsByItem.get(receipt.item_id)??[];receipts.push(receipt);cloneLocalReceiptsByItem.set(receipt.item_id,receipts)}const attributed=[];for(const id of hashMismatches){if(unsafeStreamIds.has(id))continue;const receipts=cloneLocalReceiptsByItem.get(id);if(!receipts||receipts.length===0)continue;try{await runHistoryRepair(id,{dryRun:true,mergeReceiptProof:{gitWorkspaceRoot:params.gitWorkspaceRoot,receipts}},params.global);attributed.push(id)}catch{}}return[...new Set(attributed)].sort((left,right)=>left.localeCompare(right))}function applyMergeReceiptHistoryDriftAttribution(historyDriftCheck,attributedItems){const attributed=new Set(attributedItems);historyDriftCheck.warnings=[...historyDriftCheck.warnings.filter(warning=>{if(!warning.startsWith("history_drift_hash_mismatch:"))return true;return!attributed.has(warning.slice(warning.indexOf(":")+1))}),...attributedItems.map(id=>`history_drift_merge_receipt:${id}`)].sort((left,right)=>left.localeCompare(right));historyDriftCheck.check.details={...historyDriftCheck.check.details,merge_receipt_attributed_items:attributedItems}}function projectHealthResult(result,options,summaryMode){const warningCount=result.warning_count??result.warnings.length;const boundedResult={...result,warning_count:warningCount,warning_limit:HEALTH_WARNING_LIMIT,warnings_truncated:warningCount>HEALTH_WARNING_LIMIT,warnings:result.warnings.slice(0,HEALTH_WARNING_LIMIT),findings:(result.findings??[]).filter(finding=>result.warnings.slice(0,HEALTH_WARNING_LIMIT).includes(finding.warning)||result.failed_because.includes(finding.warning))};const projected=summaryMode?applySummaryHealthProjection(boundedResult):options.brief===true?applyBriefHealthProjection(boundedResult):boundedResult;return{...projected,warning_count:warningCount,warning_limit:HEALTH_WARNING_LIMIT,warnings_truncated:warningCount>projected.warnings.length,...projected.projection?{projection:{...projected.projection,warning_count:warningCount,warnings_truncated:warningCount>projected.warnings.length}}:{}}}async function runHealth(global2,options={}){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settingsPath=getSettingsPath(pmRoot);const{settings,warnings:settingsReadWarnings}=await readSettingsWithMetadata(pmRoot);const normalizedSettingsReadWarnings=[...new Set(settingsReadWarnings)];const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const strictDirectories=options.strictDirectories===true;const strictExit=options.strictExit===true||options.failOnWarn===true;const requireMergeDrivers=options.requireMergeDrivers===true||strictExit;const refreshPolicy=resolveVectorRefreshPolicy(options);const directoryState=await scanHealthDirectories(pmRoot,typeRegistry,strictDirectories);const settingsValueWarnings=validateSettingsValues(settings);const telemetryCheck=await buildTelemetryCheck(settings,{checkTelemetry:options.checkTelemetry===true});const extensionCheck=await buildExtensionCheck(pmRoot,settings,Boolean(global2.noExtensions));const skipPolicy=resolveHealthSkipPolicy(options);const itemReadWarnings=[];const items=await readHealthItems({pmRoot,settings,typeRegistry,skipPolicy,itemReadWarnings});const itemsWithBody=items;const statusRoleDiagnostics=inspectStatusRoleAssignments(resolveRuntimeStatusRegistry(settings.schema),items);const settingWarnings=[...settingsValueWarnings,...buildStatusRoleWarnings(statusRoleDiagnostics)];const historyPolicy=skipPolicy.skipDrift?{warnings:[]}:await enforceHistoryStreamPolicyForItems({pmRoot,settings,itemIds:items.map(item=>item.id),commandLabel:"health"});const historySummary=await countHistoryStreams(pmRoot,settings.history.compact_policy,await listStoredItemDocumentIds(pmRoot));const authorAttribution=await scanHistoryAuthorAttribution(pmRoot,20,options.verboseAuthorEvents===true);const actionableUnknownAuthorEventCount=resolveActionableUnknownAuthorEventCount(authorAttribution);const authorAttributionWarnings=actionableUnknownAuthorEventCount>0?[`history_unknown_author_events:${actionableUnknownAuthorEventCount}`]:[];const staleInProgress=buildStaleInProgressHealthSummary(await scanStaleInProgressItems(pmRoot,items,{in_progress_status:settings.schema.workflow.in_progress_status,threshold_hours:settings.mutation_guard.stale_in_progress_hours}));const provenanceResolverHealth=await scanProvenanceResolverHealth(pmRoot);const provenanceResolverOutcomes=provenanceResolverHealth.outcomes;const provenanceInvalidValues=provenanceResolverHealth.invalid_values;const provenanceWarnings=provenanceResolverHealth.warnings;const locksCheck=await buildLocksCheck(pmRoot);const integrityCheck=skipPolicy.skipIntegrity&&!requireMergeDrivers?{...buildSkippedHealthCheck("integrity"),gitWorkspaceRoot:null,pendingMergeReceipts:[]}:await buildIntegrityCheck(pmRoot,typeRegistry.type_to_folder,settings.schema,requireMergeDrivers,items);const historyDriftCheck=skipPolicy.skipDrift?buildSkippedHealthCheck("history_drift"):await buildHistoryDriftCheck({pmRoot,items:itemsWithBody,settings,typeRegistry,itemReadWarnings});const normalizedItemReadWarnings=[...new Set(itemReadWarnings)];const mergeReceiptAttributedHistoryDriftItems=await correlateMergeReceiptHistoryDriftItems({gitWorkspaceRoot:integrityCheck.gitWorkspaceRoot,pendingMergeReceipts:integrityCheck.pendingMergeReceipts,historyDriftCheck,global:global2});applyMergeReceiptHistoryDriftAttribution(historyDriftCheck,mergeReceiptAttributedHistoryDriftItems);const vectorizationCheck=skipPolicy.skipVectors?buildSkippedHealthCheck("vectorization"):await buildVectorizationCheck(pmRoot,settings,itemsWithBody,refreshPolicy,options.verboseStaleItems===true);const checks=[buildSettingsHealthCheck(settingsPath,settings,normalizedSettingsReadWarnings),buildDirectoriesHealthCheck(directoryState,strictDirectories),buildSettingsValuesHealthCheck(settingWarnings,statusRoleDiagnostics),telemetryCheck.check,extensionCheck.check,buildStorageHealthCheck(items,settings,historySummary,authorAttribution,staleInProgress.scan,provenanceResolverOutcomes,provenanceInvalidValues),locksCheck.check,integrityCheck.check,historyDriftCheck.check,vectorizationCheck.check];const normalizedWarnings=collectHealthWarnings({directoryState,normalizedSettingsReadWarnings,settingWarnings,normalizedItemReadWarnings,telemetryCheck,extensionCheck,historyPolicyWarnings:historyPolicy.warnings,historySummary,authorAttributionWarnings,staleInProgressWarnings:staleInProgress.warnings,provenanceWarnings,locksCheck,integrityCheck,historyDriftCheck,vectorizationCheck});const remediationSources=buildHealthRemediationSources({directoryState,normalizedSettingsReadWarnings,settingWarnings,normalizedItemReadWarnings,telemetryCheck,extensionCheck,historyPolicyWarnings:historyPolicy.warnings,historySummary,authorAttributionWarnings,staleInProgressWarnings:staleInProgress.warnings,provenanceWarnings,locksCheck,integrityCheck,historyDriftCheck,vectorizationCheck});attachHealthRemediationMaps({checks,remediationSources,historyDriftedCount:extractHistoryDriftedCount(historyDriftCheck),overThresholdCount:historySummary.over_threshold.length});const blockingWarnings=normalizedWarnings.filter(warning=>!isAdvisoryHealthWarning(warning,requireMergeDrivers));const findings=buildHealthFindings({warnings:normalizedWarnings,checks,remediationSources,requireMergeDrivers});const failingChecks=new Set(findings.filter(finding=>finding.severity==="gate_failing").map(finding=>finding.check));const warningChecks=new Set(findings.map(finding=>finding.check));for(const check of checks){check.ok=!failingChecks.has(check.name);if(warningChecks.has(check.name))check.status="warn"}const result={ok:blockingWarnings.length===0,verdict:{authority:"ok",...strictExit?{strict_exit:true}:{},...requireMergeDrivers?{require_merge_drivers:true}:{},exit_code:strictExit&&blockingWarnings.length>0?EXIT_CODE.GENERIC_FAILURE:0},checks,warnings:normalizedWarnings,findings,failed_because:blockingWarnings,generated_at:nowIso()};return projectHealthResult(result,options,skipPolicy.summaryMode)}const _testOnlyHealthCommand={buildHierarchyIntegrityWarnings,buildExtensionHealthTriageSummary,buildHealthFindings,buildCapabilityContractMetadata,buildStaleInProgressHealthSummary,buildVectorizationProviderDetails,collectUnknownCapabilityGuidance,isAdvisoryHealthWarning,isDirectory,isExpectedUnmanagedExtension,listItemDocumentPaths,normalizeEndpointForDisplay,normalizeExtensionNameForMatch,parseTelemetryQueue,probeTelemetryEndpointHealth,projectHealthResult,resolveActionableUnknownAuthorEventCount,resolveHealthSkipPolicy,resolveUnknownAuthorEventCount,resolveVectorRefreshPolicy,selectStaleItemDetail,summarizeHealthCheckDetails,summarizeExtensionList,summarizeRecordList,summarizeStringList,telemetryEnvFlagEnabled,warningCode};export{_testOnlyHealthCommand,runHealth};
2
2
  //# sourceMappingURL=health.js.map