@unbrained/pm-cli 2026.10.3 → 2026.10.5

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 (742) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +28 -2
  3. package/dist/cli/after-command-context-usage.js +1 -1
  4. package/dist/cli/argv-utils.js +1 -1
  5. package/dist/cli/bootstrap-args.js +1 -1
  6. package/dist/cli/bundle-integrity.js +2 -2
  7. package/dist/cli/command-namespaces.js +1 -1
  8. package/dist/cli/commander-usage.d.ts +1 -1
  9. package/dist/cli/commander-usage.js +7 -4
  10. package/dist/cli/commands/annotations/comments.js +1 -1
  11. package/dist/cli/commands/annotations/docs.js +1 -1
  12. package/dist/cli/commands/annotations/files.js +1 -1
  13. package/dist/cli/commands/annotations/learnings.js +1 -1
  14. package/dist/cli/commands/annotations/notes.js +1 -1
  15. package/dist/cli/commands/extension/describe.js +1 -1
  16. package/dist/cli/commands/extension/extension.js +1 -1
  17. package/dist/cli/commands/extension/scaffold.js +1 -1
  18. package/dist/cli/commands/extension/shared.js +1 -1
  19. package/dist/cli/commands/governance/gc.js +1 -1
  20. package/dist/cli/commands/governance/health.js +1 -1
  21. package/dist/cli/commands/governance/telemetry.js +1 -1
  22. package/dist/cli/commands/governance/validate.js +1 -1
  23. package/dist/cli/commands/history/activity.js +1 -1
  24. package/dist/cli/commands/history/history-compact.js +1 -1
  25. package/dist/cli/commands/history/history-redact.js +1 -1
  26. package/dist/cli/commands/history/history-repair.js +1 -1
  27. package/dist/cli/commands/history/history.js +1 -1
  28. package/dist/cli/commands/history/restore.js +1 -1
  29. package/dist/cli/commands/lifecycle/append.js +1 -1
  30. package/dist/cli/commands/lifecycle/claim.js +1 -1
  31. package/dist/cli/commands/lifecycle/close-many.js +1 -1
  32. package/dist/cli/commands/lifecycle/close.js +1 -1
  33. package/dist/cli/commands/lifecycle/copy.js +1 -1
  34. package/dist/cli/commands/lifecycle/create.js +1 -1
  35. package/dist/cli/commands/lifecycle/delete.js +1 -1
  36. package/dist/cli/commands/lifecycle/focus.js +1 -1
  37. package/dist/cli/commands/lifecycle/plan.js +1 -1
  38. package/dist/cli/commands/lifecycle/update-many.js +1 -1
  39. package/dist/cli/commands/lifecycle/update.js +1 -1
  40. package/dist/cli/commands/query/aggregate.js +1 -1
  41. package/dist/cli/commands/query/context.js +1 -1
  42. package/dist/cli/commands/query/deps.js +1 -1
  43. package/dist/cli/commands/query/duplicates.js +1 -1
  44. package/dist/cli/commands/query/eval.js +1 -1
  45. package/dist/cli/commands/query/get.js +1 -1
  46. package/dist/cli/commands/query/graph.js +1 -1
  47. package/dist/cli/commands/query/list.js +1 -1
  48. package/dist/cli/commands/query/next.js +1 -1
  49. package/dist/cli/commands/query/search.js +1 -1
  50. package/dist/cli/commands/query/stats.js +1 -1
  51. package/dist/cli/commands/test/test-all.js +1 -1
  52. package/dist/cli/commands/test/test-runs.js +1 -1
  53. package/dist/cli/commands/test/test.js +1 -1
  54. package/dist/cli/commands/workspace/config.js +1 -1
  55. package/dist/cli/commands/workspace/contracts.js +1 -1
  56. package/dist/cli/commands/workspace/init.js +1 -1
  57. package/dist/cli/commands/workspace/merge.js +1 -1
  58. package/dist/cli/commands/workspace/profile.js +1 -1
  59. package/dist/cli/commands/workspace/schema.js +1 -1
  60. package/dist/cli/commands/workspace/upgrade.js +1 -1
  61. package/dist/cli/context-intent-invocation.js +1 -1
  62. package/dist/cli/description-stdin.js +1 -1
  63. package/dist/cli/error-guidance.js +3 -1
  64. package/dist/cli/extension-command-help.js +5 -3
  65. package/dist/cli/extension-command-options.js +1 -1
  66. package/dist/cli/extension-recovery.js +1 -1
  67. package/dist/cli/help-content.js +5 -2
  68. package/dist/cli/help-json-payload.js +6 -3
  69. package/dist/cli/invocation-profile.js +2 -2
  70. package/dist/cli/main.js +5 -5
  71. package/dist/cli/migration-gates.js +1 -1
  72. package/dist/cli/option-values.js +1 -1
  73. package/dist/cli/public.js +1 -1
  74. package/dist/cli/register-annotations.js +1 -1
  75. package/dist/cli/register-assurance.js +1 -1
  76. package/dist/cli/register-files-lookup.js +1 -1
  77. package/dist/cli/register-history-activity.js +1 -1
  78. package/dist/cli/register-history-author.js +1 -1
  79. package/dist/cli/register-history-maintenance.js +2 -2
  80. package/dist/cli/register-list-query.js +10 -10
  81. package/dist/cli/register-mutation-options.js +1 -1
  82. package/dist/cli/register-mutation.js +2 -2
  83. package/dist/cli/register-operations.js +1 -1
  84. package/dist/cli/register-setup.js +1 -1
  85. package/dist/cli/register-structured-mutation.js +1 -1
  86. package/dist/cli/registration-helpers.js +1 -1
  87. package/dist/cli/runtime/activation.js +1 -1
  88. package/dist/cli/runtime/invocation-options.js +1 -1
  89. package/dist/cli/runtime/projection-retry.js +1 -1
  90. package/dist/cli/runtime/selection.js +1 -1
  91. package/dist/cli/runtime/telemetry-outcome.js +1 -1
  92. package/dist/cli/runtime-compatibility-boundary.d.ts +1 -1
  93. package/dist/cli/runtime-compatibility-boundary.js +4 -4
  94. package/dist/cli/schema/registration.js +2 -2
  95. package/dist/cli/schema-registration-helpers.js +1 -1
  96. package/dist/cli/search-refresh.js +1 -1
  97. package/dist/cli/stats-analytics-json.js +1 -1
  98. package/dist/cli/telemetry-flush.js +1 -1
  99. package/dist/cli-bundle/bundle-manifest.json +162 -162
  100. package/dist/cli-bundle/chunks/chunk-3CYOBJUK.js +3 -0
  101. package/dist/cli-bundle/chunks/chunk-5MNOWZPN.js +3 -0
  102. package/dist/cli-bundle/chunks/chunk-AJ7H6XUF.js +20 -0
  103. package/dist/cli-bundle/chunks/chunk-D332RXZ7.js +80 -0
  104. package/dist/cli-bundle/chunks/chunk-HRJ6G6ZG.js +31 -0
  105. package/dist/cli-bundle/chunks/chunk-KRVI56QE.js +6 -0
  106. package/dist/cli-bundle/chunks/chunk-N4YGSG6F.js +238 -0
  107. package/dist/cli-bundle/chunks/chunk-OOLYASYJ.js +2 -0
  108. package/dist/cli-bundle/chunks/chunk-R7CG2DB7.js +2 -0
  109. package/dist/cli-bundle/chunks/chunk-TGMONGWX.js +2 -0
  110. package/dist/cli-bundle/chunks/chunk-UZ7BIUCI.js +2 -0
  111. package/dist/cli-bundle/chunks/{chunk-44UGMMQ6.js → chunk-VZ63DEVJ.js} +3 -3
  112. package/dist/cli-bundle/chunks/chunk-WFZ4UEOB.js +2 -0
  113. package/dist/cli-bundle/chunks/chunk-YVBRASXO.js +8 -0
  114. package/dist/cli-bundle/chunks/{chunk-5XKF5SQV.js → chunk-Z66DWDAU.js} +91 -91
  115. package/dist/cli-bundle/chunks/{register-list-query-DYCGUQEW.js → register-list-query-75QXHIFH.js} +11 -11
  116. package/dist/cli-bundle/chunks/register-mutation-YS54SCHG.js +20 -0
  117. package/dist/cli-bundle/chunks/register-operations-6KHZQSYJ.js +2 -0
  118. package/dist/cli-bundle/chunks/register-setup-RTATEN2M.js +2 -0
  119. package/dist/cli-bundle/focused-chunks/{chunk-3BIYG72P.js → chunk-2CVX3KR3.js} +2 -2
  120. package/dist/cli-bundle/focused-chunks/chunk-5C3IDDW7.js +2 -0
  121. package/dist/cli-bundle/focused-chunks/{chunk-DBD4W4QP.js → chunk-ABV67XCC.js} +3 -3
  122. package/dist/cli-bundle/focused-chunks/chunk-B5RSLVE6.js +3 -0
  123. package/dist/cli-bundle/focused-chunks/chunk-C224METM.js +20 -0
  124. package/dist/cli-bundle/focused-chunks/chunk-CLDPTMQY.js +6 -0
  125. package/dist/cli-bundle/focused-chunks/chunk-DDRN42PB.js +8 -0
  126. package/dist/cli-bundle/focused-chunks/{chunk-EJN7DY3B.js → chunk-DOVTUKJQ.js} +2 -2
  127. package/dist/cli-bundle/focused-chunks/chunk-ECBOPEJE.js +75 -0
  128. package/dist/cli-bundle/focused-chunks/chunk-GITOYRUW.js +165 -0
  129. package/dist/cli-bundle/focused-chunks/chunk-GUIF3WVC.js +30 -0
  130. package/dist/cli-bundle/focused-chunks/chunk-LE4JUCRR.js +3 -0
  131. package/dist/cli-bundle/focused-chunks/{chunk-HFAW3FJQ.js → chunk-PSXFFQFT.js} +2 -2
  132. package/dist/cli-bundle/focused-chunks/chunk-RHIH6XIW.js +12 -0
  133. package/dist/cli-bundle/focused-chunks/chunk-UDYRVBOZ.js +2 -0
  134. package/dist/cli-bundle/focused-chunks/chunk-XV5RV4ZT.js +2 -0
  135. package/dist/cli-bundle/focused-chunks/{chunk-XRSCIYHR.js → chunk-YMU42COG.js} +2 -2
  136. package/dist/cli-bundle/main.js +28 -28
  137. package/dist/cli-bundle/sdk-authoring.js +1 -1
  138. package/dist/cli-bundle/sdk-contracts.js +2 -2
  139. package/dist/cli-bundle/sdk-core.js +32 -32
  140. package/dist/cli-bundle/sdk-governance.js +1 -1
  141. package/dist/cli-bundle/sdk-graph.js +1 -1
  142. package/dist/cli-bundle/sdk-merge.js +55 -55
  143. package/dist/cli-bundle/sdk-query.js +1 -1
  144. package/dist/cli-bundle/sdk-runtime.js +1 -1
  145. package/dist/cli-bundle/sdk-testing.js +1 -1
  146. package/dist/cli-bundle/sdk.js +10 -10
  147. package/dist/cli.js +1 -1
  148. package/dist/core/checkpoint/checkpoint-gc.js +1 -1
  149. package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
  150. package/dist/core/config/nested-settings.js +1 -1
  151. package/dist/core/config/positional-value.js +1 -1
  152. package/dist/core/diagnostics/remediation.js +1 -1
  153. package/dist/core/extensions/activation-summary-markdown.js +2 -1
  154. package/dist/core/extensions/activation-summary.js +1 -1
  155. package/dist/core/extensions/activation-transaction.js +1 -1
  156. package/dist/core/extensions/capability-usage.js +1 -1
  157. package/dist/core/extensions/command-hook-context.js +1 -1
  158. package/dist/core/extensions/command-metadata-contract.js +1 -1
  159. package/dist/core/extensions/command-visibility-tier.js +1 -1
  160. package/dist/core/extensions/contribution-inventory.js +1 -1
  161. package/dist/core/extensions/exporter-output-contract.js +1 -1
  162. package/dist/core/extensions/extension-candidate.js +1 -1
  163. package/dist/core/extensions/extension-capability-aliases.js +1 -1
  164. package/dist/core/extensions/extension-hook-runtime.js +1 -1
  165. package/dist/core/extensions/extension-policy.js +1 -1
  166. package/dist/core/extensions/extension-registries.js +1 -1
  167. package/dist/core/extensions/extension-runtime-helpers.js +1 -1
  168. package/dist/core/extensions/extension-types.d.ts +8 -1
  169. package/dist/core/extensions/extension-types.js +1 -1
  170. package/dist/core/extensions/flag-definition-validation.js +1 -1
  171. package/dist/core/extensions/flag-value-types.js +1 -1
  172. package/dist/core/extensions/index.js +1 -1
  173. package/dist/core/extensions/item-field-types.js +1 -1
  174. package/dist/core/extensions/item-fields.js +1 -1
  175. package/dist/core/extensions/loader.js +1 -1
  176. package/dist/core/extensions/manifest-parser.js +1 -1
  177. package/dist/core/extensions/manifest-schema.js +1 -1
  178. package/dist/core/extensions/module-graph-snapshot.js +1 -1
  179. package/dist/core/extensions/preflight-ownership.js +1 -1
  180. package/dist/core/extensions/registration-contracts.js +1 -1
  181. package/dist/core/extensions/registration-validation.js +1 -1
  182. package/dist/core/extensions/registration-values.js +1 -1
  183. package/dist/core/extensions/reserved-host-flags.js +1 -1
  184. package/dist/core/extensions/runtime-registrations.js +1 -1
  185. package/dist/core/extensions/service-ownership.js +1 -1
  186. package/dist/core/extensions/version-compat.js +1 -1
  187. package/dist/core/fs/atomic-create.js +1 -1
  188. package/dist/core/fs/fs-utils.js +2 -2
  189. package/dist/core/fs/host-environment-errors.js +1 -1
  190. package/dist/core/fs/index.js +1 -1
  191. package/dist/core/fs/path-utils.js +1 -1
  192. package/dist/core/governance/content-fields.js +1 -1
  193. package/dist/core/governance/issue-codes.js +1 -1
  194. package/dist/core/governance/metadata-coverage.js +1 -1
  195. package/dist/core/history/digest.js +1 -1
  196. package/dist/core/history/drift-cache.js +3 -3
  197. package/dist/core/history/drift-scan.d.ts +4 -0
  198. package/dist/core/history/drift-scan.js +1 -1
  199. package/dist/core/history/event-classification.js +1 -1
  200. package/dist/core/history/event-index.js +8 -7
  201. package/dist/core/history/history-compact-bulk.js +1 -1
  202. package/dist/core/history/history-diff.js +1 -1
  203. package/dist/core/history/history-rewrite.js +1 -1
  204. package/dist/core/history/history-storage-stats.js +1 -1
  205. package/dist/core/history/history-stream-policy.js +1 -1
  206. package/dist/core/history/history.js +2 -2
  207. package/dist/core/history/identity.js +1 -1
  208. package/dist/core/history/index.js +1 -1
  209. package/dist/core/history/operation-contract.js +1 -1
  210. package/dist/core/history/projection.js +1 -1
  211. package/dist/core/history/read.js +1 -1
  212. package/dist/core/history/replay.js +2 -1
  213. package/dist/core/history/tombstone.js +1 -1
  214. package/dist/core/history/version-address.js +1 -1
  215. package/dist/core/history/workspace-history.js +2 -2
  216. package/dist/core/io/body-file.js +1 -1
  217. package/dist/core/io/bulk-ids-input.js +2 -1
  218. package/dist/core/item/actionability.js +1 -1
  219. package/dist/core/item/dependency-reference.js +1 -1
  220. package/dist/core/item/id.js +1 -1
  221. package/dist/core/item/index.js +1 -1
  222. package/dist/core/item/item-format-version.js +1 -1
  223. package/dist/core/item/item-format.js +6 -4
  224. package/dist/core/item/item-record.js +1 -1
  225. package/dist/core/item/item-type-definition.js +1 -1
  226. package/dist/core/item/parent-reference-policy.js +1 -1
  227. package/dist/core/item/parse.js +8 -2
  228. package/dist/core/item/plan-lifecycle.js +1 -1
  229. package/dist/core/item/priority.js +1 -1
  230. package/dist/core/item/sprint-release-format.js +1 -1
  231. package/dist/core/item/status-filter.js +1 -1
  232. package/dist/core/item/status.js +1 -1
  233. package/dist/core/item/toon-decode.js +1 -1
  234. package/dist/core/item/type-registry.js +1 -1
  235. package/dist/core/item/type-synonyms.js +1 -1
  236. package/dist/core/lock/index.js +1 -1
  237. package/dist/core/lock/lock-gc.js +1 -1
  238. package/dist/core/lock/lock.js +3 -3
  239. package/dist/core/output/mutation-projection.js +1 -1
  240. package/dist/core/output/output-control.js +1 -1
  241. package/dist/core/output/output.js +22 -10
  242. package/dist/core/output/query-summary.js +1 -1
  243. package/dist/core/output/tabular.js +3 -1
  244. package/dist/core/packages/manifest.js +1 -1
  245. package/dist/core/packages/root.js +1 -1
  246. package/dist/core/policy/workflow-policy-schema.js +1 -1
  247. package/dist/core/policy/workflow-policy-store.js +1 -1
  248. package/dist/core/policy/workflow-policy.js +1 -1
  249. package/dist/core/profile/profile-describe.js +1 -1
  250. package/dist/core/profile/profile-lint.js +1 -1
  251. package/dist/core/profile/profile-plan.js +1 -1
  252. package/dist/core/profile/profile-presets.js +25 -1
  253. package/dist/core/reproducibility/context.js +1 -1
  254. package/dist/core/schema/fields-file.js +2 -2
  255. package/dist/core/schema/item-types-file.js +2 -2
  256. package/dist/core/schema/runtime-field-filters.js +1 -1
  257. package/dist/core/schema/runtime-field-values.js +1 -1
  258. package/dist/core/schema/runtime-schema.js +2 -2
  259. package/dist/core/schema/status-defs-file.js +2 -2
  260. package/dist/core/schema/status-token.js +1 -1
  261. package/dist/core/schema/type-inference.js +1 -1
  262. package/dist/core/schema/type-presets.js +1 -1
  263. package/dist/core/schema/type-workflows.js +1 -1
  264. package/dist/core/search/background-refresh.js +2 -2
  265. package/dist/core/search/bm25.js +1 -1
  266. package/dist/core/search/cache.js +2 -2
  267. package/dist/core/search/corpus.js +1 -1
  268. package/dist/core/search/embedding-batches.js +1 -1
  269. package/dist/core/search/eval-thresholds.js +1 -1
  270. package/dist/core/search/eval.js +1 -1
  271. package/dist/core/search/http-client.js +1 -1
  272. package/dist/core/search/providers.js +1 -1
  273. package/dist/core/search/relevance.js +1 -1
  274. package/dist/core/search/semantic-defaults.js +1 -1
  275. package/dist/core/search/staleness.js +1 -1
  276. package/dist/core/search/vector-stores.js +2 -2
  277. package/dist/core/search/vectorization-metadata.js +1 -1
  278. package/dist/core/sentry/helpers.js +1 -1
  279. package/dist/core/sentry/instrument.js +1 -1
  280. package/dist/core/session/session-state.js +1 -1
  281. package/dist/core/shared/agent-session-context.js +1 -1
  282. package/dist/core/shared/author.js +5 -1
  283. package/dist/core/shared/command-line.js +1 -1
  284. package/dist/core/shared/command-types.js +1 -1
  285. package/dist/core/shared/conflict-markers.js +1 -1
  286. package/dist/core/shared/constants.js +1 -1
  287. package/dist/core/shared/errors.js +1 -1
  288. package/dist/core/shared/html-entity-decode.js +1 -1
  289. package/dist/core/shared/index.js +1 -1
  290. package/dist/core/shared/item-metadata-contract.js +1 -1
  291. package/dist/core/shared/lazy-module.js +1 -1
  292. package/dist/core/shared/levenshtein.js +1 -1
  293. package/dist/core/shared/memo.js +1 -1
  294. package/dist/core/shared/numeric-parsers.js +1 -1
  295. package/dist/core/shared/option-alias-visibility.js +1 -1
  296. package/dist/core/shared/primitives.js +1 -1
  297. package/dist/core/shared/secret-rules.js +1 -1
  298. package/dist/core/shared/serial-queue.js +1 -1
  299. package/dist/core/shared/serialization.js +1 -1
  300. package/dist/core/shared/split-comma-list.js +1 -1
  301. package/dist/core/shared/text-normalization.js +1 -1
  302. package/dist/core/shared/time.js +2 -1
  303. package/dist/core/store/index.js +1 -1
  304. package/dist/core/store/item-format-migration.js +1 -1
  305. package/dist/core/store/item-metadata-cache.js +1 -1
  306. package/dist/core/store/item-metadata-query-index.js +7 -7
  307. package/dist/core/store/item-metadata-read-work.js +1 -1
  308. package/dist/core/store/item-store.js +1 -1
  309. package/dist/core/store/paths.js +1 -1
  310. package/dist/core/store/settings-concurrency.js +1 -1
  311. package/dist/core/store/settings-read-cache.js +1 -1
  312. package/dist/core/store/settings-validator.js +1 -1
  313. package/dist/core/store/settings.d.ts +11 -2
  314. package/dist/core/store/settings.js +3 -3
  315. package/dist/core/store/tracker-preflight.js +1 -1
  316. package/dist/core/telemetry/consent.js +2 -2
  317. package/dist/core/telemetry/observability.js +1 -1
  318. package/dist/core/telemetry/policy.js +1 -1
  319. package/dist/core/telemetry/read-sampling.js +2 -2
  320. package/dist/core/telemetry/runtime.js +9 -5
  321. package/dist/core/test/background-runs.js +3 -3
  322. package/dist/core/test/item-test-run-tracking.js +1 -1
  323. package/dist/core/test/run-selectors.js +1 -1
  324. package/dist/core/validate/estimate-defaults.js +1 -1
  325. package/dist/core/validate/fix-planning.js +1 -1
  326. package/dist/core/validate/linked-artifact-reference.js +1 -1
  327. package/dist/core/validate/missing-by-type.js +1 -1
  328. package/dist/core/validate/missing-link-owners.js +1 -1
  329. package/dist/core/validate/stale-file-classification.js +1 -1
  330. package/dist/mcp/http-server.js +6 -4
  331. package/dist/mcp/legacy-adapter.js +1 -1
  332. package/dist/mcp/runtime-capabilities.js +1 -1
  333. package/dist/mcp/server.js +4 -4
  334. package/dist/mcp/tool-definitions.js +1 -1
  335. package/dist/sdk/actionability.js +1 -1
  336. package/dist/sdk/agent/closed-domain-contracts.js +1 -1
  337. package/dist/sdk/agent/command-recovery.js +1 -1
  338. package/dist/sdk/agent/command-suggestions.js +1 -1
  339. package/dist/sdk/agent/create-option-policy.js +1 -1
  340. package/dist/sdk/agent/identity-config.js +1 -1
  341. package/dist/sdk/agent/item-addressing.js +1 -1
  342. package/dist/sdk/agent/refusal-closure-census.js +2 -1
  343. package/dist/sdk/agent/refusal-closure.js +1 -1
  344. package/dist/sdk/agent/refusal-corpus-contracts.js +1 -1
  345. package/dist/sdk/agent/refusal-reachability.js +3 -1
  346. package/dist/sdk/agent/subcommand-recovery.js +1 -1
  347. package/dist/sdk/agent/task-transcript-contracts.js +1 -1
  348. package/dist/sdk/agent/tracker-preflight-contracts.js +1 -1
  349. package/dist/sdk/agent-capability-contracts.js +3 -1
  350. package/dist/sdk/agent-session-context.js +1 -1
  351. package/dist/sdk/annotations.js +1 -1
  352. package/dist/sdk/author-attribution.js +1 -1
  353. package/dist/sdk/authoring.js +1 -1
  354. package/dist/sdk/cli-bootstrap.js +1 -1
  355. package/dist/sdk/cli-contracts/agent-output-contracts.js +5 -3
  356. package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -1
  357. package/dist/sdk/cli-contracts/command-aliases.js +1 -1
  358. package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -1
  359. package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1
  360. package/dist/sdk/cli-contracts/commander-types.js +1 -1
  361. package/dist/sdk/cli-contracts/completeness.js +1 -1
  362. package/dist/sdk/cli-contracts/enum-contracts.js +1 -1
  363. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
  364. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +2 -1
  365. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
  366. package/dist/sdk/cli-contracts/registration-helpers.js +7 -7
  367. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
  368. package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -1
  369. package/dist/sdk/cli-contracts/string-lists.js +1 -1
  370. package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
  371. package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
  372. package/dist/sdk/cli-contracts/tool-schema.js +1 -1
  373. package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -1
  374. package/dist/sdk/cli-contracts.js +1 -1
  375. package/dist/sdk/cli-program.js +1 -1
  376. package/dist/sdk/command-line.js +1 -1
  377. package/dist/sdk/comments.js +1 -1
  378. package/dist/sdk/compile-cache.js +1 -1
  379. package/dist/sdk/completion/bash.js +2 -1
  380. package/dist/sdk/completion/fish.js +13 -7
  381. package/dist/sdk/completion/shared.js +1 -1
  382. package/dist/sdk/completion/zsh.js +14 -8
  383. package/dist/sdk/completion.js +1 -1
  384. package/dist/sdk/compose.js +1 -1
  385. package/dist/sdk/config.js +1 -1
  386. package/dist/sdk/context/recency.js +1 -1
  387. package/dist/sdk/context/semantic-session-attribution.js +1 -1
  388. package/dist/sdk/context/usage-egress.js +1 -1
  389. package/dist/sdk/context/usage-ledger.js +6 -3
  390. package/dist/sdk/context-intent-contracts.js +1 -1
  391. package/dist/sdk/context-intent-runtime.js +1 -1
  392. package/dist/sdk/context-packing.js +1 -1
  393. package/dist/sdk/context-relevance.js +1 -1
  394. package/dist/sdk/context-signal-store.js +2 -2
  395. package/dist/sdk/context-usage.js +1 -1
  396. package/dist/sdk/contracts.js +1 -1
  397. package/dist/sdk/core-governance.js +1 -1
  398. package/dist/sdk/core.js +1 -1
  399. package/dist/sdk/corpus-shape.js +1 -1
  400. package/dist/sdk/define.js +1 -1
  401. package/dist/sdk/dependencies.js +1 -1
  402. package/dist/sdk/dependency-flag-validation.js +1 -1
  403. package/dist/sdk/dependency-provenance.js +1 -1
  404. package/dist/sdk/docs.js +1 -1
  405. package/dist/sdk/duplicates.js +1 -1
  406. package/dist/sdk/environment/agent-environment.js +1 -1
  407. package/dist/sdk/environment/host-environment-errors.js +1 -1
  408. package/dist/sdk/environment/project-runtime-compatibility.js +2 -1
  409. package/dist/sdk/environment/source-context.js +1 -1
  410. package/dist/sdk/environment/tracker-preflight.js +1 -1
  411. package/dist/sdk/error-code-catalog.js +1 -1
  412. package/dist/sdk/error-runtime.js +1 -1
  413. package/dist/sdk/errors.js +1 -1
  414. package/dist/sdk/eval.js +1 -1
  415. package/dist/sdk/extension/author-manifest.js +1 -1
  416. package/dist/sdk/extension/bundled-catalog.js +1 -1
  417. package/dist/sdk/extension/concurrency.js +1 -1
  418. package/dist/sdk/extension/copy-scope.js +1 -1
  419. package/dist/sdk/extension/custom-field-collisions.js +1 -1
  420. package/dist/sdk/extension/describe.js +4 -2
  421. package/dist/sdk/extension/doctor.js +1 -1
  422. package/dist/sdk/extension/install-plan.js +1 -1
  423. package/dist/sdk/extension/install-receipts.js +1 -1
  424. package/dist/sdk/extension/install-runtime.js +3 -3
  425. package/dist/sdk/extension/install-snapshot.js +1 -1
  426. package/dist/sdk/extension/install-sources.js +5 -5
  427. package/dist/sdk/extension/managed-state.js +2 -2
  428. package/dist/sdk/extension/migrations.js +2 -2
  429. package/dist/sdk/extension/output-ownership.js +1 -1
  430. package/dist/sdk/extension/runtime-summary.js +1 -1
  431. package/dist/sdk/extension/scaffold.js +11 -4
  432. package/dist/sdk/extension/shared.js +1 -1
  433. package/dist/sdk/extension/source-resolution.js +1 -1
  434. package/dist/sdk/extension/static-inventory.js +1 -1
  435. package/dist/sdk/extension/update-check.js +1 -1
  436. package/dist/sdk/extension-command-context.js +1 -1
  437. package/dist/sdk/extension-contracts.js +1 -1
  438. package/dist/sdk/extension.js +1 -1
  439. package/dist/sdk/files.js +1 -1
  440. package/dist/sdk/flag-invocation-contracts.js +1 -1
  441. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  442. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  443. package/dist/sdk/generated-error-code-catalog.js +1 -1
  444. package/dist/sdk/governance/assurance-action-contracts.js +1 -1
  445. package/dist/sdk/governance/assurance-action.js +1 -1
  446. package/dist/sdk/governance/assurance-limits.js +1 -1
  447. package/dist/sdk/governance/assurance-mutation-error.js +1 -1
  448. package/dist/sdk/governance/assurance-presets.js +1 -1
  449. package/dist/sdk/governance/assurance-runtime.js +1 -1
  450. package/dist/sdk/governance/assurance.js +4 -4
  451. package/dist/sdk/governance/boundary-fixtures.js +1 -1
  452. package/dist/sdk/governance/closure-timestamps.js +1 -1
  453. package/dist/sdk/governance/coverage-assurance.js +1 -1
  454. package/dist/sdk/governance/defect-recurrence-coverage.js +1 -1
  455. package/dist/sdk/governance/defect-recurrence-graph.js +1 -1
  456. package/dist/sdk/governance/defect-recurrence-signals.js +1 -1
  457. package/dist/sdk/governance/defect-recurrence.js +1 -1
  458. package/dist/sdk/governance/extension-host-version.js +1 -1
  459. package/dist/sdk/governance/gc.js +1 -1
  460. package/dist/sdk/governance/health-merge-evidence.js +1 -1
  461. package/dist/sdk/governance/health.js +2 -1
  462. package/dist/sdk/governance/hierarchy-validation.js +1 -1
  463. package/dist/sdk/governance/linked-file-report.js +1 -1
  464. package/dist/sdk/governance/merge-receipt-history.js +1 -1
  465. package/dist/sdk/governance/provenance-health.js +4 -1
  466. package/dist/sdk/governance/reindex.js +5 -4
  467. package/dist/sdk/governance/stale-work.js +1 -1
  468. package/dist/sdk/governance/status-role-diagnostics.js +1 -1
  469. package/dist/sdk/governance/storage-integrity.js +1 -1
  470. package/dist/sdk/governance/tracked-runtime-cache.js +1 -1
  471. package/dist/sdk/governance/upgrade.js +2 -2
  472. package/dist/sdk/governance/validate-history-drift.js +1 -1
  473. package/dist/sdk/governance/validate-item-reader.js +1 -1
  474. package/dist/sdk/governance/validate-normalization.js +1 -1
  475. package/dist/sdk/governance/validate.js +1 -1
  476. package/dist/sdk/governance/workflow-completeness.js +1 -1
  477. package/dist/sdk/governance/workflow-policy.js +3 -3
  478. package/dist/sdk/governance/workspace-position.js +2 -1
  479. package/dist/sdk/governance.js +1 -1
  480. package/dist/sdk/graph/adapter.js +1 -1
  481. package/dist/sdk/graph/analytics.js +1 -1
  482. package/dist/sdk/graph/assembly.js +1 -1
  483. package/dist/sdk/graph/cache.js +1 -1
  484. package/dist/sdk/graph/centrality.js +1 -1
  485. package/dist/sdk/graph/conformance.js +1 -1
  486. package/dist/sdk/graph/deadline-scheduling.js +1 -1
  487. package/dist/sdk/graph/durable-cache.js +1 -1
  488. package/dist/sdk/graph/governance-contracts.js +1 -1
  489. package/dist/sdk/graph/governance.js +1 -1
  490. package/dist/sdk/graph/hierarchy-integrity.js +1 -1
  491. package/dist/sdk/graph/index.js +1 -1
  492. package/dist/sdk/graph/lifecycle-coverage.js +1 -1
  493. package/dist/sdk/graph/mutation-advisory.js +1 -1
  494. package/dist/sdk/graph/query-contracts.js +1 -1
  495. package/dist/sdk/graph/remediation.js +1 -1
  496. package/dist/sdk/graph/run.js +1 -1
  497. package/dist/sdk/graph/scheduling.js +1 -1
  498. package/dist/sdk/graph/traversal.js +1 -1
  499. package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -1
  500. package/dist/sdk/graph.js +1 -1
  501. package/dist/sdk/guide-topics.js +1 -1
  502. package/dist/sdk/guide.js +8 -1
  503. package/dist/sdk/history/attestation-command.js +1 -1
  504. package/dist/sdk/history/attestation-contract.js +1 -1
  505. package/dist/sdk/history/attestation-scan.js +1 -1
  506. package/dist/sdk/history/attestation.js +1 -1
  507. package/dist/sdk/history/maintenance.js +1 -1
  508. package/dist/sdk/history/salvage.js +3 -2
  509. package/dist/sdk/history/subject.js +1 -1
  510. package/dist/sdk/history-analytics.js +1 -1
  511. package/dist/sdk/history-compact.js +1 -1
  512. package/dist/sdk/history-mcp.js +1 -1
  513. package/dist/sdk/history-provenance.js +1 -1
  514. package/dist/sdk/history-read.js +1 -1
  515. package/dist/sdk/history-redact.js +1 -1
  516. package/dist/sdk/history-repair.js +1 -1
  517. package/dist/sdk/improvement-ledger-validation.js +1 -1
  518. package/dist/sdk/improvement-ledger.js +2 -2
  519. package/dist/sdk/index.js +1 -1
  520. package/dist/sdk/init-agent-guidance.js +16 -2
  521. package/dist/sdk/init.js +16 -2
  522. package/dist/sdk/invocation-author.js +1 -1
  523. package/dist/sdk/item-children.js +1 -1
  524. package/dist/sdk/item-metadata-index.js +1 -1
  525. package/dist/sdk/item-schedule.js +1 -1
  526. package/dist/sdk/item-transaction.js +1 -1
  527. package/dist/sdk/learnings.js +1 -1
  528. package/dist/sdk/lifecycle/append.js +4 -2
  529. package/dist/sdk/lifecycle/claim.js +1 -1
  530. package/dist/sdk/lifecycle/close-many.js +1 -1
  531. package/dist/sdk/lifecycle/close.js +1 -1
  532. package/dist/sdk/lifecycle/copy.js +1 -1
  533. package/dist/sdk/lifecycle/create.js +1 -1
  534. package/dist/sdk/lifecycle/delete.js +1 -1
  535. package/dist/sdk/lifecycle/event-validation-messages.js +1 -1
  536. package/dist/sdk/lifecycle/focus.js +1 -1
  537. package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
  538. package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -1
  539. package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -1
  540. package/dist/sdk/lifecycle/mcp-actions.js +1 -1
  541. package/dist/sdk/lifecycle/metadata-normalizers.js +1 -1
  542. package/dist/sdk/lifecycle/mutation-command-options.js +1 -1
  543. package/dist/sdk/lifecycle/plan-mutation-receipt.js +1 -1
  544. package/dist/sdk/lifecycle/plan.js +1 -1
  545. package/dist/sdk/lifecycle/recurrence-parsers.js +1 -1
  546. package/dist/sdk/lifecycle/reopen.js +1 -1
  547. package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +2 -1
  548. package/dist/sdk/lifecycle/restore.js +1 -1
  549. package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
  550. package/dist/sdk/lifecycle/task-composition.js +1 -1
  551. package/dist/sdk/lifecycle/update-many.js +1 -1
  552. package/dist/sdk/lifecycle/update.js +2 -1
  553. package/dist/sdk/lifecycle-completion.js +1 -1
  554. package/dist/sdk/lifecycle-policy.js +1 -1
  555. package/dist/sdk/linked-artifacts.js +2 -1
  556. package/dist/sdk/mcp/apps.js +1 -1
  557. package/dist/sdk/mcp/authorization.js +1 -1
  558. package/dist/sdk/mcp/discovery.js +1 -1
  559. package/dist/sdk/mcp/interactions.js +1 -1
  560. package/dist/sdk/mcp/protocol.js +1 -1
  561. package/dist/sdk/mcp/skills.js +3 -1
  562. package/dist/sdk/mcp/subscriptions.js +1 -1
  563. package/dist/sdk/mcp/tasks.js +2 -2
  564. package/dist/sdk/mcp/transport.js +1 -1
  565. package/dist/sdk/merge/abandoned-receipts.js +1 -1
  566. package/dist/sdk/merge/driver.js +1 -1
  567. package/dist/sdk/merge/index.js +1 -1
  568. package/dist/sdk/merge/install.js +4 -2
  569. package/dist/sdk/merge/receipt-file-boundary.js +1 -1
  570. package/dist/sdk/merge/receipt-operation.js +1 -1
  571. package/dist/sdk/merge/receipt-schema.js +1 -1
  572. package/dist/sdk/merge/receipts.js +4 -4
  573. package/dist/sdk/merge/reconcile.js +1 -1
  574. package/dist/sdk/merge/three-way.js +3 -2
  575. package/dist/sdk/merge/worktree-config.js +1 -1
  576. package/dist/sdk/merge.js +1 -1
  577. package/dist/sdk/mutation-events.js +1 -1
  578. package/dist/sdk/mutation-guard.js +1 -1
  579. package/dist/sdk/notes.js +1 -1
  580. package/dist/sdk/output-contracts.js +1 -1
  581. package/dist/sdk/output-projection.js +1 -1
  582. package/dist/sdk/output-token-accounting.js +1 -1
  583. package/dist/sdk/output.js +2 -1
  584. package/dist/sdk/ownership-source.js +1 -1
  585. package/dist/sdk/package-import-adapters.js +1 -1
  586. package/dist/sdk/package-migrations.js +1 -1
  587. package/dist/sdk/package-runtime-options.js +1 -1
  588. package/dist/sdk/pagination.js +1 -1
  589. package/dist/sdk/profile.js +5 -1
  590. package/dist/sdk/provenance.js +1 -1
  591. package/dist/sdk/public-surface.json +1 -1
  592. package/dist/sdk/query/activity.js +1 -1
  593. package/dist/sdk/query/aggregate.js +1 -1
  594. package/dist/sdk/query/calendar.js +4 -1
  595. package/dist/sdk/query/complete-list.js +1 -1
  596. package/dist/sdk/query/context.js +2 -1
  597. package/dist/sdk/query/duplicate-candidates.js +1 -1
  598. package/dist/sdk/query/get.d.ts +14 -2
  599. package/dist/sdk/query/get.js +1 -1
  600. package/dist/sdk/query/history.js +1 -1
  601. package/dist/sdk/query/item-filter-options.js +1 -1
  602. package/dist/sdk/query/light-metadata.js +1 -1
  603. package/dist/sdk/query/list-filter-shared.js +1 -1
  604. package/dist/sdk/query/list.js +1 -1
  605. package/dist/sdk/query/multi-value-filters.js +1 -1
  606. package/dist/sdk/query/next-ready-budget.js +1 -1
  607. package/dist/sdk/query/next.js +2 -1
  608. package/dist/sdk/query/parsers.js +1 -1
  609. package/dist/sdk/query/projection-contracts.js +1 -1
  610. package/dist/sdk/query/search/corpus.js +2 -1
  611. package/dist/sdk/query/search/filters.js +1 -1
  612. package/dist/sdk/query/search/input.js +1 -1
  613. package/dist/sdk/query/search/lexical.js +1 -1
  614. package/dist/sdk/query/search/response.js +1 -1
  615. package/dist/sdk/query/search/semantic.js +3 -2
  616. package/dist/sdk/query/search/types.js +1 -1
  617. package/dist/sdk/query/search-contracts.js +1 -1
  618. package/dist/sdk/query/search-pagination.d.ts +1 -1
  619. package/dist/sdk/query/search-pagination.js +1 -1
  620. package/dist/sdk/query/search-rendering.js +1 -1
  621. package/dist/sdk/query/search.js +1 -1
  622. package/dist/sdk/query/workspace-contracts.js +1 -1
  623. package/dist/sdk/query.js +1 -1
  624. package/dist/sdk/read-output/continuation.js +1 -1
  625. package/dist/sdk/read-output/options.js +1 -1
  626. package/dist/sdk/read-output/provenance.js +1 -1
  627. package/dist/sdk/read-output-budget.js +1 -1
  628. package/dist/sdk/read-output-contracts.js +1 -1
  629. package/dist/sdk/read-output-rows.js +1 -1
  630. package/dist/sdk/read-output-session.js +1 -1
  631. package/dist/sdk/relationship-analytics.js +1 -1
  632. package/dist/sdk/relationship-context.js +1 -1
  633. package/dist/sdk/relationship-history.js +7 -4
  634. package/dist/sdk/relationship-kinds/contract.js +1 -1
  635. package/dist/sdk/relationship-migration.js +1 -1
  636. package/dist/sdk/relationships.js +1 -1
  637. package/dist/sdk/reproducibility/process.js +1 -1
  638. package/dist/sdk/runtime/actions.js +1 -1
  639. package/dist/sdk/runtime/context.js +1 -1
  640. package/dist/sdk/runtime/schema-preview.js +1 -1
  641. package/dist/sdk/runtime/schema.js +1 -1
  642. package/dist/sdk/runtime-action-aliases.js +1 -1
  643. package/dist/sdk/runtime-extended-actions.js +1 -1
  644. package/dist/sdk/runtime-input.js +1 -1
  645. package/dist/sdk/runtime-primitives.js +1 -1
  646. package/dist/sdk/runtime-public-contracts.js +1 -1
  647. package/dist/sdk/runtime-stats-options.js +1 -1
  648. package/dist/sdk/runtime.js +1 -1
  649. package/dist/sdk/scheduling-shortcuts.js +1 -1
  650. package/dist/sdk/schema-migration.js +4 -3
  651. package/dist/sdk/schema.js +7 -1
  652. package/dist/sdk/search-refresh-worker.js +1 -1
  653. package/dist/sdk/similarity-scoring.js +1 -1
  654. package/dist/sdk/similarity.js +1 -1
  655. package/dist/sdk/start-task-status.js +1 -1
  656. package/dist/sdk/stats.js +1 -1
  657. package/dist/sdk/structured-mutations.js +1 -1
  658. package/dist/sdk/telemetry-flush.js +1 -1
  659. package/dist/sdk/telemetry.js +4 -3
  660. package/dist/sdk/templates.js +26 -2
  661. package/dist/sdk/test/batch.js +2 -2
  662. package/dist/sdk/test/entry.js +1 -1
  663. package/dist/sdk/test/execution.js +6 -5
  664. package/dist/sdk/test/json-path.js +1 -1
  665. package/dist/sdk/test/linked-command-detection.js +1 -1
  666. package/dist/sdk/test/measurements.js +1 -1
  667. package/dist/sdk/test/parsers.js +1 -1
  668. package/dist/sdk/test/runs.js +1 -1
  669. package/dist/sdk/test/trust.js +2 -2
  670. package/dist/sdk/test/workspace-snapshot.js +1 -1
  671. package/dist/sdk/testing.js +7 -4
  672. package/dist/sdk/traceability/runtime-files-lookup.js +1 -1
  673. package/dist/sdk/traceability/source-traceability.js +2 -1
  674. package/dist/sdk/tracker-root-discovery.js +1 -1
  675. package/dist/sdk/workspace-contracts-cache.js +1 -1
  676. package/dist/sdk/workspace-contracts.js +1 -1
  677. package/dist/sdk/workspace-memory.js +2 -2
  678. package/dist/sdk/workspace-recipe.js +1 -1
  679. package/dist/sdk/workspace-snapshot.js +5 -4
  680. package/dist/sdk/workspace-transaction-gc.js +1 -1
  681. package/dist/sdk/workspace-transaction.js +2 -2
  682. package/dist/sdk/workspace.js +3 -2
  683. package/dist/types/index.js +1 -1
  684. package/dist/types.js +1 -1
  685. package/docs/AGENT_EVIDENCE_CONSISTENCY.md +88 -0
  686. package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +25 -0
  687. package/docs/GET_READ_EVIDENCE.md +68 -0
  688. package/docs/OUTPUT_PROJECTION_CONTRACTS.md +23 -0
  689. package/docs/README.md +2 -0
  690. package/docs/SDK_AUDITED_MUTATIONS.md +35 -0
  691. package/docs/TESTING.md +8 -0
  692. package/docs/ecosystem-review-2026-09-28.json +2864 -3157
  693. package/marketplace.json +2 -2
  694. package/package.json +1 -1
  695. package/packages/pm-beads/package.json +1 -1
  696. package/packages/pm-calendar/package.json +1 -1
  697. package/packages/pm-command-kit/package.json +1 -1
  698. package/packages/pm-digital-twin/package.json +1 -1
  699. package/packages/pm-governance-audit/package.json +1 -1
  700. package/packages/pm-guide-shell/package.json +1 -1
  701. package/packages/pm-kanban/package.json +1 -1
  702. package/packages/pm-lifecycle-hooks/package.json +1 -1
  703. package/packages/pm-linked-test-adapters/package.json +1 -1
  704. package/packages/pm-search-advanced/package.json +1 -1
  705. package/packages/pm-templates/package.json +1 -1
  706. package/packages/pm-todos/package.json +1 -1
  707. package/packages/pm-vcs/extensions/vcs/index.ts +4 -2
  708. package/packages/pm-vcs/package.json +1 -1
  709. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  710. package/plugins/pm-claude/package.json +2 -2
  711. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  712. package/plugins/pm-codex/package.json +2 -2
  713. package/plugins/pm-codex/plugin.json +1 -1
  714. package/scripts/finalize-build.mjs +3 -2
  715. package/dist/cli-bundle/chunks/chunk-3AF2R3Y6.js +0 -6
  716. package/dist/cli-bundle/chunks/chunk-6ST3SCQ6.js +0 -2
  717. package/dist/cli-bundle/chunks/chunk-6Z4IV2MC.js +0 -8
  718. package/dist/cli-bundle/chunks/chunk-DEZPZOQ7.js +0 -2
  719. package/dist/cli-bundle/chunks/chunk-FW5LJXQY.js +0 -31
  720. package/dist/cli-bundle/chunks/chunk-H2DZW6I6.js +0 -3
  721. package/dist/cli-bundle/chunks/chunk-H7CXQBGQ.js +0 -2
  722. package/dist/cli-bundle/chunks/chunk-KP7NBQK3.js +0 -80
  723. package/dist/cli-bundle/chunks/chunk-MKXBCBAN.js +0 -20
  724. package/dist/cli-bundle/chunks/chunk-QPKQKSQU.js +0 -238
  725. package/dist/cli-bundle/chunks/chunk-SGFQQXFD.js +0 -2
  726. package/dist/cli-bundle/chunks/chunk-YCBGZF3T.js +0 -2
  727. package/dist/cli-bundle/chunks/chunk-YDWKGUQU.js +0 -3
  728. package/dist/cli-bundle/chunks/register-mutation-5PT3NW3A.js +0 -20
  729. package/dist/cli-bundle/chunks/register-operations-QDDQOAAV.js +0 -2
  730. package/dist/cli-bundle/chunks/register-setup-BBX67YMA.js +0 -2
  731. package/dist/cli-bundle/focused-chunks/chunk-4FFPGNCJ.js +0 -6
  732. package/dist/cli-bundle/focused-chunks/chunk-73DA7ISY.js +0 -75
  733. package/dist/cli-bundle/focused-chunks/chunk-E754JDLY.js +0 -2
  734. package/dist/cli-bundle/focused-chunks/chunk-FKK2HI3S.js +0 -2
  735. package/dist/cli-bundle/focused-chunks/chunk-GMYUNHST.js +0 -3
  736. package/dist/cli-bundle/focused-chunks/chunk-HIA2ZF64.js +0 -12
  737. package/dist/cli-bundle/focused-chunks/chunk-UTRSM3ZK.js +0 -8
  738. package/dist/cli-bundle/focused-chunks/chunk-VVWYI2X7.js +0 -2
  739. package/dist/cli-bundle/focused-chunks/chunk-WAJNX4RN.js +0 -20
  740. package/dist/cli-bundle/focused-chunks/chunk-WCY6HRZO.js +0 -30
  741. package/dist/cli-bundle/focused-chunks/chunk-YC32ZSLS.js +0 -165
  742. package/dist/cli-bundle/focused-chunks/chunk-ZIXFMIUL.js +0 -3
@@ -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]="73dc2a96-d38f-5599-9c1a-3f035d466c46")}catch(e2){}})();export*from"./item-format-migration.js";export*from"./item-store.js";export*from"./paths.js";export*from"./settings.js";
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="73dc2a96-d38f-5599-9c1a-3f035d466c46")}catch{}})();export*from"./item-format-migration.js";export*from"./item-store.js";export*from"./paths.js";export*from"./settings.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -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]="1ad4a739-f29d-5b50-b1cf-f8590804e32b")}catch(e2){}})();import fs from"node:fs/promises";import path from"node:path";import{runActiveOnWriteHooks}from"../extensions/index.js";import{readFileIfExists,removeFileIfExists,writeFileAtomic}from"../fs/fs-utils.js";import{parseItemDocument,serializeItemDocument}from"../item/item-format.js";import{TYPE_TO_FOLDER}from"../shared/constants.js";import{getItemFormatFromPath,getItemPath}from"./paths.js";function alternateItemFormat(_targetFormat){return"json_markdown"}function normalizeRelativePath(pmRoot,absolutePath){return path.relative(pmRoot,absolutePath).replaceAll("\\","/")}function errorSummary(error){return String(error).replaceAll(/[^a-zA-Z0-9._-]+/g,"_").slice(0,120)}async function migrateItemFilesToFormat(pmRoot,targetFormat,op="item_format:migrate",typeToFolder=TYPE_TO_FOLDER,schema){if(targetFormat!=="toon"){throw new Error("Only toon item-format migration targets are supported. Markdown item files are legacy read-only input.")}const migratedIds=new Set;const removedPaths=new Set;const warnings=[];let scanned=0;const alternateFormat=alternateItemFormat(targetFormat);const typeEntries=Object.entries(typeToFolder);for(const[itemType,folder]of typeEntries){const directoryPath=path.join(pmRoot,folder);let files=[];try{files=await fs.readdir(directoryPath)}catch{continue}const variantsById=new Map;for(const file of files){const absolutePath=path.join(directoryPath,file);const itemFormat=getItemFormatFromPath(absolutePath);if(!itemFormat){continue}const extension=path.extname(file);const itemId=file.slice(0,file.length-extension.length).trim();if(itemId.length===0){continue}const entry=variantsById.get(itemId)??{};entry[itemFormat]=absolutePath;variantsById.set(itemId,entry)}const itemIds=[...variantsById.keys()].sort((left,right)=>left.localeCompare(right));for(const itemId of itemIds){const variants=variantsById.get(itemId);scanned+=1;const alternatePath=variants[alternateFormat];if(!alternatePath){continue}const sourcePath=variants[targetFormat]??alternatePath;const sourceFormat=sourcePath===variants[targetFormat]?targetFormat:alternateFormat;try{const sourceRaw=await fs.readFile(sourcePath,"utf8");const parsedDocument=parseItemDocument(sourceRaw,{format:sourceFormat,schema,onWarning:warning=>warnings.push(`item_format_migration_parse_warning:${itemId}:${warning}`)});const targetPath=getItemPath(pmRoot,itemType,itemId,targetFormat,typeToFolder);const serializedTarget=serializeItemDocument(parsedDocument,{format:targetFormat,schema});const existingTargetRaw=await readFileIfExists(targetPath);if(existingTargetRaw!==serializedTarget){await writeFileAtomic(targetPath,serializedTarget);warnings.push(...await runActiveOnWriteHooks({path:targetPath,scope:"project",op}));migratedIds.add(itemId)}await removeFileIfExists(alternatePath);removedPaths.add(normalizeRelativePath(pmRoot,alternatePath));warnings.push(...await runActiveOnWriteHooks({path:alternatePath,scope:"project",op:`${op}:remove`}));migratedIds.add(itemId)}catch(error){warnings.push(`item_format_migration_skipped:${normalizeRelativePath(pmRoot,sourcePath)}:${errorSummary(error)}`)}}}return{target_format:targetFormat,scanned,migrated:[...migratedIds].sort((left,right)=>left.localeCompare(right)),removed:[...removedPaths].sort((left,right)=>left.localeCompare(right)),warnings}}export{migrateItemFilesToFormat};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="104c9ab0-5349-5aab-9d79-7697272a36fc")}catch{}})();import fs from"node:fs/promises";import path from"node:path";import{runActiveOnWriteHooks}from"../extensions/index.js";import{readFileIfExists,removeFileIfExists,writeFileAtomic}from"../fs/fs-utils.js";import{parseItemDocument,serializeItemDocument}from"../item/item-format.js";import{TYPE_TO_FOLDER}from"../shared/constants.js";import{getItemFormatFromPath,getItemPath}from"./paths.js";function alternateItemFormat(_targetFormat){return"json_markdown"}function normalizeRelativePath(pmRoot,absolutePath){return path.relative(pmRoot,absolutePath).replaceAll("\\","/")}function errorSummary(error){return String(error).replaceAll(/[^a-zA-Z0-9._-]+/g,"_").slice(0,120)}async function migrateItemFilesToFormat(pmRoot,targetFormat,op="item_format:migrate",typeToFolder=TYPE_TO_FOLDER,schema){if(targetFormat!=="toon")throw new Error("Only toon item-format migration targets are supported. Markdown item files are legacy read-only input.");const migratedIds=new Set,removedPaths=new Set,warnings=[];let scanned=0;const alternateFormat=alternateItemFormat(targetFormat),typeEntries=Object.entries(typeToFolder);for(const[itemType,folder]of typeEntries){const directoryPath=path.join(pmRoot,folder);let files=[];try{files=await fs.readdir(directoryPath)}catch{continue}const variantsById=new Map;for(const file of files){const absolutePath=path.join(directoryPath,file),itemFormat=getItemFormatFromPath(absolutePath);if(!itemFormat)continue;const extension=path.extname(file),itemId=file.slice(0,file.length-extension.length).trim();if(itemId.length===0)continue;const entry=variantsById.get(itemId)??{};entry[itemFormat]=absolutePath,variantsById.set(itemId,entry)}const itemIds=[...variantsById.keys()].sort((left,right)=>left.localeCompare(right));for(const itemId of itemIds){const variants=variantsById.get(itemId);scanned+=1;const alternatePath=variants[alternateFormat];if(!alternatePath)continue;const sourcePath=variants[targetFormat]??alternatePath,sourceFormat=sourcePath===variants[targetFormat]?targetFormat:alternateFormat;try{const sourceRaw=await fs.readFile(sourcePath,"utf8"),parsedDocument=parseItemDocument(sourceRaw,{format:sourceFormat,schema,onWarning:warning=>warnings.push(`item_format_migration_parse_warning:${itemId}:${warning}`)}),targetPath=getItemPath(pmRoot,itemType,itemId,targetFormat,typeToFolder),serializedTarget=serializeItemDocument(parsedDocument,{format:targetFormat,schema});await readFileIfExists(targetPath)!==serializedTarget&&(await writeFileAtomic(targetPath,serializedTarget),warnings.push(...await runActiveOnWriteHooks({path:targetPath,scope:"project",op})),migratedIds.add(itemId)),await removeFileIfExists(alternatePath),removedPaths.add(normalizeRelativePath(pmRoot,alternatePath)),warnings.push(...await runActiveOnWriteHooks({path:alternatePath,scope:"project",op:`${op}:remove`})),migratedIds.add(itemId)}catch(error){warnings.push(`item_format_migration_skipped:${normalizeRelativePath(pmRoot,sourcePath)}:${errorSummary(error)}`)}}}return{target_format:targetFormat,scanned,migrated:[...migratedIds].sort((left,right)=>left.localeCompare(right)),removed:[...removedPaths].sort((left,right)=>left.localeCompare(right)),warnings}}export{migrateItemFilesToFormat};
2
2
  //# sourceMappingURL=item-format-migration.js.map
@@ -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]="1c60c095-9763-5372-9dc3-c0ea1a5caca6")}catch(e2){}})();import fs from"node:fs/promises";import path from"node:path";import{createHash,randomUUID}from"node:crypto";import{getActiveExtensionRegistrations,hasActiveOnReadHooks,runActiveOnReadHooks}from"../extensions/index.js";import{collectRegisteredItemFieldNames}from"../extensions/item-fields.js";import{parseItemDocument}from"../item/item-format.js";import{evictOldestMemoEntries}from"../shared/memo.js";import{isFileMissingError,writeFileAtomic}from"../fs/fs-utils.js";import{acquireLock}from"../lock/lock.js";import{ITEM_FILE_EXTENSIONS,getItemFormatFromPath}from"./paths.js";import{rebuildItemMetadataQueryIndex,removeItemMetadataQueryIndex,updateItemMetadataQueryIndex}from"./item-metadata-query-index.js";const CACHE_VERSION=8;const DEFAULT_DERIVED_INDEX_MINIMUM_ITEMS=500;const DERIVED_INDEX_LOCK_ID="metadata-derived-index";const CACHE_FILENAME="metadata-cache.json";const BODY_CACHE_FILENAME="metadata-cache-bodies.json";const COLLECTIONS_CACHE_FILENAME="metadata-cache-collections.json";const DELTA_CACHE_FILENAME="metadata-cache-delta.json";const MANIFEST_CACHE_FILENAME="metadata-cache-manifest.json";const MAX_CACHE_CONTEXTS=4;const HEAVY_METADATA_KEYS=["comments","notes","learnings","files","tests","test_runs","docs"];function resolveActiveExtensionFieldNames(){return collectRegisteredItemFieldNames(getActiveExtensionRegistrations())}function splitHeavyMetadata(metadata){const light={...metadata};const heavy={};for(const key of HEAVY_METADATA_KEYS){if(key in light){heavy[key]=light[key];delete light[key]}}return{light,heavy}}function mergeHeavyMetadata(light,heavy){if(!heavy||Object.keys(heavy).length===0){return light}return{...light,...heavy}}function computeContextFingerprint(preferredFormat,typeToFolder,schema,extensionFieldNames){const hash=createHash("sha256");hash.update(`format:${preferredFormat??"default"}`);const sortedTypes=Object.entries(typeToFolder).sort(([a],[b])=>a.localeCompare(b)).map(([type,folder])=>`${type}=${folder}`).join(",");hash.update(`|types:${sortedTypes}`);if(schema){hash.update(`|schema:${JSON.stringify(schema)}`)}if(extensionFieldNames.length>0){hash.update(`|extension_fields:${extensionFieldNames.join(",")}`)}return hash.digest("hex").slice(0,16)}function getCachePath(pmRoot){return path.join(pmRoot,"runtime",CACHE_FILENAME)}function getBodyCachePath(pmRoot){return path.join(pmRoot,"runtime",BODY_CACHE_FILENAME)}function getCollectionsCachePath(pmRoot){return path.join(pmRoot,"runtime",COLLECTIONS_CACHE_FILENAME)}function getDeltaCachePath(pmRoot){return path.join(pmRoot,"runtime",DELTA_CACHE_FILENAME)}function getManifestCachePath(pmRoot){return path.join(pmRoot,"runtime",MANIFEST_CACHE_FILENAME)}function getContextCachePath(cachePath,contextFingerprint){const extension=path.extname(cachePath);return`${cachePath.slice(0,-extension.length)}.${contextFingerprint}${extension}`}const ENVELOPE_MEMO_MAX_ENTRIES=24;const envelopeMemo=new Map;const projectedBaseCursor=new WeakMap;function baseCursorFor(envelope){return projectedBaseCursor.get(envelope)??envelope.source_cursor}function applyMetadataDelta(envelope,delta){const baseCursor=baseCursorFor(envelope);if(delta.base_source_cursor!==baseCursor||envelope.source_cursor===delta.source_cursor){return}projectedBaseCursor.set(envelope,baseCursor);for(const[relativePath,change]of Object.entries(delta.changes)){if(change.entry)envelope.entries[relativePath]=change.entry;else delete envelope.entries[relativePath]}envelope.directory_signatures=delta.directory_signatures;envelope.source_cursor=delta.source_cursor}function applyBodyDelta(envelope,delta){if(!envelope)return;const baseCursor=baseCursorFor(envelope);if(delta.base_source_cursor!==baseCursor||envelope.source_cursor===delta.source_cursor){return}projectedBaseCursor.set(envelope,baseCursor);for(const[relativePath,change]of Object.entries(delta.changes)){if(change.body)envelope.bodies[relativePath]=change.body;else delete envelope.bodies[relativePath]}envelope.source_cursor=delta.source_cursor}function applyCollectionsDelta(envelope,delta){if(!envelope)return;const baseCursor=baseCursorFor(envelope);if(delta.base_source_cursor!==baseCursor||envelope.source_cursor===delta.source_cursor){return}projectedBaseCursor.set(envelope,baseCursor);for(const[relativePath,change]of Object.entries(delta.changes)){if(change.collections)envelope.collections[relativePath]=change.collections;else delete envelope.collections[relativePath]}envelope.source_cursor=delta.source_cursor}function applyDerivedIndexDelta(metadata,bodies,collections,delta){if(!metadata||!delta||metadata.context_fingerprint!==delta.context_fingerprint){return}applyMetadataDelta(metadata,delta);applyBodyDelta(bodies,delta);applyCollectionsDelta(collections,delta)}function memoizeEnvelope(cachePath,entry){if(envelopeMemo.size>=ENVELOPE_MEMO_MAX_ENTRIES&&!envelopeMemo.has(cachePath)){evictOldestMemoEntries(envelopeMemo)}envelopeMemo.set(cachePath,entry)}async function loadEnvelopeMemoized(cachePath,parse){let stat;try{stat=await fs.stat(cachePath)}catch{envelopeMemo.delete(cachePath);return null}const memoized=envelopeMemo.get(cachePath);if(memoized&&statMatches(memoized.signature,stat.mtimeMs,stat.ctimeMs,stat.size)){envelopeMemo.delete(cachePath);envelopeMemo.set(cachePath,memoized);return memoized.envelope}let envelope;try{envelope=parse(await fs.readFile(cachePath,"utf8"))}catch{envelope=null}memoizeEnvelope(cachePath,{signature:{mtime_ms:stat.mtimeMs,ctime_ms:stat.ctimeMs,size:stat.size},envelope});return envelope}function clearItemMetadataEnvelopeMemo(){envelopeMemo.clear()}async function loadCache(pmRoot,contextFingerprint,diagnostics){const parse=raw=>{const parsed=JSON.parse(raw);if(parsed.version!==CACHE_VERSION||typeof parsed.source_cursor!=="string"||typeof parsed.entries!=="object"||parsed.entries===null){return null}return parsed};const cachePath=getCachePath(pmRoot);const active=await loadEnvelopeMemoized(cachePath,parse);if(!contextFingerprint||active===null||active.context_fingerprint===contextFingerprint){return active}const retained=await loadEnvelopeMemoized(getContextCachePath(cachePath,contextFingerprint),parse);if(retained===null){appendWarning(diagnostics,`metadata_cache_context_changed:${active.context_fingerprint}->${contextFingerprint}`)}return retained}async function loadBodyCache(pmRoot,contextFingerprint){const parse=raw=>{const parsed=JSON.parse(raw);if(parsed.version!==CACHE_VERSION||typeof parsed.source_cursor!=="string"||typeof parsed.bodies!=="object"||parsed.bodies===null){return null}return parsed};const cachePath=getBodyCachePath(pmRoot);const active=await loadEnvelopeMemoized(cachePath,parse);return contextFingerprint&&active?.context_fingerprint!==contextFingerprint?await loadEnvelopeMemoized(getContextCachePath(cachePath,contextFingerprint),parse):active}async function loadCollectionsCache(pmRoot,contextFingerprint){const parse=raw=>{const parsed=JSON.parse(raw);if(parsed.version!==CACHE_VERSION||typeof parsed.source_cursor!=="string"||typeof parsed.collections!=="object"||parsed.collections===null){return null}return parsed};const cachePath=getCollectionsCachePath(pmRoot);const active=await loadEnvelopeMemoized(cachePath,parse);return contextFingerprint&&active?.context_fingerprint!==contextFingerprint?await loadEnvelopeMemoized(getContextCachePath(cachePath,contextFingerprint),parse):active}async function loadDerivedIndexDelta(pmRoot){const deltaPath=getDeltaCachePath(pmRoot);const envelope=await loadEnvelopeMemoized(deltaPath,raw=>{const parsed=JSON.parse(raw);if(parsed.version!==CACHE_VERSION||typeof parsed.base_source_cursor!=="string"||typeof parsed.source_cursor!=="string"||typeof parsed.changes!=="object"||parsed.changes===null){return null}return parsed});if(envelope)return{envelope,invalid:false};try{await fs.stat(deltaPath);return{envelope:null,invalid:true}}catch{return{envelope:null,invalid:false}}}async function loadDerivedIndexManifest(pmRoot){const manifestPath=getManifestCachePath(pmRoot);const manifest=await loadEnvelopeMemoized(manifestPath,raw=>{const parsed=JSON.parse(raw);if(parsed.version!==CACHE_VERSION||typeof parsed.context_fingerprint!=="string"||typeof parsed.source_cursor!=="string"||!Number.isInteger(parsed.entry_count)||parsed.entry_count<0||typeof parsed.directory_signatures!=="object"||parsed.directory_signatures===null){return null}return parsed});if(manifest)return manifest;try{await fs.stat(manifestPath);await removeDerivedIndexFiles(pmRoot)}catch{}return null}async function persistCache(cachePath,envelope){await fs.mkdir(path.dirname(cachePath),{recursive:true});await writeFileAtomic(cachePath,JSON.stringify(envelope));try{const stat=await fs.stat(cachePath);memoizeEnvelope(cachePath,{signature:{mtime_ms:stat.mtimeMs,ctime_ms:stat.ctimeMs,size:stat.size},envelope})}catch{envelopeMemo.delete(cachePath)}const pmRoot=path.dirname(path.dirname(cachePath));if(cachePath===getCachePath(pmRoot)||cachePath===getBodyCachePath(pmRoot)||cachePath===getCollectionsCachePath(pmRoot)){const contextPath=getContextCachePath(cachePath,envelope.context_fingerprint);await writeFileAtomic(contextPath,JSON.stringify(envelope));try{const contextStat=await fs.stat(contextPath);memoizeEnvelope(contextPath,{signature:{mtime_ms:contextStat.mtimeMs,ctime_ms:contextStat.ctimeMs,size:contextStat.size},envelope})}catch{envelopeMemo.delete(contextPath)}const directory=path.dirname(cachePath);const extension=path.extname(cachePath);const stem=path.basename(cachePath,extension);const variants=(await fs.readdir(directory,{withFileTypes:true}).catch(()=>[])).filter(entry=>entry.isFile()&&entry.name!==path.basename(cachePath)&&entry.name.startsWith(`${stem}.`)&&entry.name.endsWith(extension)).map(entry=>path.join(directory,entry.name));if(variants.length>MAX_CACHE_CONTEXTS){const byAge=(await Promise.all(variants.map(async variantPath=>{try{return{path:variantPath,mtime:(await fs.stat(variantPath)).mtimeMs}}catch{return null}}))).filter(entry=>entry!==null);for(const stale of byAge.sort((left,right)=>left.mtime-right.mtime).slice(0,Math.max(0,byAge.length-MAX_CACHE_CONTEXTS))){await fs.rm(stale.path,{force:true});envelopeMemo.delete(stale.path)}}}}function shouldReplaceCachedDocumentCandidate(existingFormat,candidateFormat,preferredFormat){if(preferredFormat){return candidateFormat===preferredFormat&&existingFormat!==preferredFormat}return candidateFormat==="toon"&&existingFormat!=="toon"}function shouldRecordCachedDocumentCandidate(existingFormat,candidateFormat,preferredFormat){return existingFormat===void 0||shouldReplaceCachedDocumentCandidate(existingFormat,candidateFormat,preferredFormat)}function appendWarning(warnings,warning){if(warnings&&!warnings.includes(warning)){warnings.push(warning)}}function statMatches(signature,mtimeMs,ctimeMs,size){return signature.mtime_ms===mtimeMs&&signature.ctime_ms===ctimeMs&&signature.size===size}async function readItemDirectoryFiles(pmRoot,folder,warnings){const dirPath=path.join(pmRoot,folder);try{const files=await fs.readdir(dirPath);return{folder,dirPath,files}}catch(error){if(typeof error==="object"&&error!==null&&"code"in error&&!isFileMissingError(error)){appendWarning(warnings,`item_list_directory_read_failed:${folder}`)}return{folder,dirPath,files:[]}}}async function readDirectorySignature(pmRoot,folder){try{const stat=await fs.stat(path.join(pmRoot,folder));return[folder,{exists:true,mtime_ms:stat.mtimeMs,ctime_ms:stat.ctimeMs,size:stat.size}]}catch{return[folder,{exists:false,mtime_ms:0,ctime_ms:0,size:0}]}}async function readDirectorySignatures(pmRoot,folders){return Object.fromEntries(await Promise.all(folders.map(async folder=>await readDirectorySignature(pmRoot,folder))))}function directorySignaturesMatch(left,right){if(!left||Object.keys(left).length!==Object.keys(right).length){return false}return Object.entries(right).every(([folder,signature])=>{const previous=left[folder];return previous!==void 0&&previous.exists===signature.exists&&statMatches(previous,signature.mtime_ms,signature.ctime_ms,signature.size)})}function isItemDocumentFile(file){return ITEM_FILE_EXTENSIONS.some(ext=>file.toLowerCase().endsWith(ext))}function markDocumentCacheMisses(misses,includeBody,includeCollections,metadataCached,bodyCached,collectionsCached){if(!metadataCached){misses.metadata=true}if(includeBody&&!bodyCached){misses.body=true}if(includeCollections&&!collectionsCached){misses.collections=true}}async function dispatchCachedDocumentReadHooks(filePath,warnings,dispatchReadHooks){if(!dispatchReadHooks){return}for(const warning of await runActiveOnReadHooks({path:filePath,scope:"project"})){appendWarning(warnings,warning)}}function selectHeavyMetadata(includeCollections,collectionsCached,cachedCollections,parsedCollections){if(!includeCollections){return void 0}return collectionsCached&&cachedCollections?cachedCollections.collections:parsedCollections}async function readCachedDocumentParts(filePath,relativePath,context){const stat=await fs.stat(filePath);const mtimeMs=stat.mtimeMs;const ctimeMs=stat.ctimeMs;const{size}=stat;const itemFormat=getItemFormatFromPath(filePath);await dispatchCachedDocumentReadHooks(filePath,context.warnings,context.dispatchReadHooks);const cachedEntry=context.previousEntries[relativePath];const metadataCached=!context.forceSourceRead&&cachedEntry!==void 0&&statMatches(cachedEntry,mtimeMs,ctimeMs,size);const cachedBody=context.previousBodies[relativePath];const bodyCached=!context.forceSourceRead&&cachedBody!==void 0&&statMatches(cachedBody,mtimeMs,ctimeMs,size);const cachedCollections=context.previousCollections[relativePath];const collectionsCached=!context.forceSourceRead&&cachedCollections!==void 0&&statMatches(cachedCollections,mtimeMs,ctimeMs,size);const needRead=!metadataCached||context.includeBody&&!bodyCached||context.includeCollections&&!collectionsCached;if(!needRead){return{mtimeMs,ctimeMs,size,itemFormat,lightMetadata:cachedEntry.metadata,heavyMetadata:selectHeavyMetadata(context.includeCollections,collectionsCached,cachedCollections,void 0),bodyLength:cachedEntry.body_length,body:context.includeBody?cachedBody.body:void 0}}const raw=await fs.readFile(filePath,"utf8");const parsed=parseItemDocument(raw,{format:itemFormat,schema:context.schema,extensionFieldNames:context.extensionFieldNames,onWarning:warning=>appendWarning(context.warnings,warning)});const split=splitHeavyMetadata(parsed.metadata);markDocumentCacheMisses(context.state.misses,context.includeBody,context.includeCollections,metadataCached,bodyCached,collectionsCached);return{mtimeMs,ctimeMs,size,itemFormat,lightMetadata:metadataCached?cachedEntry.metadata:split.light,heavyMetadata:selectHeavyMetadata(context.includeCollections,collectionsCached,cachedCollections,split.heavy),bodyLength:metadataCached?cachedEntry.body_length:parsed.body.length,body:context.includeBody?parsed.body:void 0}}function recordCachedDocumentCandidate(filePath,relativePath,context,parts){context.state.newEntries[relativePath]={mtime_ms:parts.mtimeMs,ctime_ms:parts.ctimeMs,size:parts.size,metadata:parts.lightMetadata,body_length:parts.bodyLength};if(context.includeBody&&parts.body!==void 0){context.state.newBodies[relativePath]={mtime_ms:parts.mtimeMs,ctime_ms:parts.ctimeMs,size:parts.size,body:parts.body}}if(context.includeCollections&&parts.heavyMetadata!==void 0){context.state.newCollections[relativePath]={mtime_ms:parts.mtimeMs,ctime_ms:parts.ctimeMs,size:parts.size,collections:parts.heavyMetadata}}const metadata=context.includeCollections?mergeHeavyMetadata(parts.lightMetadata,parts.heavyMetadata):parts.lightMetadata;const existing=context.state.documentsById.get(metadata.id);const candidate={metadata,body:parts.body,item_format:parts.itemFormat,item_path:filePath};if(shouldRecordCachedDocumentCandidate(existing?.itemFormat,parts.itemFormat,context.preferredFormat)){context.state.documentsById.set(metadata.id,{candidate,itemFormat:parts.itemFormat})}}async function processCachedDocumentFile(folder,filePath,relativePath,context){try{const parts=await readCachedDocumentParts(filePath,relativePath,context);recordCachedDocumentCandidate(filePath,relativePath,context,parts)}catch{appendWarning(context.warnings,`item_list_item_read_failed:${folder}/${path.basename(filePath)}`)}}function selectPreviousMetadataEntries(existingCache,contextFingerprint){return existingCache&&existingCache.context_fingerprint===contextFingerprint?existingCache.entries:{}}function selectPreviousBodyEntries(existingBodyCache,contextFingerprint){return existingBodyCache&&existingBodyCache.context_fingerprint===contextFingerprint?existingBodyCache.bodies:{}}function selectPreviousCollectionEntries(existingCollectionsCache,contextFingerprint){return existingCollectionsCache&&existingCollectionsCache.context_fingerprint===contextFingerprint?existingCollectionsCache.collections:{}}function createDocumentCacheMutableState(){return{newEntries:{},newBodies:{},newCollections:{},documentsById:new Map,misses:{metadata:false,body:false,collections:false}}}async function processCachedDocumentFiles(dirResults,context){const parseTasks=[];for(const{folder,dirPath,files}of dirResults){for(const file of files){if(!isItemDocumentFile(file)){continue}const filePath=path.join(dirPath,file);const relativePath=path.relative(context.pmRoot,filePath);parseTasks.push(processCachedDocumentFile(folder,filePath,relativePath,context));if(parseTasks.length===32){await Promise.all(parseTasks);parseTasks.length=0}}}await Promise.all(parseTasks)}async function persistMetadataCacheIfNeeded(params){const metadataDirty=params.state.misses.metadata||Object.keys(params.previousEntries).length!==Object.keys(params.state.newEntries).length||!directorySignaturesMatch(params.existingCache?.directory_signatures,params.directorySignatures);if(!metadataDirty&&params.existingCache!==null&&params.existingCache.context_fingerprint===params.contextFingerprint){return}try{await persistCache(getCachePath(params.pmRoot),{version:CACHE_VERSION,context_fingerprint:params.contextFingerprint,source_cursor:params.sourceCursor,directory_signatures:params.directorySignatures,entries:params.state.newEntries});await persistCache(getManifestCachePath(params.pmRoot),{version:CACHE_VERSION,context_fingerprint:params.contextFingerprint,source_cursor:params.sourceCursor,entry_count:Object.keys(params.state.newEntries).length,directory_signatures:params.directorySignatures});const rows=[...params.state.documentsById.values()].map(({candidate})=>({relativePath:path.relative(params.pmRoot,candidate.item_path),metadata:splitHeavyMetadata(candidate.metadata).light,linkedFiles:candidate.metadata.files??[]}));if(rows.length>=params.minimumIndexedItems){await rebuildItemMetadataQueryIndex({pmRoot:params.pmRoot,contextFingerprint:params.contextFingerprint,sourceCursor:params.sourceCursor,rows})}else{await removeItemMetadataQueryIndex(params.pmRoot)}}catch{}}async function persistBodyCacheIfNeeded(params){const bodyDirty=params.state.misses.body||Object.keys(params.previousBodies).length!==Object.keys(params.state.newBodies).length;if(!bodyDirty&&params.existingBodyCache!==null&&params.existingBodyCache.context_fingerprint===params.contextFingerprint){return}await persistCache(getBodyCachePath(params.pmRoot),{version:CACHE_VERSION,context_fingerprint:params.contextFingerprint,source_cursor:params.sourceCursor,bodies:params.state.newBodies}).catch(()=>{})}async function persistCollectionsCacheIfNeeded(params){const collectionsDirty=params.state.misses.collections||Object.keys(params.previousCollections).length!==Object.keys(params.state.newCollections).length;if(!collectionsDirty&&params.existingCollectionsCache!==null&&params.existingCollectionsCache.context_fingerprint===params.contextFingerprint){return}await persistCache(getCollectionsCachePath(params.pmRoot),{version:CACHE_VERSION,context_fingerprint:params.contextFingerprint,source_cursor:params.sourceCursor,collections:params.state.newCollections}).catch(()=>{})}async function acquireItemMetadataDerivedIndexLock(pmRoot,author,options={}){const cache=await loadDerivedIndexManifest(pmRoot);if(options.required!==true&&(cache===null||cache.entry_count<DEFAULT_DERIVED_INDEX_MINIMUM_ITEMS)){return async()=>{}}return acquireLock(pmRoot,DERIVED_INDEX_LOCK_ID,30,author,false,false,3e3)}async function readItemMetadataDerivedIndexState(pmRoot,folders){const manifest=await loadDerivedIndexManifest(pmRoot);if(manifest===null)return null;const delta=await loadDerivedIndexDelta(pmRoot);if(delta.invalid){await removeDerivedIndexFiles(pmRoot);return null}const effectiveCursor=delta.envelope?.context_fingerprint===manifest.context_fingerprint&&delta.envelope.base_source_cursor===manifest.source_cursor?delta.envelope.source_cursor:manifest.source_cursor;const effectiveDirectorySignatures=delta.envelope?.context_fingerprint===manifest.context_fingerprint&&delta.envelope.base_source_cursor===manifest.source_cursor?delta.envelope.directory_signatures:manifest.directory_signatures;if(folders&&!directorySignaturesMatch(effectiveDirectorySignatures,await readDirectorySignatures(pmRoot,folders))){return null}return{source_cursor:effectiveCursor,entry_count:manifest.entry_count}}function relativeIndexPath(pmRoot,itemPath){const relative=path.relative(pmRoot,itemPath);return relative===""||relative===".."||relative.startsWith(`..${path.sep}`)||path.isAbsolute(relative)?null:relative}async function removeDerivedIndexFiles(pmRoot){await Promise.all([getCachePath(pmRoot),getBodyCachePath(pmRoot),getCollectionsCachePath(pmRoot),getDeltaCachePath(pmRoot),getManifestCachePath(pmRoot)].map(async cachePath=>{await fs.rm(cachePath,{force:true});envelopeMemo.delete(cachePath)}));await removeItemMetadataQueryIndex(pmRoot)}async function createDerivedIndexDeltaChange(params){if(params.mutation.document===null){return{entry:null,body:null,collections:null}}const stat=await fs.stat(params.mutation.itemPath);const split=splitHeavyMetadata(params.mutation.document.metadata);const signature={mtime_ms:stat.mtimeMs,ctime_ms:stat.ctimeMs,size:stat.size};return{entry:{...signature,metadata:split.light,body_length:params.mutation.document.body.length},body:{...signature,body:params.mutation.document.body},collections:{...signature,collections:split.heavy}}}function selectDerivedIndexDeltaChanges(delta,contextFingerprint,baseSourceCursor){return delta?.context_fingerprint===contextFingerprint&&delta.base_source_cursor===baseSourceCursor?structuredClone(delta.changes):{}}async function refreshItemMetadataDerivedIndex(mutation){const relativePath=relativeIndexPath(mutation.pmRoot,mutation.itemPath);const previousRelativePath=mutation.previousItemPath?relativeIndexPath(mutation.pmRoot,mutation.previousItemPath):void 0;if(relativePath===null||previousRelativePath===null){await removeDerivedIndexFiles(mutation.pmRoot);return["metadata_derived_index_path_invalidated"]}try{const contextFingerprint=computeContextFingerprint(mutation.preferredFormat,mutation.typeToFolder,mutation.schema,resolveActiveExtensionFieldNames());const existingCache=await loadDerivedIndexManifest(mutation.pmRoot);if(existingCache===null||existingCache.context_fingerprint!==contextFingerprint){return[]}const baseSourceCursor=existingCache.source_cursor;const delta=await loadDerivedIndexDelta(mutation.pmRoot);if(delta.invalid){await removeDerivedIndexFiles(mutation.pmRoot);return["metadata_derived_index_refresh_failed"]}const changes=selectDerivedIndexDeltaChanges(delta.envelope,contextFingerprint,baseSourceCursor);const expectedSourceCursor=delta.envelope?.context_fingerprint===contextFingerprint&&delta.envelope.base_source_cursor===baseSourceCursor?delta.envelope.source_cursor:baseSourceCursor;if(previousRelativePath!==void 0){changes[previousRelativePath]={entry:null,body:null,collections:null}}changes[relativePath]=await createDerivedIndexDeltaChange({mutation});const sourceCursor=randomUUID();await persistCache(getDeltaCachePath(mutation.pmRoot),{version:CACHE_VERSION,context_fingerprint:contextFingerprint,base_source_cursor:baseSourceCursor,source_cursor:sourceCursor,directory_signatures:await readDirectorySignatures(mutation.pmRoot,[...new Set(Object.values(mutation.typeToFolder))]),changes});const queryIndexUpdated=await updateItemMetadataQueryIndex({pmRoot:mutation.pmRoot,contextFingerprint,expectedSourceCursor,sourceCursor,row:mutation.document===null?null:{relativePath,metadata:splitHeavyMetadata(mutation.document.metadata).light,linkedFiles:mutation.document.metadata.files},deletedRelativePaths:[...previousRelativePath===void 0?[]:[previousRelativePath],...mutation.document===null?[relativePath]:[]]});if(!queryIndexUpdated){await removeItemMetadataQueryIndex(mutation.pmRoot)}return[]}catch{await removeDerivedIndexFiles(mutation.pmRoot).catch(()=>{});return["metadata_derived_index_refresh_failed"]}}function sortedCachedDocumentCandidates(state){return[...state.documentsById.values()].sort((left,right)=>left.candidate.metadata.id.localeCompare(right.candidate.metadata.id)).map(entry=>entry.candidate)}function cacheTierMatchesContext(envelope,contextFingerprint,sourceCursor){return envelope?.context_fingerprint===contextFingerprint&&envelope.source_cursor===sourceCursor}function hasEveryDerivedIndexPart(keys,includeBody,includeCollections,previousBodies,previousCollections){return keys.every(key=>(!includeBody||previousBodies[key]!==void 0)&&(!includeCollections||previousCollections[key]!==void 0))}function candidatesFromDerivedIndex(params){const candidatesById=new Map;for(const[relativePath,entry]of Object.entries(params.previousEntries)){const itemFormat=getItemFormatFromPath(relativePath);if(!itemFormat){continue}const metadata=params.includeCollections?mergeHeavyMetadata(entry.metadata,params.previousCollections[relativePath]?.collections):entry.metadata;const existing=candidatesById.get(metadata.id);if(shouldRecordCachedDocumentCandidate(existing?.itemFormat,itemFormat,params.preferredFormat)){candidatesById.set(metadata.id,{itemFormat,candidate:{metadata,body:params.includeBody?params.previousBodies[relativePath]?.body:void 0,item_format:itemFormat,item_path:path.join(params.pmRoot,relativePath)}})}}return[...candidatesById.values()].sort((left,right)=>left.candidate.metadata.id.localeCompare(right.candidate.metadata.id)).map(entry=>entry.candidate)}function canUseDerivedIndex(params){if(params.forceSourceScan||hasActiveOnReadHooks()||params.existingCache?.context_fingerprint!==params.contextFingerprint||params.entryKeys.length<params.minimumIndexedItems||!directorySignaturesMatch(params.existingCache?.directory_signatures,params.directorySignatures)){return false}const requiredTiersMatch=[!params.includeBody||cacheTierMatchesContext(params.existingBodyCache,params.contextFingerprint,params.existingCache.source_cursor),!params.includeCollections||cacheTierMatchesContext(params.existingCollectionsCache,params.contextFingerprint,params.existingCache.source_cursor)];return requiredTiersMatch.every(Boolean)&&hasEveryDerivedIndexPart(params.entryKeys,params.includeBody,params.includeCollections,params.previousBodies,params.previousCollections)}async function listAllDocumentCandidatesCached(pmRoot,preferredFormat,typeToFolder,warnings,schema,options={}){const includeBody=options.includeBody!==false;const includeCollections=options.includeCollections!==false;const extensionFieldNames=resolveActiveExtensionFieldNames();const contextFingerprint=computeContextFingerprint(preferredFormat,typeToFolder,schema,extensionFieldNames);const delta=await loadDerivedIndexDelta(pmRoot);if(delta.invalid)await removeDerivedIndexFiles(pmRoot);const existingCache=await loadCache(pmRoot,contextFingerprint,options.cacheDiagnostics);const existingBodyCache=includeBody?await loadBodyCache(pmRoot,contextFingerprint):null;const existingCollectionsCache=includeCollections?await loadCollectionsCache(pmRoot,contextFingerprint):null;applyDerivedIndexDelta(existingCache,existingBodyCache,existingCollectionsCache,delta.envelope);const previousEntries=selectPreviousMetadataEntries(existingCache,contextFingerprint);const previousBodies=selectPreviousBodyEntries(existingBodyCache,contextFingerprint);const previousCollections=selectPreviousCollectionEntries(existingCollectionsCache,contextFingerprint);const folders=[...new Set(Object.values(typeToFolder))];const directorySignaturesBefore=await readDirectorySignatures(pmRoot,folders);const entryKeys=Object.keys(previousEntries);const minimumIndexedItems=Math.max(1,Math.floor(options.derivedIndexMinimumItems??DEFAULT_DERIVED_INDEX_MINIMUM_ITEMS));if(canUseDerivedIndex({forceSourceScan:options.forceSourceScan===true,contextFingerprint,existingCache,existingBodyCache,existingCollectionsCache,directorySignatures:directorySignaturesBefore,entryKeys,minimumIndexedItems,includeBody,includeCollections,previousBodies,previousCollections})){return candidatesFromDerivedIndex({pmRoot,preferredFormat,includeBody,includeCollections,previousEntries,previousBodies,previousCollections})}const dirResults=await Promise.all(folders.map(folder=>readItemDirectoryFiles(pmRoot,folder,warnings)));const dispatchReadHooks=hasActiveOnReadHooks();const state=createDocumentCacheMutableState();const context={pmRoot,preferredFormat,warnings,schema,extensionFieldNames,includeBody,includeCollections,forceSourceRead:options.forceSourceScan===true,dispatchReadHooks,previousEntries,previousBodies,previousCollections,state};await processCachedDocumentFiles(dirResults,context);const directorySignaturesAfter=await readDirectorySignatures(pmRoot,folders);const stableDirectorySignatures=directorySignaturesMatch(directorySignaturesBefore,directorySignaturesAfter)?directorySignaturesAfter:{};const metadataChanged=state.misses.metadata||Object.keys(previousEntries).length!==Object.keys(state.newEntries).length||!directorySignaturesMatch(existingCache?.directory_signatures,stableDirectorySignatures);const sourceCursor=metadataChanged||existingCache===null?randomUUID():existingCache.source_cursor;await persistMetadataCacheIfNeeded({pmRoot,contextFingerprint,sourceCursor,existingCache,previousEntries,directorySignatures:stableDirectorySignatures,state,minimumIndexedItems});if(includeBody){await persistBodyCacheIfNeeded({pmRoot,contextFingerprint,sourceCursor,existingBodyCache,previousBodies,state})}if(includeCollections){await persistCollectionsCacheIfNeeded({pmRoot,contextFingerprint,sourceCursor,existingCollectionsCache,previousCollections,state})}return sortedCachedDocumentCandidates(state)}async function listAllDocumentsCached(pmRoot,preferredFormat,typeToFolder,warnings,schema){const candidates=await listAllDocumentCandidatesCached(pmRoot,preferredFormat,typeToFolder,warnings,schema,{includeBody:false});return candidates.map(candidate=>({metadata:candidate.metadata,body:candidate.body??""}))}async function listAllDocumentsCachedLight(pmRoot,preferredFormat,typeToFolder,warnings,schema){const candidates=await listAllDocumentCandidatesCached(pmRoot,preferredFormat,typeToFolder,warnings,schema,{includeBody:false,includeCollections:false});return candidates.map(candidate=>({metadata:candidate.metadata,body:candidate.body??""}))}export{DEFAULT_DERIVED_INDEX_MINIMUM_ITEMS,HEAVY_METADATA_KEYS,acquireItemMetadataDerivedIndexLock,clearItemMetadataEnvelopeMemo,listAllDocumentCandidatesCached,listAllDocumentsCached,listAllDocumentsCachedLight,readItemMetadataDerivedIndexState,refreshItemMetadataDerivedIndex,shouldRecordCachedDocumentCandidate,shouldReplaceCachedDocumentCandidate};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="846c1c5d-8a5c-56ee-832a-bfc780283e70")}catch{}})();import fs from"node:fs/promises";import path from"node:path";import{createHash,randomUUID}from"node:crypto";import{getActiveExtensionRegistrations,hasActiveOnReadHooks,runActiveOnReadHooks}from"../extensions/index.js";import{collectRegisteredItemFieldNames}from"../extensions/item-fields.js";import{parseItemDocument}from"../item/item-format.js";import{evictOldestMemoEntries}from"../shared/memo.js";import{isFileMissingError,writeFileAtomic}from"../fs/fs-utils.js";import{acquireLock}from"../lock/lock.js";import{ITEM_FILE_EXTENSIONS,getItemFormatFromPath}from"./paths.js";import{rebuildItemMetadataQueryIndex,removeItemMetadataQueryIndex,updateItemMetadataQueryIndex}from"./item-metadata-query-index.js";const CACHE_VERSION=8,DEFAULT_DERIVED_INDEX_MINIMUM_ITEMS=500,DERIVED_INDEX_LOCK_ID="metadata-derived-index",CACHE_FILENAME="metadata-cache.json",BODY_CACHE_FILENAME="metadata-cache-bodies.json",COLLECTIONS_CACHE_FILENAME="metadata-cache-collections.json",DELTA_CACHE_FILENAME="metadata-cache-delta.json",MANIFEST_CACHE_FILENAME="metadata-cache-manifest.json",MAX_CACHE_CONTEXTS=4,HEAVY_METADATA_KEYS=["comments","notes","learnings","files","tests","test_runs","docs"];function resolveActiveExtensionFieldNames(){return collectRegisteredItemFieldNames(getActiveExtensionRegistrations())}function splitHeavyMetadata(metadata){const light={...metadata},heavy={};for(const key of HEAVY_METADATA_KEYS)key in light&&(heavy[key]=light[key],delete light[key]);return{light,heavy}}function mergeHeavyMetadata(light,heavy){return!heavy||Object.keys(heavy).length===0?light:{...light,...heavy}}function computeContextFingerprint(preferredFormat,typeToFolder,schema,extensionFieldNames){const hash=createHash("sha256");hash.update(`format:${preferredFormat??"default"}`);const sortedTypes=Object.entries(typeToFolder).sort(([a],[b])=>a.localeCompare(b)).map(([type,folder])=>`${type}=${folder}`).join(",");return hash.update(`|types:${sortedTypes}`),schema&&hash.update(`|schema:${JSON.stringify(schema)}`),extensionFieldNames.length>0&&hash.update(`|extension_fields:${extensionFieldNames.join(",")}`),hash.digest("hex").slice(0,16)}function getCachePath(pmRoot){return path.join(pmRoot,"runtime",CACHE_FILENAME)}function getBodyCachePath(pmRoot){return path.join(pmRoot,"runtime",BODY_CACHE_FILENAME)}function getCollectionsCachePath(pmRoot){return path.join(pmRoot,"runtime",COLLECTIONS_CACHE_FILENAME)}function getDeltaCachePath(pmRoot){return path.join(pmRoot,"runtime",DELTA_CACHE_FILENAME)}function getManifestCachePath(pmRoot){return path.join(pmRoot,"runtime",MANIFEST_CACHE_FILENAME)}function getContextCachePath(cachePath,contextFingerprint){const extension=path.extname(cachePath);return`${cachePath.slice(0,-extension.length)}.${contextFingerprint}${extension}`}const ENVELOPE_MEMO_MAX_ENTRIES=24,envelopeMemo=new Map,projectedBaseCursor=new WeakMap;function baseCursorFor(envelope){return projectedBaseCursor.get(envelope)??envelope.source_cursor}function applyMetadataDelta(envelope,delta){const baseCursor=baseCursorFor(envelope);if(!(delta.base_source_cursor!==baseCursor||envelope.source_cursor===delta.source_cursor)){projectedBaseCursor.set(envelope,baseCursor);for(const[relativePath,change]of Object.entries(delta.changes))change.entry?envelope.entries[relativePath]=change.entry:delete envelope.entries[relativePath];envelope.directory_signatures=delta.directory_signatures,envelope.source_cursor=delta.source_cursor}}function applyBodyDelta(envelope,delta){if(!envelope)return;const baseCursor=baseCursorFor(envelope);if(!(delta.base_source_cursor!==baseCursor||envelope.source_cursor===delta.source_cursor)){projectedBaseCursor.set(envelope,baseCursor);for(const[relativePath,change]of Object.entries(delta.changes))change.body?envelope.bodies[relativePath]=change.body:delete envelope.bodies[relativePath];envelope.source_cursor=delta.source_cursor}}function applyCollectionsDelta(envelope,delta){if(!envelope)return;const baseCursor=baseCursorFor(envelope);if(!(delta.base_source_cursor!==baseCursor||envelope.source_cursor===delta.source_cursor)){projectedBaseCursor.set(envelope,baseCursor);for(const[relativePath,change]of Object.entries(delta.changes))change.collections?envelope.collections[relativePath]=change.collections:delete envelope.collections[relativePath];envelope.source_cursor=delta.source_cursor}}function applyDerivedIndexDelta(metadata,bodies,collections,delta){!metadata||!delta||metadata.context_fingerprint!==delta.context_fingerprint||(applyMetadataDelta(metadata,delta),applyBodyDelta(bodies,delta),applyCollectionsDelta(collections,delta))}function memoizeEnvelope(cachePath,entry){envelopeMemo.size>=ENVELOPE_MEMO_MAX_ENTRIES&&!envelopeMemo.has(cachePath)&&evictOldestMemoEntries(envelopeMemo),envelopeMemo.set(cachePath,entry)}async function loadEnvelopeMemoized(cachePath,parse){let stat;try{stat=await fs.stat(cachePath)}catch{return envelopeMemo.delete(cachePath),null}const memoized=envelopeMemo.get(cachePath);if(memoized&&statMatches(memoized.signature,stat.mtimeMs,stat.ctimeMs,stat.size))return envelopeMemo.delete(cachePath),envelopeMemo.set(cachePath,memoized),memoized.envelope;let envelope;try{envelope=parse(await fs.readFile(cachePath,"utf8"))}catch{envelope=null}return memoizeEnvelope(cachePath,{signature:{mtime_ms:stat.mtimeMs,ctime_ms:stat.ctimeMs,size:stat.size},envelope}),envelope}function clearItemMetadataEnvelopeMemo(){envelopeMemo.clear()}async function loadCache(pmRoot,contextFingerprint,diagnostics){const parse=raw=>{const parsed=JSON.parse(raw);return parsed.version!==CACHE_VERSION||typeof parsed.source_cursor!="string"||typeof parsed.entries!="object"||parsed.entries===null?null:parsed},cachePath=getCachePath(pmRoot),active=await loadEnvelopeMemoized(cachePath,parse);if(!contextFingerprint||active===null||active.context_fingerprint===contextFingerprint)return active;const retained=await loadEnvelopeMemoized(getContextCachePath(cachePath,contextFingerprint),parse);return retained===null&&appendWarning(diagnostics,`metadata_cache_context_changed:${active.context_fingerprint}->${contextFingerprint}`),retained}async function loadBodyCache(pmRoot,contextFingerprint){const parse=raw=>{const parsed=JSON.parse(raw);return parsed.version!==CACHE_VERSION||typeof parsed.source_cursor!="string"||typeof parsed.bodies!="object"||parsed.bodies===null?null:parsed},cachePath=getBodyCachePath(pmRoot),active=await loadEnvelopeMemoized(cachePath,parse);return contextFingerprint&&active?.context_fingerprint!==contextFingerprint?await loadEnvelopeMemoized(getContextCachePath(cachePath,contextFingerprint),parse):active}async function loadCollectionsCache(pmRoot,contextFingerprint){const parse=raw=>{const parsed=JSON.parse(raw);return parsed.version!==CACHE_VERSION||typeof parsed.source_cursor!="string"||typeof parsed.collections!="object"||parsed.collections===null?null:parsed},cachePath=getCollectionsCachePath(pmRoot),active=await loadEnvelopeMemoized(cachePath,parse);return contextFingerprint&&active?.context_fingerprint!==contextFingerprint?await loadEnvelopeMemoized(getContextCachePath(cachePath,contextFingerprint),parse):active}async function loadDerivedIndexDelta(pmRoot){const deltaPath=getDeltaCachePath(pmRoot),envelope=await loadEnvelopeMemoized(deltaPath,raw=>{const parsed=JSON.parse(raw);return parsed.version!==CACHE_VERSION||typeof parsed.base_source_cursor!="string"||typeof parsed.source_cursor!="string"||typeof parsed.changes!="object"||parsed.changes===null?null:parsed});if(envelope)return{envelope,invalid:!1};try{return await fs.stat(deltaPath),{envelope:null,invalid:!0}}catch{return{envelope:null,invalid:!1}}}async function loadDerivedIndexManifest(pmRoot){const manifestPath=getManifestCachePath(pmRoot),manifest=await loadEnvelopeMemoized(manifestPath,raw=>{const parsed=JSON.parse(raw);return parsed.version!==CACHE_VERSION||typeof parsed.context_fingerprint!="string"||typeof parsed.source_cursor!="string"||!Number.isInteger(parsed.entry_count)||parsed.entry_count<0||typeof parsed.directory_signatures!="object"||parsed.directory_signatures===null?null:parsed});if(manifest)return manifest;try{await fs.stat(manifestPath),await removeDerivedIndexFiles(pmRoot)}catch{}return null}async function persistCache(cachePath,envelope){await fs.mkdir(path.dirname(cachePath),{recursive:!0}),await writeFileAtomic(cachePath,JSON.stringify(envelope));try{const stat=await fs.stat(cachePath);memoizeEnvelope(cachePath,{signature:{mtime_ms:stat.mtimeMs,ctime_ms:stat.ctimeMs,size:stat.size},envelope})}catch{envelopeMemo.delete(cachePath)}const pmRoot=path.dirname(path.dirname(cachePath));if(cachePath===getCachePath(pmRoot)||cachePath===getBodyCachePath(pmRoot)||cachePath===getCollectionsCachePath(pmRoot)){const contextPath=getContextCachePath(cachePath,envelope.context_fingerprint);await writeFileAtomic(contextPath,JSON.stringify(envelope));try{const contextStat=await fs.stat(contextPath);memoizeEnvelope(contextPath,{signature:{mtime_ms:contextStat.mtimeMs,ctime_ms:contextStat.ctimeMs,size:contextStat.size},envelope})}catch{envelopeMemo.delete(contextPath)}const directory=path.dirname(cachePath),extension=path.extname(cachePath),stem=path.basename(cachePath,extension),variants=(await fs.readdir(directory,{withFileTypes:!0}).catch(()=>[])).filter(entry=>entry.isFile()&&entry.name!==path.basename(cachePath)&&entry.name.startsWith(`${stem}.`)&&entry.name.endsWith(extension)).map(entry=>path.join(directory,entry.name));if(variants.length>MAX_CACHE_CONTEXTS){const byAge=(await Promise.all(variants.map(async variantPath=>{try{return{path:variantPath,mtime:(await fs.stat(variantPath)).mtimeMs}}catch{return null}}))).filter(entry=>entry!==null);for(const stale of byAge.sort((left,right)=>left.mtime-right.mtime).slice(0,Math.max(0,byAge.length-MAX_CACHE_CONTEXTS)))await fs.rm(stale.path,{force:!0}),envelopeMemo.delete(stale.path)}}}function shouldReplaceCachedDocumentCandidate(existingFormat,candidateFormat,preferredFormat){return preferredFormat?candidateFormat===preferredFormat&&existingFormat!==preferredFormat:candidateFormat==="toon"&&existingFormat!=="toon"}function shouldRecordCachedDocumentCandidate(existingFormat,candidateFormat,preferredFormat){return existingFormat===void 0||shouldReplaceCachedDocumentCandidate(existingFormat,candidateFormat,preferredFormat)}function appendWarning(warnings,warning){warnings&&!warnings.includes(warning)&&warnings.push(warning)}function statMatches(signature,mtimeMs,ctimeMs,size){return signature.mtime_ms===mtimeMs&&signature.ctime_ms===ctimeMs&&signature.size===size}async function readItemDirectoryFiles(pmRoot,folder,warnings){const dirPath=path.join(pmRoot,folder);try{const files=await fs.readdir(dirPath);return{folder,dirPath,files}}catch(error){return typeof error=="object"&&error!==null&&"code"in error&&!isFileMissingError(error)&&appendWarning(warnings,`item_list_directory_read_failed:${folder}`),{folder,dirPath,files:[]}}}async function readDirectorySignature(pmRoot,folder){try{const stat=await fs.stat(path.join(pmRoot,folder));return[folder,{exists:!0,mtime_ms:stat.mtimeMs,ctime_ms:stat.ctimeMs,size:stat.size}]}catch{return[folder,{exists:!1,mtime_ms:0,ctime_ms:0,size:0}]}}async function readDirectorySignatures(pmRoot,folders){return Object.fromEntries(await Promise.all(folders.map(async folder=>await readDirectorySignature(pmRoot,folder))))}function directorySignaturesMatch(left,right){return!left||Object.keys(left).length!==Object.keys(right).length?!1:Object.entries(right).every(([folder,signature])=>{const previous=left[folder];return previous!==void 0&&previous.exists===signature.exists&&statMatches(previous,signature.mtime_ms,signature.ctime_ms,signature.size)})}function isItemDocumentFile(file){return ITEM_FILE_EXTENSIONS.some(ext=>file.toLowerCase().endsWith(ext))}function markDocumentCacheMisses(misses,includeBody,includeCollections,metadataCached,bodyCached,collectionsCached){metadataCached||(misses.metadata=!0),includeBody&&!bodyCached&&(misses.body=!0),includeCollections&&!collectionsCached&&(misses.collections=!0)}async function dispatchCachedDocumentReadHooks(filePath,warnings,dispatchReadHooks){if(dispatchReadHooks)for(const warning of await runActiveOnReadHooks({path:filePath,scope:"project"}))appendWarning(warnings,warning)}function selectHeavyMetadata(includeCollections,collectionsCached,cachedCollections,parsedCollections){if(includeCollections)return collectionsCached&&cachedCollections?cachedCollections.collections:parsedCollections}async function readCachedDocumentParts(filePath,relativePath,context){const stat=await fs.stat(filePath),mtimeMs=stat.mtimeMs,ctimeMs=stat.ctimeMs,{size}=stat,itemFormat=getItemFormatFromPath(filePath);await dispatchCachedDocumentReadHooks(filePath,context.warnings,context.dispatchReadHooks);const cachedEntry=context.previousEntries[relativePath],metadataCached=!context.forceSourceRead&&cachedEntry!==void 0&&statMatches(cachedEntry,mtimeMs,ctimeMs,size),cachedBody=context.previousBodies[relativePath],bodyCached=!context.forceSourceRead&&cachedBody!==void 0&&statMatches(cachedBody,mtimeMs,ctimeMs,size),cachedCollections=context.previousCollections[relativePath],collectionsCached=!context.forceSourceRead&&cachedCollections!==void 0&&statMatches(cachedCollections,mtimeMs,ctimeMs,size);if(!(!metadataCached||context.includeBody&&!bodyCached||context.includeCollections&&!collectionsCached))return{mtimeMs,ctimeMs,size,itemFormat,lightMetadata:cachedEntry.metadata,heavyMetadata:selectHeavyMetadata(context.includeCollections,collectionsCached,cachedCollections,void 0),bodyLength:cachedEntry.body_length,body:context.includeBody?cachedBody.body:void 0};const raw=await fs.readFile(filePath,"utf8"),parsed=parseItemDocument(raw,{format:itemFormat,schema:context.schema,extensionFieldNames:context.extensionFieldNames,onWarning:warning=>appendWarning(context.warnings,warning)}),split=splitHeavyMetadata(parsed.metadata);return markDocumentCacheMisses(context.state.misses,context.includeBody,context.includeCollections,metadataCached,bodyCached,collectionsCached),{mtimeMs,ctimeMs,size,itemFormat,lightMetadata:metadataCached?cachedEntry.metadata:split.light,heavyMetadata:selectHeavyMetadata(context.includeCollections,collectionsCached,cachedCollections,split.heavy),bodyLength:metadataCached?cachedEntry.body_length:parsed.body.length,body:context.includeBody?parsed.body:void 0}}function recordCachedDocumentCandidate(filePath,relativePath,context,parts){context.state.newEntries[relativePath]={mtime_ms:parts.mtimeMs,ctime_ms:parts.ctimeMs,size:parts.size,metadata:parts.lightMetadata,body_length:parts.bodyLength},context.includeBody&&parts.body!==void 0&&(context.state.newBodies[relativePath]={mtime_ms:parts.mtimeMs,ctime_ms:parts.ctimeMs,size:parts.size,body:parts.body}),context.includeCollections&&parts.heavyMetadata!==void 0&&(context.state.newCollections[relativePath]={mtime_ms:parts.mtimeMs,ctime_ms:parts.ctimeMs,size:parts.size,collections:parts.heavyMetadata});const metadata=context.includeCollections?mergeHeavyMetadata(parts.lightMetadata,parts.heavyMetadata):parts.lightMetadata,existing=context.state.documentsById.get(metadata.id),candidate={metadata,body:parts.body,item_format:parts.itemFormat,item_path:filePath};shouldRecordCachedDocumentCandidate(existing?.itemFormat,parts.itemFormat,context.preferredFormat)&&context.state.documentsById.set(metadata.id,{candidate,itemFormat:parts.itemFormat})}async function processCachedDocumentFile(folder,filePath,relativePath,context){try{const parts=await readCachedDocumentParts(filePath,relativePath,context);recordCachedDocumentCandidate(filePath,relativePath,context,parts)}catch{appendWarning(context.warnings,`item_list_item_read_failed:${folder}/${path.basename(filePath)}`)}}function selectPreviousMetadataEntries(existingCache,contextFingerprint){return existingCache&&existingCache.context_fingerprint===contextFingerprint?existingCache.entries:{}}function selectPreviousBodyEntries(existingBodyCache,contextFingerprint){return existingBodyCache&&existingBodyCache.context_fingerprint===contextFingerprint?existingBodyCache.bodies:{}}function selectPreviousCollectionEntries(existingCollectionsCache,contextFingerprint){return existingCollectionsCache&&existingCollectionsCache.context_fingerprint===contextFingerprint?existingCollectionsCache.collections:{}}function createDocumentCacheMutableState(){return{newEntries:{},newBodies:{},newCollections:{},documentsById:new Map,misses:{metadata:!1,body:!1,collections:!1}}}async function processCachedDocumentFiles(dirResults,context){const parseTasks=[];for(const{folder,dirPath,files}of dirResults)for(const file of files){if(!isItemDocumentFile(file))continue;const filePath=path.join(dirPath,file),relativePath=path.relative(context.pmRoot,filePath);parseTasks.push(processCachedDocumentFile(folder,filePath,relativePath,context)),parseTasks.length===32&&(await Promise.all(parseTasks),parseTasks.length=0)}await Promise.all(parseTasks)}async function persistMetadataCacheIfNeeded(params){if(!(!(params.state.misses.metadata||Object.keys(params.previousEntries).length!==Object.keys(params.state.newEntries).length||!directorySignaturesMatch(params.existingCache?.directory_signatures,params.directorySignatures))&&params.existingCache!==null&&params.existingCache.context_fingerprint===params.contextFingerprint))try{await persistCache(getCachePath(params.pmRoot),{version:CACHE_VERSION,context_fingerprint:params.contextFingerprint,source_cursor:params.sourceCursor,directory_signatures:params.directorySignatures,entries:params.state.newEntries}),await persistCache(getManifestCachePath(params.pmRoot),{version:CACHE_VERSION,context_fingerprint:params.contextFingerprint,source_cursor:params.sourceCursor,entry_count:Object.keys(params.state.newEntries).length,directory_signatures:params.directorySignatures});const rows=[...params.state.documentsById.values()].map(({candidate})=>({relativePath:path.relative(params.pmRoot,candidate.item_path),metadata:splitHeavyMetadata(candidate.metadata).light,linkedFiles:candidate.metadata.files??[]}));rows.length>=params.minimumIndexedItems?await rebuildItemMetadataQueryIndex({pmRoot:params.pmRoot,contextFingerprint:params.contextFingerprint,sourceCursor:params.sourceCursor,rows}):await removeItemMetadataQueryIndex(params.pmRoot)}catch{}}async function persistBodyCacheIfNeeded(params){!(params.state.misses.body||Object.keys(params.previousBodies).length!==Object.keys(params.state.newBodies).length)&&params.existingBodyCache!==null&&params.existingBodyCache.context_fingerprint===params.contextFingerprint||await persistCache(getBodyCachePath(params.pmRoot),{version:CACHE_VERSION,context_fingerprint:params.contextFingerprint,source_cursor:params.sourceCursor,bodies:params.state.newBodies}).catch(()=>{})}async function persistCollectionsCacheIfNeeded(params){!(params.state.misses.collections||Object.keys(params.previousCollections).length!==Object.keys(params.state.newCollections).length)&&params.existingCollectionsCache!==null&&params.existingCollectionsCache.context_fingerprint===params.contextFingerprint||await persistCache(getCollectionsCachePath(params.pmRoot),{version:CACHE_VERSION,context_fingerprint:params.contextFingerprint,source_cursor:params.sourceCursor,collections:params.state.newCollections}).catch(()=>{})}async function acquireItemMetadataDerivedIndexLock(pmRoot,author,options={}){const cache=await loadDerivedIndexManifest(pmRoot);return options.required!==!0&&(cache===null||cache.entry_count<DEFAULT_DERIVED_INDEX_MINIMUM_ITEMS)?async()=>{}:acquireLock(pmRoot,DERIVED_INDEX_LOCK_ID,30,author,!1,!1,3e3)}async function readItemMetadataDerivedIndexState(pmRoot,folders){const manifest=await loadDerivedIndexManifest(pmRoot);if(manifest===null)return null;const delta=await loadDerivedIndexDelta(pmRoot);if(delta.invalid)return await removeDerivedIndexFiles(pmRoot),null;const effectiveCursor=delta.envelope?.context_fingerprint===manifest.context_fingerprint&&delta.envelope.base_source_cursor===manifest.source_cursor?delta.envelope.source_cursor:manifest.source_cursor,effectiveDirectorySignatures=delta.envelope?.context_fingerprint===manifest.context_fingerprint&&delta.envelope.base_source_cursor===manifest.source_cursor?delta.envelope.directory_signatures:manifest.directory_signatures;return folders&&!directorySignaturesMatch(effectiveDirectorySignatures,await readDirectorySignatures(pmRoot,folders))?null:{source_cursor:effectiveCursor,entry_count:manifest.entry_count}}function relativeIndexPath(pmRoot,itemPath){const relative=path.relative(pmRoot,itemPath);return relative===""||relative===".."||relative.startsWith(`..${path.sep}`)||path.isAbsolute(relative)?null:relative}async function removeDerivedIndexFiles(pmRoot){await Promise.all([getCachePath(pmRoot),getBodyCachePath(pmRoot),getCollectionsCachePath(pmRoot),getDeltaCachePath(pmRoot),getManifestCachePath(pmRoot)].map(async cachePath=>{await fs.rm(cachePath,{force:!0}),envelopeMemo.delete(cachePath)})),await removeItemMetadataQueryIndex(pmRoot)}async function createDerivedIndexDeltaChange(params){if(params.mutation.document===null)return{entry:null,body:null,collections:null};const stat=await fs.stat(params.mutation.itemPath),split=splitHeavyMetadata(params.mutation.document.metadata),signature={mtime_ms:stat.mtimeMs,ctime_ms:stat.ctimeMs,size:stat.size};return{entry:{...signature,metadata:split.light,body_length:params.mutation.document.body.length},body:{...signature,body:params.mutation.document.body},collections:{...signature,collections:split.heavy}}}function selectDerivedIndexDeltaChanges(delta,contextFingerprint,baseSourceCursor){return delta?.context_fingerprint===contextFingerprint&&delta.base_source_cursor===baseSourceCursor?structuredClone(delta.changes):{}}async function refreshItemMetadataDerivedIndex(mutation){const relativePath=relativeIndexPath(mutation.pmRoot,mutation.itemPath),previousRelativePath=mutation.previousItemPath?relativeIndexPath(mutation.pmRoot,mutation.previousItemPath):void 0;if(relativePath===null||previousRelativePath===null)return await removeDerivedIndexFiles(mutation.pmRoot),["metadata_derived_index_path_invalidated"];try{const contextFingerprint=computeContextFingerprint(mutation.preferredFormat,mutation.typeToFolder,mutation.schema,resolveActiveExtensionFieldNames()),existingCache=await loadDerivedIndexManifest(mutation.pmRoot);if(existingCache===null||existingCache.context_fingerprint!==contextFingerprint)return[];const baseSourceCursor=existingCache.source_cursor,delta=await loadDerivedIndexDelta(mutation.pmRoot);if(delta.invalid)return await removeDerivedIndexFiles(mutation.pmRoot),["metadata_derived_index_refresh_failed"];const changes=selectDerivedIndexDeltaChanges(delta.envelope,contextFingerprint,baseSourceCursor),expectedSourceCursor=delta.envelope?.context_fingerprint===contextFingerprint&&delta.envelope.base_source_cursor===baseSourceCursor?delta.envelope.source_cursor:baseSourceCursor;previousRelativePath!==void 0&&(changes[previousRelativePath]={entry:null,body:null,collections:null}),changes[relativePath]=await createDerivedIndexDeltaChange({mutation});const sourceCursor=randomUUID();return await persistCache(getDeltaCachePath(mutation.pmRoot),{version:CACHE_VERSION,context_fingerprint:contextFingerprint,base_source_cursor:baseSourceCursor,source_cursor:sourceCursor,directory_signatures:await readDirectorySignatures(mutation.pmRoot,[...new Set(Object.values(mutation.typeToFolder))]),changes}),await updateItemMetadataQueryIndex({pmRoot:mutation.pmRoot,contextFingerprint,expectedSourceCursor,sourceCursor,row:mutation.document===null?null:{relativePath,metadata:splitHeavyMetadata(mutation.document.metadata).light,linkedFiles:mutation.document.metadata.files},deletedRelativePaths:[...previousRelativePath===void 0?[]:[previousRelativePath],...mutation.document===null?[relativePath]:[]]})||await removeItemMetadataQueryIndex(mutation.pmRoot),[]}catch{return await removeDerivedIndexFiles(mutation.pmRoot).catch(()=>{}),["metadata_derived_index_refresh_failed"]}}function sortedCachedDocumentCandidates(state){return[...state.documentsById.values()].sort((left,right)=>left.candidate.metadata.id.localeCompare(right.candidate.metadata.id)).map(entry=>entry.candidate)}function cacheTierMatchesContext(envelope,contextFingerprint,sourceCursor){return envelope?.context_fingerprint===contextFingerprint&&envelope.source_cursor===sourceCursor}function hasEveryDerivedIndexPart(keys,includeBody,includeCollections,previousBodies,previousCollections){return keys.every(key=>(!includeBody||previousBodies[key]!==void 0)&&(!includeCollections||previousCollections[key]!==void 0))}function candidatesFromDerivedIndex(params){const candidatesById=new Map;for(const[relativePath,entry]of Object.entries(params.previousEntries)){const itemFormat=getItemFormatFromPath(relativePath);if(!itemFormat)continue;const metadata=params.includeCollections?mergeHeavyMetadata(entry.metadata,params.previousCollections[relativePath]?.collections):entry.metadata,existing=candidatesById.get(metadata.id);shouldRecordCachedDocumentCandidate(existing?.itemFormat,itemFormat,params.preferredFormat)&&candidatesById.set(metadata.id,{itemFormat,candidate:{metadata,body:params.includeBody?params.previousBodies[relativePath]?.body:void 0,item_format:itemFormat,item_path:path.join(params.pmRoot,relativePath)}})}return[...candidatesById.values()].sort((left,right)=>left.candidate.metadata.id.localeCompare(right.candidate.metadata.id)).map(entry=>entry.candidate)}function canUseDerivedIndex(params){return params.forceSourceScan||hasActiveOnReadHooks()||params.existingCache?.context_fingerprint!==params.contextFingerprint||params.entryKeys.length<params.minimumIndexedItems||!directorySignaturesMatch(params.existingCache?.directory_signatures,params.directorySignatures)?!1:[!params.includeBody||cacheTierMatchesContext(params.existingBodyCache,params.contextFingerprint,params.existingCache.source_cursor),!params.includeCollections||cacheTierMatchesContext(params.existingCollectionsCache,params.contextFingerprint,params.existingCache.source_cursor)].every(Boolean)&&hasEveryDerivedIndexPart(params.entryKeys,params.includeBody,params.includeCollections,params.previousBodies,params.previousCollections)}async function listAllDocumentCandidatesCached(pmRoot,preferredFormat,typeToFolder,warnings,schema,options={}){const includeBody=options.includeBody!==!1,includeCollections=options.includeCollections!==!1,extensionFieldNames=resolveActiveExtensionFieldNames(),contextFingerprint=computeContextFingerprint(preferredFormat,typeToFolder,schema,extensionFieldNames),delta=await loadDerivedIndexDelta(pmRoot);delta.invalid&&await removeDerivedIndexFiles(pmRoot);const existingCache=await loadCache(pmRoot,contextFingerprint,options.cacheDiagnostics),existingBodyCache=includeBody?await loadBodyCache(pmRoot,contextFingerprint):null,existingCollectionsCache=includeCollections?await loadCollectionsCache(pmRoot,contextFingerprint):null;applyDerivedIndexDelta(existingCache,existingBodyCache,existingCollectionsCache,delta.envelope);const previousEntries=selectPreviousMetadataEntries(existingCache,contextFingerprint),previousBodies=selectPreviousBodyEntries(existingBodyCache,contextFingerprint),previousCollections=selectPreviousCollectionEntries(existingCollectionsCache,contextFingerprint),folders=[...new Set(Object.values(typeToFolder))],directorySignaturesBefore=await readDirectorySignatures(pmRoot,folders),entryKeys=Object.keys(previousEntries),minimumIndexedItems=Math.max(1,Math.floor(options.derivedIndexMinimumItems??DEFAULT_DERIVED_INDEX_MINIMUM_ITEMS));if(canUseDerivedIndex({forceSourceScan:options.forceSourceScan===!0,contextFingerprint,existingCache,existingBodyCache,existingCollectionsCache,directorySignatures:directorySignaturesBefore,entryKeys,minimumIndexedItems,includeBody,includeCollections,previousBodies,previousCollections}))return candidatesFromDerivedIndex({pmRoot,preferredFormat,includeBody,includeCollections,previousEntries,previousBodies,previousCollections});const dirResults=await Promise.all(folders.map(folder=>readItemDirectoryFiles(pmRoot,folder,warnings))),dispatchReadHooks=hasActiveOnReadHooks(),state=createDocumentCacheMutableState(),context={pmRoot,preferredFormat,warnings,schema,extensionFieldNames,includeBody,includeCollections,forceSourceRead:options.forceSourceScan===!0,dispatchReadHooks,previousEntries,previousBodies,previousCollections,state};await processCachedDocumentFiles(dirResults,context);const directorySignaturesAfter=await readDirectorySignatures(pmRoot,folders),stableDirectorySignatures=directorySignaturesMatch(directorySignaturesBefore,directorySignaturesAfter)?directorySignaturesAfter:{},sourceCursor=state.misses.metadata||Object.keys(previousEntries).length!==Object.keys(state.newEntries).length||!directorySignaturesMatch(existingCache?.directory_signatures,stableDirectorySignatures)||existingCache===null?randomUUID():existingCache.source_cursor;return await persistMetadataCacheIfNeeded({pmRoot,contextFingerprint,sourceCursor,existingCache,previousEntries,directorySignatures:stableDirectorySignatures,state,minimumIndexedItems}),includeBody&&await persistBodyCacheIfNeeded({pmRoot,contextFingerprint,sourceCursor,existingBodyCache,previousBodies,state}),includeCollections&&await persistCollectionsCacheIfNeeded({pmRoot,contextFingerprint,sourceCursor,existingCollectionsCache,previousCollections,state}),sortedCachedDocumentCandidates(state)}async function listAllDocumentsCached(pmRoot,preferredFormat,typeToFolder,warnings,schema){return(await listAllDocumentCandidatesCached(pmRoot,preferredFormat,typeToFolder,warnings,schema,{includeBody:!1})).map(candidate=>({metadata:candidate.metadata,body:candidate.body??""}))}async function listAllDocumentsCachedLight(pmRoot,preferredFormat,typeToFolder,warnings,schema){return(await listAllDocumentCandidatesCached(pmRoot,preferredFormat,typeToFolder,warnings,schema,{includeBody:!1,includeCollections:!1})).map(candidate=>({metadata:candidate.metadata,body:candidate.body??""}))}export{DEFAULT_DERIVED_INDEX_MINIMUM_ITEMS,HEAVY_METADATA_KEYS,acquireItemMetadataDerivedIndexLock,clearItemMetadataEnvelopeMemo,listAllDocumentCandidatesCached,listAllDocumentsCached,listAllDocumentsCachedLight,readItemMetadataDerivedIndexState,refreshItemMetadataDerivedIndex,shouldRecordCachedDocumentCandidate,shouldReplaceCachedDocumentCandidate};
2
2
  //# sourceMappingURL=item-metadata-cache.js.map
@@ -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]="e9e67ec7-10cb-57b0-a094-ae52b01a0f8a")}catch(e2){}})();import fs from"node:fs/promises";import path from"node:path";import{randomUUID}from"node:crypto";import{createRequire}from"node:module";const QUERY_INDEX_FILENAME="metadata-query-index.sqlite";const QUERY_INDEX_VERSION="5";function loadDatabaseSync(loadModule){try{const loaded=loadModule(["node","sqlite"].join(":"));return loaded.DatabaseSync??null}catch{return null}}let RuntimeDatabaseSync;function loadStableDatabaseSync(nodeVersion,loadModule){const nodeMajor=Number.parseInt(nodeVersion,10);return Number.isFinite(nodeMajor)&&nodeMajor>=22?loadDatabaseSync(loadModule):null}function resolveDatabaseSync(){if(RuntimeDatabaseSync!==void 0)return RuntimeDatabaseSync;RuntimeDatabaseSync=loadStableDatabaseSync(process.versions.node,createRequire(import.meta.url));return RuntimeDatabaseSync}function normalizeIndexWindowValue(value,fallback){return Math.max(0,Math.floor(value===void 0?fallback:value))}function queryIndexPath(pmRoot){return path.join(pmRoot,"runtime",QUERY_INDEX_FILENAME)}function createSchema(database){database.exec(`
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e10ab0c5-e777-5364-b7fb-464e42400ab2")}catch{}})();import fs from"node:fs/promises";import path from"node:path";import{randomUUID}from"node:crypto";import{createRequire}from"node:module";const QUERY_INDEX_FILENAME="metadata-query-index.sqlite",QUERY_INDEX_VERSION="5";function loadDatabaseSync(loadModule){try{return loadModule(["node","sqlite"].join(":")).DatabaseSync??null}catch{return null}}let RuntimeDatabaseSync;function loadStableDatabaseSync(nodeVersion,loadModule){const nodeMajor=Number.parseInt(nodeVersion,10);return Number.isFinite(nodeMajor)&&nodeMajor>=22?loadDatabaseSync(loadModule):null}function resolveDatabaseSync(){return RuntimeDatabaseSync!==void 0||(RuntimeDatabaseSync=loadStableDatabaseSync(process.versions.node,createRequire(import.meta.url))),RuntimeDatabaseSync}function normalizeIndexWindowValue(value,fallback){return Math.max(0,Math.floor(value===void 0?fallback:value))}function queryIndexPath(pmRoot){return path.join(pmRoot,"runtime",QUERY_INDEX_FILENAME)}function createSchema(database){database.exec(`
2
2
  PRAGMA foreign_keys = ON;
3
3
  PRAGMA journal_mode = OFF;
4
4
  PRAGMA synchronous = OFF;
@@ -68,24 +68,24 @@
68
68
  parent = excluded.parent,
69
69
  assignee = excluded.assignee,
70
70
  sprint = excluded.sprint,
71
- release = excluded.release`).run(metadata.id,row.relativePath,JSON.stringify(metadata),metadata.status,metadata.type,metadata.priority,metadata.updated_at,metadata.created_at,metadata.parent??null,metadata.assignee??null,metadata.sprint??null,metadata.release??null);database.prepare("DELETE FROM item_metadata_keys WHERE item_id = ?").run(metadata.id);database.prepare("DELETE FROM item_linked_files WHERE item_id = ?").run(metadata.id);database.prepare("DELETE FROM item_search WHERE rowid = (SELECT rowid FROM items WHERE id = ?)").run(metadata.id);database.prepare("INSERT INTO item_search(rowid, id, title, description, tags) SELECT rowid, ?, ?, ?, ? FROM items WHERE id = ?").run(metadata.id,metadata.title,metadata.description,metadata.tags.join(" "),metadata.id);const insertMetadataKey=database.prepare("INSERT INTO item_metadata_keys(item_id, key) VALUES (?, ?)");for(const key of Object.keys(metadata)){insertMetadataKey.run(metadata.id,key)}const insertLinkedFile=database.prepare("INSERT INTO item_linked_files(item_id, path, scope, note) VALUES (?, ?, ?, ?)");for(const file of row.linkedFiles??[]){insertLinkedFile.run(metadata.id,file.path,file.scope,file.note??null)}}async function rebuildItemMetadataQueryIndex(options){const targetPath=queryIndexPath(options.pmRoot);const Database=resolveDatabaseSync();if(!Database){await fs.rm(targetPath,{force:true});return}await fs.mkdir(path.dirname(targetPath),{recursive:true});const temporaryPath=`${targetPath}.${randomUUID()}.tmp`;let database;try{database=new Database(temporaryPath);createSchema(database);database.exec("BEGIN IMMEDIATE");writeMetadata(database,"version",QUERY_INDEX_VERSION);writeMetadata(database,"context_fingerprint",options.contextFingerprint);writeMetadata(database,"source_cursor",options.sourceCursor);for(const row of options.rows)insertRow(database,row);database.exec("COMMIT");database.close();database=void 0;await fs.rm(targetPath,{force:true});await fs.rename(temporaryPath,targetPath)}catch(error){database?.close();await Promise.allSettled([fs.rm(temporaryPath,{force:true})]);throw error}}function readIndexMetadata(database){return Object.fromEntries(database.prepare("SELECT key, value FROM metadata").all().map(row=>[String(row.key),String(row.value)]))}async function updateItemMetadataQueryIndex(options){const Database=resolveDatabaseSync();if(!Database)return false;const indexPath=queryIndexPath(options.pmRoot);let database;try{await fs.access(indexPath);database=new Database(indexPath);database.exec("PRAGMA foreign_keys = ON");const metadata=readIndexMetadata(database);if(metadata.version!==QUERY_INDEX_VERSION||metadata.context_fingerprint!==options.contextFingerprint||metadata.source_cursor!==options.expectedSourceCursor){database.close();return false}database.exec("BEGIN IMMEDIATE");const deleteByPath=database.prepare("DELETE FROM items WHERE relative_path = ?");const findRowidByPath=database.prepare("SELECT rowid FROM items WHERE relative_path = ?");const deleteSearchByRowid=database.prepare("DELETE FROM item_search WHERE rowid = ?");for(const relativePath of options.deletedRelativePaths??[]){const deleted=findRowidByPath.get(relativePath);deleteByPath.run(relativePath);if(deleted)deleteSearchByRowid.run(deleted.rowid)}if(options.row)insertRow(database,options.row);writeMetadata(database,"source_cursor",options.sourceCursor);database.exec("COMMIT");database.close();return true}catch{try{database?.exec("ROLLBACK")}catch{}database?.close();return false}}function appendSetPredicate(clauses,parameters,column,values,operator){if(!values||values.length===0)return;clauses.push(`${column} ${operator} (${values.map(()=>"?").join(", ")})`);parameters.push(...values)}function buildQueryPredicates(query){const clauses=[];const parameters=[];appendSetPredicate(clauses,parameters,"status",query.statuses,"IN");appendSetPredicate(clauses,parameters,"status",query.excludeStatuses,"NOT IN");appendSetPredicate(clauses,parameters,"type",query.types,"IN");appendSetPredicate(clauses,parameters,"id",query.ids,"IN");for(const metadataKey of query.metadataKeys??[]){clauses.push("EXISTS (SELECT 1 FROM item_metadata_keys AS indexed_key WHERE indexed_key.item_id = items.id AND indexed_key.key = ?)");parameters.push(metadataKey)}for(const[column,value]of[["parent",query.parent],["assignee",query.assignee],["sprint",query.sprint],["release",query.release]]){if(value!==void 0){clauses.push(`${column} = ?`);parameters.push(value)}}if(query.priority!==void 0){clauses.push("priority = ?");parameters.push(query.priority)}return{where:clauses.length===0?"":` WHERE ${clauses.join(" AND ")}`,parameters}}async function queryItemMetadataIndex(options){const Database=resolveDatabaseSync();if(!Database)return null;const query=options.query??{};const{where,parameters}=buildQueryPredicates(query);let database;try{database=new Database(queryIndexPath(options.pmRoot),{readOnly:true});const metadata=readIndexMetadata(database);if(metadata.version!==QUERY_INDEX_VERSION||metadata.source_cursor!==options.expectedSourceCursor){database.close();return null}const totalRow=database.prepare(`SELECT COUNT(*) AS count FROM items${where}`).get(...parameters);const windowParameters=[];let window2="";if(query.limit!==void 0){window2+=" LIMIT ?";windowParameters.push(Math.max(0,Math.floor(query.limit)));if(query.offset!==void 0){window2+=" OFFSET ?";windowParameters.push(Math.max(0,Math.floor(query.offset)))}}else if(query.offset!==void 0){window2+=" LIMIT -1 OFFSET ?";windowParameters.push(Math.max(0,Math.floor(query.offset)))}const rows=database.prepare(`SELECT metadata_json FROM items${where}
72
- ORDER BY ${query.terminalStatuses&&query.terminalStatuses.length>0?`CASE WHEN status IN (${query.terminalStatuses.map(()=>"?").join(", ")}) THEN 1 ELSE 0 END ASC, `:""}priority ASC, updated_at DESC, id ASC${window2}`).all(...parameters,...query.terminalStatuses??[],...windowParameters);const items=rows.map(row=>{const parsed=JSON.parse(String(row.metadata_json));if(!parsed.id)throw new TypeError("Indexed metadata row has no id");return parsed});database.close();return{source_cursor:metadata.source_cursor,total:Number(totalRow.count),items}}catch{database?.close();return null}}async function queryLinkedFileMetadataIndex(options){const Database=resolveDatabaseSync();if(!Database||options.paths.length===0)return null;let database;try{database=new Database(queryIndexPath(options.pmRoot),{readOnly:true});const metadata=readIndexMetadata(database);if(metadata.version!==QUERY_INDEX_VERSION||metadata.source_cursor!==options.expectedSourceCursor){database.close();return null}const pathPlaceholders=options.paths.map(()=>"?").join(", ");const scopePredicate=options.scope===void 0?"":" AND scope = ?";const matchParameters=[...options.paths,...options.scope===void 0?[]:[options.scope]];const predicate=`path IN (${pathPlaceholders})${scopePredicate}`;const totalRow=database.prepare(`SELECT COUNT(DISTINCT item_id) AS count
71
+ release = excluded.release`).run(metadata.id,row.relativePath,JSON.stringify(metadata),metadata.status,metadata.type,metadata.priority,metadata.updated_at,metadata.created_at,metadata.parent??null,metadata.assignee??null,metadata.sprint??null,metadata.release??null),database.prepare("DELETE FROM item_metadata_keys WHERE item_id = ?").run(metadata.id),database.prepare("DELETE FROM item_linked_files WHERE item_id = ?").run(metadata.id),database.prepare("DELETE FROM item_search WHERE rowid = (SELECT rowid FROM items WHERE id = ?)").run(metadata.id),database.prepare("INSERT INTO item_search(rowid, id, title, description, tags) SELECT rowid, ?, ?, ?, ? FROM items WHERE id = ?").run(metadata.id,metadata.title,metadata.description,metadata.tags.join(" "),metadata.id);const insertMetadataKey=database.prepare("INSERT INTO item_metadata_keys(item_id, key) VALUES (?, ?)");for(const key of Object.keys(metadata))insertMetadataKey.run(metadata.id,key);const insertLinkedFile=database.prepare("INSERT INTO item_linked_files(item_id, path, scope, note) VALUES (?, ?, ?, ?)");for(const file of row.linkedFiles??[])insertLinkedFile.run(metadata.id,file.path,file.scope,file.note??null)}async function rebuildItemMetadataQueryIndex(options){const targetPath=queryIndexPath(options.pmRoot),Database=resolveDatabaseSync();if(!Database){await fs.rm(targetPath,{force:!0});return}await fs.mkdir(path.dirname(targetPath),{recursive:!0});const temporaryPath=`${targetPath}.${randomUUID()}.tmp`;let database;try{database=new Database(temporaryPath),createSchema(database),database.exec("BEGIN IMMEDIATE"),writeMetadata(database,"version",QUERY_INDEX_VERSION),writeMetadata(database,"context_fingerprint",options.contextFingerprint),writeMetadata(database,"source_cursor",options.sourceCursor);for(const row of options.rows)insertRow(database,row);database.exec("COMMIT"),database.close(),database=void 0,await fs.rm(targetPath,{force:!0}),await fs.rename(temporaryPath,targetPath)}catch(error){throw database?.close(),await Promise.allSettled([fs.rm(temporaryPath,{force:!0})]),error}}function readIndexMetadata(database){return Object.fromEntries(database.prepare("SELECT key, value FROM metadata").all().map(row=>[String(row.key),String(row.value)]))}async function updateItemMetadataQueryIndex(options){const Database=resolveDatabaseSync();if(!Database)return!1;const indexPath=queryIndexPath(options.pmRoot);let database;try{await fs.access(indexPath),database=new Database(indexPath),database.exec("PRAGMA foreign_keys = ON");const metadata=readIndexMetadata(database);if(metadata.version!==QUERY_INDEX_VERSION||metadata.context_fingerprint!==options.contextFingerprint||metadata.source_cursor!==options.expectedSourceCursor)return database.close(),!1;database.exec("BEGIN IMMEDIATE");const deleteByPath=database.prepare("DELETE FROM items WHERE relative_path = ?"),findRowidByPath=database.prepare("SELECT rowid FROM items WHERE relative_path = ?"),deleteSearchByRowid=database.prepare("DELETE FROM item_search WHERE rowid = ?");for(const relativePath of options.deletedRelativePaths??[]){const deleted=findRowidByPath.get(relativePath);deleteByPath.run(relativePath),deleted&&deleteSearchByRowid.run(deleted.rowid)}return options.row&&insertRow(database,options.row),writeMetadata(database,"source_cursor",options.sourceCursor),database.exec("COMMIT"),database.close(),!0}catch{try{database?.exec("ROLLBACK")}catch{}return database?.close(),!1}}function appendSetPredicate(clauses,parameters,column,values,operator){!values||values.length===0||(clauses.push(`${column} ${operator} (${values.map(()=>"?").join(", ")})`),parameters.push(...values))}function buildQueryPredicates(query){const clauses=[],parameters=[];appendSetPredicate(clauses,parameters,"status",query.statuses,"IN"),appendSetPredicate(clauses,parameters,"status",query.excludeStatuses,"NOT IN"),appendSetPredicate(clauses,parameters,"type",query.types,"IN"),appendSetPredicate(clauses,parameters,"id",query.ids,"IN");for(const metadataKey of query.metadataKeys??[])clauses.push("EXISTS (SELECT 1 FROM item_metadata_keys AS indexed_key WHERE indexed_key.item_id = items.id AND indexed_key.key = ?)"),parameters.push(metadataKey);for(const[column,value]of[["parent",query.parent],["assignee",query.assignee],["sprint",query.sprint],["release",query.release]])value!==void 0&&(clauses.push(`${column} = ?`),parameters.push(value));return query.priority!==void 0&&(clauses.push("priority = ?"),parameters.push(query.priority)),{where:clauses.length===0?"":` WHERE ${clauses.join(" AND ")}`,parameters}}async function queryItemMetadataIndex(options){const Database=resolveDatabaseSync();if(!Database)return null;const query=options.query??{},{where,parameters}=buildQueryPredicates(query);let database;try{database=new Database(queryIndexPath(options.pmRoot),{readOnly:!0});const metadata=readIndexMetadata(database);if(metadata.version!==QUERY_INDEX_VERSION||metadata.source_cursor!==options.expectedSourceCursor)return database.close(),null;const totalRow=database.prepare(`SELECT COUNT(*) AS count FROM items${where}`).get(...parameters),windowParameters=[];let window2="";query.limit!==void 0?(window2+=" LIMIT ?",windowParameters.push(Math.max(0,Math.floor(query.limit))),query.offset!==void 0&&(window2+=" OFFSET ?",windowParameters.push(Math.max(0,Math.floor(query.offset))))):query.offset!==void 0&&(window2+=" LIMIT -1 OFFSET ?",windowParameters.push(Math.max(0,Math.floor(query.offset))));const items=database.prepare(`SELECT metadata_json FROM items${where}
72
+ ORDER BY ${query.terminalStatuses&&query.terminalStatuses.length>0?`CASE WHEN status IN (${query.terminalStatuses.map(()=>"?").join(", ")}) THEN 1 ELSE 0 END ASC, `:""}priority ASC, updated_at DESC, id ASC${window2}`).all(...parameters,...query.terminalStatuses??[],...windowParameters).map(row=>{const parsed=JSON.parse(String(row.metadata_json));if(!parsed.id)throw new TypeError("Indexed metadata row has no id");return parsed});return database.close(),{source_cursor:metadata.source_cursor,total:Number(totalRow.count),items}}catch{return database?.close(),null}}async function queryLinkedFileMetadataIndex(options){const Database=resolveDatabaseSync();if(!Database||options.paths.length===0)return null;let database;try{database=new Database(queryIndexPath(options.pmRoot),{readOnly:!0});const metadata=readIndexMetadata(database);if(metadata.version!==QUERY_INDEX_VERSION||metadata.source_cursor!==options.expectedSourceCursor)return database.close(),null;const pathPlaceholders=options.paths.map(()=>"?").join(", "),scopePredicate=options.scope===void 0?"":" AND scope = ?",matchParameters=[...options.paths,...options.scope===void 0?[]:[options.scope]],predicate=`path IN (${pathPlaceholders})${scopePredicate}`,totalRow=database.prepare(`SELECT COUNT(DISTINCT item_id) AS count
73
73
  FROM item_linked_files
74
- WHERE ${predicate}`).get(...matchParameters);const limit=normalizeIndexWindowValue(options.limit,50);const offset=normalizeIndexWindowValue(options.offset,0);const itemRows=database.prepare(`SELECT items.id, items.metadata_json
74
+ WHERE ${predicate}`).get(...matchParameters),limit=normalizeIndexWindowValue(options.limit,50),offset=normalizeIndexWindowValue(options.offset,0),itemRows=database.prepare(`SELECT items.id, items.metadata_json
75
75
  FROM items
76
76
  WHERE EXISTS (
77
77
  SELECT 1 FROM item_linked_files
78
78
  WHERE item_linked_files.item_id = items.id AND ${predicate}
79
79
  )
80
80
  ORDER BY items.priority ASC, items.updated_at DESC, items.id ASC
81
- LIMIT ? OFFSET ?`).all(...matchParameters,limit,offset);const matches=[];if(itemRows.length>0){const itemIds=itemRows.map(row=>String(row.id));const linkedRows=database.prepare(`SELECT item_id, path, scope, note
81
+ LIMIT ? OFFSET ?`).all(...matchParameters,limit,offset),matches=[];if(itemRows.length>0){const itemIds=itemRows.map(row=>String(row.id)),linkedRows=database.prepare(`SELECT item_id, path, scope, note
82
82
  FROM item_linked_files
83
83
  WHERE item_id IN (${itemIds.map(()=>"?").join(", ")})
84
84
  AND ${predicate}
85
- ORDER BY path ASC, scope ASC`).all(...itemIds,...matchParameters);const filesByItem=new Map(itemIds.map(itemId=>[itemId,[]]));for(const row of linkedRows){const itemId=String(row.item_id);const files=filesByItem.get(itemId);files.push({path:String(row.path),scope:String(row.scope),...row.note===null?{}:{note:String(row.note)}});filesByItem.set(itemId,files)}for(const row of itemRows){const item=JSON.parse(String(row.metadata_json));matches.push({item,files:filesByItem.get(String(row.id))})}}database.close();return{source_cursor:metadata.source_cursor,total:Number(totalRow.count),matches}}catch{database?.close();return null}}async function querySimilarItemMetadataIndex(options){const Database=resolveDatabaseSync();if(!Database)return null;let database;try{database=new Database(queryIndexPath(options.pmRoot),{readOnly:true});const metadata=readIndexMetadata(database);if(metadata.version!==QUERY_INDEX_VERSION||metadata.source_cursor!==options.expectedSourceCursor){database.close();return null}const rows=database.prepare(`SELECT items.metadata_json
85
+ ORDER BY path ASC, scope ASC`).all(...itemIds,...matchParameters),filesByItem=new Map(itemIds.map(itemId=>[itemId,[]]));for(const row of linkedRows){const itemId=String(row.item_id),files=filesByItem.get(itemId);files.push({path:String(row.path),scope:String(row.scope),...row.note===null?{}:{note:String(row.note)}}),filesByItem.set(itemId,files)}for(const row of itemRows){const item=JSON.parse(String(row.metadata_json));matches.push({item,files:filesByItem.get(String(row.id))})}}return database.close(),{source_cursor:metadata.source_cursor,total:Number(totalRow.count),matches}}catch{return database?.close(),null}}async function querySimilarItemMetadataIndex(options){const Database=resolveDatabaseSync();if(!Database)return null;let database;try{database=new Database(queryIndexPath(options.pmRoot),{readOnly:!0});const metadata=readIndexMetadata(database);if(metadata.version!==QUERY_INDEX_VERSION||metadata.source_cursor!==options.expectedSourceCursor)return database.close(),null;const items=database.prepare(`SELECT items.metadata_json
86
86
  FROM item_search
87
87
  JOIN items ON items.id = item_search.id
88
88
  WHERE item_search MATCH ?
89
89
  ORDER BY bm25(item_search), items.priority, items.updated_at DESC, items.id
90
- LIMIT ?`).all(options.query,Math.max(0,Math.floor(options.limit)));const items=rows.map(row=>JSON.parse(String(row.metadata_json)));database.close();return{source_cursor:metadata.source_cursor,items}}catch{database?.close();return null}}async function removeItemMetadataQueryIndex(pmRoot){await fs.rm(queryIndexPath(pmRoot),{force:true})}const _testOnly={loadDatabaseSync,loadStableDatabaseSync,setDatabaseSync(databaseSync){const previous=RuntimeDatabaseSync;RuntimeDatabaseSync=databaseSync;return()=>{RuntimeDatabaseSync=previous}}};export{_testOnly,queryItemMetadataIndex,queryLinkedFileMetadataIndex,querySimilarItemMetadataIndex,rebuildItemMetadataQueryIndex,removeItemMetadataQueryIndex,updateItemMetadataQueryIndex};
90
+ LIMIT ?`).all(options.query,Math.max(0,Math.floor(options.limit))).map(row=>JSON.parse(String(row.metadata_json)));return database.close(),{source_cursor:metadata.source_cursor,items}}catch{return database?.close(),null}}async function removeItemMetadataQueryIndex(pmRoot){await fs.rm(queryIndexPath(pmRoot),{force:!0})}const _testOnly={loadDatabaseSync,loadStableDatabaseSync,setDatabaseSync(databaseSync){const previous=RuntimeDatabaseSync;return RuntimeDatabaseSync=databaseSync,()=>{RuntimeDatabaseSync=previous}}};export{_testOnly,queryItemMetadataIndex,queryLinkedFileMetadataIndex,querySimilarItemMetadataIndex,rebuildItemMetadataQueryIndex,removeItemMetadataQueryIndex,updateItemMetadataQueryIndex};
91
91
  //# sourceMappingURL=item-metadata-query-index.js.map
@@ -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]="118ec110-fa84-550b-a0a8-4def314270b6")}catch(e2){}})();import{AsyncLocalStorage}from"node:async_hooks";import{channel}from"node:diagnostics_channel";const observers=new AsyncLocalStorage;const enumerations=channel("@unbrained/pm-cli/item-metadata-enumeration/v1");function recordItemMetadataEnumeration(rowCount){enumerations.publish(rowCount)}async function measureItemMetadataReadWork(operation){const work={enumeration_calls:0,metadata_rows:0};const observe=message=>{if(observers.getStore()?.includes(work)){work.enumeration_calls+=1;work.metadata_rows+=message}};enumerations.subscribe(observe);try{const result=await observers.run([...observers.getStore()??[],work],operation);return{result,work:{...work}}}finally{enumerations.unsubscribe(observe)}}export{measureItemMetadataReadWork,recordItemMetadataEnumeration};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b2b2d49a-bb8c-54d7-89d2-1dbe76879129")}catch{}})();import{AsyncLocalStorage}from"node:async_hooks";import{channel}from"node:diagnostics_channel";const observers=new AsyncLocalStorage,enumerations=channel("@unbrained/pm-cli/item-metadata-enumeration/v1");function recordItemMetadataEnumeration(rowCount){enumerations.publish(rowCount)}async function measureItemMetadataReadWork(operation){const work={enumeration_calls:0,metadata_rows:0},observe=message=>{observers.getStore()?.includes(work)&&(work.enumeration_calls+=1,work.metadata_rows+=message)};enumerations.subscribe(observe);try{return{result:await observers.run([...observers.getStore()??[],work],operation),work:{...work}}}finally{enumerations.unsubscribe(observe)}}export{measureItemMetadataReadWork,recordItemMetadataEnumeration};
2
2
  //# sourceMappingURL=item-metadata-read-work.js.map
@@ -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]="02383f73-64f0-5ffc-a802-f8ef2b3cc038")}catch(e2){}})();import fs from"node:fs/promises";import{buildDeletedItemError}from"../history/tombstone.js";import{normalizeHistoryOperationForWrite}from"../history/operation-contract.js";import{enforceWorkflowMutation}from"../policy/workflow-policy-store.js";import{recordItemMetadataEnumeration}from"./item-metadata-read-work.js";import path from"node:path";import{getActiveExtensionRegistrations,projectAfterCommandItemSnapshot,recordAfterCommandAffectedItem,runActiveOnReadHooks,runActiveBeforeMutationHooks,runActiveOnWriteHooks,runActiveServiceOverride}from"../extensions/index.js";import{collectRegisteredItemFieldNames}from"../extensions/item-fields.js";import{EMPTY_CANONICAL_DOCUMENT,EXIT_CODE,TYPE_TO_FOLDER}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{levenshteinDistanceWithinLimit}from"../shared/levenshtein.js";import{appendHistoryEntry,createHistoryEntry}from"../history/history.js";import{enforceHistoryStreamPolicyForItem}from"../history/history-stream-policy.js";import{canonicalDocument,parseItemDocument,serializeItemDocument}from"../item/item-format.js";import{resolveItemTypeRegistry}from"../item/type-registry.js";import{acquireLock}from"../lock/lock.js";import{writeFileAtomic}from"../fs/fs-utils.js";import{isUtf8}from"node:buffer";import{normalizeItemId,normalizeRawItemId}from"../item/id.js";import{acquireItemMetadataDerivedIndexLock,listAllDocumentCandidatesCached,listAllDocumentsCached,listAllDocumentsCachedLight,refreshItemMetadataDerivedIndex}from"./item-metadata-cache.js";import{getHistoryPath,getItemPath,ITEM_FILE_EXTENSIONS}from"./paths.js";import{resolveGovernanceKnobs}from"./settings.js";import{assertReadableTrackerRoot}from"./tracker-preflight.js";import{resolveClaimPrincipal}from"../shared/author.js";import{nowIso}from"../shared/time.js";async function fileExists(targetPath){try{await fs.access(targetPath);return true}catch{return false}}function isErrno(error,code){return typeof error==="object"&&error!==null&&"code"in error&&error.code===code}function appendWarning(warnings,warning){if(!warnings){return}if(!warnings.includes(warning)){warnings.push(warning)}}function resolveActiveExtensionFieldNames(explicit){return explicit??collectRegisteredItemFieldNames(getActiveExtensionRegistrations())}function resolveItemFormatSearchOrder(preferredFormat){if(preferredFormat==="toon"){return["toon","json_markdown"]}if(preferredFormat==="json_markdown"){return["json_markdown","toon"]}return["toon","json_markdown"]}async function locateItem(pmRoot,rawId,idPrefix="pm-",preferredFormat,typeToFolder=TYPE_TO_FOLDER){const trimmedRawId=rawId.trim();const exactRawId=trimmedRawId.startsWith("#")?trimmedRawId.slice(1):trimmedRawId;if(exactRawId.length===0){return null}const normalizedId=normalizeItemId(rawId,idPrefix);const rawNormalizedId=normalizeRawItemId(rawId);const candidateIds=[...new Set([exactRawId,normalizedId,rawNormalizedId])].filter(candidateId=>candidateId.length>0);const entries=Object.entries(typeToFolder);const searchOrder=resolveItemFormatSearchOrder(preferredFormat);for(const candidateId of candidateIds){const matches=new Map;for(const[type]of entries){for(const itemFormat of searchOrder){const itemPath=getItemPath(pmRoot,type,candidateId,itemFormat,typeToFolder);if(await fileExists(itemPath)){matches.set(itemPath,matches.get(itemPath)??{id:candidateId,type,itemPath,item_format:itemFormat})}}}if(matches.size>1){const paths=[...matches.keys()].map(itemPath=>path.relative(pmRoot,itemPath).split(path.sep).join("/")).sort();throw new PmCliError(`Item ${candidateId} has ambiguous identity across ${paths.join(", ")}. Preserve both documents and inspect pm ops validate --check-storage-integrity before resolving the collision.`,EXIT_CODE.CONFLICT,{code:"item_identity_ambiguous",item_id:candidateId,paths})}for(const match of matches.values())return match}return null}async function readLocatedItem(item,options={}){const snapshot=await readLocatedItemSnapshot(item,options);if(snapshot.error!==null)throw snapshot.error;return{raw:snapshot.raw,document:snapshot.document}}async function readLocatedItemSnapshot(item,options={}){const bytes=await fs.readFile(item.itemPath);if(!isUtf8(bytes)){throw new PmCliError("Item contains invalid UTF-8; preserve a binary backup before recovering it.",EXIT_CODE.CONFLICT,{code:"item_document_encoding_invalid",item_id:item.id,item_path:item.itemPath,byte_length:bytes.length,empty:false})}const raw=bytes.toString("utf8");await runActiveOnReadHooks({path:item.itemPath,scope:"project"});let document;try{document=parseItemDocument(raw,{format:item.item_format,schema:options.schema,extensionFieldNames:resolveActiveExtensionFieldNames(options.extensionFieldNames),onWarning:warning=>appendWarning(options.warnings,warning)})}catch(error){if(error instanceof PmCliError&&error.code==="item_document_invalid"){return{raw,document:null,error:new PmCliError(`Cannot read ${item.id} at ${item.itemPath}${bytes.length===0?" (zero-length file)":""}: ${error.message}`,error.exitCode,{...error.context,item_id:item.id,item_path:item.itemPath,byte_length:bytes.length,empty:bytes.length===0,nextSteps:[`Run pm history ${item.id} --full, then pm restore ${item.id} <version> to recover a recorded state.`]})}}throw error}return{raw,document,error:null}}async function listAllItemMetadata(pmRoot,preferredFormat,typeToFolder=TYPE_TO_FOLDER,warnings,schema){await assertReadableTrackerRoot(pmRoot);const documents=await listAllDocumentsCached(pmRoot,preferredFormat,typeToFolder,warnings,schema);recordItemMetadataEnumeration(documents.length);return documents.map(document=>document.metadata)}async function listAllItemMetadataLight(pmRoot,preferredFormat,typeToFolder=TYPE_TO_FOLDER,warnings,schema){await assertReadableTrackerRoot(pmRoot);const documents=await listAllDocumentsCachedLight(pmRoot,preferredFormat,typeToFolder,warnings,schema);recordItemMetadataEnumeration(documents.length);return documents.map(document=>document.metadata)}async function listAllItemMetadataWithBody(pmRoot,preferredFormat,typeToFolder=TYPE_TO_FOLDER,warnings,schema,options={}){await assertReadableTrackerRoot(pmRoot);const candidates=await listAllDocumentCandidatesCached(pmRoot,preferredFormat,typeToFolder,warnings,schema,{includeBody:true,forceSourceScan:options.forceSourceScan});recordItemMetadataEnumeration(candidates.length);return candidates.map(candidate=>({...candidate.metadata,body:candidate.body}))}function createMutationGuardSdk(params){return{async get(id){const located=await locateItem(params.pmRoot,id,params.settings.id_prefix,params.settings.item_format,params.typeToFolder);if(!located)return null;const{document}=await readLocatedItem(located,{schema:params.settings.schema});return{item:document.metadata,body:document.body}},list:()=>listAllItemMetadata(params.pmRoot,params.settings.item_format,params.typeToFolder,void 0,params.settings.schema)}}async function listKnownItemIds(pmRoot,typeToFolder){const folders=new Set(Object.values(typeToFolder));const allIds=[];await Promise.all([...folders].map(async folder=>{try{const entries=await fs.readdir(path.join(pmRoot,folder));for(const entry of entries){for(const ext of ITEM_FILE_EXTENSIONS){if(entry.toLowerCase().endsWith(ext)){allIds.push(entry.slice(0,-ext.length));break}}}}catch{}}));return allIds}async function buildDidYouMeanSuggestions(pmRoot,badId,idPrefix,typeToFolder){const normalized=normalizeItemId(badId,idPrefix);const ids=await listKnownItemIds(pmRoot,typeToFolder);if(ids.length===0)return[];const limit=Math.max(3,Math.floor(normalized.length/2));const scored=ids.map(id=>({id,distance:levenshteinDistanceWithinLimit(id,normalized,limit)})).filter(entry=>entry.distance!==null).sort((left,right)=>left.distance-right.distance).slice(0,3).map(entry=>entry.id);return scored}async function buildItemNotFoundError(pmRoot,badId,idPrefix,typeToFolder){const deleted=await buildDeletedItemError(pmRoot,badId,idPrefix);if(deleted)return deleted;const suggestions=await buildDidYouMeanSuggestions(pmRoot,badId,idPrefix,typeToFolder);const nextSteps=["Confirm the active --path/PM_PATH scope, then retry with a valid id."];if(suggestions.length>0){nextSteps.unshift(`Did you mean one of: ${suggestions.join(", ")}?`)}return new PmCliError(`Item ${badId} not found`,EXIT_CODE.NOT_FOUND,{nextSteps})}function bypassesAssigneeConflict(op,bypassAssigneeConflict){return op==="claim"||bypassAssigneeConflict===true&&(op==="comment_add"||op==="comment_edit"||op==="comment_delete"||op==="note_add"||op==="learning_add"||op==="release"||op==="update"||op==="update_ownership_bypass"||op==="update_audit")}async function prepareLockedItem(params){const typeToFolder=params.typeToFolder??resolveItemTypeRegistry(params.settings,getActiveExtensionRegistrations()).type_to_folder;const located=await locateItem(params.pmRoot,params.id,params.settings.id_prefix,params.settings.item_format,typeToFolder);if(!located){throw await buildItemNotFoundError(params.pmRoot,params.id,params.settings.id_prefix,typeToFolder)}const releaseLock=await acquireLock(params.pmRoot,located.id,params.settings.locks.ttl_seconds,params.author,Boolean(params.force),params.settings.governance.force_required_for_stale_lock,params.settings.locks.wait_ms);try{const warnings=[];const{raw:originalRaw,document}=await readLocatedItem(located,{schema:params.settings.schema,extensionFieldNames:params.extensionFieldNames,warnings});const assigned=document.metadata.assignee?.trim();const assignedPrincipal=document.metadata.claim_principal?.trim()||assigned;const callerPrincipal=resolveClaimPrincipal(params.author);const governance=resolveGovernanceKnobs(params.settings);const hasOwnershipConflict=assigned&&assignedPrincipal!==callerPrincipal&&!params.force&&!bypassesAssigneeConflict(params.op,params.bypassAssigneeConflict);if(hasOwnershipConflict){if(governance.ownership_enforcement==="strict"){throw new PmCliError(`Item ${located.id} is assigned to ${assigned}. Use --force to override.`,EXIT_CODE.CONFLICT)}if(governance.ownership_enforcement==="warn"){warnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`)}}return{typeToFolder,located,originalRaw,document,warnings,releaseLock}}catch(error){await releaseLock();throw error}}function resolveItemStoreWriteOverride(serviceWriteOverride,targetItemPath,serializedAfter){if(!serviceWriteOverride.handled||typeof serviceWriteOverride.result!=="object"||serviceWriteOverride.result===null){return{effectiveTargetItemPath:targetItemPath,effectiveSerializedAfter:serializedAfter,skipItemWrite:false}}const overrideRecord=serviceWriteOverride.result;return{effectiveTargetItemPath:typeof overrideRecord.target_item_path==="string"&&overrideRecord.target_item_path.trim().length>0?overrideRecord.target_item_path:targetItemPath,effectiveSerializedAfter:typeof overrideRecord.contents==="string"?overrideRecord.contents:serializedAfter,skipItemWrite:overrideRecord.skip_write===true}}async function rollbackMutatedItemWrite(params){if(params.skipItemWrite){return}if(params.effectiveTargetItemPath!==params.originalItemPath){await writeFileAtomic(params.originalItemPath,params.originalRaw);await fs.rm(params.effectiveTargetItemPath,{force:true});return}await writeFileAtomic(params.originalItemPath,params.originalRaw)}async function mutateItemWithDeferredHistoryContext(params){normalizeHistoryOperationForWrite(params.op);const prepared=await prepareLockedItem({pmRoot:params.pmRoot,settings:params.settings,id:params.id,op:params.op,author:params.author,force:params.force,bypassAssigneeConflict:params.bypassAssigneeConflict,extensionFieldNames:params.extensionFieldNames,typeToFolder:params.typeToFolder});const{typeToFolder,located,originalRaw,document,warnings:parseWarnings,releaseLock}=prepared;try{const beforeDocument=canonicalDocument(document,{schema:params.settings.schema,extensionFieldNames:params.extensionFieldNames});const mutableDocument=canonicalDocument(structuredClone(document),{schema:params.settings.schema,extensionFieldNames:params.extensionFieldNames});const mutation=await params.mutate(mutableDocument);if(params.skipNoop===true&&mutation.changedFields.length===0){return{item:beforeDocument.metadata,body:beforeDocument.body,changedFields:[],warnings:[...parseWarnings,...mutation.warnings??[]]}}const historyContext=params.resolveHistoryContext?.();mutableDocument.metadata.updated_at=nowIso();const afterDocument=canonicalDocument(mutableDocument,{schema:params.settings.schema,extensionFieldNames:params.extensionFieldNames});const workflowPolicy=await enforceWorkflowMutation({pmRoot:params.pmRoot,settings:params.settings,operation:params.op,author:params.author,before:beforeDocument,after:afterDocument});await runActiveBeforeMutationHooks({pm_root:params.pmRoot,operation:params.op,before:beforeDocument,after:afterDocument,changed_fields:mutation.changedFields,sdk:createMutationGuardSdk({pmRoot:params.pmRoot,settings:params.settings,typeToFolder})});const historyPolicy=await enforceHistoryStreamPolicyForItem({pmRoot:params.pmRoot,settings:params.settings,itemId:located.id,commandLabel:params.op});const targetItemFormat="toon";const serializedAfter=serializeItemDocument(afterDocument,{format:targetItemFormat,schema:params.settings.schema,extensionFieldNames:params.extensionFieldNames});const targetItemPath=getItemPath(params.pmRoot,afterDocument.metadata.type,located.id,targetItemFormat,typeToFolder);const historyPath=getHistoryPath(params.pmRoot,located.id);const serviceWriteOverride=await runActiveServiceOverride("item_store_write",{op:params.op,pm_root:params.pmRoot,item_id:located.id,source_item_path:located.itemPath,target_item_path:targetItemPath,history_path:historyPath,item_format:targetItemFormat,before:beforeDocument,after:afterDocument,contents:serializedAfter});const{effectiveTargetItemPath,effectiveSerializedAfter,skipItemWrite}=resolveItemStoreWriteOverride(serviceWriteOverride,targetItemPath,serializedAfter);const releaseDerivedIndexLock=await acquireItemMetadataDerivedIndexLock(params.pmRoot,params.author);let derivedIndexWarnings=[];try{if(!skipItemWrite){await writeFileAtomic(effectiveTargetItemPath,effectiveSerializedAfter)}if(!skipItemWrite&&effectiveTargetItemPath!==located.itemPath){await fs.rm(located.itemPath)}const entry=createHistoryEntry({nowIso:afterDocument.metadata.updated_at,author:params.author,op:params.op,before:beforeDocument,after:afterDocument,message:params.message,context:workflowPolicy.decisions.length===0?historyContext:{...historyContext,workflow_policies:workflowPolicy.decisions}});try{await appendHistoryEntry(historyPath,entry)}catch(error){await rollbackMutatedItemWrite({skipItemWrite,effectiveTargetItemPath,originalItemPath:located.itemPath,originalRaw});throw error}if(!skipItemWrite){derivedIndexWarnings=await refreshItemMetadataDerivedIndex({pmRoot:params.pmRoot,preferredFormat:params.settings.item_format,typeToFolder,schema:params.settings.schema,itemPath:effectiveTargetItemPath,previousItemPath:located.itemPath,document:afterDocument})}}finally{await releaseDerivedIndexLock()}const hookWarnings=[...await runActiveOnWriteHooks({path:effectiveTargetItemPath,scope:"project",op:params.op,item_id:afterDocument.metadata.id,item_type:afterDocument.metadata.type,before:beforeDocument,after:afterDocument,changed_fields:mutation.changedFields}),...await runActiveOnWriteHooks({path:historyPath,scope:"project",op:`${params.op}:history`,item_id:afterDocument.metadata.id,item_type:afterDocument.metadata.type,before:beforeDocument,after:afterDocument,changed_fields:mutation.changedFields})];recordAfterCommandAffectedItem({id:afterDocument.metadata.id,op:params.op,item_type:afterDocument.metadata.type,previous_status:beforeDocument.metadata.status,status:afterDocument.metadata.status,previous:projectAfterCommandItemSnapshot(beforeDocument.metadata,mutation.changedFields),current:projectAfterCommandItemSnapshot(afterDocument.metadata,mutation.changedFields),changed_fields:mutation.changedFields});return{item:afterDocument.metadata,body:afterDocument.body,changedFields:mutation.changedFields,warnings:[...parseWarnings,...mutation.warnings??[],...workflowPolicy.warnings,...historyPolicy.warnings,...serviceWriteOverride.warnings,...derivedIndexWarnings,...hookWarnings]}}finally{await releaseLock()}}async function mutateItemWithHistoryContext(params){const{historyContext,...mutationParams}=params;return mutateItemWithDeferredHistoryContext({...mutationParams,resolveHistoryContext:()=>historyContext})}async function mutateItemWithHistoryContextResolver(params){return mutateItemWithDeferredHistoryContext(params)}async function mutateItem(params){return mutateItemWithDeferredHistoryContext(params)}const itemStoreTestOnly={appendWarning,bypassesAssigneeConflict,buildDidYouMeanSuggestions,isErrno};async function deleteItem(params){const prepared=await prepareLockedItem({pmRoot:params.pmRoot,settings:params.settings,id:params.id,op:"delete",author:params.author,force:params.force});const{located,originalRaw,document,warnings:parseWarnings,releaseLock}=prepared;try{const extensionFieldNames=resolveActiveExtensionFieldNames(void 0);const beforeDocument=canonicalDocument(document,{schema:params.settings.schema,extensionFieldNames});const workflowPolicy=await enforceWorkflowMutation({pmRoot:params.pmRoot,settings:params.settings,operation:"delete",author:params.author,before:beforeDocument,after:null,dryRun:params.dryRun});await runActiveBeforeMutationHooks({pm_root:params.pmRoot,operation:"delete",before:beforeDocument,after:null,changed_fields:["deleted"],sdk:createMutationGuardSdk({pmRoot:params.pmRoot,settings:params.settings,typeToFolder:prepared.typeToFolder})});const historyPolicy=await enforceHistoryStreamPolicyForItem({pmRoot:params.pmRoot,settings:params.settings,itemId:located.id,commandLabel:"delete"});const deletionTimestamp=nowIso();const tombstoneDocument=EMPTY_CANONICAL_DOCUMENT;const historyEntry=createHistoryEntry({nowIso:deletionTimestamp,author:params.author,op:"delete",before:beforeDocument,after:tombstoneDocument,message:params.message,context:workflowPolicy.decisions.length===0?void 0:{workflow_policies:workflowPolicy.decisions}});const historyPath=getHistoryPath(params.pmRoot,located.id);const serviceDeleteOverride=await runActiveServiceOverride("item_store_delete",{op:"delete",pm_root:params.pmRoot,item_id:located.id,item_path:located.itemPath,history_path:historyPath,before:beforeDocument});let effectiveItemPath=located.itemPath;let skipDelete=false;if(serviceDeleteOverride.handled&&typeof serviceDeleteOverride.result==="object"&&serviceDeleteOverride.result!==null){const overrideRecord=serviceDeleteOverride.result;if(typeof overrideRecord.item_path==="string"&&overrideRecord.item_path.trim().length>0){effectiveItemPath=overrideRecord.item_path}if(overrideRecord.skip_delete===true){skipDelete=true}}if(params.dryRun===true){return{item:beforeDocument.metadata,changedFields:["deleted"],targetPath:effectiveItemPath,warnings:[...parseWarnings,...workflowPolicy.warnings,...historyPolicy.warnings,...serviceDeleteOverride.warnings]}}const releaseDerivedIndexLock=await acquireItemMetadataDerivedIndexLock(params.pmRoot,params.author);let derivedIndexWarnings=[];try{if(!skipDelete){await fs.rm(effectiveItemPath)}try{await appendHistoryEntry(historyPath,historyEntry)}catch(error){if(!skipDelete){await writeFileAtomic(effectiveItemPath,originalRaw)}throw error}if(!skipDelete){derivedIndexWarnings=await refreshItemMetadataDerivedIndex({pmRoot:params.pmRoot,preferredFormat:params.settings.item_format,typeToFolder:prepared.typeToFolder,schema:params.settings.schema,itemPath:effectiveItemPath,document:null})}}finally{await releaseDerivedIndexLock()}const hookWarnings=[...await runActiveOnWriteHooks({path:effectiveItemPath,scope:"project",op:"delete",item_id:beforeDocument.metadata.id,item_type:beforeDocument.metadata.type,before:beforeDocument,after:tombstoneDocument,changed_fields:["deleted"]}),...await runActiveOnWriteHooks({path:historyPath,scope:"project",op:"delete:history",item_id:beforeDocument.metadata.id,item_type:beforeDocument.metadata.type,before:beforeDocument,after:tombstoneDocument,changed_fields:["deleted"]})];recordAfterCommandAffectedItem({id:beforeDocument.metadata.id,op:"delete",item_type:beforeDocument.metadata.type,previous_status:beforeDocument.metadata.status,previous:projectAfterCommandItemSnapshot(beforeDocument.metadata,Object.keys(beforeDocument.metadata)),changed_fields:["deleted"]});return{item:beforeDocument.metadata,changedFields:["deleted"],warnings:[...parseWarnings,...workflowPolicy.warnings,...historyPolicy.warnings,...serviceDeleteOverride.warnings,...derivedIndexWarnings,...hookWarnings]}}finally{await releaseLock()}}export{buildItemNotFoundError,createMutationGuardSdk,deleteItem,itemStoreTestOnly,listAllItemMetadata,listAllItemMetadataLight,listAllItemMetadataWithBody,locateItem,mutateItem,mutateItemWithHistoryContext,mutateItemWithHistoryContextResolver,readLocatedItem,readLocatedItemSnapshot};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5dd36511-d680-55ce-b535-5c1fbfaf63ec")}catch{}})();import fs from"node:fs/promises";import{buildDeletedItemError}from"../history/tombstone.js";import{normalizeHistoryOperationForWrite}from"../history/operation-contract.js";import{enforceWorkflowMutation}from"../policy/workflow-policy-store.js";import{recordItemMetadataEnumeration}from"./item-metadata-read-work.js";import path from"node:path";import{getActiveExtensionRegistrations,projectAfterCommandItemSnapshot,recordAfterCommandAffectedItem,runActiveOnReadHooks,runActiveBeforeMutationHooks,runActiveOnWriteHooks,runActiveServiceOverride}from"../extensions/index.js";import{collectRegisteredItemFieldNames}from"../extensions/item-fields.js";import{EMPTY_CANONICAL_DOCUMENT,EXIT_CODE,TYPE_TO_FOLDER}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{levenshteinDistanceWithinLimit}from"../shared/levenshtein.js";import{appendHistoryEntry,createHistoryEntry}from"../history/history.js";import{enforceHistoryStreamPolicyForItem}from"../history/history-stream-policy.js";import{canonicalDocument,parseItemDocument,serializeItemDocument}from"../item/item-format.js";import{resolveItemTypeRegistry}from"../item/type-registry.js";import{acquireLock}from"../lock/lock.js";import{writeFileAtomic}from"../fs/fs-utils.js";import{isUtf8}from"node:buffer";import{normalizeItemId,normalizeRawItemId}from"../item/id.js";import{acquireItemMetadataDerivedIndexLock,listAllDocumentCandidatesCached,listAllDocumentsCached,listAllDocumentsCachedLight,refreshItemMetadataDerivedIndex}from"./item-metadata-cache.js";import{getHistoryPath,getItemPath,ITEM_FILE_EXTENSIONS}from"./paths.js";import{resolveGovernanceKnobs}from"./settings.js";import{assertReadableTrackerRoot}from"./tracker-preflight.js";import{resolveClaimPrincipal}from"../shared/author.js";import{nowIso}from"../shared/time.js";async function fileExists(targetPath){try{return await fs.access(targetPath),!0}catch{return!1}}function isErrno(error,code){return typeof error=="object"&&error!==null&&"code"in error&&error.code===code}function appendWarning(warnings,warning){warnings&&(warnings.includes(warning)||warnings.push(warning))}function resolveActiveExtensionFieldNames(explicit){return explicit??collectRegisteredItemFieldNames(getActiveExtensionRegistrations())}function resolveItemFormatSearchOrder(preferredFormat){return preferredFormat==="toon"?["toon","json_markdown"]:preferredFormat==="json_markdown"?["json_markdown","toon"]:["toon","json_markdown"]}async function locateItem(pmRoot,rawId,idPrefix="pm-",preferredFormat,typeToFolder=TYPE_TO_FOLDER){const trimmedRawId=rawId.trim(),exactRawId=trimmedRawId.startsWith("#")?trimmedRawId.slice(1):trimmedRawId;if(exactRawId.length===0)return null;const normalizedId=normalizeItemId(rawId,idPrefix),rawNormalizedId=normalizeRawItemId(rawId),candidateIds=[...new Set([exactRawId,normalizedId,rawNormalizedId])].filter(candidateId=>candidateId.length>0),entries=Object.entries(typeToFolder),searchOrder=resolveItemFormatSearchOrder(preferredFormat);for(const candidateId of candidateIds){const matches=new Map;for(const[type]of entries)for(const itemFormat of searchOrder){const itemPath=getItemPath(pmRoot,type,candidateId,itemFormat,typeToFolder);await fileExists(itemPath)&&matches.set(itemPath,matches.get(itemPath)??{id:candidateId,type,itemPath,item_format:itemFormat})}if(matches.size>1){const paths=[...matches.keys()].map(itemPath=>path.relative(pmRoot,itemPath).split(path.sep).join("/")).sort();throw new PmCliError(`Item ${candidateId} has ambiguous identity across ${paths.join(", ")}. Preserve both documents and inspect pm ops validate --check-storage-integrity before resolving the collision.`,EXIT_CODE.CONFLICT,{code:"item_identity_ambiguous",item_id:candidateId,paths})}for(const match of matches.values())return match}return null}async function readLocatedItem(item,options={}){const snapshot=await readLocatedItemSnapshot(item,options);if(snapshot.error!==null)throw snapshot.error;return{raw:snapshot.raw,document:snapshot.document}}async function readLocatedItemSnapshot(item,options={}){const bytes=await fs.readFile(item.itemPath);if(!isUtf8(bytes))throw new PmCliError("Item contains invalid UTF-8; preserve a binary backup before recovering it.",EXIT_CODE.CONFLICT,{code:"item_document_encoding_invalid",item_id:item.id,item_path:item.itemPath,byte_length:bytes.length,empty:!1});const raw=bytes.toString("utf8");await runActiveOnReadHooks({path:item.itemPath,scope:"project"});let document;try{document=parseItemDocument(raw,{format:item.item_format,schema:options.schema,extensionFieldNames:resolveActiveExtensionFieldNames(options.extensionFieldNames),onWarning:warning=>appendWarning(options.warnings,warning)})}catch(error){if(error instanceof PmCliError&&error.code==="item_document_invalid")return{raw,document:null,error:new PmCliError(`Cannot read ${item.id} at ${item.itemPath}${bytes.length===0?" (zero-length file)":""}: ${error.message}`,error.exitCode,{...error.context,item_id:item.id,item_path:item.itemPath,byte_length:bytes.length,empty:bytes.length===0,nextSteps:[`Run pm history ${item.id} --full, then pm restore ${item.id} <version> to recover a recorded state.`]})};throw error}return{raw,document,error:null}}async function listAllItemMetadata(pmRoot,preferredFormat,typeToFolder=TYPE_TO_FOLDER,warnings,schema){await assertReadableTrackerRoot(pmRoot);const documents=await listAllDocumentsCached(pmRoot,preferredFormat,typeToFolder,warnings,schema);return recordItemMetadataEnumeration(documents.length),documents.map(document=>document.metadata)}async function listAllItemMetadataLight(pmRoot,preferredFormat,typeToFolder=TYPE_TO_FOLDER,warnings,schema){await assertReadableTrackerRoot(pmRoot);const documents=await listAllDocumentsCachedLight(pmRoot,preferredFormat,typeToFolder,warnings,schema);return recordItemMetadataEnumeration(documents.length),documents.map(document=>document.metadata)}async function listAllItemMetadataWithBody(pmRoot,preferredFormat,typeToFolder=TYPE_TO_FOLDER,warnings,schema,options={}){await assertReadableTrackerRoot(pmRoot);const candidates=await listAllDocumentCandidatesCached(pmRoot,preferredFormat,typeToFolder,warnings,schema,{includeBody:!0,forceSourceScan:options.forceSourceScan});return recordItemMetadataEnumeration(candidates.length),candidates.map(candidate=>({...candidate.metadata,body:candidate.body}))}function createMutationGuardSdk(params){return{async get(id){const located=await locateItem(params.pmRoot,id,params.settings.id_prefix,params.settings.item_format,params.typeToFolder);if(!located)return null;const{document}=await readLocatedItem(located,{schema:params.settings.schema});return{item:document.metadata,body:document.body}},list:()=>listAllItemMetadata(params.pmRoot,params.settings.item_format,params.typeToFolder,void 0,params.settings.schema)}}async function listKnownItemIds(pmRoot,typeToFolder){const folders=new Set(Object.values(typeToFolder)),allIds=[];return await Promise.all([...folders].map(async folder=>{try{const entries=await fs.readdir(path.join(pmRoot,folder));for(const entry of entries)for(const ext of ITEM_FILE_EXTENSIONS)if(entry.toLowerCase().endsWith(ext)){allIds.push(entry.slice(0,-ext.length));break}}catch{}})),allIds}async function buildDidYouMeanSuggestions(pmRoot,badId,idPrefix,typeToFolder){const normalized=normalizeItemId(badId,idPrefix),ids=await listKnownItemIds(pmRoot,typeToFolder);if(ids.length===0)return[];const limit=Math.max(3,Math.floor(normalized.length/2));return ids.map(id=>({id,distance:levenshteinDistanceWithinLimit(id,normalized,limit)})).filter(entry=>entry.distance!==null).sort((left,right)=>left.distance-right.distance).slice(0,3).map(entry=>entry.id)}async function buildItemNotFoundError(pmRoot,badId,idPrefix,typeToFolder){const deleted=await buildDeletedItemError(pmRoot,badId,idPrefix);if(deleted)return deleted;const suggestions=await buildDidYouMeanSuggestions(pmRoot,badId,idPrefix,typeToFolder),nextSteps=["Confirm the active --path/PM_PATH scope, then retry with a valid id."];return suggestions.length>0&&nextSteps.unshift(`Did you mean one of: ${suggestions.join(", ")}?`),new PmCliError(`Item ${badId} not found`,EXIT_CODE.NOT_FOUND,{nextSteps})}function bypassesAssigneeConflict(op,bypassAssigneeConflict){return op==="claim"||bypassAssigneeConflict===!0&&(op==="comment_add"||op==="comment_edit"||op==="comment_delete"||op==="note_add"||op==="learning_add"||op==="release"||op==="update"||op==="update_ownership_bypass"||op==="update_audit")}async function prepareLockedItem(params){const typeToFolder=params.typeToFolder??resolveItemTypeRegistry(params.settings,getActiveExtensionRegistrations()).type_to_folder,located=await locateItem(params.pmRoot,params.id,params.settings.id_prefix,params.settings.item_format,typeToFolder);if(!located)throw await buildItemNotFoundError(params.pmRoot,params.id,params.settings.id_prefix,typeToFolder);const releaseLock=await acquireLock(params.pmRoot,located.id,params.settings.locks.ttl_seconds,params.author,!!params.force,params.settings.governance.force_required_for_stale_lock,params.settings.locks.wait_ms);try{const warnings=[],{raw:originalRaw,document}=await readLocatedItem(located,{schema:params.settings.schema,extensionFieldNames:params.extensionFieldNames,warnings}),assigned=document.metadata.assignee?.trim(),assignedPrincipal=document.metadata.claim_principal?.trim()||assigned,callerPrincipal=resolveClaimPrincipal(params.author),governance=resolveGovernanceKnobs(params.settings);if(assigned&&assignedPrincipal!==callerPrincipal&&!params.force&&!bypassesAssigneeConflict(params.op,params.bypassAssigneeConflict)){if(governance.ownership_enforcement==="strict")throw new PmCliError(`Item ${located.id} is assigned to ${assigned}. Use --force to override.`,EXIT_CODE.CONFLICT);governance.ownership_enforcement==="warn"&&warnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`)}return{typeToFolder,located,originalRaw,document,warnings,releaseLock}}catch(error){throw await releaseLock(),error}}function resolveItemStoreWriteOverride(serviceWriteOverride,targetItemPath,serializedAfter){if(!serviceWriteOverride.handled||typeof serviceWriteOverride.result!="object"||serviceWriteOverride.result===null)return{effectiveTargetItemPath:targetItemPath,effectiveSerializedAfter:serializedAfter,skipItemWrite:!1};const overrideRecord=serviceWriteOverride.result;return{effectiveTargetItemPath:typeof overrideRecord.target_item_path=="string"&&overrideRecord.target_item_path.trim().length>0?overrideRecord.target_item_path:targetItemPath,effectiveSerializedAfter:typeof overrideRecord.contents=="string"?overrideRecord.contents:serializedAfter,skipItemWrite:overrideRecord.skip_write===!0}}async function rollbackMutatedItemWrite(params){if(!params.skipItemWrite){if(params.effectiveTargetItemPath!==params.originalItemPath){await writeFileAtomic(params.originalItemPath,params.originalRaw),await fs.rm(params.effectiveTargetItemPath,{force:!0});return}await writeFileAtomic(params.originalItemPath,params.originalRaw)}}async function mutateItemWithDeferredHistoryContext(params){normalizeHistoryOperationForWrite(params.op);const prepared=await prepareLockedItem({pmRoot:params.pmRoot,settings:params.settings,id:params.id,op:params.op,author:params.author,force:params.force,bypassAssigneeConflict:params.bypassAssigneeConflict,extensionFieldNames:params.extensionFieldNames,typeToFolder:params.typeToFolder}),{typeToFolder,located,originalRaw,document,warnings:parseWarnings,releaseLock}=prepared;try{const beforeDocument=canonicalDocument(document,{schema:params.settings.schema,extensionFieldNames:params.extensionFieldNames}),mutableDocument=canonicalDocument(structuredClone(document),{schema:params.settings.schema,extensionFieldNames:params.extensionFieldNames}),mutation=await params.mutate(mutableDocument);if(params.skipNoop===!0&&mutation.changedFields.length===0)return{item:beforeDocument.metadata,body:beforeDocument.body,changedFields:[],warnings:[...parseWarnings,...mutation.warnings??[]]};const historyContext=params.resolveHistoryContext?.();mutableDocument.metadata.updated_at=nowIso();const afterDocument=canonicalDocument(mutableDocument,{schema:params.settings.schema,extensionFieldNames:params.extensionFieldNames}),workflowPolicy=await enforceWorkflowMutation({pmRoot:params.pmRoot,settings:params.settings,operation:params.op,author:params.author,before:beforeDocument,after:afterDocument});await runActiveBeforeMutationHooks({pm_root:params.pmRoot,operation:params.op,before:beforeDocument,after:afterDocument,changed_fields:mutation.changedFields,sdk:createMutationGuardSdk({pmRoot:params.pmRoot,settings:params.settings,typeToFolder})});const historyPolicy=await enforceHistoryStreamPolicyForItem({pmRoot:params.pmRoot,settings:params.settings,itemId:located.id,commandLabel:params.op}),targetItemFormat="toon",serializedAfter=serializeItemDocument(afterDocument,{format:targetItemFormat,schema:params.settings.schema,extensionFieldNames:params.extensionFieldNames}),targetItemPath=getItemPath(params.pmRoot,afterDocument.metadata.type,located.id,targetItemFormat,typeToFolder),historyPath=getHistoryPath(params.pmRoot,located.id),serviceWriteOverride=await runActiveServiceOverride("item_store_write",{op:params.op,pm_root:params.pmRoot,item_id:located.id,source_item_path:located.itemPath,target_item_path:targetItemPath,history_path:historyPath,item_format:targetItemFormat,before:beforeDocument,after:afterDocument,contents:serializedAfter}),{effectiveTargetItemPath,effectiveSerializedAfter,skipItemWrite}=resolveItemStoreWriteOverride(serviceWriteOverride,targetItemPath,serializedAfter),releaseDerivedIndexLock=await acquireItemMetadataDerivedIndexLock(params.pmRoot,params.author);let derivedIndexWarnings=[];try{skipItemWrite||await writeFileAtomic(effectiveTargetItemPath,effectiveSerializedAfter),!skipItemWrite&&effectiveTargetItemPath!==located.itemPath&&await fs.rm(located.itemPath);const entry=createHistoryEntry({nowIso:afterDocument.metadata.updated_at,author:params.author,op:params.op,before:beforeDocument,after:afterDocument,message:params.message,context:workflowPolicy.decisions.length===0?historyContext:{...historyContext,workflow_policies:workflowPolicy.decisions}});try{await appendHistoryEntry(historyPath,entry)}catch(error){throw await rollbackMutatedItemWrite({skipItemWrite,effectiveTargetItemPath,originalItemPath:located.itemPath,originalRaw}),error}skipItemWrite||(derivedIndexWarnings=await refreshItemMetadataDerivedIndex({pmRoot:params.pmRoot,preferredFormat:params.settings.item_format,typeToFolder,schema:params.settings.schema,itemPath:effectiveTargetItemPath,previousItemPath:located.itemPath,document:afterDocument}))}finally{await releaseDerivedIndexLock()}const hookWarnings=[...await runActiveOnWriteHooks({path:effectiveTargetItemPath,scope:"project",op:params.op,item_id:afterDocument.metadata.id,item_type:afterDocument.metadata.type,before:beforeDocument,after:afterDocument,changed_fields:mutation.changedFields}),...await runActiveOnWriteHooks({path:historyPath,scope:"project",op:`${params.op}:history`,item_id:afterDocument.metadata.id,item_type:afterDocument.metadata.type,before:beforeDocument,after:afterDocument,changed_fields:mutation.changedFields})];return recordAfterCommandAffectedItem({id:afterDocument.metadata.id,op:params.op,item_type:afterDocument.metadata.type,previous_status:beforeDocument.metadata.status,status:afterDocument.metadata.status,previous:projectAfterCommandItemSnapshot(beforeDocument.metadata,mutation.changedFields),current:projectAfterCommandItemSnapshot(afterDocument.metadata,mutation.changedFields),changed_fields:mutation.changedFields}),{item:afterDocument.metadata,body:afterDocument.body,changedFields:mutation.changedFields,warnings:[...parseWarnings,...mutation.warnings??[],...workflowPolicy.warnings,...historyPolicy.warnings,...serviceWriteOverride.warnings,...derivedIndexWarnings,...hookWarnings]}}finally{await releaseLock()}}async function mutateItemWithHistoryContext(params){const{historyContext,...mutationParams}=params;return mutateItemWithDeferredHistoryContext({...mutationParams,resolveHistoryContext:()=>historyContext})}async function mutateItemWithHistoryContextResolver(params){return mutateItemWithDeferredHistoryContext(params)}async function mutateItem(params){return mutateItemWithDeferredHistoryContext(params)}const itemStoreTestOnly={appendWarning,bypassesAssigneeConflict,buildDidYouMeanSuggestions,isErrno};async function deleteItem(params){const prepared=await prepareLockedItem({pmRoot:params.pmRoot,settings:params.settings,id:params.id,op:"delete",author:params.author,force:params.force}),{located,originalRaw,document,warnings:parseWarnings,releaseLock}=prepared;try{const extensionFieldNames=resolveActiveExtensionFieldNames(void 0),beforeDocument=canonicalDocument(document,{schema:params.settings.schema,extensionFieldNames}),workflowPolicy=await enforceWorkflowMutation({pmRoot:params.pmRoot,settings:params.settings,operation:"delete",author:params.author,before:beforeDocument,after:null,dryRun:params.dryRun});await runActiveBeforeMutationHooks({pm_root:params.pmRoot,operation:"delete",before:beforeDocument,after:null,changed_fields:["deleted"],sdk:createMutationGuardSdk({pmRoot:params.pmRoot,settings:params.settings,typeToFolder:prepared.typeToFolder})});const historyPolicy=await enforceHistoryStreamPolicyForItem({pmRoot:params.pmRoot,settings:params.settings,itemId:located.id,commandLabel:"delete"}),deletionTimestamp=nowIso(),tombstoneDocument=EMPTY_CANONICAL_DOCUMENT,historyEntry=createHistoryEntry({nowIso:deletionTimestamp,author:params.author,op:"delete",before:beforeDocument,after:tombstoneDocument,message:params.message,context:workflowPolicy.decisions.length===0?void 0:{workflow_policies:workflowPolicy.decisions}}),historyPath=getHistoryPath(params.pmRoot,located.id),serviceDeleteOverride=await runActiveServiceOverride("item_store_delete",{op:"delete",pm_root:params.pmRoot,item_id:located.id,item_path:located.itemPath,history_path:historyPath,before:beforeDocument});let effectiveItemPath=located.itemPath,skipDelete=!1;if(serviceDeleteOverride.handled&&typeof serviceDeleteOverride.result=="object"&&serviceDeleteOverride.result!==null){const overrideRecord=serviceDeleteOverride.result;typeof overrideRecord.item_path=="string"&&overrideRecord.item_path.trim().length>0&&(effectiveItemPath=overrideRecord.item_path),overrideRecord.skip_delete===!0&&(skipDelete=!0)}if(params.dryRun===!0)return{item:beforeDocument.metadata,changedFields:["deleted"],targetPath:effectiveItemPath,warnings:[...parseWarnings,...workflowPolicy.warnings,...historyPolicy.warnings,...serviceDeleteOverride.warnings]};const releaseDerivedIndexLock=await acquireItemMetadataDerivedIndexLock(params.pmRoot,params.author);let derivedIndexWarnings=[];try{skipDelete||await fs.rm(effectiveItemPath);try{await appendHistoryEntry(historyPath,historyEntry)}catch(error){throw skipDelete||await writeFileAtomic(effectiveItemPath,originalRaw),error}skipDelete||(derivedIndexWarnings=await refreshItemMetadataDerivedIndex({pmRoot:params.pmRoot,preferredFormat:params.settings.item_format,typeToFolder:prepared.typeToFolder,schema:params.settings.schema,itemPath:effectiveItemPath,document:null}))}finally{await releaseDerivedIndexLock()}const hookWarnings=[...await runActiveOnWriteHooks({path:effectiveItemPath,scope:"project",op:"delete",item_id:beforeDocument.metadata.id,item_type:beforeDocument.metadata.type,before:beforeDocument,after:tombstoneDocument,changed_fields:["deleted"]}),...await runActiveOnWriteHooks({path:historyPath,scope:"project",op:"delete:history",item_id:beforeDocument.metadata.id,item_type:beforeDocument.metadata.type,before:beforeDocument,after:tombstoneDocument,changed_fields:["deleted"]})];return recordAfterCommandAffectedItem({id:beforeDocument.metadata.id,op:"delete",item_type:beforeDocument.metadata.type,previous_status:beforeDocument.metadata.status,previous:projectAfterCommandItemSnapshot(beforeDocument.metadata,Object.keys(beforeDocument.metadata)),changed_fields:["deleted"]}),{item:beforeDocument.metadata,changedFields:["deleted"],warnings:[...parseWarnings,...workflowPolicy.warnings,...historyPolicy.warnings,...serviceDeleteOverride.warnings,...derivedIndexWarnings,...hookWarnings]}}finally{await releaseLock()}}export{buildItemNotFoundError,createMutationGuardSdk,deleteItem,itemStoreTestOnly,listAllItemMetadata,listAllItemMetadataLight,listAllItemMetadataWithBody,locateItem,mutateItem,mutateItemWithHistoryContext,mutateItemWithHistoryContextResolver,readLocatedItem,readLocatedItemSnapshot};
2
2
  //# sourceMappingURL=item-store.js.map
@@ -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]="124443e3-a20b-5fd6-a1d9-e4a09b17dc4a")}catch(e2){}})();import{readFileSync,readdirSync,statSync}from"node:fs";import os from"node:os";import path from"node:path";import{PM_DIRNAME,EXIT_CODE,SETTINGS_FILENAME,TYPE_TO_FOLDER}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{toDefaultFolder}from"../item/type-registry.js";const ITEM_FILE_EXTENSION_BY_FORMAT={json_markdown:".md",toon:".toon"};const ITEM_FORMAT_BY_EXTENSION={".md":"json_markdown",".toon":"toon"};const NEARBY_TRACKER_SCAN_IGNORED_DIRECTORIES=new Set([".git","coverage","dist","node_modules"]);const ITEM_FILE_EXTENSIONS=[".md",".toon"];function pathExists(pathValue){try{statSync(pathValue);return true}catch{return false}}function isPmSettingsFile(settingsPath){try{const parsed=JSON.parse(readFileSync(settingsPath,"utf8"));if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed)){return false}return"id_prefix"in parsed||"item_format"in parsed}catch{return false}}function discoverPmRootFromAncestors(cwd){let current=path.resolve(cwd);while(true){const candidateRoot=path.join(current,PM_DIRNAME);const candidateSettingsPath=path.join(candidateRoot,SETTINGS_FILENAME);if(pathExists(candidateSettingsPath)){return candidateRoot}const rootLayoutSettingsPath=path.join(current,SETTINGS_FILENAME);if(pathExists(rootLayoutSettingsPath)&&isPmSettingsFile(rootLayoutSettingsPath)){return current}const parent=path.dirname(current);if(parent===current){return void 0}current=parent}}function resolveImplicitPmRoot(cwd){return discoverPmRootFromAncestors(cwd)??path.resolve(cwd,PM_DIRNAME)}function discoverNearbyPmRoot(cwd,excludedRoot){const normalizedExcluded=excludedRoot?path.resolve(excludedRoot):void 0;try{return readdirSync(path.resolve(cwd),{withFileTypes:true}).filter(entry=>entry.isDirectory()&&!NEARBY_TRACKER_SCAN_IGNORED_DIRECTORIES.has(entry.name)).map(entry=>path.join(path.resolve(cwd),entry.name)).filter(candidate=>candidate!==normalizedExcluded).filter(candidate=>pathExists(getSettingsPath(candidate))).filter(candidate=>isPmSettingsFile(getSettingsPath(candidate))).sort((left,right)=>left.localeCompare(right))[0]}catch{return void 0}}function resolvePmRoot(cwd,cliPath){const envPath=process.env.PM_PATH;const explicitPath=cliPath?.trim()||envPath?.trim();if(explicitPath){const resolved=path.resolve(cwd,explicitPath);if(!pathExists(getSettingsPath(resolved))){const nestedRoot=path.join(resolved,PM_DIRNAME);if(pathExists(getSettingsPath(nestedRoot))){return nestedRoot}}return resolved}return resolveImplicitPmRoot(cwd)}function resolveWorkspaceRoot(pmRoot){const normalizedRoot=path.resolve(pmRoot);const parent=path.dirname(normalizedRoot);return path.basename(normalizedRoot)==="pm"&&path.basename(parent)===".agents"?path.dirname(parent):normalizedRoot}function resolveGlobalPmRoot(cwd){const envPath=process.env.PM_GLOBAL_PATH?.trim();const selected=envPath&&envPath.length>0?envPath:path.join(os.homedir(),".pm-cli");return path.resolve(cwd,selected)}function getSettingsPath(pmRoot){return path.join(pmRoot,SETTINGS_FILENAME)}function getTypeDirPath(pmRoot,type,typeToFolder=TYPE_TO_FOLDER){const folder=typeToFolder[type]??toDefaultFolder(type);return path.join(pmRoot,folder)}function getItemPath(pmRoot,type,id,itemFormat="toon",typeToFolder=TYPE_TO_FOLDER){return path.join(getTypeDirPath(pmRoot,type,typeToFolder),`${id}${ITEM_FILE_EXTENSION_BY_FORMAT[itemFormat]}`)}function getItemFormatFromPath(itemPath){const normalizedItemPath=itemPath.replaceAll("\\","/");const extension=path.posix.extname(normalizedItemPath).toLowerCase();return ITEM_FORMAT_BY_EXTENSION[extension]??null}function getHistoryPath(pmRoot,id){if(!/^(?!\.{1,2}$)[^/\\:\0]+$/.test(id)){throw new PmCliError("Invalid history item id: expected a single filename.",EXIT_CODE.USAGE)}return path.join(pmRoot,"history",`${id}.jsonl`)}function getLockPath(pmRoot,id){return path.join(pmRoot,"locks",`${id}.lock`)}function getRuntimePath(pmRoot){return path.join(pmRoot,"runtime")}function getTestRunsPath(pmRoot){return path.join(getRuntimePath(pmRoot),"test-runs")}function getTestRunsRecordsPath(pmRoot){return path.join(getTestRunsPath(pmRoot),"runs")}function getTestRunRecordPath(pmRoot,runId){return path.join(getTestRunsRecordsPath(pmRoot),`${runId}.json`)}function getTestRunsStdoutPath(pmRoot){return path.join(getTestRunsPath(pmRoot),"stdout")}function getTestRunsStderrPath(pmRoot){return path.join(getTestRunsPath(pmRoot),"stderr")}function getTestRunStdoutPath(pmRoot,runId){return path.join(getTestRunsStdoutPath(pmRoot),`${runId}.log`)}function getTestRunStderrPath(pmRoot,runId){return path.join(getTestRunsStderrPath(pmRoot),`${runId}.log`)}function getTestRunsResultsPath(pmRoot){return path.join(getTestRunsPath(pmRoot),"results")}function getTestRunResultPath(pmRoot,runId){return path.join(getTestRunsResultsPath(pmRoot),`${runId}.json`)}export{ITEM_FILE_EXTENSIONS,ITEM_FILE_EXTENSION_BY_FORMAT,discoverNearbyPmRoot,getHistoryPath,getItemFormatFromPath,getItemPath,getLockPath,getRuntimePath,getSettingsPath,getTestRunRecordPath,getTestRunResultPath,getTestRunStderrPath,getTestRunStdoutPath,getTestRunsPath,getTestRunsRecordsPath,getTestRunsResultsPath,getTestRunsStderrPath,getTestRunsStdoutPath,getTypeDirPath,resolveGlobalPmRoot,resolveImplicitPmRoot,resolvePmRoot,resolveWorkspaceRoot};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e1a10a41-219e-52fe-8369-94b8d842a29b")}catch{}})();import{readFileSync,readdirSync,statSync}from"node:fs";import os from"node:os";import path from"node:path";import{PM_DIRNAME,EXIT_CODE,SETTINGS_FILENAME,TYPE_TO_FOLDER}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{toDefaultFolder}from"../item/type-registry.js";const ITEM_FILE_EXTENSION_BY_FORMAT={json_markdown:".md",toon:".toon"},ITEM_FORMAT_BY_EXTENSION={".md":"json_markdown",".toon":"toon"},NEARBY_TRACKER_SCAN_IGNORED_DIRECTORIES=new Set([".git","coverage","dist","node_modules"]),ITEM_FILE_EXTENSIONS=[".md",".toon"];function pathExists(pathValue){try{return statSync(pathValue),!0}catch{return!1}}function isPmSettingsFile(settingsPath){try{const parsed=JSON.parse(readFileSync(settingsPath,"utf8"));return typeof parsed!="object"||parsed===null||Array.isArray(parsed)?!1:"id_prefix"in parsed||"item_format"in parsed}catch{return!1}}function discoverPmRootFromAncestors(cwd){let current=path.resolve(cwd);for(;;){const candidateRoot=path.join(current,PM_DIRNAME),candidateSettingsPath=path.join(candidateRoot,SETTINGS_FILENAME);if(pathExists(candidateSettingsPath))return candidateRoot;const rootLayoutSettingsPath=path.join(current,SETTINGS_FILENAME);if(pathExists(rootLayoutSettingsPath)&&isPmSettingsFile(rootLayoutSettingsPath))return current;const parent=path.dirname(current);if(parent===current)return;current=parent}}function resolveImplicitPmRoot(cwd){return discoverPmRootFromAncestors(cwd)??path.resolve(cwd,PM_DIRNAME)}function discoverNearbyPmRoot(cwd,excludedRoot){const normalizedExcluded=excludedRoot?path.resolve(excludedRoot):void 0;try{return readdirSync(path.resolve(cwd),{withFileTypes:!0}).filter(entry=>entry.isDirectory()&&!NEARBY_TRACKER_SCAN_IGNORED_DIRECTORIES.has(entry.name)).map(entry=>path.join(path.resolve(cwd),entry.name)).filter(candidate=>candidate!==normalizedExcluded).filter(candidate=>pathExists(getSettingsPath(candidate))).filter(candidate=>isPmSettingsFile(getSettingsPath(candidate))).sort((left,right)=>left.localeCompare(right))[0]}catch{return}}function resolvePmRoot(cwd,cliPath){const envPath=process.env.PM_PATH,explicitPath=cliPath?.trim()||envPath?.trim();if(explicitPath){const resolved=path.resolve(cwd,explicitPath);if(!pathExists(getSettingsPath(resolved))){const nestedRoot=path.join(resolved,PM_DIRNAME);if(pathExists(getSettingsPath(nestedRoot)))return nestedRoot}return resolved}return resolveImplicitPmRoot(cwd)}function resolveWorkspaceRoot(pmRoot){const normalizedRoot=path.resolve(pmRoot),parent=path.dirname(normalizedRoot);return path.basename(normalizedRoot)==="pm"&&path.basename(parent)===".agents"?path.dirname(parent):normalizedRoot}function resolveGlobalPmRoot(cwd){const envPath=process.env.PM_GLOBAL_PATH?.trim(),selected=envPath&&envPath.length>0?envPath:path.join(os.homedir(),".pm-cli");return path.resolve(cwd,selected)}function getSettingsPath(pmRoot){return path.join(pmRoot,SETTINGS_FILENAME)}function getTypeDirPath(pmRoot,type,typeToFolder=TYPE_TO_FOLDER){const folder=typeToFolder[type]??toDefaultFolder(type);return path.join(pmRoot,folder)}function getItemPath(pmRoot,type,id,itemFormat="toon",typeToFolder=TYPE_TO_FOLDER){return path.join(getTypeDirPath(pmRoot,type,typeToFolder),`${id}${ITEM_FILE_EXTENSION_BY_FORMAT[itemFormat]}`)}function getItemFormatFromPath(itemPath){const normalizedItemPath=itemPath.replaceAll("\\","/"),extension=path.posix.extname(normalizedItemPath).toLowerCase();return ITEM_FORMAT_BY_EXTENSION[extension]??null}function getHistoryPath(pmRoot,id){if(!/^(?!\.{1,2}$)[^/\\:\0]+$/.test(id))throw new PmCliError("Invalid history item id: expected a single filename.",EXIT_CODE.USAGE);return path.join(pmRoot,"history",`${id}.jsonl`)}function getLockPath(pmRoot,id){return path.join(pmRoot,"locks",`${id}.lock`)}function getRuntimePath(pmRoot){return path.join(pmRoot,"runtime")}function getTestRunsPath(pmRoot){return path.join(getRuntimePath(pmRoot),"test-runs")}function getTestRunsRecordsPath(pmRoot){return path.join(getTestRunsPath(pmRoot),"runs")}function getTestRunRecordPath(pmRoot,runId){return path.join(getTestRunsRecordsPath(pmRoot),`${runId}.json`)}function getTestRunsStdoutPath(pmRoot){return path.join(getTestRunsPath(pmRoot),"stdout")}function getTestRunsStderrPath(pmRoot){return path.join(getTestRunsPath(pmRoot),"stderr")}function getTestRunStdoutPath(pmRoot,runId){return path.join(getTestRunsStdoutPath(pmRoot),`${runId}.log`)}function getTestRunStderrPath(pmRoot,runId){return path.join(getTestRunsStderrPath(pmRoot),`${runId}.log`)}function getTestRunsResultsPath(pmRoot){return path.join(getTestRunsPath(pmRoot),"results")}function getTestRunResultPath(pmRoot,runId){return path.join(getTestRunsResultsPath(pmRoot),`${runId}.json`)}export{ITEM_FILE_EXTENSIONS,ITEM_FILE_EXTENSION_BY_FORMAT,discoverNearbyPmRoot,getHistoryPath,getItemFormatFromPath,getItemPath,getLockPath,getRuntimePath,getSettingsPath,getTestRunRecordPath,getTestRunResultPath,getTestRunStderrPath,getTestRunStdoutPath,getTestRunsPath,getTestRunsRecordsPath,getTestRunsResultsPath,getTestRunsStderrPath,getTestRunsStdoutPath,getTypeDirPath,resolveGlobalPmRoot,resolveImplicitPmRoot,resolvePmRoot,resolveWorkspaceRoot};
2
2
  //# sourceMappingURL=paths.js.map
@@ -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]="e2270ad2-349e-5e8c-b23c-3cf0645907dc")}catch(e2){}})();import{EXIT_CODE}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{stableValueEquals}from"../shared/serialization.js";function isRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function reconcileSettingsSnapshot(baseline,proposed,current,segments=[]){if(stableValueEquals(baseline,proposed)&&(segments.length>0||isRecord(current)))return current;if(stableValueEquals(baseline,current)||stableValueEquals(proposed,current)){return proposed}if((baseline===void 0||isRecord(baseline))&&isRecord(proposed)&&isRecord(current)){const before=baseline??{};const keys=new Set([...Object.keys(before),...Object.keys(proposed),...Object.keys(current)]);return Object.fromEntries([...keys].flatMap(key=>{const merged=reconcileSettingsSnapshot(Object.hasOwn(before,key)?before[key]:void 0,Object.hasOwn(proposed,key)?proposed[key]:void 0,Object.hasOwn(current,key)?current[key]:void 0,[...segments,key]);return merged===void 0?[]:[[key,merged]]}))}throw new PmCliError(`Settings changed concurrently at ${segments.join(".")||"<root>"}; read the latest settings and reapply the intended change.`,EXIT_CODE.CONFLICT,{reason:"stale_settings_snapshot",required:"Read a fresh settings snapshot and reapply the intended change.",why:"Another writer changed the same setting after this snapshot was read.",examples:["pm config project export --json"],nextSteps:["Read the current settings, then retry the original config operation."]})}export{reconcileSettingsSnapshot};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a0ca9902-540c-50fe-a4e2-9c234c4a01f3")}catch{}})();import{EXIT_CODE}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{stableValueEquals}from"../shared/serialization.js";function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function reconcileSettingsSnapshot(baseline,proposed,current,segments=[]){if(stableValueEquals(baseline,proposed)&&(segments.length>0||isRecord(current)))return current;if(stableValueEquals(baseline,current)||stableValueEquals(proposed,current))return proposed;if((baseline===void 0||isRecord(baseline))&&isRecord(proposed)&&isRecord(current)){const before=baseline??{},keys=new Set([...Object.keys(before),...Object.keys(proposed),...Object.keys(current)]);return Object.fromEntries([...keys].flatMap(key=>{const merged=reconcileSettingsSnapshot(Object.hasOwn(before,key)?before[key]:void 0,Object.hasOwn(proposed,key)?proposed[key]:void 0,Object.hasOwn(current,key)?current[key]:void 0,[...segments,key]);return merged===void 0?[]:[[key,merged]]}))}throw new PmCliError(`Settings changed concurrently at ${segments.join(".")||"<root>"}; read the latest settings and reapply the intended change.`,EXIT_CODE.CONFLICT,{reason:"stale_settings_snapshot",required:"Read a fresh settings snapshot and reapply the intended change.",why:"Another writer changed the same setting after this snapshot was read.",examples:["pm config project export --json"],nextSteps:["Read the current settings, then retry the original config operation."]})}export{reconcileSettingsSnapshot};
2
2
  //# sourceMappingURL=settings-concurrency.js.map
@@ -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]="7c23ef10-ea7a-5680-8850-822e7d0c07a6")}catch(e2){}})();import{stat}from"node:fs/promises";const settingsReadCacheByRoot=new Map;function normalizeTrackedPaths(paths){return[...new Set(paths.map(pathValue=>pathValue.trim()).filter(pathValue=>pathValue.length>0))].sort((left,right)=>left.localeCompare(right))}async function readPathSignature(targetPath){try{const targetStats=await stat(targetPath);return{path:targetPath,mtime_ms:targetStats.mtimeMs,size:targetStats.size}}catch{return{path:targetPath,mtime_ms:null,size:null}}}async function collectSettingsReadCacheSignatures(paths){const normalizedPaths=normalizeTrackedPaths(paths);const signatures=await Promise.all(normalizedPaths.map(targetPath=>readPathSignature(targetPath)));signatures.sort((left,right)=>left.path.localeCompare(right.path));return signatures}function settingsReadCacheSignaturesEqual(left,right){if(left.length!==right.length){return false}for(let index=0;index<left.length;index+=1){const leftEntry=left[index];const rightEntry=right[index];if(leftEntry.path!==rightEntry.path||leftEntry.mtime_ms!==rightEntry.mtime_ms||leftEntry.size!==rightEntry.size){return false}}return true}function getSettingsReadCacheEntry(pmRoot){return settingsReadCacheByRoot.get(pmRoot)}function setSettingsReadCacheEntry(pmRoot,entry){const normalizedTrackedPaths=normalizeTrackedPaths(entry.tracked_paths);const normalizedSignatures=[...entry.signatures].map(signature=>({path:signature.path,mtime_ms:signature.mtime_ms,size:signature.size})).sort((left,right)=>left.path.localeCompare(right.path));settingsReadCacheByRoot.set(pmRoot,{tracked_paths:normalizedTrackedPaths,signatures:normalizedSignatures,value:entry.value})}function clearSettingsReadCache(pmRoot){if(pmRoot){settingsReadCacheByRoot.delete(pmRoot);return}settingsReadCacheByRoot.clear()}export{clearSettingsReadCache,collectSettingsReadCacheSignatures,getSettingsReadCacheEntry,setSettingsReadCacheEntry,settingsReadCacheSignaturesEqual};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="78c79deb-5cf0-54fe-b98c-a0d5b3671ab2")}catch{}})();import{stat}from"node:fs/promises";const settingsReadCacheByRoot=new Map;function normalizeTrackedPaths(paths){return[...new Set(paths.map(pathValue=>pathValue.trim()).filter(pathValue=>pathValue.length>0))].sort((left,right)=>left.localeCompare(right))}async function readPathSignature(targetPath){try{const targetStats=await stat(targetPath);return{path:targetPath,mtime_ms:targetStats.mtimeMs,size:targetStats.size}}catch{return{path:targetPath,mtime_ms:null,size:null}}}async function collectSettingsReadCacheSignatures(paths){const normalizedPaths=normalizeTrackedPaths(paths),signatures=await Promise.all(normalizedPaths.map(targetPath=>readPathSignature(targetPath)));return signatures.sort((left,right)=>left.path.localeCompare(right.path)),signatures}function settingsReadCacheSignaturesEqual(left,right){if(left.length!==right.length)return!1;for(let index=0;index<left.length;index+=1){const leftEntry=left[index],rightEntry=right[index];if(leftEntry.path!==rightEntry.path||leftEntry.mtime_ms!==rightEntry.mtime_ms||leftEntry.size!==rightEntry.size)return!1}return!0}function getSettingsReadCacheEntry(pmRoot){return settingsReadCacheByRoot.get(pmRoot)}function setSettingsReadCacheEntry(pmRoot,entry){const normalizedTrackedPaths=normalizeTrackedPaths(entry.tracked_paths),normalizedSignatures=[...entry.signatures].map(signature=>({path:signature.path,mtime_ms:signature.mtime_ms,size:signature.size})).sort((left,right)=>left.path.localeCompare(right.path));settingsReadCacheByRoot.set(pmRoot,{tracked_paths:normalizedTrackedPaths,signatures:normalizedSignatures,value:entry.value})}function clearSettingsReadCache(pmRoot){if(pmRoot){settingsReadCacheByRoot.delete(pmRoot);return}settingsReadCacheByRoot.clear()}export{clearSettingsReadCache,collectSettingsReadCacheSignatures,getSettingsReadCacheEntry,setSettingsReadCacheEntry,settingsReadCacheSignaturesEqual};
2
2
  //# sourceMappingURL=settings-read-cache.js.map
@@ -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]="245ec731-790e-55ae-9bb6-3eeaaefe27ee")}catch(e2){}})();import{GOVERNANCE_PRESET_VALUES,RUNTIME_FIELD_COMMAND_VALUES,RUNTIME_FIELD_TYPE_VALUES,RUNTIME_STATUS_ROLE_VALUES,RUNTIME_UNKNOWN_FIELD_POLICY_VALUES}from"../../types.js";const FAIL={ok:false};const vString=input=>typeof input==="string"?{ok:true,value:input}:FAIL;const vBoolean=input=>typeof input==="boolean"?{ok:true,value:input}:FAIL;function vNumber(options={}){return input=>{if(typeof input!=="number"||!Number.isFinite(input)){return FAIL}if(options.int&&(!Number.isInteger(input)||!Number.isSafeInteger(input))){return FAIL}if(options.positive&&input<=0){return FAIL}if(typeof options.min==="number"&&input<options.min){return FAIL}if(typeof options.max==="number"&&input>options.max){return FAIL}return{ok:true,value:input}}}function vLiteral(...allowed){return input=>typeof input==="string"&&allowed.includes(input)?{ok:true,value:input}:FAIL}function vArray(item,maxLength){return input=>{if(!Array.isArray(input)||maxLength!==void 0&&input.length>maxLength){return FAIL}const value=[];for(const element of input){const result=item(element);if(!result.ok){return FAIL}value.push(result.value)}return{ok:true,value}}}function vBoundedNormalizedString(maxLength,pattern){return input=>typeof input==="string"&&input.length>0&&input.length<=maxLength&&input===input.trim()&&(pattern===void 0||pattern.test(input))?{ok:true,value:input}:FAIL}function vOptional(inner){return input=>input===void 0?{ok:true,value:void 0}:inner(input)}function vRecordOf(valueCheck){return input=>{if(typeof input!=="object"||input===null||Array.isArray(input)){return FAIL}const value={};for(const[key,raw]of Object.entries(input)){const result=valueCheck(raw);if(!result.ok){return FAIL}value[key]=result.value}return{ok:true,value}}}function vObject(shape){return input=>{if(typeof input!=="object"||input===null||Array.isArray(input)){return FAIL}const record=input;const value={};for(const[key,check]of Object.entries(shape)){const result=check(record[key]);if(!result.ok){return FAIL}if(result.value!==void 0){value[key]=result.value}}return{ok:true,value}}}const itemTypeOption=vObject({key:vString,values:vArray(vString),required:vOptional(vBoolean),aliases:vOptional(vArray(vString)),description:vOptional(vString)});const itemTypeCommandOptionPolicy=vObject({command:vLiteral("create","update"),option:vString,required:vOptional(vBoolean),visible:vOptional(vBoolean),enabled:vOptional(vBoolean)});const itemTypeDefinition=vObject({name:vString,description:vOptional(vString),default_status:vOptional(vString),execution_role:vOptional(vLiteral("agent","human","gate")),folder:vOptional(vString),aliases:vOptional(vArray(vString)),required_create_fields:vOptional(vArray(vString)),required_create_repeatables:vOptional(vArray(vString)),options:vOptional(vArray(itemTypeOption)),command_option_policies:vOptional(vArray(itemTypeCommandOptionPolicy))});const runtimeStatusDefinition=vObject({id:vString,aliases:vOptional(vArray(vString)),roles:vOptional(vArray(vLiteral(...RUNTIME_STATUS_ROLE_VALUES))),description:vOptional(vString),order:vOptional(vNumber())});const runtimeFieldDefinition=vObject({key:vString,metadata_key:vOptional(vString),front_matter_key:vOptional(vString),cli_flag:vOptional(vString),cli_aliases:vOptional(vArray(vString)),description:vOptional(vString),type:vOptional(vLiteral(...RUNTIME_FIELD_TYPE_VALUES)),commands:vOptional(vArray(vLiteral(...RUNTIME_FIELD_COMMAND_VALUES))),repeatable:vOptional(vBoolean),required:vOptional(vBoolean),required_on_create:vOptional(vBoolean),required_types:vOptional(vArray(vString)),allow_unset:vOptional(vBoolean)});const statusTransitionPair=input=>{if(!Array.isArray(input)||input.length!==2){return FAIL}const[from,to]=input;if(typeof from!=="string"||typeof to!=="string"){return FAIL}return{ok:true,value:[from,to]}};const typeWorkflowDefinition=vObject({type:vString,allowed_transitions:vArray(statusTransitionPair)});const runtimeSchemaSettings=vOptional(vObject({version:vOptional(vNumber({int:true})),files:vOptional(vObject({types:vOptional(vString),statuses:vOptional(vString),fields:vOptional(vString),workflows:vOptional(vString)})),statuses:vOptional(vArray(runtimeStatusDefinition)),fields:vOptional(vArray(runtimeFieldDefinition)),workflow:vOptional(vObject({draft_status:vOptional(vString),open_status:vOptional(vString),in_progress_status:vOptional(vString),blocked_status:vOptional(vString),close_status:vOptional(vString),canceled_status:vOptional(vString)})),type_workflows:vOptional(vArray(typeWorkflowDefinition)),unknown_field_policy:vOptional(vLiteral(...RUNTIME_UNKNOWN_FIELD_POLICY_VALUES))}));const governanceSettings=vOptional(vObject({preset:vOptional(vLiteral(...GOVERNANCE_PRESET_VALUES)),ownership_enforcement:vOptional(vLiteral("none","warn","strict")),create_mode_default:vOptional(vLiteral("progressive","strict")),close_validation_default:vOptional(vLiteral("off","warn","strict")),require_close_reason:vOptional(vBoolean),parent_reference:vOptional(vLiteral("warn","strict_error")),metadata_profile:vOptional(vLiteral("core","strict","custom")),force_required_for_stale_lock:vOptional(vBoolean),create_default_type:vOptional(vString),workflow_enforcement:vOptional(vLiteral("off","warn","strict")),duplicate_detection_mode:vOptional(vLiteral("off","advisory","strict")),duplicate_detection_threshold:vOptional(vNumber({min:0,max:1})),duplicate_detection_limit:vOptional(vNumber({int:true,min:0,max:20}))}));const extensionPolicyOverride=vObject({name:vString,disabled:vOptional(vBoolean),require_trusted:vOptional(vBoolean),require_provenance:vOptional(vBoolean),sandbox_profile:vOptional(vLiteral("none","restricted","strict")),allowed_capabilities:vOptional(vArray(vString)),blocked_capabilities:vOptional(vArray(vString)),allowed_surfaces:vOptional(vArray(vString)),blocked_surfaces:vOptional(vArray(vString)),allowed_commands:vOptional(vArray(vString)),blocked_commands:vOptional(vArray(vString)),allowed_actions:vOptional(vArray(vString)),blocked_actions:vOptional(vArray(vString)),allowed_services:vOptional(vArray(vString)),blocked_services:vOptional(vArray(vString))});const pmMaxVersionExceededModeLiteral=vLiteral("block","warn");const pmMaxVersionExceededMode=input=>typeof input==="string"?pmMaxVersionExceededModeLiteral(input):vObject({global:vOptional(pmMaxVersionExceededModeLiteral),project:vOptional(pmMaxVersionExceededModeLiteral)})(input);const extensionPolicy=vOptional(vObject({mode:vOptional(vLiteral("off","warn","enforce")),trust_mode:vOptional(vLiteral("off","warn","enforce")),pm_max_version_exceeded_mode:vOptional(pmMaxVersionExceededMode),require_provenance:vOptional(vBoolean),trusted_extensions:vOptional(vArray(vString)),default_sandbox_profile:vOptional(vLiteral("none","restricted","strict")),allowed_extensions:vOptional(vArray(vString)),blocked_extensions:vOptional(vArray(vString)),allowed_capabilities:vOptional(vArray(vString)),blocked_capabilities:vOptional(vArray(vString)),allowed_surfaces:vOptional(vArray(vString)),blocked_surfaces:vOptional(vArray(vString)),allowed_commands:vOptional(vArray(vString)),blocked_commands:vOptional(vArray(vString)),allowed_actions:vOptional(vArray(vString)),blocked_actions:vOptional(vArray(vString)),allowed_services:vOptional(vArray(vString)),blocked_services:vOptional(vArray(vString)),extension_overrides:vOptional(vArray(extensionPolicyOverride))}));const harnessSignalLiteral=vBoundedNormalizedString(128);const harnessSignalDescriptor=vObject({harness:vBoundedNormalizedString(128,/^[a-z0-9]+(?:-[a-z0-9]+)*$/u),environment_keys:vOptional(vArray(harnessSignalLiteral,64)),model_environment_keys:vOptional(vArray(harnessSignalLiteral,64)),session_environment_keys:vOptional(vArray(harnessSignalLiteral,64)),provenance_environment_keys:vOptional(vRecordOf(vArray(harnessSignalLiteral,64))),provenance_resolvers:vOptional(vRecordOf(vLiteral("ai_agent_version","claude_session_file"))),provenance_unavailable_dimensions:vOptional(vArray(harnessSignalLiteral,64)),argv_markers:vOptional(vArray(harnessSignalLiteral,64)),client_names:vOptional(vArray(harnessSignalLiteral,64))});const settingsCheck=vObject({version:vNumber({int:true}),id_prefix:vString,ids:vOptional(vObject({token_length:vOptional(vNumber({int:true,min:4,max:12}))})),author_default:vString,agent_identity:vOptional(vObject({probes_enabled:vOptional(vBoolean),identity_vocabulary:vOptional(vObject({version:vNumber({int:true,positive:true}),aliases:vRecordOf(vBoundedNormalizedString(128,/^[a-z0-9]+(?:-[a-z0-9]+)*$/u))})),harness_signals:vArray(harnessSignalDescriptor)})),mutation_guard:vOptional(vObject({require_attributed_author:vOptional(vBoolean),secret_guard:vOptional(vLiteral("off","advise","block")),stale_in_progress_hours:vOptional(vNumber({int:true,positive:true}))})),item_format:vOptional(vLiteral("toon","json_markdown")),locks:vObject({ttl_seconds:vNumber({int:true}),wait_ms:vOptional(vNumber({int:true,min:0}))}),checkpoints:vOptional(vObject({retention_days:vOptional(vNumber({int:true,positive:true}))})),output:vObject({default_format:vLiteral("toon","json")}),ux:vOptional(vObject({deprecation_hints:vOptional(vBoolean)})),history:vOptional(vObject({missing_stream:vLiteral("auto_create","strict_error"),compact_policy:vOptional(vObject({enabled:vOptional(vBoolean),max_entries:vOptional(vNumber({int:true,positive:true})),trigger:vOptional(vLiteral("health_warn","auto"))}))})),validation:vOptional(vObject({sprint_release_format:vLiteral("warn","strict_error"),parent_reference:vOptional(vLiteral("warn","strict_error")),metadata_profile:vOptional(vLiteral("core","strict","custom")),metadata_required_fields:vOptional(vArray(vString)),lifecycle_stale_blocker_reason_patterns:vOptional(vArray(vString)),lifecycle_closure_like_blocked_reason_patterns:vOptional(vArray(vString)),lifecycle_closure_like_resolution_patterns:vOptional(vArray(vString)),lifecycle_closure_like_actual_result_patterns:vOptional(vArray(vString)),estimate_defaults_by_type:vOptional(vRecordOf(vNumber({int:true,positive:true})))})),governance:governanceSettings,workflow:vOptional(vObject({definition_of_done:vArray(vString)})),testing:vOptional(vObject({record_results_to_items:vBoolean,allow_untrusted_linked_tests:vOptional(vBoolean)})),telemetry:vOptional(vObject({enabled:vBoolean,first_run_prompt_completed:vOptional(vBoolean),capture_level:vOptional(vLiteral("minimal","redacted","max")),endpoint:vOptional(vString),installation_id:vOptional(vString),retention_days:vOptional(vNumber({int:true,positive:true}))})),agent_guidance:vOptional(vObject({prompt_completed:vOptional(vBoolean),declined:vOptional(vBoolean),declined_at:vOptional(vString),template_version:vOptional(vNumber({int:true,positive:true})),last_checked_files:vOptional(vArray(vString))})),item_types:vOptional(vObject({definitions:vArray(itemTypeDefinition)})),schema:runtimeSchemaSettings,context:vOptional(vObject({default_depth:vOptional(vLiteral("brief","standard","deep")),activity_limit:vOptional(vNumber({int:true,positive:true})),stale_threshold_days:vOptional(vNumber({int:true,positive:true})),sections:vOptional(vObject({hierarchy:vOptional(vBoolean),activity:vOptional(vBoolean),progress:vOptional(vBoolean),recently_created:vOptional(vBoolean),unparented:vOptional(vBoolean),blockers:vOptional(vBoolean),files:vOptional(vBoolean),workload:vOptional(vBoolean),staleness:vOptional(vBoolean),tests:vOptional(vBoolean)}))})),extensions:vObject({enabled:vArray(vString),disabled:vArray(vString),policy:extensionPolicy}),search:vObject({score_threshold:vNumber(),hybrid_semantic_weight:vOptional(vNumber()),max_results:vNumber({int:true}),embedding_model:vString,embedding_corpus_max_characters:vOptional(vNumber()),embedding_batch_size:vNumber({int:true}),embedding_timeout_ms:vOptional(vNumber({int:true})),scanner_max_batch_retries:vNumber({int:true}),provider:vOptional(vString),default_mode:vOptional(vLiteral("auto","keyword","semantic","hybrid")),corpus_fields:vOptional(vArray(vString)),mutation_refresh_policy:vOptional(vLiteral("cache_only","semantic_configured","semantic_auto")),query_expansion:vOptional(vObject({enabled:vOptional(vBoolean),provider:vOptional(vString)})),rerank:vOptional(vObject({enabled:vOptional(vBoolean),model:vOptional(vString),top_k:vOptional(vNumber({int:true,positive:true}))})),bm25:vOptional(vObject({k1:vOptional(vNumber()),b:vOptional(vNumber())}))}),providers:vObject({openai:vObject({base_url:vString,api_key:vString,model:vString}),ollama:vObject({base_url:vString,model:vString})}),vector_store:vObject({adapter:vOptional(vString),collection_name:vOptional(vString),qdrant:vObject({url:vString,api_key:vString}),lancedb:vObject({path:vString})})});function validateSettings(raw){const result=settingsCheck(raw);if(!result.ok){return{success:false}}return{success:true,data:result.value}}export{validateSettings};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f4ae942c-f11f-5d24-95bf-a2abf3c226da")}catch{}})();import{GOVERNANCE_PRESET_VALUES,RUNTIME_FIELD_COMMAND_VALUES,RUNTIME_FIELD_TYPE_VALUES,RUNTIME_STATUS_ROLE_VALUES,RUNTIME_UNKNOWN_FIELD_POLICY_VALUES}from"../../types.js";const FAIL={ok:!1},vString=input=>typeof input=="string"?{ok:!0,value:input}:FAIL,vBoolean=input=>typeof input=="boolean"?{ok:!0,value:input}:FAIL;function vNumber(options={}){return input=>typeof input!="number"||!Number.isFinite(input)||options.int&&(!Number.isInteger(input)||!Number.isSafeInteger(input))||options.positive&&input<=0||typeof options.min=="number"&&input<options.min||typeof options.max=="number"&&input>options.max?FAIL:{ok:!0,value:input}}function vLiteral(...allowed){return input=>typeof input=="string"&&allowed.includes(input)?{ok:!0,value:input}:FAIL}function vArray(item,maxLength){return input=>{if(!Array.isArray(input)||maxLength!==void 0&&input.length>maxLength)return FAIL;const value=[];for(const element of input){const result=item(element);if(!result.ok)return FAIL;value.push(result.value)}return{ok:!0,value}}}function vBoundedNormalizedString(maxLength,pattern){return input=>typeof input=="string"&&input.length>0&&input.length<=maxLength&&input===input.trim()&&(pattern===void 0||pattern.test(input))?{ok:!0,value:input}:FAIL}function vOptional(inner){return input=>input===void 0?{ok:!0,value:void 0}:inner(input)}function vRecordOf(valueCheck){return input=>{if(typeof input!="object"||input===null||Array.isArray(input))return FAIL;const value={};for(const[key,raw]of Object.entries(input)){const result=valueCheck(raw);if(!result.ok)return FAIL;value[key]=result.value}return{ok:!0,value}}}function vObject(shape){return input=>{if(typeof input!="object"||input===null||Array.isArray(input))return FAIL;const record=input,value={};for(const[key,check]of Object.entries(shape)){const result=check(record[key]);if(!result.ok)return FAIL;result.value!==void 0&&(value[key]=result.value)}return{ok:!0,value}}}const itemTypeOption=vObject({key:vString,values:vArray(vString),required:vOptional(vBoolean),aliases:vOptional(vArray(vString)),description:vOptional(vString)}),itemTypeCommandOptionPolicy=vObject({command:vLiteral("create","update"),option:vString,required:vOptional(vBoolean),visible:vOptional(vBoolean),enabled:vOptional(vBoolean)}),itemTypeDefinition=vObject({name:vString,description:vOptional(vString),default_status:vOptional(vString),execution_role:vOptional(vLiteral("agent","human","gate")),folder:vOptional(vString),aliases:vOptional(vArray(vString)),required_create_fields:vOptional(vArray(vString)),required_create_repeatables:vOptional(vArray(vString)),options:vOptional(vArray(itemTypeOption)),command_option_policies:vOptional(vArray(itemTypeCommandOptionPolicy))}),runtimeStatusDefinition=vObject({id:vString,aliases:vOptional(vArray(vString)),roles:vOptional(vArray(vLiteral(...RUNTIME_STATUS_ROLE_VALUES))),description:vOptional(vString),order:vOptional(vNumber())}),runtimeFieldDefinition=vObject({key:vString,metadata_key:vOptional(vString),front_matter_key:vOptional(vString),cli_flag:vOptional(vString),cli_aliases:vOptional(vArray(vString)),description:vOptional(vString),type:vOptional(vLiteral(...RUNTIME_FIELD_TYPE_VALUES)),commands:vOptional(vArray(vLiteral(...RUNTIME_FIELD_COMMAND_VALUES))),repeatable:vOptional(vBoolean),required:vOptional(vBoolean),required_on_create:vOptional(vBoolean),required_types:vOptional(vArray(vString)),allow_unset:vOptional(vBoolean)}),statusTransitionPair=input=>{if(!Array.isArray(input)||input.length!==2)return FAIL;const[from,to]=input;return typeof from!="string"||typeof to!="string"?FAIL:{ok:!0,value:[from,to]}},typeWorkflowDefinition=vObject({type:vString,allowed_transitions:vArray(statusTransitionPair)}),runtimeSchemaSettings=vOptional(vObject({version:vOptional(vNumber({int:!0})),files:vOptional(vObject({types:vOptional(vString),statuses:vOptional(vString),fields:vOptional(vString),workflows:vOptional(vString)})),statuses:vOptional(vArray(runtimeStatusDefinition)),fields:vOptional(vArray(runtimeFieldDefinition)),workflow:vOptional(vObject({draft_status:vOptional(vString),open_status:vOptional(vString),in_progress_status:vOptional(vString),blocked_status:vOptional(vString),close_status:vOptional(vString),canceled_status:vOptional(vString)})),type_workflows:vOptional(vArray(typeWorkflowDefinition)),unknown_field_policy:vOptional(vLiteral(...RUNTIME_UNKNOWN_FIELD_POLICY_VALUES))})),governanceSettings=vOptional(vObject({preset:vOptional(vLiteral(...GOVERNANCE_PRESET_VALUES)),ownership_enforcement:vOptional(vLiteral("none","warn","strict")),create_mode_default:vOptional(vLiteral("progressive","strict")),close_validation_default:vOptional(vLiteral("off","warn","strict")),require_close_reason:vOptional(vBoolean),parent_reference:vOptional(vLiteral("warn","strict_error")),metadata_profile:vOptional(vLiteral("core","strict","custom")),force_required_for_stale_lock:vOptional(vBoolean),create_default_type:vOptional(vString),workflow_enforcement:vOptional(vLiteral("off","warn","strict")),duplicate_detection_mode:vOptional(vLiteral("off","advisory","strict")),duplicate_detection_threshold:vOptional(vNumber({min:0,max:1})),duplicate_detection_limit:vOptional(vNumber({int:!0,min:0,max:20}))})),extensionPolicyOverride=vObject({name:vString,disabled:vOptional(vBoolean),require_trusted:vOptional(vBoolean),require_provenance:vOptional(vBoolean),sandbox_profile:vOptional(vLiteral("none","restricted","strict")),allowed_capabilities:vOptional(vArray(vString)),blocked_capabilities:vOptional(vArray(vString)),allowed_surfaces:vOptional(vArray(vString)),blocked_surfaces:vOptional(vArray(vString)),allowed_commands:vOptional(vArray(vString)),blocked_commands:vOptional(vArray(vString)),allowed_actions:vOptional(vArray(vString)),blocked_actions:vOptional(vArray(vString)),allowed_services:vOptional(vArray(vString)),blocked_services:vOptional(vArray(vString))}),pmMaxVersionExceededModeLiteral=vLiteral("block","warn"),pmMaxVersionExceededMode=input=>typeof input=="string"?pmMaxVersionExceededModeLiteral(input):vObject({global:vOptional(pmMaxVersionExceededModeLiteral),project:vOptional(pmMaxVersionExceededModeLiteral)})(input),extensionPolicy=vOptional(vObject({mode:vOptional(vLiteral("off","warn","enforce")),trust_mode:vOptional(vLiteral("off","warn","enforce")),pm_max_version_exceeded_mode:vOptional(pmMaxVersionExceededMode),require_provenance:vOptional(vBoolean),trusted_extensions:vOptional(vArray(vString)),default_sandbox_profile:vOptional(vLiteral("none","restricted","strict")),allowed_extensions:vOptional(vArray(vString)),blocked_extensions:vOptional(vArray(vString)),allowed_capabilities:vOptional(vArray(vString)),blocked_capabilities:vOptional(vArray(vString)),allowed_surfaces:vOptional(vArray(vString)),blocked_surfaces:vOptional(vArray(vString)),allowed_commands:vOptional(vArray(vString)),blocked_commands:vOptional(vArray(vString)),allowed_actions:vOptional(vArray(vString)),blocked_actions:vOptional(vArray(vString)),allowed_services:vOptional(vArray(vString)),blocked_services:vOptional(vArray(vString)),extension_overrides:vOptional(vArray(extensionPolicyOverride))})),harnessSignalLiteral=vBoundedNormalizedString(128),harnessSignalDescriptor=vObject({harness:vBoundedNormalizedString(128,/^[a-z0-9]+(?:-[a-z0-9]+)*$/u),environment_keys:vOptional(vArray(harnessSignalLiteral,64)),model_environment_keys:vOptional(vArray(harnessSignalLiteral,64)),session_environment_keys:vOptional(vArray(harnessSignalLiteral,64)),provenance_environment_keys:vOptional(vRecordOf(vArray(harnessSignalLiteral,64))),provenance_resolvers:vOptional(vRecordOf(vLiteral("ai_agent_version","claude_session_file"))),provenance_unavailable_dimensions:vOptional(vArray(harnessSignalLiteral,64)),argv_markers:vOptional(vArray(harnessSignalLiteral,64)),client_names:vOptional(vArray(harnessSignalLiteral,64))}),settingsCheck=vObject({version:vNumber({int:!0}),id_prefix:vString,ids:vOptional(vObject({token_length:vOptional(vNumber({int:!0,min:4,max:12}))})),author_default:vString,agent_identity:vOptional(vObject({probes_enabled:vOptional(vBoolean),identity_vocabulary:vOptional(vObject({version:vNumber({int:!0,positive:!0}),aliases:vRecordOf(vBoundedNormalizedString(128,/^[a-z0-9]+(?:-[a-z0-9]+)*$/u))})),harness_signals:vArray(harnessSignalDescriptor)})),mutation_guard:vOptional(vObject({require_attributed_author:vOptional(vBoolean),secret_guard:vOptional(vLiteral("off","advise","block")),stale_in_progress_hours:vOptional(vNumber({int:!0,positive:!0}))})),item_format:vOptional(vLiteral("toon","json_markdown")),locks:vObject({ttl_seconds:vNumber({int:!0}),wait_ms:vOptional(vNumber({int:!0,min:0}))}),checkpoints:vOptional(vObject({retention_days:vOptional(vNumber({int:!0,positive:!0}))})),output:vObject({default_format:vLiteral("toon","json")}),ux:vOptional(vObject({deprecation_hints:vOptional(vBoolean)})),history:vOptional(vObject({missing_stream:vLiteral("auto_create","strict_error"),compact_policy:vOptional(vObject({enabled:vOptional(vBoolean),max_entries:vOptional(vNumber({int:!0,positive:!0})),trigger:vOptional(vLiteral("health_warn","auto"))}))})),validation:vOptional(vObject({sprint_release_format:vLiteral("warn","strict_error"),parent_reference:vOptional(vLiteral("warn","strict_error")),metadata_profile:vOptional(vLiteral("core","strict","custom")),metadata_required_fields:vOptional(vArray(vString)),lifecycle_stale_blocker_reason_patterns:vOptional(vArray(vString)),lifecycle_closure_like_blocked_reason_patterns:vOptional(vArray(vString)),lifecycle_closure_like_resolution_patterns:vOptional(vArray(vString)),lifecycle_closure_like_actual_result_patterns:vOptional(vArray(vString)),estimate_defaults_by_type:vOptional(vRecordOf(vNumber({int:!0,positive:!0})))})),governance:governanceSettings,workflow:vOptional(vObject({definition_of_done:vArray(vString)})),testing:vOptional(vObject({record_results_to_items:vBoolean,allow_untrusted_linked_tests:vOptional(vBoolean)})),telemetry:vOptional(vObject({enabled:vBoolean,first_run_prompt_completed:vOptional(vBoolean),capture_level:vOptional(vLiteral("minimal","redacted","max")),endpoint:vOptional(vString),installation_id:vOptional(vString),retention_days:vOptional(vNumber({int:!0,positive:!0}))})),agent_guidance:vOptional(vObject({prompt_completed:vOptional(vBoolean),declined:vOptional(vBoolean),declined_at:vOptional(vString),template_version:vOptional(vNumber({int:!0,positive:!0})),last_checked_files:vOptional(vArray(vString))})),item_types:vOptional(vObject({definitions:vArray(itemTypeDefinition)})),schema:runtimeSchemaSettings,context:vOptional(vObject({default_depth:vOptional(vLiteral("brief","standard","deep")),activity_limit:vOptional(vNumber({int:!0,positive:!0})),stale_threshold_days:vOptional(vNumber({int:!0,positive:!0})),sections:vOptional(vObject({hierarchy:vOptional(vBoolean),activity:vOptional(vBoolean),progress:vOptional(vBoolean),recently_created:vOptional(vBoolean),unparented:vOptional(vBoolean),blockers:vOptional(vBoolean),files:vOptional(vBoolean),workload:vOptional(vBoolean),staleness:vOptional(vBoolean),tests:vOptional(vBoolean)}))})),extensions:vObject({enabled:vArray(vString),disabled:vArray(vString),policy:extensionPolicy}),search:vObject({score_threshold:vNumber(),hybrid_semantic_weight:vOptional(vNumber()),max_results:vNumber({int:!0}),embedding_model:vString,embedding_corpus_max_characters:vOptional(vNumber()),embedding_batch_size:vNumber({int:!0}),embedding_timeout_ms:vOptional(vNumber({int:!0})),scanner_max_batch_retries:vNumber({int:!0}),provider:vOptional(vString),default_mode:vOptional(vLiteral("auto","keyword","semantic","hybrid")),corpus_fields:vOptional(vArray(vString)),mutation_refresh_policy:vOptional(vLiteral("cache_only","semantic_configured","semantic_auto")),query_expansion:vOptional(vObject({enabled:vOptional(vBoolean),provider:vOptional(vString)})),rerank:vOptional(vObject({enabled:vOptional(vBoolean),model:vOptional(vString),top_k:vOptional(vNumber({int:!0,positive:!0}))})),bm25:vOptional(vObject({k1:vOptional(vNumber()),b:vOptional(vNumber())}))}),providers:vObject({openai:vObject({base_url:vString,api_key:vString,model:vString}),ollama:vObject({base_url:vString,model:vString})}),vector_store:vObject({adapter:vOptional(vString),collection_name:vOptional(vString),qdrant:vObject({url:vString,api_key:vString}),lancedb:vObject({path:vString})})});function validateSettings(raw){const result=settingsCheck(raw);return result.ok?{success:!0,data:result.value}:{success:!1}}export{validateSettings};
2
2
  //# sourceMappingURL=settings-validator.js.map
@@ -35,7 +35,15 @@ interface SettingsPersistSourceSnapshot {
35
35
  runtime_schema_type_workflows: NonNullable<PmSettings["schema"]["type_workflows"]>;
36
36
  }
37
37
  interface SerializeSettingsOptions {
38
+ /** Ordinary writer snapshot, including file-backed schema boundaries. */
38
39
  persist_source?: SettingsPersistSourceSnapshot;
40
+ /** Paired views of one locked inline source, without schema hydration. */
41
+ source?: {
42
+ /** Parsed original JSON whose sparse omissions and future fields survive known-value edits. */
43
+ raw: unknown;
44
+ /** Validated projection of the same original JSON, used for the canonical delta baseline. */
45
+ validated: ParsedSettings;
46
+ };
39
47
  }
40
48
  /** Documents the settings read metadata payload exchanged by command, SDK, and package integrations. */
41
49
  export interface SettingsReadMetadata {
@@ -89,9 +97,10 @@ declare function valueOrDefault<T>(value: T | undefined, fallback: T): T;
89
97
  declare function arrayOrEmpty<T>(value: unknown): T[];
90
98
  /** Implements normalize item type definitions for the public runtime surface of this module. */
91
99
  export declare function normalizeItemTypeDefinitions(definitions: ItemTypeDefinition[] | undefined): ItemTypeDefinition[];
92
- declare function mergeSettings(settings: ParsedSettings): PmSettings;
100
+ /** Resolve validated inline settings using the shared defaults and preset rules, without filesystem reads or schema hydration. */
101
+ export declare function mergeSettings(settings: ParsedSettings): PmSettings;
93
102
  declare function applySettingsDelta(target: Record<string, unknown>, baseline: Record<string, unknown>, current: Record<string, unknown>): void;
94
- /** Implements serialize settings for the public runtime surface of this module. */
103
+ /** Canonicalize settings, optionally applying only known-value changes to a captured sparse source. */
95
104
  export declare function serializeSettings(settings: PmSettings, options?: SerializeSettingsOptions): string;
96
105
  /** Implements read settings with metadata for the public runtime surface of this module. */
97
106
  export declare function readSettingsWithMetadata(pmRoot: string): Promise<SettingsReadResult>;