canopycms 0.0.60 → 0.0.61-int.74

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 (218) hide show
  1. package/dist/api/__test__/mock-client.d.ts +29 -0
  2. package/dist/api/__test__/mock-client.d.ts.map +1 -1
  3. package/dist/api/__test__/mock-client.js +51 -0
  4. package/dist/api/__test__/mock-client.js.map +1 -1
  5. package/dist/api/admin-branch-health.d.ts +65 -0
  6. package/dist/api/admin-branch-health.d.ts.map +1 -0
  7. package/dist/api/admin-branch-health.js +448 -0
  8. package/dist/api/admin-branch-health.js.map +1 -0
  9. package/dist/api/admin.d.ts +136 -0
  10. package/dist/api/admin.d.ts.map +1 -0
  11. package/dist/api/admin.js +338 -0
  12. package/dist/api/admin.js.map +1 -0
  13. package/dist/api/assets.d.ts.map +1 -1
  14. package/dist/api/assets.js +4 -0
  15. package/dist/api/assets.js.map +1 -1
  16. package/dist/api/branch-merge.d.ts +6 -0
  17. package/dist/api/branch-merge.d.ts.map +1 -1
  18. package/dist/api/branch-merge.js +13 -3
  19. package/dist/api/branch-merge.js.map +1 -1
  20. package/dist/api/branch-status.d.ts.map +1 -1
  21. package/dist/api/branch-status.js +15 -5
  22. package/dist/api/branch-status.js.map +1 -1
  23. package/dist/api/branch-withdraw.d.ts +6 -0
  24. package/dist/api/branch-withdraw.d.ts.map +1 -1
  25. package/dist/api/branch-withdraw.js +15 -3
  26. package/dist/api/branch-withdraw.js.map +1 -1
  27. package/dist/api/branch.d.ts +11 -1
  28. package/dist/api/branch.d.ts.map +1 -1
  29. package/dist/api/branch.js +70 -4
  30. package/dist/api/branch.js.map +1 -1
  31. package/dist/api/client.d.ts +34 -0
  32. package/dist/api/client.d.ts.map +1 -1
  33. package/dist/api/client.js +47 -0
  34. package/dist/api/client.js.map +1 -1
  35. package/dist/api/comments.d.ts.map +1 -1
  36. package/dist/api/comments.js +4 -0
  37. package/dist/api/comments.js.map +1 -1
  38. package/dist/api/content.d.ts.map +1 -1
  39. package/dist/api/content.js +4 -4
  40. package/dist/api/content.js.map +1 -1
  41. package/dist/api/entries.js +1 -1
  42. package/dist/api/entries.js.map +1 -1
  43. package/dist/api/github-sync.d.ts.map +1 -1
  44. package/dist/api/github-sync.js +14 -3
  45. package/dist/api/github-sync.js.map +1 -1
  46. package/dist/api/guards.d.ts +7 -1
  47. package/dist/api/guards.d.ts.map +1 -1
  48. package/dist/api/guards.js +54 -0
  49. package/dist/api/guards.js.map +1 -1
  50. package/dist/api/index.d.ts +1 -0
  51. package/dist/api/index.d.ts.map +1 -1
  52. package/dist/api/index.js +0 -1
  53. package/dist/api/index.js.map +1 -1
  54. package/dist/api/schema.js +7 -7
  55. package/dist/api/schema.js.map +1 -1
  56. package/dist/authorization/branch.d.ts +14 -1
  57. package/dist/authorization/branch.d.ts.map +1 -1
  58. package/dist/authorization/branch.js +5 -3
  59. package/dist/authorization/branch.js.map +1 -1
  60. package/dist/authorization/index.d.ts +1 -0
  61. package/dist/authorization/index.d.ts.map +1 -1
  62. package/dist/authorization/index.js +2 -0
  63. package/dist/authorization/index.js.map +1 -1
  64. package/dist/authorization/protected-branch.d.ts +39 -0
  65. package/dist/authorization/protected-branch.d.ts.map +1 -0
  66. package/dist/authorization/protected-branch.js +43 -0
  67. package/dist/authorization/protected-branch.js.map +1 -0
  68. package/dist/branch-health.d.ts +78 -0
  69. package/dist/branch-health.d.ts.map +1 -0
  70. package/dist/branch-health.js +151 -0
  71. package/dist/branch-health.js.map +1 -0
  72. package/dist/branch-metadata.d.ts +20 -0
  73. package/dist/branch-metadata.d.ts.map +1 -1
  74. package/dist/branch-metadata.js +21 -1
  75. package/dist/branch-metadata.js.map +1 -1
  76. package/dist/branch-registry.d.ts.map +1 -1
  77. package/dist/branch-registry.js +13 -1
  78. package/dist/branch-registry.js.map +1 -1
  79. package/dist/cli/cli.js +154 -13
  80. package/dist/cli/generate-ai-content.js +54 -10
  81. package/dist/cli/init.js +72 -0
  82. package/dist/cli/sync.d.ts.map +1 -1
  83. package/dist/cli/sync.js +4 -1
  84. package/dist/cli/sync.js.map +1 -1
  85. package/dist/content-store.d.ts +16 -0
  86. package/dist/content-store.d.ts.map +1 -1
  87. package/dist/content-store.js +22 -6
  88. package/dist/content-store.js.map +1 -1
  89. package/dist/editor/BranchManager.d.ts +9 -1
  90. package/dist/editor/BranchManager.d.ts.map +1 -1
  91. package/dist/editor/BranchManager.js +20 -9
  92. package/dist/editor/BranchManager.js.map +1 -1
  93. package/dist/editor/CommentsPanel.d.ts.map +1 -1
  94. package/dist/editor/CommentsPanel.js +4 -12
  95. package/dist/editor/CommentsPanel.js.map +1 -1
  96. package/dist/editor/Editor.d.ts.map +1 -1
  97. package/dist/editor/Editor.js +46 -10
  98. package/dist/editor/Editor.js.map +1 -1
  99. package/dist/editor/EntryNavigator.d.ts +7 -0
  100. package/dist/editor/EntryNavigator.d.ts.map +1 -1
  101. package/dist/editor/EntryNavigator.js +17 -5
  102. package/dist/editor/EntryNavigator.js.map +1 -1
  103. package/dist/editor/FormRenderer.d.ts.map +1 -1
  104. package/dist/editor/FormRenderer.js +4 -0
  105. package/dist/editor/FormRenderer.js.map +1 -1
  106. package/dist/editor/admin/SystemHealthPanel.d.ts +6 -0
  107. package/dist/editor/admin/SystemHealthPanel.d.ts.map +1 -0
  108. package/dist/editor/admin/SystemHealthPanel.js +234 -0
  109. package/dist/editor/admin/SystemHealthPanel.js.map +1 -0
  110. package/dist/editor/admin/useSystemHealth.d.ts +40 -0
  111. package/dist/editor/admin/useSystemHealth.d.ts.map +1 -0
  112. package/dist/editor/admin/useSystemHealth.js +205 -0
  113. package/dist/editor/admin/useSystemHealth.js.map +1 -0
  114. package/dist/editor/comments/FieldWrapper.d.ts.map +1 -1
  115. package/dist/editor/comments/FieldWrapper.js +1 -1
  116. package/dist/editor/comments/FieldWrapper.js.map +1 -1
  117. package/dist/editor/comments/InlineCommentThread.d.ts.map +1 -1
  118. package/dist/editor/comments/InlineCommentThread.js +2 -21
  119. package/dist/editor/comments/InlineCommentThread.js.map +1 -1
  120. package/dist/editor/comments/ThreadCarousel.d.ts +2 -0
  121. package/dist/editor/comments/ThreadCarousel.d.ts.map +1 -1
  122. package/dist/editor/comments/ThreadCarousel.js +5 -2
  123. package/dist/editor/comments/ThreadCarousel.js.map +1 -1
  124. package/dist/editor/components/EditorHeader.d.ts +11 -0
  125. package/dist/editor/components/EditorHeader.d.ts.map +1 -1
  126. package/dist/editor/components/EditorHeader.js +75 -41
  127. package/dist/editor/components/EditorHeader.js.map +1 -1
  128. package/dist/editor/components/EditorSidebar.d.ts +7 -1
  129. package/dist/editor/components/EditorSidebar.d.ts.map +1 -1
  130. package/dist/editor/components/EditorSidebar.js +3 -3
  131. package/dist/editor/components/EditorSidebar.js.map +1 -1
  132. package/dist/editor/fields/ImageField.d.ts.map +1 -1
  133. package/dist/editor/fields/ImageField.js +4 -1
  134. package/dist/editor/fields/ImageField.js.map +1 -1
  135. package/dist/editor/fields/StringListField.d.ts +20 -0
  136. package/dist/editor/fields/StringListField.d.ts.map +1 -0
  137. package/dist/editor/fields/StringListField.js +25 -0
  138. package/dist/editor/fields/StringListField.js.map +1 -0
  139. package/dist/editor/hooks/useBranchActions.d.ts.map +1 -1
  140. package/dist/editor/hooks/useBranchActions.js +8 -2
  141. package/dist/editor/hooks/useBranchActions.js.map +1 -1
  142. package/dist/editor/hooks/useBranchManager.d.ts +12 -3
  143. package/dist/editor/hooks/useBranchManager.d.ts.map +1 -1
  144. package/dist/editor/hooks/useBranchManager.js +16 -1
  145. package/dist/editor/hooks/useBranchManager.js.map +1 -1
  146. package/dist/editor/hooks/useDraftManager.d.ts +7 -0
  147. package/dist/editor/hooks/useDraftManager.d.ts.map +1 -1
  148. package/dist/editor/hooks/useDraftManager.js +57 -3
  149. package/dist/editor/hooks/useDraftManager.js.map +1 -1
  150. package/dist/editor/hooks/useEntryManager.d.ts.map +1 -1
  151. package/dist/editor/hooks/useEntryManager.js +25 -7
  152. package/dist/editor/hooks/useEntryManager.js.map +1 -1
  153. package/dist/editor/media/AssetCard.d.ts.map +1 -1
  154. package/dist/editor/media/AssetCard.js +23 -2
  155. package/dist/editor/media/AssetCard.js.map +1 -1
  156. package/dist/editor/relative-time.d.ts +8 -0
  157. package/dist/editor/relative-time.d.ts.map +1 -0
  158. package/dist/editor/relative-time.js +26 -0
  159. package/dist/editor/relative-time.js.map +1 -0
  160. package/dist/git-manager.d.ts.map +1 -1
  161. package/dist/git-manager.js +10 -2
  162. package/dist/git-manager.js.map +1 -1
  163. package/dist/http/handler.d.ts.map +1 -1
  164. package/dist/http/handler.js +20 -9
  165. package/dist/http/handler.js.map +1 -1
  166. package/dist/http/router.d.ts.map +1 -1
  167. package/dist/http/router.js +2 -0
  168. package/dist/http/router.js.map +1 -1
  169. package/dist/paths/branch-name.d.ts +20 -0
  170. package/dist/paths/branch-name.d.ts.map +1 -0
  171. package/dist/paths/branch-name.js +24 -0
  172. package/dist/paths/branch-name.js.map +1 -0
  173. package/dist/paths/branch.d.ts +2 -8
  174. package/dist/paths/branch.d.ts.map +1 -1
  175. package/dist/paths/branch.js +6 -12
  176. package/dist/paths/branch.js.map +1 -1
  177. package/dist/paths/index.d.ts +2 -1
  178. package/dist/paths/index.d.ts.map +1 -1
  179. package/dist/paths/index.js +4 -1
  180. package/dist/paths/index.js.map +1 -1
  181. package/dist/services.js +9 -1
  182. package/dist/services.js.map +1 -1
  183. package/dist/task-queue/index.d.ts +2 -2
  184. package/dist/task-queue/index.d.ts.map +1 -1
  185. package/dist/task-queue/index.js +1 -1
  186. package/dist/task-queue/index.js.map +1 -1
  187. package/dist/task-queue/task-queue.d.ts +37 -1
  188. package/dist/task-queue/task-queue.d.ts.map +1 -1
  189. package/dist/task-queue/task-queue.js +104 -0
  190. package/dist/task-queue/task-queue.js.map +1 -1
  191. package/dist/task-queue/types.d.ts +11 -0
  192. package/dist/task-queue/types.d.ts.map +1 -1
  193. package/dist/types.d.ts +41 -0
  194. package/dist/types.d.ts.map +1 -1
  195. package/dist/utils/occ-json-write.d.ts.map +1 -1
  196. package/dist/utils/occ-json-write.js +7 -0
  197. package/dist/utils/occ-json-write.js.map +1 -1
  198. package/dist/utils/provisioning-lock.d.ts +19 -0
  199. package/dist/utils/provisioning-lock.d.ts.map +1 -1
  200. package/dist/utils/provisioning-lock.js +26 -0
  201. package/dist/utils/provisioning-lock.js.map +1 -1
  202. package/dist/validation/reference-validator.d.ts +17 -1
  203. package/dist/validation/reference-validator.d.ts.map +1 -1
  204. package/dist/validation/reference-validator.js +33 -10
  205. package/dist/validation/reference-validator.js.map +1 -1
  206. package/dist/worker/cms-worker.d.ts +38 -0
  207. package/dist/worker/cms-worker.d.ts.map +1 -1
  208. package/dist/worker/cms-worker.js +328 -25
  209. package/dist/worker/cms-worker.js.map +1 -1
  210. package/dist/worker/task-queue.d.ts +3 -3
  211. package/dist/worker/task-queue.d.ts.map +1 -1
  212. package/dist/worker/task-queue.js +2 -2
  213. package/dist/worker/task-queue.js.map +1 -1
  214. package/dist/worker/worker-status.d.ts +48 -0
  215. package/dist/worker/worker-status.d.ts.map +1 -0
  216. package/dist/worker/worker-status.js +53 -0
  217. package/dist/worker/worker-status.js.map +1 -0
  218. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"provisioning-lock.d.ts","sourceRoot":"","sources":["../../src/utils/provisioning-lock.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAc9B"}
1
+ {"version":3,"file":"provisioning-lock.d.ts","sourceRoot":"","sources":["../../src/utils/provisioning-lock.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAc9B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,0BAA0B,CAC9C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAQ9B"}
@@ -31,4 +31,30 @@ export async function acquireProvisioningLock(lockTargetDir, lockName) {
31
31
  stale: 30_000,
32
32
  });
33
33
  }
34
+ /**
35
+ * Zero-retry variant of {@link acquireProvisioningLock}, for admin actions
36
+ * running inside a synchronous request/response cycle (e.g. a Lambda-backed
37
+ * API handler). `acquireProvisioningLock`'s ~600-retry budget is sized for a
38
+ * build worker that can afford to wait several minutes for a live
39
+ * provisioner to finish; an admin request must fail fast on contention
40
+ * instead (409 immediately) rather than hang the request for that long.
41
+ *
42
+ * `stale: 30_000` is unchanged from the patient variant: a genuinely stale
43
+ * lock (holder crashed more than 30s ago) is still taken over normally --
44
+ * this only removes the RETRY loop for live contention, not the staleness
45
+ * recovery a caller depends on (see branch-health.ts's [H1] freshness rail,
46
+ * which reads this same lock's mtime to decide whether it is fresh or
47
+ * stale before an admin purge/repair proceeds).
48
+ *
49
+ * Throws with `err.code === 'ELOCKED'` on contention (a live, non-stale
50
+ * holder) -- callers should translate that into a 409.
51
+ */
52
+ export async function tryAcquireProvisioningLock(lockTargetDir, lockName) {
53
+ await fs.mkdir(lockTargetDir, { recursive: true });
54
+ return lockfile.lock(lockTargetDir, {
55
+ lockfilePath: path.join(lockTargetDir, lockName),
56
+ retries: 0,
57
+ stale: 30_000,
58
+ });
59
+ }
34
60
  //# sourceMappingURL=provisioning-lock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provisioning-lock.js","sourceRoot":"","sources":["../../src/utils/provisioning-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,aAAqB,EACrB,QAAgB;IAEhB,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAElD,+EAA+E;IAC/E,2EAA2E;IAC3E,gFAAgF;IAChF,+EAA+E;IAC/E,0EAA0E;IAC1E,yBAAyB;IACzB,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE;QAClC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;QAChD,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE;QACvF,KAAK,EAAE,MAAM;KACd,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"provisioning-lock.js","sourceRoot":"","sources":["../../src/utils/provisioning-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AAEtC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,aAAqB,EACrB,QAAgB;IAEhB,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAElD,+EAA+E;IAC/E,2EAA2E;IAC3E,gFAAgF;IAChF,+EAA+E;IAC/E,0EAA0E;IAC1E,yBAAyB;IACzB,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE;QAClC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;QAChD,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE;QACvF,KAAK,EAAE,MAAM;KACd,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,aAAqB,EACrB,QAAgB;IAEhB,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAElD,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE;QAClC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;QAChD,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,MAAM;KACd,CAAC,CAAA;AACJ,CAAC"}
@@ -28,7 +28,23 @@ export interface ValidationResult {
28
28
  export declare class ReferenceValidator {
29
29
  private idIndex;
30
30
  private schema;
31
- constructor(idIndex: ContentIdIndex, schema: readonly FieldConfig[]);
31
+ private resolveCollection?;
32
+ /**
33
+ * @param resolveCollection - Resolves a schema-declared collection name
34
+ * (the documented unprefixed form, e.g. 'posts') to its canonical logical
35
+ * path (e.g. 'content/posts'), typically `ContentStore.resolveCollectionItem`.
36
+ * Keeps the write boundary consistent with reference-option loading: any
37
+ * entry the dropdown offers must also pass validation. Without a resolver,
38
+ * names are compared as-is against the index's logical collection paths.
39
+ */
40
+ constructor(idIndex: ContentIdIndex, schema: readonly FieldConfig[], resolveCollection?: ((name: string) => string | undefined) | undefined);
41
+ /**
42
+ * Check whether an entry's collection (canonical logical path from the ID
43
+ * index, e.g. 'content/posts') satisfies a field's `collections` constraint
44
+ * (documented unprefixed names, e.g. ['posts']). Subcollections of an
45
+ * allowed collection are allowed.
46
+ */
47
+ private collectionAllowed;
32
48
  /**
33
49
  * Validate all reference fields in the provided data.
34
50
  *
@@ -1 +1 @@
1
- {"version":3,"file":"reference-validator.d.ts","sourceRoot":"","sources":["../../src/validation/reference-validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAIlE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;gBADN,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,SAAS,WAAW,EAAE;IAGxC;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuFxE;;;OAGG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CA0D/F"}
1
+ {"version":3,"file":"reference-validator.d.ts","sourceRoot":"","sources":["../../src/validation/reference-validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAIlE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,kBAAkB;IAU3B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,iBAAiB,CAAC;IAX5B;;;;;;;OAOG;gBAEO,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,iBAAiB,CAAC,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,aAAA;IAGlE;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuFxE;;;OAGG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CA0D/F"}
@@ -18,9 +18,31 @@ import { findFieldsByType } from './field-traversal.js';
18
18
  * }
19
19
  */
20
20
  export class ReferenceValidator {
21
- constructor(idIndex, schema) {
21
+ /**
22
+ * @param resolveCollection - Resolves a schema-declared collection name
23
+ * (the documented unprefixed form, e.g. 'posts') to its canonical logical
24
+ * path (e.g. 'content/posts'), typically `ContentStore.resolveCollectionItem`.
25
+ * Keeps the write boundary consistent with reference-option loading: any
26
+ * entry the dropdown offers must also pass validation. Without a resolver,
27
+ * names are compared as-is against the index's logical collection paths.
28
+ */
29
+ constructor(idIndex, schema, resolveCollection) {
22
30
  this.idIndex = idIndex;
23
31
  this.schema = schema;
32
+ this.resolveCollection = resolveCollection;
33
+ }
34
+ /**
35
+ * Check whether an entry's collection (canonical logical path from the ID
36
+ * index, e.g. 'content/posts') satisfies a field's `collections` constraint
37
+ * (documented unprefixed names, e.g. ['posts']). Subcollections of an
38
+ * allowed collection are allowed.
39
+ */
40
+ collectionAllowed(entryCollection, allowed) {
41
+ return allowed.some((col) => {
42
+ const canonical = this.resolveCollection?.(col) ?? col;
43
+ // Exact match or nested collection match
44
+ return entryCollection === canonical || entryCollection?.startsWith(canonical + '/');
45
+ });
24
46
  }
25
47
  /**
26
48
  * Validate all reference fields in the provided data.
@@ -40,8 +62,11 @@ export class ReferenceValidator {
40
62
  for (const { field, value, path: fieldPath } of refs) {
41
63
  const ids = Array.isArray(value) ? value : [value];
42
64
  for (const id of ids) {
43
- // Skip null/undefined values (they're handled by required validation)
44
- if (id == null)
65
+ // Skip empty values (they're handled by required validation). The
66
+ // editor sends '' when a single-select reference is cleared
67
+ // (ReferenceField coerces Mantine's null to ''), so an empty string
68
+ // means "no reference", not a malformed ID.
69
+ if (id == null || id === '')
45
70
  continue;
46
71
  // Validate ID format
47
72
  if (typeof id !== 'string' || !isValidId(id)) {
@@ -76,10 +101,7 @@ export class ReferenceValidator {
76
101
  }
77
102
  // Validate collection constraint
78
103
  if (field.collections && field.collections.length > 0) {
79
- const allowed = field.collections.some((col) => {
80
- // Exact match or nested collection match
81
- return location.collection === col || location.collection?.startsWith(col + '/');
82
- });
104
+ const allowed = this.collectionAllowed(location.collection, field.collections);
83
105
  if (!allowed) {
84
106
  errors.push({
85
107
  field: field.name,
@@ -111,6 +133,9 @@ export class ReferenceValidator {
111
133
  * Useful for validating user input in real-time.
112
134
  */
113
135
  async validateSingle(id, field) {
136
+ // '' means "no reference" (cleared single-select) — see validate().
137
+ if (id === '')
138
+ return null;
114
139
  if (!isValidId(id)) {
115
140
  return {
116
141
  field: field.name,
@@ -137,9 +162,7 @@ export class ReferenceValidator {
137
162
  };
138
163
  }
139
164
  if (field.collections && field.collections.length > 0) {
140
- const allowed = field.collections.some((col) => {
141
- return location.collection === col || location.collection?.startsWith(col + '/');
142
- });
165
+ const allowed = this.collectionAllowed(location.collection, field.collections);
143
166
  if (!allowed) {
144
167
  return {
145
168
  field: field.name,
@@ -1 +1 @@
1
- {"version":3,"file":"reference-validator.js","sourceRoot":"","sources":["../../src/validation/reference-validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reference-validator.js","sourceRoot":"","sources":["../../src/validation/reference-validator.ts"],"names":[],"mappings":"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"}
@@ -104,7 +104,17 @@ export declare class CmsWorker {
104
104
  private releaseLockFn;
105
105
  private contentRoot;
106
106
  private log;
107
+ private statusReport?;
107
108
  constructor(config: CmsWorkerConfig);
109
+ /**
110
+ * Lazily get (and initialize if necessary) this worker's self-reported
111
+ * status object (PR-W1). Normally set once, up front, at the top of
112
+ * start(). The lazy fallback here covers two cases: (1) something in
113
+ * start() reaching a status-write point before that normal init runs
114
+ * (defensive -- see start()'s catch), and (2) unit tests that exercise
115
+ * syncGit()/processTaskQueue() directly without calling start() first.
116
+ */
117
+ private ensureStatusReport;
108
118
  start(): Promise<void>;
109
119
  stop(): Promise<void>;
110
120
  /**
@@ -209,6 +219,17 @@ export declare class CmsWorker {
209
219
  */
210
220
  private pushSettingsBranches;
211
221
  syncGit(): Promise<void>;
222
+ /**
223
+ * [C1] Remove `.trash-*` branch directories (created by the admin purge
224
+ * action, api/admin-branch-health.ts) whose name-embedded stamp is older
225
+ * than {@link TRASH_RETENTION_MS}. Names that don't match the expected
226
+ * `.trash-{dirName}-{STAMP}` shape, or whose stamp fails to parse, are
227
+ * left alone (logged once per cycle, not per file, to avoid flooding logs
228
+ * if something odd accumulates) -- purge is the only writer of this
229
+ * naming scheme, so an unparseable name is unexpected and worth a human
230
+ * looking rather than a silent skip.
231
+ */
232
+ private cleanupTrashedBranchDirs;
212
233
  /**
213
234
  * Fast-forward the base branch's own working-tree clone
214
235
  * (content-branches/<baseBranch>) to match origin/<baseBranch>.
@@ -244,6 +265,23 @@ export declare class CmsWorker {
244
265
  * failure here is logged and swallowed, retried next sync cycle.
245
266
  */
246
267
  private pollMergeState;
268
+ /**
269
+ * Persist a per-branch rebase failure to branch.json (PR-W2), bounded to
270
+ * roughly one save per failing branch per hour: a branch stuck failing
271
+ * every cycle must not turn into unbounded save-per-cycle x N-failing-
272
+ * branches write amplification -- save() eager-regenerates the branch
273
+ * registry (branch-metadata.ts's invalidateRegistry(), O(branch count) EFS
274
+ * reads), the same concern the `alreadyClean` no-op guard above exists
275
+ * for.
276
+ *
277
+ * Best-effort and non-fatal like every other metadata write in this
278
+ * loop's error paths: a corrupt branch.json, a lock-contention error, or
279
+ * any other save failure here must never abort the per-branch iteration.
280
+ * This matters doubly at the two call sites -- one is inside the outer
281
+ * per-branch catch, with no further catch of its own around this call --
282
+ * so the whole method is wrapped, not just the load.
283
+ */
284
+ private recordRebaseFailure;
247
285
  private rebaseActiveBranches;
248
286
  refreshAuthCache(): Promise<void>;
249
287
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cms-worker.d.ts","sourceRoot":"","sources":["../../src/worker/cms-worker.ts"],"names":[],"mappings":"AA6BA;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;AAEpD,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAA;IACrB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,kBAAkB,CAAA;IACrC,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kEAAkE;IAClE,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAMD;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAEhD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAO5D;AA2DD;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IAwBR,OAAO,CAAC,MAAM;IAvB1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,mBAAmB,CAAQ;IACnC,OAAO,CAAC,UAAU,CAAQ;IAM1B,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,gBAAgB,CAA2B;IACnD,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,GAAG,CAAqB;gBAEZ,MAAM,EAAE,eAAe;IAerC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2DtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;YACW,WAAW;YAyBX,WAAW;IAWzB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAkBpB;;;;;;;;;;;;;;;OAeG;YACW,sBAAsB;IAUpC;;;;;;;;;;;;;;OAcG;YACW,eAAe;IAiD7B;;;;;OAKG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCvC;;;;;;;;OAQG;YACW,sBAAsB;YAqBtB,WAAW;IAkHzB;;;OAGG;YACW,oBAAoB;IA2ClC;;;OAGG;YACW,6BAA6B;IAsB3C,OAAO,CAAC,cAAc;YAIR,kBAAkB;IAahC;;;OAGG;YACW,oBAAoB;IAqB5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B9B;;;;;;;;;;;;;;;;;;;;OAoBG;YACW,0BAA0B;IAgHxC;;;;;;;;;;;OAWG;YACW,cAAc;YAkDd,oBAAoB;IA6O5B,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAYxC"}
1
+ {"version":3,"file":"cms-worker.d.ts","sourceRoot":"","sources":["../../src/worker/cms-worker.ts"],"names":[],"mappings":"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"}