@aglyn/aglyn 1.0.0-beta.143

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 (963) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +11 -0
  3. package/package.json +66 -0
  4. package/src/index.d.ts +25 -0
  5. package/src/index.js +26 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/aglyn.d.ts +31 -0
  8. package/src/lib/aglyn.js +114 -0
  9. package/src/lib/aglyn.js.map +1 -0
  10. package/src/lib/app-utils/abuse-report.d.ts +193 -0
  11. package/src/lib/app-utils/abuse-report.js +321 -0
  12. package/src/lib/app-utils/abuse-report.js.map +1 -0
  13. package/src/lib/app-utils/accept-negotiation.d.ts +129 -0
  14. package/src/lib/app-utils/accept-negotiation.js +266 -0
  15. package/src/lib/app-utils/accept-negotiation.js.map +1 -0
  16. package/src/lib/app-utils/account-emails.d.ts +263 -0
  17. package/src/lib/app-utils/account-emails.js +264 -0
  18. package/src/lib/app-utils/account-emails.js.map +1 -0
  19. package/src/lib/app-utils/actions.d.ts +717 -0
  20. package/src/lib/app-utils/actions.js +1031 -0
  21. package/src/lib/app-utils/actions.js.map +1 -0
  22. package/src/lib/app-utils/activity-presenter.d.ts +152 -0
  23. package/src/lib/app-utils/activity-presenter.js +326 -0
  24. package/src/lib/app-utils/activity-presenter.js.map +1 -0
  25. package/src/lib/app-utils/advertising-tag-mounts.d.ts +133 -0
  26. package/src/lib/app-utils/advertising-tag-mounts.js +118 -0
  27. package/src/lib/app-utils/advertising-tag-mounts.js.map +1 -0
  28. package/src/lib/app-utils/advertising-tags.d.ts +307 -0
  29. package/src/lib/app-utils/advertising-tags.js +525 -0
  30. package/src/lib/app-utils/advertising-tags.js.map +1 -0
  31. package/src/lib/app-utils/agent-api-catalog.d.ts +94 -0
  32. package/src/lib/app-utils/agent-api-catalog.js +106 -0
  33. package/src/lib/app-utils/agent-api-catalog.js.map +1 -0
  34. package/src/lib/app-utils/agent-openapi.d.ts +103 -0
  35. package/src/lib/app-utils/agent-openapi.js +1128 -0
  36. package/src/lib/app-utils/agent-openapi.js.map +1 -0
  37. package/src/lib/app-utils/analytics-beacon.d.ts +154 -0
  38. package/src/lib/app-utils/analytics-beacon.js +152 -0
  39. package/src/lib/app-utils/analytics-beacon.js.map +1 -0
  40. package/src/lib/app-utils/analytics-environment.d.ts +133 -0
  41. package/src/lib/app-utils/analytics-environment.js +152 -0
  42. package/src/lib/app-utils/analytics-environment.js.map +1 -0
  43. package/src/lib/app-utils/analytics-events.d.ts +744 -0
  44. package/src/lib/app-utils/analytics-events.js +650 -0
  45. package/src/lib/app-utils/analytics-events.js.map +1 -0
  46. package/src/lib/app-utils/analytics-link-clicks.d.ts +102 -0
  47. package/src/lib/app-utils/analytics-link-clicks.js +267 -0
  48. package/src/lib/app-utils/analytics-link-clicks.js.map +1 -0
  49. package/src/lib/app-utils/analytics-path-key.d.ts +46 -0
  50. package/src/lib/app-utils/analytics-path-key.js +46 -0
  51. package/src/lib/app-utils/analytics-path-key.js.map +1 -0
  52. package/src/lib/app-utils/api-adapter.d.ts +47 -0
  53. package/src/lib/app-utils/api-adapter.js +367 -0
  54. package/src/lib/app-utils/api-adapter.js.map +1 -0
  55. package/src/lib/app-utils/api-idempotency.d.ts +169 -0
  56. package/src/lib/app-utils/api-idempotency.js +213 -0
  57. package/src/lib/app-utils/api-idempotency.js.map +1 -0
  58. package/src/lib/app-utils/api-plugins.d.ts +210 -0
  59. package/src/lib/app-utils/api-plugins.js +221 -0
  60. package/src/lib/app-utils/api-plugins.js.map +1 -0
  61. package/src/lib/app-utils/assist-credits.d.ts +482 -0
  62. package/src/lib/app-utils/assist-credits.js +509 -0
  63. package/src/lib/app-utils/assist-credits.js.map +1 -0
  64. package/src/lib/app-utils/attribution-attribute.d.ts +34 -0
  65. package/src/lib/app-utils/attribution-attribute.js +34 -0
  66. package/src/lib/app-utils/attribution-attribute.js.map +1 -0
  67. package/src/lib/app-utils/attribution-guard.d.ts +130 -0
  68. package/src/lib/app-utils/attribution-guard.js +410 -0
  69. package/src/lib/app-utils/attribution-guard.js.map +1 -0
  70. package/src/lib/app-utils/author-css.d.ts +123 -0
  71. package/src/lib/app-utils/author-css.js +275 -0
  72. package/src/lib/app-utils/author-css.js.map +1 -0
  73. package/src/lib/app-utils/author-html-markdown.d.ts +31 -0
  74. package/src/lib/app-utils/author-html-markdown.js +497 -0
  75. package/src/lib/app-utils/author-html-markdown.js.map +1 -0
  76. package/src/lib/app-utils/author-html.d.ts +135 -0
  77. package/src/lib/app-utils/author-html.js +1037 -0
  78. package/src/lib/app-utils/author-html.js.map +1 -0
  79. package/src/lib/app-utils/automation-placeholders.d.ts +72 -0
  80. package/src/lib/app-utils/automation-placeholders.js +207 -0
  81. package/src/lib/app-utils/automation-placeholders.js.map +1 -0
  82. package/src/lib/app-utils/bandwidth-cap.d.ts +183 -0
  83. package/src/lib/app-utils/bandwidth-cap.js +193 -0
  84. package/src/lib/app-utils/bandwidth-cap.js.map +1 -0
  85. package/src/lib/app-utils/binding-token-catalog.d.ts +82 -0
  86. package/src/lib/app-utils/binding-token-catalog.js +293 -0
  87. package/src/lib/app-utils/binding-token-catalog.js.map +1 -0
  88. package/src/lib/app-utils/binding-tokens.d.ts +157 -0
  89. package/src/lib/app-utils/binding-tokens.js +251 -0
  90. package/src/lib/app-utils/binding-tokens.js.map +1 -0
  91. package/src/lib/app-utils/breadcrumb-json-ld.d.ts +57 -0
  92. package/src/lib/app-utils/breadcrumb-json-ld.js +67 -0
  93. package/src/lib/app-utils/breadcrumb-json-ld.js.map +1 -0
  94. package/src/lib/app-utils/campaign-attribution.d.ts +117 -0
  95. package/src/lib/app-utils/campaign-attribution.js +162 -0
  96. package/src/lib/app-utils/campaign-attribution.js.map +1 -0
  97. package/src/lib/app-utils/campaign-forwarding.d.ts +220 -0
  98. package/src/lib/app-utils/campaign-forwarding.js +332 -0
  99. package/src/lib/app-utils/campaign-forwarding.js.map +1 -0
  100. package/src/lib/app-utils/campaign-membership.d.ts +109 -0
  101. package/src/lib/app-utils/campaign-membership.js +176 -0
  102. package/src/lib/app-utils/campaign-membership.js.map +1 -0
  103. package/src/lib/app-utils/campaign-touch.d.ts +206 -0
  104. package/src/lib/app-utils/campaign-touch.js +326 -0
  105. package/src/lib/app-utils/campaign-touch.js.map +1 -0
  106. package/src/lib/app-utils/child-contract-compose.d.ts +28 -0
  107. package/src/lib/app-utils/child-contract-compose.js +140 -0
  108. package/src/lib/app-utils/child-contract-compose.js.map +1 -0
  109. package/src/lib/app-utils/child-contract.d.ts +129 -0
  110. package/src/lib/app-utils/child-contract.js +153 -0
  111. package/src/lib/app-utils/child-contract.js.map +1 -0
  112. package/src/lib/app-utils/collection-delete.d.ts +113 -0
  113. package/src/lib/app-utils/collection-delete.js +120 -0
  114. package/src/lib/app-utils/collection-delete.js.map +1 -0
  115. package/src/lib/app-utils/collection-entries.d.ts +833 -0
  116. package/src/lib/app-utils/collection-entries.js +1285 -0
  117. package/src/lib/app-utils/collection-entries.js.map +1 -0
  118. package/src/lib/app-utils/collection-entry-date.d.ts +129 -0
  119. package/src/lib/app-utils/collection-entry-date.js +183 -0
  120. package/src/lib/app-utils/collection-entry-date.js.map +1 -0
  121. package/src/lib/app-utils/collection-kind.d.ts +55 -0
  122. package/src/lib/app-utils/collection-kind.js +69 -0
  123. package/src/lib/app-utils/collection-kind.js.map +1 -0
  124. package/src/lib/app-utils/collection-slug.d.ts +79 -0
  125. package/src/lib/app-utils/collection-slug.js +70 -0
  126. package/src/lib/app-utils/collection-slug.js.map +1 -0
  127. package/src/lib/app-utils/compose-layout-nodes.d.ts +147 -0
  128. package/src/lib/app-utils/compose-layout-nodes.js +261 -0
  129. package/src/lib/app-utils/compose-layout-nodes.js.map +1 -0
  130. package/src/lib/app-utils/compose-layout-props.d.ts +71 -0
  131. package/src/lib/app-utils/compose-layout-props.js +61 -0
  132. package/src/lib/app-utils/compose-layout-props.js.map +1 -0
  133. package/src/lib/app-utils/compose-reusable-components.d.ts +504 -0
  134. package/src/lib/app-utils/compose-reusable-components.js +1366 -0
  135. package/src/lib/app-utils/compose-reusable-components.js.map +1 -0
  136. package/src/lib/app-utils/compress.d.ts +35 -0
  137. package/src/lib/app-utils/compress.js +38 -0
  138. package/src/lib/app-utils/compress.js.map +1 -0
  139. package/src/lib/app-utils/consent-banner-ui.d.ts +226 -0
  140. package/src/lib/app-utils/consent-banner-ui.js +583 -0
  141. package/src/lib/app-utils/consent-banner-ui.js.map +1 -0
  142. package/src/lib/app-utils/consent-groups.d.ts +189 -0
  143. package/src/lib/app-utils/consent-groups.js +219 -0
  144. package/src/lib/app-utils/consent-groups.js.map +1 -0
  145. package/src/lib/app-utils/consent-preferences-dialog.d.ts +58 -0
  146. package/src/lib/app-utils/consent-preferences-dialog.js +106 -0
  147. package/src/lib/app-utils/consent-preferences-dialog.js.map +1 -0
  148. package/src/lib/app-utils/console-record-links.d.ts +163 -0
  149. package/src/lib/app-utils/console-record-links.js +178 -0
  150. package/src/lib/app-utils/console-record-links.js.map +1 -0
  151. package/src/lib/app-utils/console-routes.d.ts +658 -0
  152. package/src/lib/app-utils/console-routes.js +489 -0
  153. package/src/lib/app-utils/console-routes.js.map +1 -0
  154. package/src/lib/app-utils/console-widget-slot-context.d.ts +46 -0
  155. package/src/lib/app-utils/console-widget-slot-context.js +23 -0
  156. package/src/lib/app-utils/console-widget-slot-context.js.map +1 -0
  157. package/src/lib/app-utils/contact-custom-fields.d.ts +191 -0
  158. package/src/lib/app-utils/contact-custom-fields.js +349 -0
  159. package/src/lib/app-utils/contact-custom-fields.js.map +1 -0
  160. package/src/lib/app-utils/contact-holder.d.ts +52 -0
  161. package/src/lib/app-utils/contact-holder.js +98 -0
  162. package/src/lib/app-utils/contact-holder.js.map +1 -0
  163. package/src/lib/app-utils/contact-merge.d.ts +136 -0
  164. package/src/lib/app-utils/contact-merge.js +379 -0
  165. package/src/lib/app-utils/contact-merge.js.map +1 -0
  166. package/src/lib/app-utils/contacts.d.ts +554 -0
  167. package/src/lib/app-utils/contacts.js +401 -0
  168. package/src/lib/app-utils/contacts.js.map +1 -0
  169. package/src/lib/app-utils/content-author-profile.d.ts +68 -0
  170. package/src/lib/app-utils/content-author-profile.js +118 -0
  171. package/src/lib/app-utils/content-author-profile.js.map +1 -0
  172. package/src/lib/app-utils/content-authors.d.ts +662 -0
  173. package/src/lib/app-utils/content-authors.js +771 -0
  174. package/src/lib/app-utils/content-authors.js.map +1 -0
  175. package/src/lib/app-utils/content-schema-type.d.ts +81 -0
  176. package/src/lib/app-utils/content-schema-type.js +87 -0
  177. package/src/lib/app-utils/content-schema-type.js.map +1 -0
  178. package/src/lib/app-utils/contexts.d.ts +35 -0
  179. package/src/lib/app-utils/contexts.js +35 -0
  180. package/src/lib/app-utils/contexts.js.map +1 -0
  181. package/src/lib/app-utils/create-resource-uid.d.ts +18 -0
  182. package/src/lib/app-utils/create-resource-uid.js +23 -0
  183. package/src/lib/app-utils/create-resource-uid.js.map +1 -0
  184. package/src/lib/app-utils/crm-booking.d.ts +75 -0
  185. package/src/lib/app-utils/crm-booking.js +133 -0
  186. package/src/lib/app-utils/crm-booking.js.map +1 -0
  187. package/src/lib/app-utils/crm-csv.d.ts +232 -0
  188. package/src/lib/app-utils/crm-csv.js +432 -0
  189. package/src/lib/app-utils/crm-csv.js.map +1 -0
  190. package/src/lib/app-utils/crm-digest.d.ts +179 -0
  191. package/src/lib/app-utils/crm-digest.js +271 -0
  192. package/src/lib/app-utils/crm-digest.js.map +1 -0
  193. package/src/lib/app-utils/crm-email-templates.d.ts +172 -0
  194. package/src/lib/app-utils/crm-email-templates.js +382 -0
  195. package/src/lib/app-utils/crm-email-templates.js.map +1 -0
  196. package/src/lib/app-utils/crm-inbound.d.ts +245 -0
  197. package/src/lib/app-utils/crm-inbound.js +407 -0
  198. package/src/lib/app-utils/crm-inbound.js.map +1 -0
  199. package/src/lib/app-utils/crm-kinds.d.ts +73 -0
  200. package/src/lib/app-utils/crm-kinds.js +92 -0
  201. package/src/lib/app-utils/crm-kinds.js.map +1 -0
  202. package/src/lib/app-utils/crm-next-activity.d.ts +107 -0
  203. package/src/lib/app-utils/crm-next-activity.js +140 -0
  204. package/src/lib/app-utils/crm-next-activity.js.map +1 -0
  205. package/src/lib/app-utils/crm-reports.d.ts +479 -0
  206. package/src/lib/app-utils/crm-reports.js +680 -0
  207. package/src/lib/app-utils/crm-reports.js.map +1 -0
  208. package/src/lib/app-utils/crm-task-reminders.d.ts +129 -0
  209. package/src/lib/app-utils/crm-task-reminders.js +139 -0
  210. package/src/lib/app-utils/crm-task-reminders.js.map +1 -0
  211. package/src/lib/app-utils/crm.d.ts +1546 -0
  212. package/src/lib/app-utils/crm.js +1814 -0
  213. package/src/lib/app-utils/crm.js.map +1 -0
  214. package/src/lib/app-utils/csp-report.d.ts +84 -0
  215. package/src/lib/app-utils/csp-report.js +177 -0
  216. package/src/lib/app-utils/csp-report.js.map +1 -0
  217. package/src/lib/app-utils/csv-import.d.ts +192 -0
  218. package/src/lib/app-utils/csv-import.js +279 -0
  219. package/src/lib/app-utils/csv-import.js.map +1 -0
  220. package/src/lib/app-utils/dataset-csv.d.ts +109 -0
  221. package/src/lib/app-utils/dataset-csv.js +235 -0
  222. package/src/lib/app-utils/dataset-csv.js.map +1 -0
  223. package/src/lib/app-utils/dataset-models.d.ts +194 -0
  224. package/src/lib/app-utils/dataset-models.js +409 -0
  225. package/src/lib/app-utils/dataset-models.js.map +1 -0
  226. package/src/lib/app-utils/dataset-query.d.ts +57 -0
  227. package/src/lib/app-utils/dataset-query.js +126 -0
  228. package/src/lib/app-utils/dataset-query.js.map +1 -0
  229. package/src/lib/app-utils/datasets.d.ts +136 -0
  230. package/src/lib/app-utils/datasets.js +177 -0
  231. package/src/lib/app-utils/datasets.js.map +1 -0
  232. package/src/lib/app-utils/decompress.d.ts +36 -0
  233. package/src/lib/app-utils/decompress.js +32 -0
  234. package/src/lib/app-utils/decompress.js.map +1 -0
  235. package/src/lib/app-utils/dedicated-sending-domain.d.ts +47 -0
  236. package/src/lib/app-utils/dedicated-sending-domain.js +114 -0
  237. package/src/lib/app-utils/dedicated-sending-domain.js.map +1 -0
  238. package/src/lib/app-utils/deferred-image.d.ts +86 -0
  239. package/src/lib/app-utils/deferred-image.js +83 -0
  240. package/src/lib/app-utils/deferred-image.js.map +1 -0
  241. package/src/lib/app-utils/definition-canvas-tree.d.ts +61 -0
  242. package/src/lib/app-utils/definition-canvas-tree.js +126 -0
  243. package/src/lib/app-utils/definition-canvas-tree.js.map +1 -0
  244. package/src/lib/app-utils/deployment-shape.d.ts +167 -0
  245. package/src/lib/app-utils/deployment-shape.js +238 -0
  246. package/src/lib/app-utils/deployment-shape.js.map +1 -0
  247. package/src/lib/app-utils/detect-template-placeholders.d.ts +30 -0
  248. package/src/lib/app-utils/detect-template-placeholders.js +53 -0
  249. package/src/lib/app-utils/detect-template-placeholders.js.map +1 -0
  250. package/src/lib/app-utils/dmca-counter-notice.d.ts +185 -0
  251. package/src/lib/app-utils/dmca-counter-notice.js +277 -0
  252. package/src/lib/app-utils/dmca-counter-notice.js.map +1 -0
  253. package/src/lib/app-utils/docs-deflection.d.ts +156 -0
  254. package/src/lib/app-utils/docs-deflection.js +547 -0
  255. package/src/lib/app-utils/docs-deflection.js.map +1 -0
  256. package/src/lib/app-utils/docs-help.d.ts +57 -0
  257. package/src/lib/app-utils/docs-help.generated.d.ts +303 -0
  258. package/src/lib/app-utils/docs-help.generated.js +867 -0
  259. package/src/lib/app-utils/docs-help.generated.js.map +1 -0
  260. package/src/lib/app-utils/docs-help.js +46 -0
  261. package/src/lib/app-utils/docs-help.js.map +1 -0
  262. package/src/lib/app-utils/docs-index.generated.d.ts +29 -0
  263. package/src/lib/app-utils/docs-index.generated.js +8388 -0
  264. package/src/lib/app-utils/docs-index.generated.js.map +1 -0
  265. package/src/lib/app-utils/docs-retrieval.d.ts +67 -0
  266. package/src/lib/app-utils/docs-retrieval.js +188 -0
  267. package/src/lib/app-utils/docs-retrieval.js.map +1 -0
  268. package/src/lib/app-utils/document-landmark.d.ts +50 -0
  269. package/src/lib/app-utils/document-landmark.js +100 -0
  270. package/src/lib/app-utils/document-landmark.js.map +1 -0
  271. package/src/lib/app-utils/duplicate-resource.d.ts +101 -0
  272. package/src/lib/app-utils/duplicate-resource.js +206 -0
  273. package/src/lib/app-utils/duplicate-resource.js.map +1 -0
  274. package/src/lib/app-utils/dynamic-list-rule.d.ts +471 -0
  275. package/src/lib/app-utils/dynamic-list-rule.js +914 -0
  276. package/src/lib/app-utils/dynamic-list-rule.js.map +1 -0
  277. package/src/lib/app-utils/element-animation.d.ts +200 -0
  278. package/src/lib/app-utils/element-animation.js +233 -0
  279. package/src/lib/app-utils/element-animation.js.map +1 -0
  280. package/src/lib/app-utils/element-hidden-style.d.ts +46 -0
  281. package/src/lib/app-utils/element-hidden-style.js +48 -0
  282. package/src/lib/app-utils/element-hidden-style.js.map +1 -0
  283. package/src/lib/app-utils/element-ui.d.ts +243 -0
  284. package/src/lib/app-utils/element-ui.js +459 -0
  285. package/src/lib/app-utils/element-ui.js.map +1 -0
  286. package/src/lib/app-utils/email-starter-policy.d.ts +160 -0
  287. package/src/lib/app-utils/email-starter-policy.js +327 -0
  288. package/src/lib/app-utils/email-starter-policy.js.map +1 -0
  289. package/src/lib/app-utils/email-topics.d.ts +310 -0
  290. package/src/lib/app-utils/email-topics.js +336 -0
  291. package/src/lib/app-utils/email-topics.js.map +1 -0
  292. package/src/lib/app-utils/enabled-plugins-context.d.ts +100 -0
  293. package/src/lib/app-utils/enabled-plugins-context.js +113 -0
  294. package/src/lib/app-utils/enabled-plugins-context.js.map +1 -0
  295. package/src/lib/app-utils/ensure-canvas-root.d.ts +38 -0
  296. package/src/lib/app-utils/ensure-canvas-root.js +61 -0
  297. package/src/lib/app-utils/ensure-canvas-root.js.map +1 -0
  298. package/src/lib/app-utils/entity-picker-context.d.ts +199 -0
  299. package/src/lib/app-utils/entity-picker-context.js +93 -0
  300. package/src/lib/app-utils/entity-picker-context.js.map +1 -0
  301. package/src/lib/app-utils/error-beacon.d.ts +107 -0
  302. package/src/lib/app-utils/error-beacon.js +296 -0
  303. package/src/lib/app-utils/error-beacon.js.map +1 -0
  304. package/src/lib/app-utils/expand-repeatables.d.ts +172 -0
  305. package/src/lib/app-utils/expand-repeatables.js +299 -0
  306. package/src/lib/app-utils/expand-repeatables.js.map +1 -0
  307. package/src/lib/app-utils/foreign-script.d.ts +82 -0
  308. package/src/lib/app-utils/foreign-script.js +102 -0
  309. package/src/lib/app-utils/foreign-script.js.map +1 -0
  310. package/src/lib/app-utils/form-abuse-ceiling.d.ts +146 -0
  311. package/src/lib/app-utils/form-abuse-ceiling.js +158 -0
  312. package/src/lib/app-utils/form-abuse-ceiling.js.map +1 -0
  313. package/src/lib/app-utils/form-contract.d.ts +198 -0
  314. package/src/lib/app-utils/form-contract.js +282 -0
  315. package/src/lib/app-utils/form-contract.js.map +1 -0
  316. package/src/lib/app-utils/form-dataset-binding.d.ts +50 -0
  317. package/src/lib/app-utils/form-dataset-binding.js +74 -0
  318. package/src/lib/app-utils/form-dataset-binding.js.map +1 -0
  319. package/src/lib/app-utils/forms.d.ts +727 -0
  320. package/src/lib/app-utils/forms.js +777 -0
  321. package/src/lib/app-utils/forms.js.map +1 -0
  322. package/src/lib/app-utils/functions.d.ts +188 -0
  323. package/src/lib/app-utils/functions.js +529 -0
  324. package/src/lib/app-utils/functions.js.map +1 -0
  325. package/src/lib/app-utils/guarded-version-save.d.ts +91 -0
  326. package/src/lib/app-utils/guarded-version-save.js +131 -0
  327. package/src/lib/app-utils/guarded-version-save.js.map +1 -0
  328. package/src/lib/app-utils/health-report.d.ts +1766 -0
  329. package/src/lib/app-utils/health-report.js +2072 -0
  330. package/src/lib/app-utils/health-report.js.map +1 -0
  331. package/src/lib/app-utils/host-naming.d.ts +135 -0
  332. package/src/lib/app-utils/host-naming.js +188 -0
  333. package/src/lib/app-utils/host-naming.js.map +1 -0
  334. package/src/lib/app-utils/host-permissions.d.ts +76 -0
  335. package/src/lib/app-utils/host-permissions.js +119 -0
  336. package/src/lib/app-utils/host-permissions.js.map +1 -0
  337. package/src/lib/app-utils/host-tokens.d.ts +228 -0
  338. package/src/lib/app-utils/host-tokens.js +304 -0
  339. package/src/lib/app-utils/host-tokens.js.map +1 -0
  340. package/src/lib/app-utils/idp-profile.d.ts +83 -0
  341. package/src/lib/app-utils/idp-profile.js +268 -0
  342. package/src/lib/app-utils/idp-profile.js.map +1 -0
  343. package/src/lib/app-utils/image-upload-types.d.ts +49 -0
  344. package/src/lib/app-utils/image-upload-types.js +86 -0
  345. package/src/lib/app-utils/image-upload-types.js.map +1 -0
  346. package/src/lib/app-utils/index.d.ts +18 -0
  347. package/src/lib/app-utils/index.js +23 -0
  348. package/src/lib/app-utils/index.js.map +1 -0
  349. package/src/lib/app-utils/internal-traffic.d.ts +197 -0
  350. package/src/lib/app-utils/internal-traffic.js +288 -0
  351. package/src/lib/app-utils/internal-traffic.js.map +1 -0
  352. package/src/lib/app-utils/lineal-order.d.ts +62 -0
  353. package/src/lib/app-utils/lineal-order.js +65 -0
  354. package/src/lib/app-utils/lineal-order.js.map +1 -0
  355. package/src/lib/app-utils/link-references.d.ts +36 -0
  356. package/src/lib/app-utils/link-references.js +89 -0
  357. package/src/lib/app-utils/link-references.js.map +1 -0
  358. package/src/lib/app-utils/link-target-search-context.d.ts +123 -0
  359. package/src/lib/app-utils/link-target-search-context.js +221 -0
  360. package/src/lib/app-utils/link-target-search-context.js.map +1 -0
  361. package/src/lib/app-utils/list-assignment-policy.d.ts +169 -0
  362. package/src/lib/app-utils/list-assignment-policy.js +170 -0
  363. package/src/lib/app-utils/list-assignment-policy.js.map +1 -0
  364. package/src/lib/app-utils/list-import.d.ts +158 -0
  365. package/src/lib/app-utils/list-import.js +332 -0
  366. package/src/lib/app-utils/list-import.js.map +1 -0
  367. package/src/lib/app-utils/llms-txt.d.ts +104 -0
  368. package/src/lib/app-utils/llms-txt.js +144 -0
  369. package/src/lib/app-utils/llms-txt.js.map +1 -0
  370. package/src/lib/app-utils/local-storage-budget.d.ts +75 -0
  371. package/src/lib/app-utils/local-storage-budget.js +153 -0
  372. package/src/lib/app-utils/local-storage-budget.js.map +1 -0
  373. package/src/lib/app-utils/lockdown.d.ts +698 -0
  374. package/src/lib/app-utils/lockdown.js +929 -0
  375. package/src/lib/app-utils/lockdown.js.map +1 -0
  376. package/src/lib/app-utils/margin-utilization.d.ts +267 -0
  377. package/src/lib/app-utils/margin-utilization.js +351 -0
  378. package/src/lib/app-utils/margin-utilization.js.map +1 -0
  379. package/src/lib/app-utils/markdown-lite.d.ts +297 -0
  380. package/src/lib/app-utils/markdown-lite.js +705 -0
  381. package/src/lib/app-utils/markdown-lite.js.map +1 -0
  382. package/src/lib/app-utils/marketing-consent.d.ts +704 -0
  383. package/src/lib/app-utils/marketing-consent.js +783 -0
  384. package/src/lib/app-utils/marketing-consent.js.map +1 -0
  385. package/src/lib/app-utils/marketplace-listing-visibility.d.ts +120 -0
  386. package/src/lib/app-utils/marketplace-listing-visibility.js +139 -0
  387. package/src/lib/app-utils/marketplace-listing-visibility.js.map +1 -0
  388. package/src/lib/app-utils/marketplace-overrides.d.ts +271 -0
  389. package/src/lib/app-utils/marketplace-overrides.js +462 -0
  390. package/src/lib/app-utils/marketplace-overrides.js.map +1 -0
  391. package/src/lib/app-utils/marketplace-provenance.d.ts +150 -0
  392. package/src/lib/app-utils/marketplace-provenance.js +136 -0
  393. package/src/lib/app-utils/marketplace-provenance.js.map +1 -0
  394. package/src/lib/app-utils/marketplace-theme.d.ts +237 -0
  395. package/src/lib/app-utils/marketplace-theme.js +525 -0
  396. package/src/lib/app-utils/marketplace-theme.js.map +1 -0
  397. package/src/lib/app-utils/marketplace-update-state.d.ts +119 -0
  398. package/src/lib/app-utils/marketplace-update-state.js +132 -0
  399. package/src/lib/app-utils/marketplace-update-state.js.map +1 -0
  400. package/src/lib/app-utils/marketplace-verification.d.ts +95 -0
  401. package/src/lib/app-utils/marketplace-verification.js +81 -0
  402. package/src/lib/app-utils/marketplace-verification.js.map +1 -0
  403. package/src/lib/app-utils/measure-node-map.d.ts +76 -0
  404. package/src/lib/app-utils/measure-node-map.js +111 -0
  405. package/src/lib/app-utils/measure-node-map.js.map +1 -0
  406. package/src/lib/app-utils/media-alt.d.ts +55 -0
  407. package/src/lib/app-utils/media-alt.js +58 -0
  408. package/src/lib/app-utils/media-alt.js.map +1 -0
  409. package/src/lib/app-utils/media-asset-facts.d.ts +125 -0
  410. package/src/lib/app-utils/media-asset-facts.js +467 -0
  411. package/src/lib/app-utils/media-asset-facts.js.map +1 -0
  412. package/src/lib/app-utils/media-cdn-scope.d.ts +65 -0
  413. package/src/lib/app-utils/media-cdn-scope.js +75 -0
  414. package/src/lib/app-utils/media-cdn-scope.js.map +1 -0
  415. package/src/lib/app-utils/media-folders.d.ts +161 -0
  416. package/src/lib/app-utils/media-folders.js +230 -0
  417. package/src/lib/app-utils/media-folders.js.map +1 -0
  418. package/src/lib/app-utils/media-metadata.d.ts +277 -0
  419. package/src/lib/app-utils/media-metadata.js +388 -0
  420. package/src/lib/app-utils/media-metadata.js.map +1 -0
  421. package/src/lib/app-utils/media-picker-context.d.ts +93 -0
  422. package/src/lib/app-utils/media-picker-context.js +26 -0
  423. package/src/lib/app-utils/media-picker-context.js.map +1 -0
  424. package/src/lib/app-utils/media-quarantine.d.ts +247 -0
  425. package/src/lib/app-utils/media-quarantine.js +323 -0
  426. package/src/lib/app-utils/media-quarantine.js.map +1 -0
  427. package/src/lib/app-utils/media-ref.d.ts +661 -0
  428. package/src/lib/app-utils/media-ref.js +1055 -0
  429. package/src/lib/app-utils/media-ref.js.map +1 -0
  430. package/src/lib/app-utils/media-takedown-reach.d.ts +126 -0
  431. package/src/lib/app-utils/media-takedown-reach.js +143 -0
  432. package/src/lib/app-utils/media-takedown-reach.js.map +1 -0
  433. package/src/lib/app-utils/member-email-aliases.d.ts +180 -0
  434. package/src/lib/app-utils/member-email-aliases.js +217 -0
  435. package/src/lib/app-utils/member-email-aliases.js.map +1 -0
  436. package/src/lib/app-utils/merge-node-sx.d.ts +47 -0
  437. package/src/lib/app-utils/merge-node-sx.js +123 -0
  438. package/src/lib/app-utils/merge-node-sx.js.map +1 -0
  439. package/src/lib/app-utils/name-match.d.ts +155 -0
  440. package/src/lib/app-utils/name-match.js +175 -0
  441. package/src/lib/app-utils/name-match.js.map +1 -0
  442. package/src/lib/app-utils/name-search.d.ts +117 -0
  443. package/src/lib/app-utils/name-search.js +145 -0
  444. package/src/lib/app-utils/name-search.js.map +1 -0
  445. package/src/lib/app-utils/node-capabilities.d.ts +85 -0
  446. package/src/lib/app-utils/node-capabilities.js +88 -0
  447. package/src/lib/app-utils/node-capabilities.js.map +1 -0
  448. package/src/lib/app-utils/node-definition-sanitizer.d.ts +164 -0
  449. package/src/lib/app-utils/node-definition-sanitizer.js +402 -0
  450. package/src/lib/app-utils/node-definition-sanitizer.js.map +1 -0
  451. package/src/lib/app-utils/node-identity.d.ts +47 -0
  452. package/src/lib/app-utils/node-identity.js +50 -0
  453. package/src/lib/app-utils/node-identity.js.map +1 -0
  454. package/src/lib/app-utils/node-interactions.d.ts +102 -0
  455. package/src/lib/app-utils/node-interactions.js +192 -0
  456. package/src/lib/app-utils/node-interactions.js.map +1 -0
  457. package/src/lib/app-utils/node-url-policy.d.ts +54 -0
  458. package/src/lib/app-utils/node-url-policy.js +72 -0
  459. package/src/lib/app-utils/node-url-policy.js.map +1 -0
  460. package/src/lib/app-utils/notifications.d.ts +71 -0
  461. package/src/lib/app-utils/notifications.js +101 -0
  462. package/src/lib/app-utils/notifications.js.map +1 -0
  463. package/src/lib/app-utils/onboarding-deep-link.d.ts +120 -0
  464. package/src/lib/app-utils/onboarding-deep-link.js +142 -0
  465. package/src/lib/app-utils/onboarding-deep-link.js.map +1 -0
  466. package/src/lib/app-utils/operator-identity.d.ts +207 -0
  467. package/src/lib/app-utils/operator-identity.js +186 -0
  468. package/src/lib/app-utils/operator-identity.js.map +1 -0
  469. package/src/lib/app-utils/org-billing-doc.d.ts +231 -0
  470. package/src/lib/app-utils/org-billing-doc.js +238 -0
  471. package/src/lib/app-utils/org-billing-doc.js.map +1 -0
  472. package/src/lib/app-utils/org-override-reason.d.ts +100 -0
  473. package/src/lib/app-utils/org-override-reason.js +116 -0
  474. package/src/lib/app-utils/org-override-reason.js.map +1 -0
  475. package/src/lib/app-utils/org-permissions.d.ts +194 -0
  476. package/src/lib/app-utils/org-permissions.js +357 -0
  477. package/src/lib/app-utils/org-permissions.js.map +1 -0
  478. package/src/lib/app-utils/org-roles.d.ts +72 -0
  479. package/src/lib/app-utils/org-roles.js +131 -0
  480. package/src/lib/app-utils/org-roles.js.map +1 -0
  481. package/src/lib/app-utils/organizations.d.ts +407 -0
  482. package/src/lib/app-utils/organizations.js +511 -0
  483. package/src/lib/app-utils/organizations.js.map +1 -0
  484. package/src/lib/app-utils/page-header-actions-context.d.ts +83 -0
  485. package/src/lib/app-utils/page-header-actions-context.js +58 -0
  486. package/src/lib/app-utils/page-header-actions-context.js.map +1 -0
  487. package/src/lib/app-utils/page-header-record-context.d.ts +80 -0
  488. package/src/lib/app-utils/page-header-record-context.js +64 -0
  489. package/src/lib/app-utils/page-header-record-context.js.map +1 -0
  490. package/src/lib/app-utils/page-markdown.d.ts +103 -0
  491. package/src/lib/app-utils/page-markdown.js +385 -0
  492. package/src/lib/app-utils/page-markdown.js.map +1 -0
  493. package/src/lib/app-utils/paid-media-source.d.ts +90 -0
  494. package/src/lib/app-utils/paid-media-source.js +184 -0
  495. package/src/lib/app-utils/paid-media-source.js.map +1 -0
  496. package/src/lib/app-utils/palette-sx.d.ts +34 -0
  497. package/src/lib/app-utils/palette-sx.js +150 -0
  498. package/src/lib/app-utils/palette-sx.js.map +1 -0
  499. package/src/lib/app-utils/password-policy.d.ts +47 -0
  500. package/src/lib/app-utils/password-policy.js +46 -0
  501. package/src/lib/app-utils/password-policy.js.map +1 -0
  502. package/src/lib/app-utils/payments-configured.d.ts +84 -0
  503. package/src/lib/app-utils/payments-configured.js +88 -0
  504. package/src/lib/app-utils/payments-configured.js.map +1 -0
  505. package/src/lib/app-utils/person-erasure.d.ts +126 -0
  506. package/src/lib/app-utils/person-erasure.js +121 -0
  507. package/src/lib/app-utils/person-erasure.js.map +1 -0
  508. package/src/lib/app-utils/person-key.d.ts +32 -0
  509. package/src/lib/app-utils/person-key.js +62 -0
  510. package/src/lib/app-utils/person-key.js.map +1 -0
  511. package/src/lib/app-utils/plan-entitlements.d.ts +2756 -0
  512. package/src/lib/app-utils/plan-entitlements.js +4085 -0
  513. package/src/lib/app-utils/plan-entitlements.js.map +1 -0
  514. package/src/lib/app-utils/platform-ad-conversions.d.ts +122 -0
  515. package/src/lib/app-utils/platform-ad-conversions.js +174 -0
  516. package/src/lib/app-utils/platform-ad-conversions.js.map +1 -0
  517. package/src/lib/app-utils/platform-advertising-tags.d.ts +139 -0
  518. package/src/lib/app-utils/platform-advertising-tags.js +203 -0
  519. package/src/lib/app-utils/platform-advertising-tags.js.map +1 -0
  520. package/src/lib/app-utils/platform-brand.d.ts +151 -0
  521. package/src/lib/app-utils/platform-brand.js +175 -0
  522. package/src/lib/app-utils/platform-brand.js.map +1 -0
  523. package/src/lib/app-utils/platform-consent-default.d.ts +142 -0
  524. package/src/lib/app-utils/platform-consent-default.js +295 -0
  525. package/src/lib/app-utils/platform-consent-default.js.map +1 -0
  526. package/src/lib/app-utils/platform-marketing-consent.d.ts +151 -0
  527. package/src/lib/app-utils/platform-marketing-consent.js +182 -0
  528. package/src/lib/app-utils/platform-marketing-consent.js.map +1 -0
  529. package/src/lib/app-utils/platform-marketing-host.d.ts +33 -0
  530. package/src/lib/app-utils/platform-marketing-host.js +97 -0
  531. package/src/lib/app-utils/platform-marketing-host.js.map +1 -0
  532. package/src/lib/app-utils/platform-visitor-consent.d.ts +252 -0
  533. package/src/lib/app-utils/platform-visitor-consent.js +533 -0
  534. package/src/lib/app-utils/platform-visitor-consent.js.map +1 -0
  535. package/src/lib/app-utils/plugin-api-cross-origin.d.ts +61 -0
  536. package/src/lib/app-utils/plugin-api-cross-origin.js +202 -0
  537. package/src/lib/app-utils/plugin-api-cross-origin.js.map +1 -0
  538. package/src/lib/app-utils/plugin-api-rate-limit.d.ts +192 -0
  539. package/src/lib/app-utils/plugin-api-rate-limit.js +270 -0
  540. package/src/lib/app-utils/plugin-api-rate-limit.js.map +1 -0
  541. package/src/lib/app-utils/plugin-artifact-path.d.ts +32 -0
  542. package/src/lib/app-utils/plugin-artifact-path.js +33 -0
  543. package/src/lib/app-utils/plugin-artifact-path.js.map +1 -0
  544. package/src/lib/app-utils/plugin-bundle-checks.d.ts +148 -0
  545. package/src/lib/app-utils/plugin-bundle-checks.js +989 -0
  546. package/src/lib/app-utils/plugin-bundle-checks.js.map +1 -0
  547. package/src/lib/app-utils/plugin-manifest.d.ts +516 -0
  548. package/src/lib/app-utils/plugin-manifest.js +687 -0
  549. package/src/lib/app-utils/plugin-manifest.js.map +1 -0
  550. package/src/lib/app-utils/published-legal-pages.d.ts +71 -0
  551. package/src/lib/app-utils/published-legal-pages.js +90 -0
  552. package/src/lib/app-utils/published-legal-pages.js.map +1 -0
  553. package/src/lib/app-utils/publisher-agreement.d.ts +254 -0
  554. package/src/lib/app-utils/publisher-agreement.js +274 -0
  555. package/src/lib/app-utils/publisher-agreement.js.map +1 -0
  556. package/src/lib/app-utils/publisher-attestation.d.ts +99 -0
  557. package/src/lib/app-utils/publisher-attestation.js +158 -0
  558. package/src/lib/app-utils/publisher-attestation.js.map +1 -0
  559. package/src/lib/app-utils/recipient-email-render.d.ts +216 -0
  560. package/src/lib/app-utils/recipient-email-render.js +221 -0
  561. package/src/lib/app-utils/recipient-email-render.js.map +1 -0
  562. package/src/lib/app-utils/redispatch-caught-error.d.ts +38 -0
  563. package/src/lib/app-utils/redispatch-caught-error.js +46 -0
  564. package/src/lib/app-utils/redispatch-caught-error.js.map +1 -0
  565. package/src/lib/app-utils/registering-plugin.d.ts +19 -0
  566. package/src/lib/app-utils/registering-plugin.js +38 -0
  567. package/src/lib/app-utils/registering-plugin.js.map +1 -0
  568. package/src/lib/app-utils/release-flags.d.ts +283 -0
  569. package/src/lib/app-utils/release-flags.js +518 -0
  570. package/src/lib/app-utils/release-flags.js.map +1 -0
  571. package/src/lib/app-utils/repair-canvas-nodes.d.ts +130 -0
  572. package/src/lib/app-utils/repair-canvas-nodes.js +298 -0
  573. package/src/lib/app-utils/repair-canvas-nodes.js.map +1 -0
  574. package/src/lib/app-utils/repeat-infringer.d.ts +166 -0
  575. package/src/lib/app-utils/repeat-infringer.js +188 -0
  576. package/src/lib/app-utils/repeat-infringer.js.map +1 -0
  577. package/src/lib/app-utils/repeat-sources.d.ts +115 -0
  578. package/src/lib/app-utils/repeat-sources.js +86 -0
  579. package/src/lib/app-utils/repeat-sources.js.map +1 -0
  580. package/src/lib/app-utils/request-geo.d.ts +114 -0
  581. package/src/lib/app-utils/request-geo.js +247 -0
  582. package/src/lib/app-utils/request-geo.js.map +1 -0
  583. package/src/lib/app-utils/request-ip.d.ts +213 -0
  584. package/src/lib/app-utils/request-ip.js +344 -0
  585. package/src/lib/app-utils/request-ip.js.map +1 -0
  586. package/src/lib/app-utils/resolve-named-tokens.d.ts +26 -0
  587. package/src/lib/app-utils/resolve-named-tokens.js +59 -0
  588. package/src/lib/app-utils/resolve-named-tokens.js.map +1 -0
  589. package/src/lib/app-utils/responsive-typography-sx.d.ts +77 -0
  590. package/src/lib/app-utils/responsive-typography-sx.js +122 -0
  591. package/src/lib/app-utils/responsive-typography-sx.js.map +1 -0
  592. package/src/lib/app-utils/reusable-component-keys.d.ts +135 -0
  593. package/src/lib/app-utils/reusable-component-keys.js +140 -0
  594. package/src/lib/app-utils/reusable-component-keys.js.map +1 -0
  595. package/src/lib/app-utils/reusable-prop-values.d.ts +199 -0
  596. package/src/lib/app-utils/reusable-prop-values.js +494 -0
  597. package/src/lib/app-utils/reusable-prop-values.js.map +1 -0
  598. package/src/lib/app-utils/safe-json-ld.d.ts +29 -0
  599. package/src/lib/app-utils/safe-json-ld.js +37 -0
  600. package/src/lib/app-utils/safe-json-ld.js.map +1 -0
  601. package/src/lib/app-utils/sanitize-svg.d.ts +55 -0
  602. package/src/lib/app-utils/sanitize-svg.js +460 -0
  603. package/src/lib/app-utils/sanitize-svg.js.map +1 -0
  604. package/src/lib/app-utils/scheme-sx.d.ts +84 -0
  605. package/src/lib/app-utils/scheme-sx.js +148 -0
  606. package/src/lib/app-utils/scheme-sx.js.map +1 -0
  607. package/src/lib/app-utils/scope-tokens.d.ts +249 -0
  608. package/src/lib/app-utils/scope-tokens.js +331 -0
  609. package/src/lib/app-utils/scope-tokens.js.map +1 -0
  610. package/src/lib/app-utils/screen-link-context-value.d.ts +57 -0
  611. package/src/lib/app-utils/screen-link-context-value.js +43 -0
  612. package/src/lib/app-utils/screen-link-context-value.js.map +1 -0
  613. package/src/lib/app-utils/screen-link-context.d.ts +185 -0
  614. package/src/lib/app-utils/screen-link-context.js +304 -0
  615. package/src/lib/app-utils/screen-link-context.js.map +1 -0
  616. package/src/lib/app-utils/screen-link-value.d.ts +269 -0
  617. package/src/lib/app-utils/screen-link-value.js +384 -0
  618. package/src/lib/app-utils/screen-link-value.js.map +1 -0
  619. package/src/lib/app-utils/screen-route.d.ts +669 -0
  620. package/src/lib/app-utils/screen-route.js +751 -0
  621. package/src/lib/app-utils/screen-route.js.map +1 -0
  622. package/src/lib/app-utils/screen-seo-fields.d.ts +37 -0
  623. package/src/lib/app-utils/screen-seo-fields.js +42 -0
  624. package/src/lib/app-utils/screen-seo-fields.js.map +1 -0
  625. package/src/lib/app-utils/search-indexing.d.ts +162 -0
  626. package/src/lib/app-utils/search-indexing.js +207 -0
  627. package/src/lib/app-utils/search-indexing.js.map +1 -0
  628. package/src/lib/app-utils/seo-listing-fields.d.ts +70 -0
  629. package/src/lib/app-utils/seo-listing-fields.js +75 -0
  630. package/src/lib/app-utils/seo-listing-fields.js.map +1 -0
  631. package/src/lib/app-utils/seo-locale.d.ts +119 -0
  632. package/src/lib/app-utils/seo-locale.js +133 -0
  633. package/src/lib/app-utils/seo-locale.js.map +1 -0
  634. package/src/lib/app-utils/seo-title-variables.d.ts +149 -0
  635. package/src/lib/app-utils/seo-title-variables.js +190 -0
  636. package/src/lib/app-utils/seo-title-variables.js.map +1 -0
  637. package/src/lib/app-utils/seo-title.d.ts +70 -0
  638. package/src/lib/app-utils/seo-title.js +117 -0
  639. package/src/lib/app-utils/seo-title.js.map +1 -0
  640. package/src/lib/app-utils/server.d.ts +174 -0
  641. package/src/lib/app-utils/server.js +314 -0
  642. package/src/lib/app-utils/server.js.map +1 -0
  643. package/src/lib/app-utils/site-context.d.ts +106 -0
  644. package/src/lib/app-utils/site-context.js +100 -0
  645. package/src/lib/app-utils/site-context.js.map +1 -0
  646. package/src/lib/app-utils/sitemap.d.ts +117 -0
  647. package/src/lib/app-utils/sitemap.js +183 -0
  648. package/src/lib/app-utils/sitemap.js.map +1 -0
  649. package/src/lib/app-utils/social-image.d.ts +112 -0
  650. package/src/lib/app-utils/social-image.js +191 -0
  651. package/src/lib/app-utils/social-image.js.map +1 -0
  652. package/src/lib/app-utils/starter-templates.d.ts +99 -0
  653. package/src/lib/app-utils/starter-templates.js +579 -0
  654. package/src/lib/app-utils/starter-templates.js.map +1 -0
  655. package/src/lib/app-utils/stored-nodes.d.ts +120 -0
  656. package/src/lib/app-utils/stored-nodes.js +174 -0
  657. package/src/lib/app-utils/stored-nodes.js.map +1 -0
  658. package/src/lib/app-utils/strip-undefined.d.ts +59 -0
  659. package/src/lib/app-utils/strip-undefined.js +95 -0
  660. package/src/lib/app-utils/strip-undefined.js.map +1 -0
  661. package/src/lib/app-utils/stripe-deployment-mode.d.ts +47 -0
  662. package/src/lib/app-utils/stripe-deployment-mode.js +70 -0
  663. package/src/lib/app-utils/stripe-deployment-mode.js.map +1 -0
  664. package/src/lib/app-utils/support-tiers.d.ts +108 -0
  665. package/src/lib/app-utils/support-tiers.js +201 -0
  666. package/src/lib/app-utils/support-tiers.js.map +1 -0
  667. package/src/lib/app-utils/timezone-geo-hint.d.ts +36 -0
  668. package/src/lib/app-utils/timezone-geo-hint.js +180 -0
  669. package/src/lib/app-utils/timezone-geo-hint.js.map +1 -0
  670. package/src/lib/app-utils/upload-cors.d.ts +155 -0
  671. package/src/lib/app-utils/upload-cors.js +254 -0
  672. package/src/lib/app-utils/upload-cors.js.map +1 -0
  673. package/src/lib/app-utils/upload-inspection.d.ts +159 -0
  674. package/src/lib/app-utils/upload-inspection.js +539 -0
  675. package/src/lib/app-utils/upload-inspection.js.map +1 -0
  676. package/src/lib/app-utils/url-slug.d.ts +40 -0
  677. package/src/lib/app-utils/url-slug.js +42 -0
  678. package/src/lib/app-utils/url-slug.js.map +1 -0
  679. package/src/lib/app-utils/usage-budget.d.ts +429 -0
  680. package/src/lib/app-utils/usage-budget.js +421 -0
  681. package/src/lib/app-utils/usage-budget.js.map +1 -0
  682. package/src/lib/app-utils/variables.d.ts +96 -0
  683. package/src/lib/app-utils/variables.js +233 -0
  684. package/src/lib/app-utils/variables.js.map +1 -0
  685. package/src/lib/app-utils/video-asset-facts.d.ts +61 -0
  686. package/src/lib/app-utils/video-asset-facts.js +70 -0
  687. package/src/lib/app-utils/video-asset-facts.js.map +1 -0
  688. package/src/lib/app-utils/video-object.d.ts +89 -0
  689. package/src/lib/app-utils/video-object.js +245 -0
  690. package/src/lib/app-utils/video-object.js.map +1 -0
  691. package/src/lib/app-utils/visitor-consent.d.ts +757 -0
  692. package/src/lib/app-utils/visitor-consent.js +981 -0
  693. package/src/lib/app-utils/visitor-consent.js.map +1 -0
  694. package/src/lib/app-utils/visitor-record-ceiling.d.ts +223 -0
  695. package/src/lib/app-utils/visitor-record-ceiling.js +215 -0
  696. package/src/lib/app-utils/visitor-record-ceiling.js.map +1 -0
  697. package/src/lib/app-utils/web-vitals-rum.d.ts +53 -0
  698. package/src/lib/app-utils/web-vitals-rum.js +278 -0
  699. package/src/lib/app-utils/web-vitals-rum.js.map +1 -0
  700. package/src/lib/app-utils/webhook-delivery.d.ts +324 -0
  701. package/src/lib/app-utils/webhook-delivery.js +413 -0
  702. package/src/lib/app-utils/webhook-delivery.js.map +1 -0
  703. package/src/lib/app-utils/where-used.d.ts +57 -0
  704. package/src/lib/app-utils/where-used.js +59 -0
  705. package/src/lib/app-utils/where-used.js.map +1 -0
  706. package/src/lib/app-utils/wistia-embed.d.ts +86 -0
  707. package/src/lib/app-utils/wistia-embed.js +119 -0
  708. package/src/lib/app-utils/wistia-embed.js.map +1 -0
  709. package/src/lib/app-utils/workflows.d.ts +136 -0
  710. package/src/lib/app-utils/workflows.js +346 -0
  711. package/src/lib/app-utils/workflows.js.map +1 -0
  712. package/src/lib/canvas-manager/canvas-manager-tree.d.ts +109 -0
  713. package/src/lib/canvas-manager/canvas-manager-tree.js +139 -0
  714. package/src/lib/canvas-manager/canvas-manager-tree.js.map +1 -0
  715. package/src/lib/canvas-manager/canvas-manager.d.ts +549 -0
  716. package/src/lib/canvas-manager/canvas-manager.js +1311 -0
  717. package/src/lib/canvas-manager/canvas-manager.js.map +1 -0
  718. package/src/lib/canvas-manager/index.d.ts +20 -0
  719. package/src/lib/canvas-manager/index.js +21 -0
  720. package/src/lib/canvas-manager/index.js.map +1 -0
  721. package/src/lib/canvas-manager/stores/index.d.ts +17 -0
  722. package/src/lib/canvas-manager/stores/index.js +18 -0
  723. package/src/lib/canvas-manager/stores/index.js.map +1 -0
  724. package/src/lib/canvas-manager/stores/node.store.d.ts +30 -0
  725. package/src/lib/canvas-manager/stores/node.store.js +45 -0
  726. package/src/lib/canvas-manager/stores/node.store.js.map +1 -0
  727. package/src/lib/components-manager/components-manager.d.ts +56 -0
  728. package/src/lib/components-manager/components-manager.js +191 -0
  729. package/src/lib/components-manager/components-manager.js.map +1 -0
  730. package/src/lib/components-manager/index.d.ts +18 -0
  731. package/src/lib/components-manager/index.js +19 -0
  732. package/src/lib/components-manager/index.js.map +1 -0
  733. package/src/lib/emit-manager/emit-manager.d.ts +56 -0
  734. package/src/lib/emit-manager/emit-manager.js +60 -0
  735. package/src/lib/emit-manager/emit-manager.js.map +1 -0
  736. package/src/lib/emit-manager/index.d.ts +18 -0
  737. package/src/lib/emit-manager/index.js +19 -0
  738. package/src/lib/emit-manager/index.js.map +1 -0
  739. package/src/lib/foundation/constants/_internal.d.ts +18 -0
  740. package/src/lib/foundation/constants/_internal.js +62 -0
  741. package/src/lib/foundation/constants/_internal.js.map +1 -0
  742. package/src/lib/foundation/constants/app.d.ts +23 -0
  743. package/src/lib/foundation/constants/app.js +25 -0
  744. package/src/lib/foundation/constants/app.js.map +1 -0
  745. package/src/lib/foundation/constants/canvas.d.ts +18 -0
  746. package/src/lib/foundation/constants/canvas.js +18 -0
  747. package/src/lib/foundation/constants/canvas.js.map +1 -0
  748. package/src/lib/foundation/constants/components.d.ts +54 -0
  749. package/src/lib/foundation/constants/components.js +61 -0
  750. package/src/lib/foundation/constants/components.js.map +1 -0
  751. package/src/lib/foundation/constants/shared.d.ts +50 -0
  752. package/src/lib/foundation/constants/shared.js +49 -0
  753. package/src/lib/foundation/constants/shared.js.map +1 -0
  754. package/src/lib/foundation/constants/symbol.d.ts +63 -0
  755. package/src/lib/foundation/constants/symbol.js +75 -0
  756. package/src/lib/foundation/constants/symbol.js.map +1 -0
  757. package/src/lib/foundation/definitions/components.types.d.ts +372 -0
  758. package/src/lib/foundation/definitions/components.types.js +180 -0
  759. package/src/lib/foundation/definitions/components.types.js.map +1 -0
  760. package/src/lib/foundation/definitions/contact.types.d.ts +73 -0
  761. package/src/lib/foundation/definitions/contact.types.js +107 -0
  762. package/src/lib/foundation/definitions/contact.types.js.map +1 -0
  763. package/src/lib/foundation/definitions/host-content-collections.d.ts +137 -0
  764. package/src/lib/foundation/definitions/host-content-collections.js +219 -0
  765. package/src/lib/foundation/definitions/host-content-collections.js.map +1 -0
  766. package/src/lib/foundation/definitions/org-billing.types.d.ts +1361 -0
  767. package/src/lib/foundation/definitions/org-billing.types.js +77 -0
  768. package/src/lib/foundation/definitions/org-billing.types.js.map +1 -0
  769. package/src/lib/foundation/definitions/organization.types.d.ts +307 -0
  770. package/src/lib/foundation/definitions/organization.types.js +42 -0
  771. package/src/lib/foundation/definitions/organization.types.js.map +1 -0
  772. package/src/lib/foundation/definitions/platform.types.d.ts +1326 -0
  773. package/src/lib/foundation/definitions/platform.types.js +124 -0
  774. package/src/lib/foundation/definitions/platform.types.js.map +1 -0
  775. package/src/lib/foundation/definitions/property-kinds.d.ts +189 -0
  776. package/src/lib/foundation/definitions/property-kinds.js +565 -0
  777. package/src/lib/foundation/definitions/property-kinds.js.map +1 -0
  778. package/src/lib/foundation/definitions/shared.d.ts +23 -0
  779. package/src/lib/foundation/definitions/shared.js +18 -0
  780. package/src/lib/foundation/definitions/shared.js.map +1 -0
  781. package/src/lib/foundation/definitions/write-deny-coverage.util.d.ts +249 -0
  782. package/src/lib/foundation/definitions/write-deny-coverage.util.js +499 -0
  783. package/src/lib/foundation/definitions/write-deny-coverage.util.js.map +1 -0
  784. package/src/lib/foundation/index.d.ts +32 -0
  785. package/src/lib/foundation/index.js +67 -0
  786. package/src/lib/foundation/index.js.map +1 -0
  787. package/src/lib/lifecycle.d.ts +24 -0
  788. package/src/lib/lifecycle.js +39 -0
  789. package/src/lib/lifecycle.js.map +1 -0
  790. package/src/lib/mst/common.d.ts +17 -0
  791. package/src/lib/mst/common.js +23 -0
  792. package/src/lib/mst/common.js.map +1 -0
  793. package/src/lib/mst/index.d.ts +19 -0
  794. package/src/lib/mst/index.js +20 -0
  795. package/src/lib/mst/index.js.map +1 -0
  796. package/src/lib/mst/json.d.ts +22 -0
  797. package/src/lib/mst/json.js +23 -0
  798. package/src/lib/mst/json.js.map +1 -0
  799. package/src/lib/mst/types.d.ts +20 -0
  800. package/src/lib/mst/types.js +18 -0
  801. package/src/lib/mst/types.js.map +1 -0
  802. package/src/lib/plugin-manager/billing-webhook-hooks.d.ts +77 -0
  803. package/src/lib/plugin-manager/billing-webhook-hooks.js +55 -0
  804. package/src/lib/plugin-manager/billing-webhook-hooks.js.map +1 -0
  805. package/src/lib/plugin-manager/commerce-zone-props.d.ts +172 -0
  806. package/src/lib/plugin-manager/commerce-zone-props.js +31 -0
  807. package/src/lib/plugin-manager/commerce-zone-props.js.map +1 -0
  808. package/src/lib/plugin-manager/custom-fields.d.ts +60 -0
  809. package/src/lib/plugin-manager/custom-fields.js +39 -0
  810. package/src/lib/plugin-manager/custom-fields.js.map +1 -0
  811. package/src/lib/plugin-manager/editor-sessions.d.ts +109 -0
  812. package/src/lib/plugin-manager/editor-sessions.js +137 -0
  813. package/src/lib/plugin-manager/editor-sessions.js.map +1 -0
  814. package/src/lib/plugin-manager/enabled-plugins.d.ts +438 -0
  815. package/src/lib/plugin-manager/enabled-plugins.js +403 -0
  816. package/src/lib/plugin-manager/enabled-plugins.js.map +1 -0
  817. package/src/lib/plugin-manager/feature-plugins.d.ts +1314 -0
  818. package/src/lib/plugin-manager/feature-plugins.js +609 -0
  819. package/src/lib/plugin-manager/feature-plugins.js.map +1 -0
  820. package/src/lib/plugin-manager/first-party-plugins.generated.d.ts +11 -0
  821. package/src/lib/plugin-manager/first-party-plugins.generated.js +149 -0
  822. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -0
  823. package/src/lib/plugin-manager/index.d.ts +42 -0
  824. package/src/lib/plugin-manager/index.js +46 -0
  825. package/src/lib/plugin-manager/index.js.map +1 -0
  826. package/src/lib/plugin-manager/install-presets.d.ts +93 -0
  827. package/src/lib/plugin-manager/install-presets.js +86 -0
  828. package/src/lib/plugin-manager/install-presets.js.map +1 -0
  829. package/src/lib/plugin-manager/media-delivery-provider.d.ts +124 -0
  830. package/src/lib/plugin-manager/media-delivery-provider.js +53 -0
  831. package/src/lib/plugin-manager/media-delivery-provider.js.map +1 -0
  832. package/src/lib/plugin-manager/order-fulfilment.d.ts +142 -0
  833. package/src/lib/plugin-manager/order-fulfilment.js +104 -0
  834. package/src/lib/plugin-manager/order-fulfilment.js.map +1 -0
  835. package/src/lib/plugin-manager/plugin-activity-actions.d.ts +122 -0
  836. package/src/lib/plugin-manager/plugin-activity-actions.js +140 -0
  837. package/src/lib/plugin-manager/plugin-activity-actions.js.map +1 -0
  838. package/src/lib/plugin-manager/plugin-bridge.d.ts +98 -0
  839. package/src/lib/plugin-manager/plugin-bridge.js +154 -0
  840. package/src/lib/plugin-manager/plugin-bridge.js.map +1 -0
  841. package/src/lib/plugin-manager/plugin-config.d.ts +148 -0
  842. package/src/lib/plugin-manager/plugin-config.js +228 -0
  843. package/src/lib/plugin-manager/plugin-config.js.map +1 -0
  844. package/src/lib/plugin-manager/plugin-console-crons.d.ts +139 -0
  845. package/src/lib/plugin-manager/plugin-console-crons.js +177 -0
  846. package/src/lib/plugin-manager/plugin-console-crons.js.map +1 -0
  847. package/src/lib/plugin-manager/plugin-contact-capture.d.ts +220 -0
  848. package/src/lib/plugin-manager/plugin-contact-capture.js +89 -0
  849. package/src/lib/plugin-manager/plugin-contact-capture.js.map +1 -0
  850. package/src/lib/plugin-manager/plugin-contributions.d.ts +244 -0
  851. package/src/lib/plugin-manager/plugin-contributions.js +283 -0
  852. package/src/lib/plugin-manager/plugin-contributions.js.map +1 -0
  853. package/src/lib/plugin-manager/plugin-entitlement-keys.d.ts +169 -0
  854. package/src/lib/plugin-manager/plugin-entitlement-keys.js +84 -0
  855. package/src/lib/plugin-manager/plugin-entitlement-keys.js.map +1 -0
  856. package/src/lib/plugin-manager/plugin-entitlements.d.ts +181 -0
  857. package/src/lib/plugin-manager/plugin-entitlements.js +188 -0
  858. package/src/lib/plugin-manager/plugin-entitlements.js.map +1 -0
  859. package/src/lib/plugin-manager/plugin-events.d.ts +145 -0
  860. package/src/lib/plugin-manager/plugin-events.js +79 -0
  861. package/src/lib/plugin-manager/plugin-events.js.map +1 -0
  862. package/src/lib/plugin-manager/plugin-figures.d.ts +251 -0
  863. package/src/lib/plugin-manager/plugin-figures.js +252 -0
  864. package/src/lib/plugin-manager/plugin-figures.js.map +1 -0
  865. package/src/lib/plugin-manager/plugin-host-collections.d.ts +146 -0
  866. package/src/lib/plugin-manager/plugin-host-collections.js +116 -0
  867. package/src/lib/plugin-manager/plugin-host-collections.js.map +1 -0
  868. package/src/lib/plugin-manager/plugin-jobs.d.ts +130 -0
  869. package/src/lib/plugin-manager/plugin-jobs.js +182 -0
  870. package/src/lib/plugin-manager/plugin-jobs.js.map +1 -0
  871. package/src/lib/plugin-manager/plugin-loader.d.ts +86 -0
  872. package/src/lib/plugin-manager/plugin-loader.js +223 -0
  873. package/src/lib/plugin-manager/plugin-loader.js.map +1 -0
  874. package/src/lib/plugin-manager/plugin-manager.d.ts +95 -0
  875. package/src/lib/plugin-manager/plugin-manager.js +343 -0
  876. package/src/lib/plugin-manager/plugin-manager.js.map +1 -0
  877. package/src/lib/plugin-manager/plugin-metered-lines.d.ts +97 -0
  878. package/src/lib/plugin-manager/plugin-metered-lines.js +123 -0
  879. package/src/lib/plugin-manager/plugin-metered-lines.js.map +1 -0
  880. package/src/lib/plugin-manager/plugin-org-erasure.d.ts +52 -0
  881. package/src/lib/plugin-manager/plugin-org-erasure.js +100 -0
  882. package/src/lib/plugin-manager/plugin-org-erasure.js.map +1 -0
  883. package/src/lib/plugin-manager/plugin-permissions.d.ts +69 -0
  884. package/src/lib/plugin-manager/plugin-permissions.js +77 -0
  885. package/src/lib/plugin-manager/plugin-permissions.js.map +1 -0
  886. package/src/lib/plugin-manager/plugin-person-erasure.d.ts +58 -0
  887. package/src/lib/plugin-manager/plugin-person-erasure.js +109 -0
  888. package/src/lib/plugin-manager/plugin-person-erasure.js.map +1 -0
  889. package/src/lib/plugin-manager/plugin-record-cards.d.ts +99 -0
  890. package/src/lib/plugin-manager/plugin-record-cards.js +59 -0
  891. package/src/lib/plugin-manager/plugin-record-cards.js.map +1 -0
  892. package/src/lib/plugin-manager/plugin-record-facts.d.ts +111 -0
  893. package/src/lib/plugin-manager/plugin-record-facts.js +51 -0
  894. package/src/lib/plugin-manager/plugin-record-facts.js.map +1 -0
  895. package/src/lib/plugin-manager/plugin-record-routes.d.ts +129 -0
  896. package/src/lib/plugin-manager/plugin-record-routes.js +93 -0
  897. package/src/lib/plugin-manager/plugin-record-routes.js.map +1 -0
  898. package/src/lib/plugin-manager/plugin-record-timeline.d.ts +147 -0
  899. package/src/lib/plugin-manager/plugin-record-timeline.js +39 -0
  900. package/src/lib/plugin-manager/plugin-record-timeline.js.map +1 -0
  901. package/src/lib/plugin-manager/plugin-resource-drafts.d.ts +137 -0
  902. package/src/lib/plugin-manager/plugin-resource-drafts.js +51 -0
  903. package/src/lib/plugin-manager/plugin-resource-drafts.js.map +1 -0
  904. package/src/lib/plugin-manager/plugin-services.d.ts +94 -0
  905. package/src/lib/plugin-manager/plugin-services.js +153 -0
  906. package/src/lib/plugin-manager/plugin-services.js.map +1 -0
  907. package/src/lib/plugin-manager/plugin-styles-ui.d.ts +71 -0
  908. package/src/lib/plugin-manager/plugin-styles-ui.js +80 -0
  909. package/src/lib/plugin-manager/plugin-styles-ui.js.map +1 -0
  910. package/src/lib/plugin-manager/plugin-styles.d.ts +176 -0
  911. package/src/lib/plugin-manager/plugin-styles.js +186 -0
  912. package/src/lib/plugin-manager/plugin-styles.js.map +1 -0
  913. package/src/lib/plugin-manager/plugin-subprocessors.d.ts +135 -0
  914. package/src/lib/plugin-manager/plugin-subprocessors.js +129 -0
  915. package/src/lib/plugin-manager/plugin-subprocessors.js.map +1 -0
  916. package/src/lib/plugin-manager/plugin-tax-profile.d.ts +84 -0
  917. package/src/lib/plugin-manager/plugin-tax-profile.js +39 -0
  918. package/src/lib/plugin-manager/plugin-tax-profile.js.map +1 -0
  919. package/src/lib/plugin-manager/plugin-user-erasure.d.ts +53 -0
  920. package/src/lib/plugin-manager/plugin-user-erasure.js +84 -0
  921. package/src/lib/plugin-manager/plugin-user-erasure.js.map +1 -0
  922. package/src/lib/plugin-manager/plugin-zones.d.ts +121 -0
  923. package/src/lib/plugin-manager/plugin-zones.js +74 -0
  924. package/src/lib/plugin-manager/plugin-zones.js.map +1 -0
  925. package/src/lib/plugin-manager/realm-plugins.d.ts +112 -0
  926. package/src/lib/plugin-manager/realm-plugins.js +196 -0
  927. package/src/lib/plugin-manager/realm-plugins.js.map +1 -0
  928. package/src/lib/plugin-manager/realm-server.d.ts +54 -0
  929. package/src/lib/plugin-manager/realm-server.js +88 -0
  930. package/src/lib/plugin-manager/realm-server.js.map +1 -0
  931. package/src/lib/plugin-manager/record-zone-props.d.ts +126 -0
  932. package/src/lib/plugin-manager/record-zone-props.js +31 -0
  933. package/src/lib/plugin-manager/record-zone-props.js.map +1 -0
  934. package/src/lib/plugin-manager/site-page-hooks.d.ts +102 -0
  935. package/src/lib/plugin-manager/site-page-hooks.js +114 -0
  936. package/src/lib/plugin-manager/site-page-hooks.js.map +1 -0
  937. package/src/lib/plugin-manager/site-runtime.d.ts +57 -0
  938. package/src/lib/plugin-manager/site-runtime.js +25 -0
  939. package/src/lib/plugin-manager/site-runtime.js.map +1 -0
  940. package/src/lib/plugin-manager/usage-alert-contributors.d.ts +115 -0
  941. package/src/lib/plugin-manager/usage-alert-contributors.js +106 -0
  942. package/src/lib/plugin-manager/usage-alert-contributors.js.map +1 -0
  943. package/src/lib/types/ast.d.ts +199 -0
  944. package/src/lib/types/ast.js +20 -0
  945. package/src/lib/types/ast.js.map +1 -0
  946. package/src/lib/types/index.d.ts +20 -0
  947. package/src/lib/types/index.js +21 -0
  948. package/src/lib/types/index.js.map +1 -0
  949. package/src/lib/types/nodes.d.ts +608 -0
  950. package/src/lib/types/nodes.js +28 -0
  951. package/src/lib/types/nodes.js.map +1 -0
  952. package/src/lib/types/routing.d.ts +17 -0
  953. package/src/lib/types/routing.js +18 -0
  954. package/src/lib/types/routing.js.map +1 -0
  955. package/src/lib/types/screen.d.ts +23 -0
  956. package/src/lib/types/screen.js +18 -0
  957. package/src/lib/types/screen.js.map +1 -0
  958. package/src/lib/utils.d.ts +25 -0
  959. package/src/lib/utils.js +42 -0
  960. package/src/lib/utils.js.map +1 -0
  961. package/src/server.d.ts +37 -0
  962. package/src/server.js +55 -0
  963. package/src/server.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/plugin-manifest.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { PluginConfigField } from '../plugin-manager/plugin-config'\nimport {\n sanitizePluginContributions,\n type PluginContributions,\n} from '../plugin-manager/plugin-contributions'\n\n/**\n * Executable-plugin manifest, artifact-path, CSP, and revocation helpers\n * (AGL-45), per the accepted AGL-43 design. Plugins — unlike declarative\n * components (see `marketplace.ts`) — are code, so they never run in the\n * console/tenant origin: they load in a sandboxed iframe on a dedicated\n * plugin origin, and this manifest is the contract the install screen\n * shows verbatim and the serving layer turns into CSP. Pure module — safe\n * to import from API routes, the loader, and the host runtime alike.\n */\n\n/** Capabilities a plugin declares; shown verbatim at install. */\n/**\n * How a declared prop should be EDITED. Authoring metadata only (AGL-1049).\n *\n * Deliberately separate from `props`, which stays the security allowlist. A\n * schema entry for a name that is not in `props` widens nothing — it is\n * dropped, because the filter and the author disagreeing must resolve in the\n * filter's favour. The point of this is to make them agree, never to let a\n * publisher grant themselves a prop by describing it.\n */\nexport interface PluginPropSchema {\n /** Must also appear in `capabilities.props`, or this entry is ignored. */\n name: string\n /**\n * Which editor to render. Unknown values degrade to `string` rather than\n * being rejected: this is publisher-authored data, and a manifest from a\n * newer platform version must not make an older host refuse the plugin.\n */\n type?: 'string' | 'number' | 'boolean' | 'color' | 'date' | 'url' | 'select'\n label?: string\n description?: string\n /** Shown as the field's initial value, so \"leave it alone\" is visible. */\n default?: string | number | boolean\n /** `select` only. */\n options?: Array<{ value: string; label?: string }>\n}\n\n/**\n * A canvas element a plugin version contributes (AGL-1031).\n *\n * A first-party plugin that extends the besigner declares a `ComponentSchema`\n * and gets a first-class palette entry. A marketplace plugin doing the same\n * work got a generic \"Plugin\" wrapper and a JSON textarea. Where an element\n * came from is a fact about its provenance, not a different kind of thing.\n *\n * The line this must not cross: **declared schema drives AUTHORING; the\n * sandbox still owns runtime.** This is publisher-authored DATA. It never\n * becomes a React component in the host bundle — the palette entry, the label\n * and the attribute fields are host-rendered from the declaration, and the\n * saved node still resolves to a sandboxed `PluginFrame` integrity-checked\n * against the pinned sha256. Nothing here changes what executes or where.\n */\nexport interface PluginElementDeclaration {\n /**\n * Stable id, unique within the plugin. Saved on the node beside the listing\n * id, so renaming the display name never orphans a placed element.\n */\n id: string\n displayName: string\n description?: string\n /**\n * Drawer category. Constrained to a subset — see\n * {@link PLUGIN_ELEMENT_CATEGORIES}.\n */\n category?: string\n /**\n * An mdi icon NAME (`mdiTimerOutline`), never markup and never a path.\n *\n * A path would be arbitrary SVG from a publisher rendered into console\n * chrome; a name is looked up in the icon set the host already ships, so the\n * worst a bad value can do is render nothing.\n */\n icon?: string\n /**\n * The element's editable attributes. Intersected with `capabilities.props`\n * exactly as {@link PluginPropSchema} is — an attribute the plugin cannot\n * receive is not an attribute.\n */\n attributes?: PluginPropSchema[]\n}\n\n/**\n * Categories a third-party element may declare.\n *\n * Deliberately not the whole enum. `LAYOUT` and `NAVIGATION` are structural —\n * a third-party element appearing among the containers a page is built out of\n * invites placements the sandbox cannot honour, and taking a category away\n * later breaks every site that used it. Cheaper to decide now, as the issue\n * says; widening later is easy and narrowing is not.\n */\nexport const PLUGIN_ELEMENT_CATEGORIES: readonly string[] = [\n 'Data Display',\n 'Media',\n 'Commerce',\n 'Forms',\n 'Input',\n 'Text',\n 'Sections & Blocks',\n]\n\n/** Bound on how many elements one plugin may contribute to the palette. */\nexport const PLUGIN_MAX_ELEMENTS = 12\n\nexport interface PluginCapabilities {\n /**\n * Outbound origins the plugin may call (`connect-src`), each an exact\n * https origin (`https://api.example.com`). Empty = no network.\n */\n network?: string[]\n /** Prop names the host passes IN through the bridge. THE allowlist. */\n props?: string[]\n /**\n * Optional editing metadata for the props above (AGL-1049). Absent on every\n * plugin published before this existed, which is why the authoring surface\n * falls back to a plain text field per declared name rather than requiring\n * it.\n */\n propSchema?: PluginPropSchema[]\n /** Event names the plugin may emit OUT through the bridge. */\n events?: string[]\n /** Rendered iframe region size (host reserves this box). */\n size?: { width?: number; height?: number }\n}\n\nexport interface PluginManifest {\n /** Stable plugin id (matches the listing); persisted, never renamed. */\n id: string\n /** Human name shown in the drawer + install screen. */\n name: string\n /** Semver-ish version string (`1.2.0`); must match the artifact version. */\n version: string\n /** Bundle entry the loader imports on the plugin origin. */\n entry: string\n /**\n * Host ABI generation the bundle was built against (AGL-429). Realm and\n * remote-server loaders refuse a bundle whose declared ABI differs from\n * the running host's PLUGIN_HOST_ABI_VERSION; absent = pre-compat\n * bundle, loaded with a warning. Bumping the ABI is a breaking change.\n */\n hostAbi?: number\n capabilities?: PluginCapabilities\n /**\n * Canvas elements this version contributes to the palette (AGL-1031).\n *\n * Part of the reviewed bytes: a new element is a new version through review,\n * and a revoked version's elements vanish from the palette with it, because\n * the palette is built from the pinned install.\n */\n elements?: PluginElementDeclaration[]\n /** Besigner lineal rules the registered component honors (AGL-45 §4). */\n restrictParent?: string[]\n restrictChildren?: string[]\n description?: string\n /**\n * Settings this plugin takes, declared in the manifest (AGL-428).\n *\n * First-party plugins call `registerPluginConfigSchema` at module scope,\n * which a sandboxed third-party bundle cannot do: it does not run in the\n * console process at all, so nothing it executes can reach the registry the\n * settings form reads. The manifest is the one declaration of a marketplace\n * plugin that IS present in the console — denormalized onto every install\n * pin, and part of the reviewed bytes — so it is where a publisher's fields\n * come from.\n *\n * Read through `pluginConfigSchemaFromManifest`, never directly: this is\n * publisher-authored data on a document the console renders a form from, so\n * every field is re-validated on the way in rather than trusted for having\n * been reviewed once.\n */\n config?: {\n fields: PluginConfigField[]\n defaults?: Record<string, unknown>\n }\n /**\n * What `register(host)` contributes, and where (AGL-3116): the elements and\n * features a published page loads the plugin for, and the console slots,\n * routes and shell entries a console screen loads it for. See\n * `plugin-contributions.ts`.\n *\n * Absent on every version published before the contract, and those load\n * under its documented default. A version that declares it is held to it:\n * the verifier compares it with what the bundle registers, and a published\n * page never loads the plugin anywhere the declaration does not place it.\n */\n contributes?: PluginContributions\n}\n\n/** A published, content-addressed version of a plugin listing. */\nexport interface PluginListingVersion {\n version: string\n /** Content hash of the artifact bundle (integrity check at load). */\n sha256: string\n /**\n * Trust tier (AGL-420): 'realm' = staff-reviewed + platform-signed,\n * may load into the app realm; anything else stays in the sandboxed\n * PluginFrame. Staff-writable only.\n */\n trust?: string\n /** Ed25519 signature (base64) over the sha256 hex (AGL-420). */\n signature?: string\n changelog?: string\n createdAtMs?: number\n manifest: PluginManifest\n}\n\n/** `hosts/{hostId}/installs/{listingId}` — a pinned plugin install. */\nexport interface PluginInstall {\n listingId: string\n version: string\n sha256: string\n /** Mirrored trust tier + signature at install time (AGL-420). */\n trust?: string\n signature?: string\n installedAtMs?: number\n updatedAtMs?: number\n entitlementRef?: string\n}\n\n/** `revocations/{listingId}` — platform kill switch checked at load. */\nexport interface PluginRevocation {\n /**\n * Specific versions revoked, or `'all'` to kill the whole listing. The\n * field every INSTALLABILITY reader consults, via `isPluginRevoked`.\n *\n * It used to say this was the only field any reader consulted, and that\n * was the defect rather than a description of one: staff are required to\n * type a reason, it was written here, and nothing rendered it — so the\n * customer whose site broke and the publisher whose version was pulled\n * both got a bare chip (AGL-2328). `reason` and the timestamp are now\n * read by `host-plugins-card` and by the publisher branch of\n * `listing-versions`. Do not restore the old claim.\n */\n versions: string[] | 'all'\n /** Typed by staff, REQUIRED to revoke. Rendered to both audiences. */\n reason?: string\n /**\n * ⚠️ DECLARED HERE AND WRITTEN BY NOTHING. Every writer in\n * `apps/console/app/api/admin/plugin-reviews/route.ts` stores\n * `revokedAt` instead. A reader that trusts this field alone shows no\n * date for every revocation that actually exists — read both, the way\n * `revocationTimeMs` in `listing-versions.ts` does.\n */\n atMs?: number\n /**\n * What the writers actually store — a Firestore server timestamp, so its\n * shape depends on which SDK read it back (`toMillis()` on admin, a\n * `seconds` field through a client). Deliberately `unknown` rather than a\n * lie about which one a given reader will see.\n */\n revokedAt?: unknown\n /**\n * The staff uid that pulled it. Recorded, and deliberately NEVER returned\n * to a customer or a publisher: who acted belongs in the audit log, not\n * on the screen of the person it was done to (AGL-2328).\n */\n revokedBy?: string\n /**\n * `'takedown'` when the listing-level hide wrote it (AGL-948). Un-hiding\n * clears a takedown-owned entry, so it must not be the only record.\n */\n source?: string\n /**\n * Versions revoked by a REVIEW decision (AGL-1085), kept separately from\n * `versions` because a takedown flattens that to `'all'`. Without this,\n * un-hiding a listing would silently un-revoke versions a reviewer stopped\n * for an unrelated reason.\n */\n reviewVersions?: string[]\n}\n\nexport * from './plugin-artifact-path'\n\nexport const PLUGIN_ID_PATTERN = /^[a-z][a-z0-9-]{1,63}$/\nexport const PLUGIN_VERSION_PATTERN = /^\\d+\\.\\d+\\.\\d+$/\nexport const PLUGIN_MAX_NETWORK_ORIGINS = 10\nexport const PLUGIN_MAX_PROPS = 32\n/** Label/description/default text is publisher-authored; keep it bounded. */\nconst PLUGIN_PROP_TEXT_MAX = 200\n/**\n * `mdiTimerOutline` — an icon NAME from the set the host already ships.\n *\n * Never a path: a path is arbitrary SVG from a publisher rendered into console\n * chrome. A name is a lookup, so the worst an unknown one does is render\n * nothing.\n */\nconst MDI_ICON_NAME_PATTERN = /^mdi[A-Za-z0-9]{1,48}$/\nconst PROP_SCHEMA_TYPES = new Set([\n 'string',\n 'number',\n 'boolean',\n 'color',\n 'date',\n 'url',\n 'select',\n])\nexport const PLUGIN_MAX_EVENTS = 32\nexport const PLUGIN_MAX_SIZE_PX = 4096\nconst HTTPS_ORIGIN_PATTERN = /^https:\\/\\/[a-z0-9.-]+(:\\d+)?$/i\nconst IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/\n\n/**\n * Validates a manifest at publish time. Returns the normalized manifest or\n * a human-readable error — the publish Cloud Function refuses to store a\n * bundle whose manifest doesn't pass, so bad capabilities never reach a\n * consumer's install screen.\n */\n/**\n * Sanitizes a publisher-authored prop schema against a set of declared props.\n *\n * Shared by `capabilities.propSchema` and each element's `attributes`, so a\n * declared element cannot describe its way past the allowlist any more than a\n * top-level schema can. One implementation, one rule.\n */\nfunction sanitizePropSchemaList(\n input: unknown,\n declared: ReadonlySet<string>,\n): PluginPropSchema[] {\n if (!Array.isArray(input)) return []\n const out: PluginPropSchema[] = []\n const seen = new Set<string>()\n for (const raw of input.slice(0, PLUGIN_MAX_PROPS)) {\n if (!raw || typeof raw !== 'object') continue\n const entry = raw as Record<string, unknown>\n const name = entry['name']\n if (typeof name !== 'string' || !IDENTIFIER_PATTERN.test(name)) continue\n if (!declared.has(name) || seen.has(name)) continue\n seen.add(name)\n const type = PROP_SCHEMA_TYPES.has(String(entry['type']))\n ? (entry['type'] as PluginPropSchema['type'])\n : 'string'\n const next: PluginPropSchema = { name, type }\n for (const key of ['label', 'description'] as const) {\n const value = entry[key]\n if (typeof value === 'string' && value.trim()) {\n next[key] = value.trim().slice(0, PLUGIN_PROP_TEXT_MAX)\n }\n }\n const fallback = entry['default']\n if (\n typeof fallback === 'string' ||\n typeof fallback === 'number' ||\n typeof fallback === 'boolean'\n ) {\n next.default =\n typeof fallback === 'string'\n ? fallback.slice(0, PLUGIN_PROP_TEXT_MAX)\n : fallback\n }\n if (type === 'select' && Array.isArray(entry['options'])) {\n const options = (entry['options'] as unknown[])\n .map((option) => {\n const record = (option ?? {}) as Record<string, unknown>\n const value = record['value']\n if (typeof value !== 'string' || !value) return null\n const label = record['label']\n return {\n value: value.slice(0, PLUGIN_PROP_TEXT_MAX),\n ...(typeof label === 'string' && label.trim()\n ? { label: label.trim().slice(0, PLUGIN_PROP_TEXT_MAX) }\n : {}),\n }\n })\n .filter(Boolean) as Array<{ value: string; label?: string }>\n if (options.length) next.options = options.slice(0, PLUGIN_MAX_PROPS)\n }\n out.push(next)\n }\n return out\n}\n\nexport function validatePluginManifest(\n input: unknown,\n): { ok: true; manifest: PluginManifest } | { ok: false; error: string } {\n if (!input || typeof input !== 'object') {\n return { ok: false, error: 'Manifest must be an object' }\n }\n const raw = input as Record<string, unknown>\n const id = String(raw['id'] ?? '')\n if (!PLUGIN_ID_PATTERN.test(id)) {\n return { ok: false, error: 'Invalid plugin id' }\n }\n const version = String(raw['version'] ?? '')\n if (!PLUGIN_VERSION_PATTERN.test(version)) {\n return { ok: false, error: 'Version must be semver (e.g. 1.0.0)' }\n }\n const name = String(raw['name'] ?? '').trim()\n if (!name || name.length > 80) {\n return { ok: false, error: 'Name is required (max 80 chars)' }\n }\n const entry = String(raw['entry'] ?? '').trim()\n // Entry is a relative bundle path — absolute URLs would let a plugin\n // point the loader at an off-origin script.\n if (!entry || /^[a-z][a-z0-9+.-]*:/i.test(entry) || entry.startsWith('//')) {\n return { ok: false, error: 'Entry must be a relative bundle path' }\n }\n\n const capabilitiesInput = (raw['capabilities'] ?? {}) as Record<\n string,\n unknown\n >\n const capabilities: PluginCapabilities = {}\n\n const network = capabilitiesInput['network']\n if (network !== undefined) {\n if (!Array.isArray(network) || network.length > PLUGIN_MAX_NETWORK_ORIGINS) {\n return { ok: false, error: 'Too many network origins declared' }\n }\n for (const origin of network) {\n if (typeof origin !== 'string' || !HTTPS_ORIGIN_PATTERN.test(origin)) {\n return {\n ok: false,\n error: `Network origin \"${origin}\" must be an https origin`,\n }\n }\n }\n if (network.length) capabilities.network = [...new Set(network as string[])]\n }\n\n for (const key of ['props', 'events'] as const) {\n const list = capabilitiesInput[key]\n if (list === undefined) continue\n const max = key === 'props' ? PLUGIN_MAX_PROPS : PLUGIN_MAX_EVENTS\n if (!Array.isArray(list) || list.length > max) {\n return { ok: false, error: `Too many ${key} declared` }\n }\n for (const name of list) {\n if (typeof name !== 'string' || !IDENTIFIER_PATTERN.test(name)) {\n return { ok: false, error: `Invalid ${key} name \"${name}\"` }\n }\n }\n if (list.length) capabilities[key] = [...new Set(list as string[])]\n }\n\n /**\n * Editing metadata (AGL-1049). Sanitized, never trusted, and INTERSECTED\n * with the allowlist above — an entry naming a prop that is not declared in\n * `props` is dropped rather than rejected.\n *\n * Dropped and not rejected on purpose: a publisher who describes a prop they\n * forgot to declare has made an authoring mistake, not an attack, and\n * refusing the whole manifest for it would fail the publish over a label.\n * The prop still does not cross the bridge, because `filterPluginProps`\n * reads `props` and never this.\n *\n * An unknown `type` degrades to a text field rather than failing: a manifest\n * written against a newer platform must not make an older host refuse a\n * plugin that is otherwise fine.\n */\n const propSchemaInput = capabilitiesInput['propSchema']\n if (propSchemaInput !== undefined) {\n if (\n !Array.isArray(propSchemaInput) ||\n propSchemaInput.length > PLUGIN_MAX_PROPS\n ) {\n return { ok: false, error: 'Too many prop schemas declared' }\n }\n const propSchema = sanitizePropSchemaList(\n propSchemaInput,\n new Set(capabilities.props ?? []),\n )\n if (propSchema.length) capabilities.propSchema = propSchema\n }\n\n const size = capabilitiesInput['size'] as\n | { width?: unknown; height?: unknown }\n | undefined\n if (size) {\n const width = Number(size.width ?? 0)\n const height = Number(size.height ?? 0)\n if (\n (size.width !== undefined &&\n (!Number.isFinite(width) || width < 0 || width > PLUGIN_MAX_SIZE_PX)) ||\n (size.height !== undefined &&\n (!Number.isFinite(height) ||\n height < 0 ||\n height > PLUGIN_MAX_SIZE_PX))\n ) {\n return { ok: false, error: 'Declared size is out of range' }\n }\n capabilities.size = {\n ...(size.width !== undefined ? { width } : {}),\n ...(size.height !== undefined ? { height } : {}),\n }\n }\n\n const restrict = (value: unknown): string[] | undefined => {\n if (!Array.isArray(value)) return undefined\n const ids = value.filter(\n (entry): entry is string => typeof entry === 'string' && entry.length > 0,\n )\n return ids.length ? [...new Set(ids)] : undefined\n }\n\n const hostAbiRaw = raw['hostAbi']\n let hostAbi: number | undefined\n if (hostAbiRaw !== undefined) {\n hostAbi = Number(hostAbiRaw)\n if (!Number.isInteger(hostAbi) || hostAbi < 1 || hostAbi > 99) {\n return { ok: false, error: 'hostAbi must be a small positive integer' }\n }\n }\n\n /**\n * Declared canvas elements (AGL-1031). Sanitized hard, because every field\n * here is publisher-authored data the HOST renders into its own chrome.\n *\n * A malformed `elements` array is refused — that is a build error a\n * publisher can see and fix. A single bad ENTRY is dropped instead, so one\n * typo cannot fail a whole release.\n */\n const elementsInput = raw['elements']\n const elements: PluginElementDeclaration[] = []\n if (elementsInput !== undefined) {\n if (\n !Array.isArray(elementsInput) ||\n elementsInput.length > PLUGIN_MAX_ELEMENTS\n ) {\n return { ok: false, error: 'Too many elements declared' }\n }\n const declaredProps = new Set(capabilities.props ?? [])\n const seenIds = new Set<string>()\n for (const rawElement of elementsInput) {\n if (!rawElement || typeof rawElement !== 'object') continue\n const entryRecord = rawElement as Record<string, unknown>\n const elementId = entryRecord['id']\n const elementName = entryRecord['displayName']\n if (typeof elementId !== 'string' || !IDENTIFIER_PATTERN.test(elementId)) {\n continue\n }\n if (seenIds.has(elementId)) continue\n if (typeof elementName !== 'string' || !elementName.trim()) continue\n seenIds.add(elementId)\n const element: PluginElementDeclaration = {\n id: elementId,\n displayName: elementName.trim().slice(0, PLUGIN_PROP_TEXT_MAX),\n }\n const elementDescription = entryRecord['description']\n if (typeof elementDescription === 'string' && elementDescription.trim()) {\n element.description = elementDescription\n .trim()\n .slice(0, PLUGIN_PROP_TEXT_MAX)\n }\n // A category outside the permitted subset is DROPPED, not refused: the\n // structural ones are withheld deliberately (see\n // PLUGIN_ELEMENT_CATEGORIES), and a publisher aiming at one should still\n // get a usable element rather than a failed publish.\n const elementCategory = entryRecord['category']\n if (\n typeof elementCategory === 'string' &&\n PLUGIN_ELEMENT_CATEGORIES.includes(elementCategory)\n ) {\n element.category = elementCategory\n }\n const elementIcon = entryRecord['icon']\n if (\n typeof elementIcon === 'string' &&\n MDI_ICON_NAME_PATTERN.test(elementIcon)\n ) {\n element.icon = elementIcon\n }\n const elementAttributes = sanitizePropSchemaList(\n entryRecord['attributes'],\n declaredProps,\n )\n if (elementAttributes.length) element.attributes = elementAttributes\n elements.push(element)\n }\n }\n\n /**\n * Declared contributions (AGL-3116). Refused whole when malformed rather\n * than trimmed: a loader places the plugin by this block, and an entry\n * dropped on the way in would stop it loading where it is used.\n */\n let contributes: PluginContributions | undefined\n if (raw['contributes'] !== undefined) {\n const verdict = sanitizePluginContributions(raw['contributes'])\n if (verdict.ok === false) return { ok: false, error: verdict.error }\n contributes = verdict.contributions\n }\n\n return {\n ok: true,\n manifest: {\n id,\n name,\n version,\n entry,\n ...(hostAbi !== undefined ? { hostAbi } : {}),\n ...(contributes ? { contributes } : {}),\n ...(Object.keys(capabilities).length ? { capabilities } : {}),\n ...(elements.length ? { elements } : {}),\n ...(restrict(raw['restrictParent'])\n ? { restrictParent: restrict(raw['restrictParent']) }\n : {}),\n ...(restrict(raw['restrictChildren'])\n ? { restrictChildren: restrict(raw['restrictChildren']) }\n : {}),\n ...(typeof raw['description'] === 'string'\n ? { description: String(raw['description']).slice(0, 500) }\n : {}),\n },\n }\n}\n\n\n/**\n * The sandbox CSP is NOT built here (AGL-1092).\n *\n * A `pluginContentSecurityPolicy` used to live at this spot: exported,\n * unit-tested, and called by nothing. The policy that actually reaches a\n * browser is `csp()` in `tools/plugin-loader/origin/api/load.mjs`, on the\n * plugin-origin deployment, and the two disagreed — this one emitted\n * `connect-src 'none'` for a manifest with no network, which would have\n * broken every sandboxed load, since the frame fetches its own bundle from\n * its own origin. Deleted rather than reconciled: a tested policy nobody\n * serves is worse than none, because it answers a reader's question wrongly.\n * `capabilities.network` still decides the allowlist — the loader reads it\n * from the public listing-versions endpoint and appends it to `connect-src`,\n * with tests beside it (`npm run test:plugin-loader`).\n */\n\n/**\n * True when a pinned version is killed — the whole listing (`'all'`) or the\n * specific version. Loaders check this before executing and render a safe\n * placeholder when true (AGL-45 §3.5 kill switch).\n */\nexport function isPluginRevoked(\n revocation: PluginRevocation | null | undefined,\n version: string,\n): boolean {\n if (!revocation) return false\n if (isListingWideRevocation(revocation)) return true\n return (\n Array.isArray(revocation.versions) && revocation.versions.includes(version)\n )\n}\n\n/**\n * True when the kill switch is thrown on the WHOLE listing, not one build.\n *\n * Split out for the one caller that has no version to ask about: marketplace\n * checkout (AGL-2288) must refuse to SELL a listing the platform has switched\n * off, and it decides that before any version is chosen. Written here rather\n * than as `revocation?.versions === 'all'` at that call site for the reason\n * the doc comment on `nextRevocationState` gives — what `'all'` means is a\n * property of this document's shape, and a second reader that spelled it out\n * itself is how a kill switch silently stops killing.\n *\n * A per-version revocation is deliberately NOT listing-wide: it stops one\n * build while the rest stay installable.\n */\nexport function isListingWideRevocation(\n revocation: PluginRevocation | null | undefined,\n): boolean {\n return revocation?.versions === 'all'\n}\n\n/**\n * What a listing OFFERS a client right now (AGL-2368).\n *\n * `newestInstallableVersion` is the derivation, and it needs the version set —\n * which is server-only (`pluginVersions`). A client has the listing's\n * `latestApprovedVersion` mirror instead, and since AGL-2306 every writer of\n * that mirror computes it with `newestInstallableVersion`. So on a client the\n * mirror IS the answer, with one gap: the revocation document and the listing\n * document are two non-transactional writes, and a live listener sees them\n * land at different times. In that window the mirror names a version the kill\n * switch has already stopped, which is the whole shape of this bug.\n *\n * So a client that holds the revocation checks it against the mirror and, when\n * they disagree, offers NOTHING rather than the next-best guess. It cannot\n * compute the next-best guess — it has no version list — and \"no update to\n * offer\" is the safe reading of a mirror it has caught mid-repair. The repair\n * lands moments later and the real answer appears.\n *\n * A client with no revocation in hand passes `undefined` and gets the mirror,\n * which is what it had before. That is a real fallback, not a silent one: the\n * gap it leaves is bounded by the repair, and the install route derives live\n * and refuses regardless.\n */\nexport function offeredPluginVersion(\n listing: { latestApprovedVersion?: unknown } | null | undefined,\n revocation: PluginRevocation | null | undefined,\n): string | null {\n const offered = String(listing?.latestApprovedVersion ?? '')\n if (!offered) return null\n return isPluginRevoked(revocation, offered) ? null : offered\n}\n\n/**\n * The newest version a buyer could actually install right now (AGL-2306).\n *\n * Two things have to be true of an offer, and the listing's\n * `latestApprovedVersion` mirror only ever tracked one of them: the version\n * must be APPROVED (AGL-966 — review lives on the version) and it must not be\n * REVOKED (AGL-1085 — `install-plugin` answers 409 to a revoked pin).\n *\n * Written here rather than in the console route that repairs the mirror, and\n * rather than reusing `newestApprovedVersion` in the marketplace plugin's\n * model, because the console is `scope:app` and may not depend on\n * `aglyn:addons`. Both may import core, and \"what is on offer\" is one\n * question that must have one answer.\n *\n * `compare` is injected rather than imported so this module stays free of the\n * artifact-version comparator's own dependencies; every caller already has it.\n * A `null` comparison (an unparseable version string) sorts as \"not newer\",\n * which keeps a malformed version out of an offer rather than into one.\n *\n * Returns `null` when nothing qualifies — an ABSENT mirror reads as \"no update\n * to offer\", while a stale string reads as an update that does not exist.\n */\nexport function newestInstallableVersion(\n versions: readonly { version: string; reviewState?: unknown }[],\n revocation: PluginRevocation | null | undefined,\n compare: (a: string, b: string) => number | null,\n): string | null {\n let newest: string | null = null\n for (const entry of versions) {\n if (!entry?.version) continue\n if (entry.reviewState !== 'approved') continue\n if (isPluginRevoked(revocation, entry.version)) continue\n if (newest == null || (compare(newest, entry.version) ?? 0) < 0) {\n newest = entry.version\n }\n }\n return newest\n}\n\n/**\n * The next `revocations/{listingId}` state after one write (AGL-1085).\n *\n * Two writers share this doc and neither may erase the other:\n *\n * * a **takedown** kills the listing, flattening `versions` to `'all'`, and\n * un-hiding removes what it wrote (AGL-948);\n * * a **review** decision stops one version's bytes — the reviewer's only\n * alternative used to be a full takedown, which also revokes the version\n * customers are happily running.\n *\n * `versions` stays the single field every reader consults, so `isPluginRevoked`\n * and the loaders are untouched. `reviewVersions` is the durable record of the\n * review-owned half, which is what lets un-hiding restore rather than clear it.\n * Returns `null` when nothing is revoked any more and the doc should be\n * deleted — an empty `versions: []` would read as \"revoked nothing\" but keep a\n * doc around that a later reader has to interpret.\n *\n * Pure so both transitions are testable without Firestore, and colocated with\n * `isPluginRevoked` on purpose: a writer that disagreed with the reader about\n * this doc's shape is exactly how a kill switch silently stops killing.\n */\nexport function nextRevocationState(\n current: PluginRevocation | null | undefined,\n change:\n | { type: 'revoke-version'; version: string }\n | { type: 'unrevoke-version'; version: string }\n | { type: 'takedown' }\n | { type: 'restore' },\n): PluginRevocation | null {\n const takenDown = current?.source === 'takedown'\n // A document written before AGL-1085 — or by hand, which the rules permit\n // any staff client to do — has `versions` and NO `reviewVersions`\n // (AGL-2305). `withReview` REPLACES `versions` wholesale from this seed, so\n // reading it as an empty list silently rebuilt the document: revoking a\n // second version un-revoked the first, and un-revoking any version returned\n // `null`, which the caller turns into a DELETE of the whole kill switch.\n //\n // A legacy `versions` array is adopted as the review-owned half, which is\n // what it actually was: before AGL-1085 the only writer that produced an\n // array here was a reviewer, and `'all'` (the takedown form) is excluded\n // because that half is owned by `source` and restored by `restore`.\n const reviewVersions = [\n ...(current?.reviewVersions ??\n (Array.isArray(current?.versions) ? current.versions : [])),\n ]\n const withReview = (versions: string[], stillTakenDown: boolean) => {\n if (stillTakenDown) {\n return { ...current, versions: 'all' as const, reviewVersions: versions }\n }\n if (!versions.length) return null\n const { source: _source, ...rest } = current ?? {}\n return { ...rest, versions, reviewVersions: versions }\n }\n switch (change.type) {\n case 'revoke-version': {\n const next = reviewVersions.includes(change.version)\n ? reviewVersions\n : [...reviewVersions, change.version]\n return withReview(next, takenDown)\n }\n case 'unrevoke-version': {\n return withReview(\n reviewVersions.filter((entry) => entry !== change.version),\n takenDown,\n )\n }\n case 'takedown':\n return { ...current, versions: 'all', source: 'takedown', reviewVersions }\n case 'restore':\n // Only the takedown's own contribution goes away. A version a reviewer\n // stopped stays stopped — un-hiding is not a review decision.\n return withReview(reviewVersions, false)\n }\n}\n\n/** Methods a host-mediated plugin fetch may use (AGL-191). */\nexport const PLUGIN_FETCH_METHODS = ['GET', 'POST'] as const\nexport type PluginFetchMethod = (typeof PLUGIN_FETCH_METHODS)[number]\n/** Request/response body cap for host-mediated fetch (bytes). */\nexport const PLUGIN_FETCH_MAX_BODY_BYTES = 256 * 1024\n\n/**\n * True when `url`'s origin is an exact match against the manifest's\n * declared `network` allowlist (AGL-191). The host re-checks this before\n * proxying a plugin's `fetch-request`, so a plugin can only reach origins\n * it declared at install (and the install screen surfaced). No allowlist =\n * no host-mediated network; https-only.\n */\nexport function isPluginNetworkAllowed(\n url: string,\n capabilities: PluginCapabilities | undefined,\n): boolean {\n const allow = capabilities?.network\n if (!allow?.length) return false\n try {\n const parsed = new URL(url)\n if (parsed.protocol !== 'https:') return false\n return allow.includes(parsed.origin)\n } catch {\n return false\n }\n}\n\n/** Component id of the sandboxed plugin canvas element (plugins-mui). */\nexport const PLUGIN_COMPONENT_ID = 'marketplacePlugin'\n\n/** Resolved install data injected into a plugin node's props at compose. */\nexport interface ResolvedPluginInstall {\n listingId: string\n version: string\n sha256: string\n capabilities?: PluginCapabilities\n revoked?: boolean\n}\n\n/**\n * Compose-time injection (AGL-45), mirroring `attachFunctionDefinitions`:\n * a `marketplacePlugin` node carries only a `listingId` in the saved screen;\n * the tenant compose pass resolves that to the host's pinned install\n * (version/sha256/capabilities) and the kill-switch state, and stamps them\n * onto the node's props so `PluginFrame` renders without a client read.\n * Unknown/uninstalled listings leave the node untouched (it shows a safe\n * \"not installed\" placeholder rather than taking the screen down).\n */\nexport function attachPluginInstalls<T extends Record<string, any>>(\n nodes: T,\n installsByListingId: Record<string, ResolvedPluginInstall | undefined>,\n): T {\n if (!Object.keys(installsByListingId).length) return nodes\n const next: Record<string, any> = {}\n for (const [id, node] of Object.entries(nodes)) {\n const listingId =\n node?.componentId === PLUGIN_COMPONENT_ID\n ? node?.props?.listingId\n : undefined\n const install = listingId\n ? installsByListingId[String(listingId)]\n : undefined\n next[id] = install\n ? {\n ...node,\n props: {\n ...node.props,\n version: install.version,\n sha256: install.sha256,\n capabilities: install.capabilities,\n revoked: Boolean(install.revoked),\n },\n }\n : node\n }\n return next as T\n}\n\n/** One editable setting on a placed plugin, resolved for the attributes panel. */\nexport interface PluginPropField {\n name: string\n type: NonNullable<PluginPropSchema['type']>\n label: string\n description?: string\n default?: string | number | boolean\n options?: Array<{ value: string; label?: string }>\n}\n\n/**\n * The settings an author may edit on a placed plugin (AGL-1049).\n *\n * Driven by `capabilities.props` — THE allowlist — and decorated by\n * `propSchema` where the publisher supplied one. That order is the whole\n * security property: the list of editable settings can never be longer than\n * the list of props that cross the bridge, whatever the schema says, so a\n * publisher cannot describe their way into a prop they did not declare.\n *\n * A plugin published before `propSchema` existed still gets a field per\n * declared prop, as plain text. That is the difference between guessing key\n * names in a JSON textarea and being shown them, and it needs no manifest\n * change to work — which matters, because every plugin installed today\n * predates this.\n */\nexport function resolvePluginPropFields(\n manifest: { capabilities?: PluginCapabilities } | null | undefined,\n): PluginPropField[] {\n const props = manifest?.capabilities?.props ?? []\n const schema = new Map(\n (manifest?.capabilities?.propSchema ?? []).map((entry) => [\n entry.name,\n entry,\n ]),\n )\n return props.map((name) => {\n const declared = schema.get(name)\n return {\n name,\n type: declared?.type ?? 'string',\n label: declared?.label ?? name,\n ...(declared?.description ? { description: declared.description } : {}),\n ...(declared?.default !== undefined ? { default: declared.default } : {}),\n ...(declared?.options ? { options: declared.options } : {}),\n }\n })\n}\n\n/**\n * Keys an author has set that the plugin will silently ignore.\n *\n * The failure this exists to surface: `filterPluginProps` drops anything not\n * in the allowlist, so a typo does not fail — it just quietly does nothing,\n * which is the worst of the options. Naming the key is the whole fix.\n */\nexport function unknownPluginPropKeys(\n manifest: { capabilities?: PluginCapabilities } | null | undefined,\n values: Record<string, unknown> | null | undefined,\n): string[] {\n if (!values) return []\n const allowed = new Set(manifest?.capabilities?.props ?? [])\n return Object.keys(values).filter((key) => !allowed.has(key))\n}\n\n/** A declared element, resolved for the palette. */\nexport interface PluginPaletteElement {\n listingId: string\n elementId: string\n displayName: string\n description?: string\n category: string\n /** mdi icon NAME; the surface looks it up, never renders it as markup. */\n icon?: string\n fields: PluginPropField[]\n}\n\n/**\n * The palette entries an installed plugin contributes (AGL-1031).\n *\n * Resolved from the PINNED install, which is what makes the two guarantees in\n * the issue hold without extra machinery: an element only appears where the\n * plugin is installed, and a revoked or downgraded version's elements vanish\n * with it, because the palette is rebuilt from whatever the pin now points at.\n *\n * Attributes come back through `resolvePluginPropFields`, so an element's\n * editable fields are bounded by `capabilities.props` exactly like the generic\n * plugin element's are. A declared element cannot widen what crosses the\n * bridge; it only gives the same props a better name and a better editor.\n */\nexport function resolvePluginElements(\n install:\n | {\n listingId?: string\n capabilities?: PluginCapabilities\n manifest?: { elements?: PluginElementDeclaration[] }\n elements?: PluginElementDeclaration[]\n }\n | null\n | undefined,\n): PluginPaletteElement[] {\n const listingId = install?.listingId\n if (!listingId) return []\n const declared = install?.elements ?? install?.manifest?.elements ?? []\n const capabilities = install?.capabilities\n return declared.map((element) => ({\n listingId,\n elementId: element.id,\n displayName: element.displayName,\n ...(element.description ? { description: element.description } : {}),\n category: element.category ?? 'Data Display',\n ...(element.icon ? { icon: element.icon } : {}),\n // Per-element attributes when declared; otherwise the plugin's whole\n // declared prop set, which is still better than a JSON box.\n fields: element.attributes?.length\n ? resolvePluginPropFields({\n capabilities: {\n props: element.attributes.map((attribute) => attribute.name),\n propSchema: element.attributes,\n },\n })\n : resolvePluginPropFields({ capabilities }),\n }))\n}\n"],"names":["sanitizePluginContributions","PLUGIN_ELEMENT_CATEGORIES","PLUGIN_MAX_ELEMENTS","PLUGIN_ID_PATTERN","PLUGIN_VERSION_PATTERN","PLUGIN_MAX_NETWORK_ORIGINS","PLUGIN_MAX_PROPS","PLUGIN_PROP_TEXT_MAX","MDI_ICON_NAME_PATTERN","PROP_SCHEMA_TYPES","Set","PLUGIN_MAX_EVENTS","PLUGIN_MAX_SIZE_PX","HTTPS_ORIGIN_PATTERN","IDENTIFIER_PATTERN","sanitizePropSchemaList","input","declared","Array","isArray","out","seen","raw","slice","entry","name","test","has","add","type","String","next","key","value","trim","fallback","default","options","map","option","record","label","filter","Boolean","length","push","validatePluginManifest","ok","error","id","version","startsWith","capabilitiesInput","capabilities","network","undefined","origin","list","max","propSchemaInput","propSchema","props","size","width","Number","height","isFinite","restrict","ids","hostAbiRaw","hostAbi","isInteger","elementsInput","elements","declaredProps","seenIds","rawElement","entryRecord","elementId","elementName","element","displayName","elementDescription","description","elementCategory","includes","category","elementIcon","icon","elementAttributes","attributes","contributes","verdict","contributions","manifest","Object","keys","restrictParent","restrictChildren","isPluginRevoked","revocation","isListingWideRevocation","versions","offeredPluginVersion","listing","offered","latestApprovedVersion","newestInstallableVersion","compare","newest","reviewState","nextRevocationState","current","change","takenDown","source","reviewVersions","withReview","stillTakenDown","_source","rest","PLUGIN_FETCH_METHODS","PLUGIN_FETCH_MAX_BODY_BYTES","isPluginNetworkAllowed","url","allow","parsed","URL","protocol","PLUGIN_COMPONENT_ID","attachPluginInstalls","nodes","installsByListingId","node","entries","listingId","componentId","install","sha256","revoked","resolvePluginPropFields","schema","Map","get","unknownPluginPropKeys","values","allowed","resolvePluginElements","fields","attribute"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * Which legal documents actually have a page (AGL-1660).
19
+ *
20
+ * The apps link legal documents by absolute URL, because the canonical text
21
+ * lives on the marketing site rather than in the repo. That works right up
22
+ * until a constant names a document nobody published: `PUBLISHER_AGREEMENT_URL`
23
+ * pointed at `/legal/marketplace-publisher-agreement` for two and a half weeks
24
+ * while the console asked publishers to accept it, and the URL 404ed the whole
25
+ * time. Nothing in the build could see that, and a legal audit found it.
26
+ *
27
+ * So the repo keeps its own record of what the site serves. It is a *list*, not
28
+ * a fetch: a test that hit the network would be offline-flaky and would pass
29
+ * against a stale ISR cache anyway (a cached 200 for a page since removed).
30
+ * A list is checkable in CI, and wrong in exactly one direction — it can only
31
+ * go stale by claiming a page exists, which is the mistake the reviewer of the
32
+ * edit that adds a path is looking straight at.
33
+ *
34
+ * VERIFIED 2026-08-14 against the live `/legal` index, which links these nine
35
+ * documents and no others. `/legal/marketplace-publisher-agreement` joined the
36
+ * list that day (AGL-1674), *after* the page was confirmed serving: fetched
37
+ * once, HTTP 200, and its body read out of the Flight payload rather than the
38
+ * DOM — at the time `<aglyn-text>` rendered into shadow roots and grepped
39
+ * empty (no longer so since AGL-2011). The payload
40
+ * carried exactly one text row, sha256
41
+ * 66e1f8fb3956cfed1b71712c9aaf38ed736b956de571160b7c3cf83add923d90, identical
42
+ * to the approved source, with all fourteen sections and no `DRAFT` or
43
+ * `[EFFECTIVE DATE]` anywhere in the response.
44
+ *
45
+ * That ordering is the rule, not a courtesy. `publisherAgreementIsPublished()`
46
+ * reads this list, so adding a path here is what re-opens the acceptance
47
+ * control in the console, the accept route and the publish refusal — all three
48
+ * at once. Added before the page serves, the gate becomes a lie in the other
49
+ * direction, and the acceptance it collects is the signature-on-a-blank-page
50
+ * this whole file exists to prevent. Verify first, then add.
51
+ */
52
+ /**
53
+ * The origin the canonical legal documents are served from.
54
+ *
55
+ * Configurable (AGL-2017): `isPublishedLegalUrl` gates the marketplace
56
+ * publisher agreement, and pinned to our origin it answered `true` for AGLYN's
57
+ * URLs on an operator's deployment regardless of what they had published — a
58
+ * gate blind to the deployment it is gating. Same variable the clickwrap links
59
+ * read, so the two cannot disagree about whose documents this install serves.
60
+ */
61
+ export declare const LEGAL_ORIGIN: string;
62
+ /** Paths under {@link LEGAL_ORIGIN} that have a published page. */
63
+ export declare const PUBLISHED_LEGAL_PATHS: readonly string[];
64
+ /**
65
+ * Whether `url` names a legal document that is actually published.
66
+ *
67
+ * Accepts an absolute URL or a site-relative path. Anything on another origin
68
+ * is false — a lookalike host is not our published text, and this is used to
69
+ * decide whether a user may be asked to agree to something.
70
+ */
71
+ export declare function isPublishedLegalUrl(url: string | null | undefined): boolean;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /**
17
+ * Which legal documents actually have a page (AGL-1660).
18
+ *
19
+ * The apps link legal documents by absolute URL, because the canonical text
20
+ * lives on the marketing site rather than in the repo. That works right up
21
+ * until a constant names a document nobody published: `PUBLISHER_AGREEMENT_URL`
22
+ * pointed at `/legal/marketplace-publisher-agreement` for two and a half weeks
23
+ * while the console asked publishers to accept it, and the URL 404ed the whole
24
+ * time. Nothing in the build could see that, and a legal audit found it.
25
+ *
26
+ * So the repo keeps its own record of what the site serves. It is a *list*, not
27
+ * a fetch: a test that hit the network would be offline-flaky and would pass
28
+ * against a stale ISR cache anyway (a cached 200 for a page since removed).
29
+ * A list is checkable in CI, and wrong in exactly one direction — it can only
30
+ * go stale by claiming a page exists, which is the mistake the reviewer of the
31
+ * edit that adds a path is looking straight at.
32
+ *
33
+ * VERIFIED 2026-08-14 against the live `/legal` index, which links these nine
34
+ * documents and no others. `/legal/marketplace-publisher-agreement` joined the
35
+ * list that day (AGL-1674), *after* the page was confirmed serving: fetched
36
+ * once, HTTP 200, and its body read out of the Flight payload rather than the
37
+ * DOM — at the time `<aglyn-text>` rendered into shadow roots and grepped
38
+ * empty (no longer so since AGL-2011). The payload
39
+ * carried exactly one text row, sha256
40
+ * 66e1f8fb3956cfed1b71712c9aaf38ed736b956de571160b7c3cf83add923d90, identical
41
+ * to the approved source, with all fourteen sections and no `DRAFT` or
42
+ * `[EFFECTIVE DATE]` anywhere in the response.
43
+ *
44
+ * That ordering is the rule, not a courtesy. `publisherAgreementIsPublished()`
45
+ * reads this list, so adding a path here is what re-opens the acceptance
46
+ * control in the console, the accept route and the publish refusal — all three
47
+ * at once. Added before the page serves, the gate becomes a lie in the other
48
+ * direction, and the acceptance it collects is the signature-on-a-blank-page
49
+ * this whole file exists to prevent. Verify first, then add.
50
+ */ /**
51
+ * The origin the canonical legal documents are served from.
52
+ *
53
+ * Configurable (AGL-2017): `isPublishedLegalUrl` gates the marketplace
54
+ * publisher agreement, and pinned to our origin it answered `true` for AGLYN's
55
+ * URLs on an operator's deployment regardless of what they had published — a
56
+ * gate blind to the deployment it is gating. Same variable the clickwrap links
57
+ * read, so the two cannot disagree about whose documents this install serves.
58
+ */ export const LEGAL_ORIGIN = (process.env.NEXT_PUBLIC_OPERATOR_LEGAL_ORIGIN || 'https://aglyn.com').replace(/\/+$/, '');
59
+ /** Paths under {@link LEGAL_ORIGIN} that have a published page. */ export const PUBLISHED_LEGAL_PATHS = [
60
+ '/legal',
61
+ '/legal/acceptable-use',
62
+ '/legal/cookies',
63
+ '/legal/dmca',
64
+ '/legal/dpa',
65
+ '/legal/eula',
66
+ '/legal/marketplace-publisher-agreement',
67
+ '/legal/privacy',
68
+ '/legal/subprocessors',
69
+ '/legal/terms'
70
+ ];
71
+ /**
72
+ * Whether `url` names a legal document that is actually published.
73
+ *
74
+ * Accepts an absolute URL or a site-relative path. Anything on another origin
75
+ * is false — a lookalike host is not our published text, and this is used to
76
+ * decide whether a user may be asked to agree to something.
77
+ */ export function isPublishedLegalUrl(url) {
78
+ if (typeof url !== 'string' || !url.trim()) return false;
79
+ let parsed;
80
+ try {
81
+ parsed = new URL(url, LEGAL_ORIGIN);
82
+ } catch (unused) {
83
+ return false;
84
+ }
85
+ if (parsed.origin !== LEGAL_ORIGIN) return false;
86
+ const path = parsed.pathname.replace(/\/+$/, '') || '/';
87
+ return PUBLISHED_LEGAL_PATHS.includes(path);
88
+ }
89
+
90
+ //# sourceMappingURL=published-legal-pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/published-legal-pages.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Which legal documents actually have a page (AGL-1660).\n *\n * The apps link legal documents by absolute URL, because the canonical text\n * lives on the marketing site rather than in the repo. That works right up\n * until a constant names a document nobody published: `PUBLISHER_AGREEMENT_URL`\n * pointed at `/legal/marketplace-publisher-agreement` for two and a half weeks\n * while the console asked publishers to accept it, and the URL 404ed the whole\n * time. Nothing in the build could see that, and a legal audit found it.\n *\n * So the repo keeps its own record of what the site serves. It is a *list*, not\n * a fetch: a test that hit the network would be offline-flaky and would pass\n * against a stale ISR cache anyway (a cached 200 for a page since removed).\n * A list is checkable in CI, and wrong in exactly one direction — it can only\n * go stale by claiming a page exists, which is the mistake the reviewer of the\n * edit that adds a path is looking straight at.\n *\n * VERIFIED 2026-08-14 against the live `/legal` index, which links these nine\n * documents and no others. `/legal/marketplace-publisher-agreement` joined the\n * list that day (AGL-1674), *after* the page was confirmed serving: fetched\n * once, HTTP 200, and its body read out of the Flight payload rather than the\n * DOM — at the time `<aglyn-text>` rendered into shadow roots and grepped\n * empty (no longer so since AGL-2011). The payload\n * carried exactly one text row, sha256\n * 66e1f8fb3956cfed1b71712c9aaf38ed736b956de571160b7c3cf83add923d90, identical\n * to the approved source, with all fourteen sections and no `DRAFT` or\n * `[EFFECTIVE DATE]` anywhere in the response.\n *\n * That ordering is the rule, not a courtesy. `publisherAgreementIsPublished()`\n * reads this list, so adding a path here is what re-opens the acceptance\n * control in the console, the accept route and the publish refusal — all three\n * at once. Added before the page serves, the gate becomes a lie in the other\n * direction, and the acceptance it collects is the signature-on-a-blank-page\n * this whole file exists to prevent. Verify first, then add.\n */\n\n/**\n * The origin the canonical legal documents are served from.\n *\n * Configurable (AGL-2017): `isPublishedLegalUrl` gates the marketplace\n * publisher agreement, and pinned to our origin it answered `true` for AGLYN's\n * URLs on an operator's deployment regardless of what they had published — a\n * gate blind to the deployment it is gating. Same variable the clickwrap links\n * read, so the two cannot disagree about whose documents this install serves.\n */\nexport const LEGAL_ORIGIN = (\n process.env.NEXT_PUBLIC_OPERATOR_LEGAL_ORIGIN || 'https://aglyn.com'\n).replace(/\\/+$/, '')\n\n/** Paths under {@link LEGAL_ORIGIN} that have a published page. */\nexport const PUBLISHED_LEGAL_PATHS: readonly string[] = [\n '/legal',\n '/legal/acceptable-use',\n '/legal/cookies',\n '/legal/dmca',\n '/legal/dpa',\n '/legal/eula',\n '/legal/marketplace-publisher-agreement',\n '/legal/privacy',\n '/legal/subprocessors',\n '/legal/terms',\n]\n\n/**\n * Whether `url` names a legal document that is actually published.\n *\n * Accepts an absolute URL or a site-relative path. Anything on another origin\n * is false — a lookalike host is not our published text, and this is used to\n * decide whether a user may be asked to agree to something.\n */\nexport function isPublishedLegalUrl(url: string | null | undefined): boolean {\n if (typeof url !== 'string' || !url.trim()) return false\n let parsed: URL\n try {\n parsed = new URL(url, LEGAL_ORIGIN)\n } catch {\n return false\n }\n if (parsed.origin !== LEGAL_ORIGIN) return false\n const path = parsed.pathname.replace(/\\/+$/, '') || '/'\n return PUBLISHED_LEGAL_PATHS.includes(path)\n}\n"],"names":["LEGAL_ORIGIN","process","env","NEXT_PUBLIC_OPERATOR_LEGAL_ORIGIN","replace","PUBLISHED_LEGAL_PATHS","isPublishedLegalUrl","url","trim","parsed","URL","origin","path","pathname","includes"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCC,GAED;;;;;;;;CAQC,GACD,OAAO,MAAMA,eAAe,AAC1BC,CAAAA,QAAQC,GAAG,CAACC,iCAAiC,IAAI,mBAAkB,EACnEC,OAAO,CAAC,QAAQ,IAAG;AAErB,iEAAiE,GACjE,OAAO,MAAMC,wBAA2C;IACtD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAA;AAED;;;;;;CAMC,GACD,OAAO,SAASC,oBAAoBC,GAA8B;IAChE,IAAI,OAAOA,QAAQ,YAAY,CAACA,IAAIC,IAAI,IAAI,OAAO;IACnD,IAAIC;IACJ,IAAI;QACFA,SAAS,IAAIC,IAAIH,KAAKP;IACxB,EAAE,eAAM;QACN,OAAO;IACT;IACA,IAAIS,OAAOE,MAAM,KAAKX,cAAc,OAAO;IAC3C,MAAMY,OAAOH,OAAOI,QAAQ,CAACT,OAAO,CAAC,QAAQ,OAAO;IACpD,OAAOC,sBAAsBS,QAAQ,CAACF;AACxC"}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * The version of the agreement currently in force.
19
+ *
20
+ * Matches the `Agreement version` header of the document itself, which is now
21
+ * besigner content at {@link PUBLISHER_AGREEMENT_URL} rather than a repo file
22
+ * (same practice as the Terms of Service). Bump this **only** when the
23
+ * substance changes in a way a publisher should re-read — a typo fix is not a
24
+ * bump. Bumping it stops every publisher at their next publish until they
25
+ * accept again.
26
+ *
27
+ * Moved off `2026-07-28.1` on 2026-08-14 (AGL-1674). That string named the
28
+ * July draft, which was never published and whose §8 said the publisher is the
29
+ * seller of record. The published text says the opposite — Aglyn processes the
30
+ * sale and remits transaction tax — so it is a different document in
31
+ * substance, not a reissue, and re-asking is the point rather than a cost.
32
+ *
33
+ * Moved to `2026-08-18.1` on 2026-08-18 (AGL-1840 + AGL-1661). Two body-text
34
+ * changes: §1 now says "the Aglyn marketplace" (the AGL-975 rename, and the
35
+ * reason this snapshot must NOT need the AGL-975 naming-guard exemption that
36
+ * the `2026-08-14.1` one still carries), and §1's cross-reference to
37
+ * the "End User Licence Agreement"
38
+ * becomes "License" to match the document that agreement actually is, which
39
+ * was renamed on the same day.
40
+ *
41
+ * ⚠️ Read against the "a typo fix is not a bump" rule above, both edits are
42
+ * closer to a typo than to substance, and the tension is real. The bump was
43
+ * taken anyway on the decision (2026-08-18), for a reason the rule does not
44
+ * cover: the served page changed, so keeping `2026-08-14.1` would leave the
45
+ * pin below asserting a hash for text nobody is shown any more — a FALSE
46
+ * RECORD, which is the exact failure the pin exists to detect. The choice is
47
+ * therefore between a bump and a broken pin, not between a bump and nothing.
48
+ *
49
+ * ## 2026-08-22 — the page changed and this string DELIBERATELY did not
50
+ *
51
+ * Three clauses were added on 2026-08-22 (§3(h) listing conduct, §8.6 sales
52
+ * through the Marketplace, §13.6 marks) and the pin below moved with them, but
53
+ * `2026-08-18.1` stayed. That is not the third option the paragraph above says
54
+ * does not exist — it is the same choice with one input changed. A bump exists
55
+ * to re-ask publishers who accepted the OLD text; production holds exactly one
56
+ * acceptance record and it is the own, so there is nobody to re-ask and the
57
+ * bump would buy nothing. the decision, 2026-08-22.
58
+ *
59
+ * The pin still had to move, for precisely the reason given above: the served
60
+ * bytes changed, so leaving the old hash here would assert a document nobody
61
+ * is shown. Version unchanged + pin re-captured is coherent ONLY while the
62
+ * acceptance set is empty. The first real publisher acceptance ends that, and
63
+ * from then on any body-text change costs a bump — see the same rule in
64
+ * `apps/console/constants/legal-documents.ts`, where the clickwrap snapshots
65
+ * collapsed back to `v1` on the identical argument.
66
+ *
67
+ * ## 2026-08-24 — `2026-08-24.1`, and why this one CANNOT be folded (AGL-1956)
68
+ *
69
+ * §13.3 changed twice in one sentence. The venue moved from Williamson County
70
+ * to TRAVIS County (decided) — Williamson entered from the former
71
+ * Jarrell residential address, while every published Aglyn address is 5900
72
+ * Balcones Dr STE 100, Austin, TX 78731, which is Travis. And the clause cited
73
+ * "Terms of Service Section 19" for governing law and venue when those live at
74
+ * §18.6; §19 is General. A wrong cross-reference in a forum-selection clause is
75
+ * the kind of defect that gets argued about, so it was corrected in the same
76
+ * pass.
77
+ *
78
+ * Unlike 2026-08-22, this one takes the bump rather than only re-pinning, and
79
+ * the deciding reason is mechanical rather than editorial: THIS VERSION STRING
80
+ * IS PUBLISHED IN THE DOCUMENT. The page at {@link PUBLISHER_AGREEMENT_URL}
81
+ * serves `Agreement version: 2026-08-24.1` in its own second line, so the
82
+ * capture below contains it, and `publisher-agreement-version.spec.ts` asserts
83
+ * the snapshot contains `Agreement version: ${PUBLISHER_AGREEMENT_VERSION}`.
84
+ * Holding the constant at `2026-08-18.1` against that text would need the page
85
+ * republished to say so, and would otherwise record a publisher as having
86
+ * accepted `2026-08-18.1` while naming bytes that call themselves
87
+ * `2026-08-24.1`. That is a false record of exactly the shape the pin exists
88
+ * to prevent.
89
+ *
90
+ * ⚠️ THIS IS THE ONE PLACE THE CLICKWRAP ARGUMENT DOES NOT REACH. The signup
91
+ * clickwrap folded its 2026-08-24 corrections into `v1` and did not bump
92
+ * (`apps/console/constants/legal-documents.ts`) — decided: no v2
93
+ * before launch. That works there because `v1` is a REPO-SIDE label: the
94
+ * published Terms carry a "Last updated" date and no version string at all, so
95
+ * the label can stay still while the text moves. Here the label is part of the
96
+ * document a publisher reads. The two schemes are not the same kind of thing
97
+ * and must not be reasoned about as one — that difference is the whole content
98
+ * of this paragraph.
99
+ *
100
+ * On the merits it would have been a bump anyway: a forum-selection clause is
101
+ * substance, not a typo — it names the court a publisher would have to travel
102
+ * to. The 2026-08-22 cost argument is unchanged and still cheap, production
103
+ * holding exactly one acceptance record which is the own.
104
+ *
105
+ * §8.1 and §8.3 are UNTOUCHED and were already correct: they have said Aglyn is
106
+ * merchant of record and determines, collects and remits transaction tax since
107
+ * 2026-08-14. The Terms of Service moved TO them in this pass (new ToS §10.7),
108
+ * not the other way around.
109
+ */
110
+ export declare const PUBLISHER_AGREEMENT_VERSION = "2026-08-24.1";
111
+ export declare const PUBLISHER_AGREEMENT_TITLE = "Marketplace Publisher Agreement";
112
+ /**
113
+ * The snapshot pin for the version above (AGL-1678).
114
+ *
115
+ * A version string is a label we control and can reuse, so on its own it
116
+ * proves nothing about what a publisher actually read. These two values pin
117
+ * the archived snapshot at
118
+ * `legal/publisher-agreement/{PUBLISHER_AGREEMENT_VERSION}/marketplace-publisher-agreement.txt`
119
+ * (beside this module), captured FROM THE LIVE PAGE after publication — the
120
+ * same publication-first machinery as the signup clickwrap
121
+ * (`apps/console/constants/legal-documents.ts`, AGL-1497), and deliberately a
122
+ * PARALLEL manifest rather than an entry in `LEGAL_DOCUMENTS`: ToS §19.1 makes
123
+ * that set the entire signup agreement, and the publisher agreement is
124
+ * deliberately not part of it. Mixing them would widen what a signup
125
+ * acceptance covers.
126
+ *
127
+ * Both values go onto every acceptance record, so a record is self-contained
128
+ * evidence of content and later tampering with the archive is detectable
129
+ * rather than invisible. `publisher-agreement-version.spec.ts` re-hashes the
130
+ * snapshot, so one version string can never come to mean two different
131
+ * documents.
132
+ *
133
+ * Capture method (proven byte-for-byte against the clickwrap v4 hashes before
134
+ * this snapshot was taken): fetch the live page, walk its HTML text nodes
135
+ * skipping script/style, trim each, drop empties, take the document's content
136
+ * block (first line `Last updated: …` through its closing `© …` line,
137
+ * excluding site chrome and the table of contents), join with `\n`, and end
138
+ * with a trailing newline. UTF-8 throughout.
139
+ *
140
+ * TO PUBLISH A CHANGE: publish the besigner edit first, confirm the live page
141
+ * serves it, capture a new snapshot under the new version's directory, then
142
+ * bump `PUBLISHER_AGREEMENT_VERSION` and these two values together. Never
143
+ * hand-write a snapshot: it is evidence of what a publisher was shown, and a
144
+ * snapshot of unpublished text is a false record.
145
+ */
146
+ export declare const PUBLISHER_AGREEMENT_SHA256 = "2df6e940f037b4630e53c8f63bad8604ef4bf370374b89afcd4ea7f9fe8e8d63";
147
+ /** Byte length of the same snapshot — a cheap second check on the content. */
148
+ export declare const PUBLISHER_AGREEMENT_BYTES = 13730;
149
+ /**
150
+ * Canonical document, on the operator's legal origin beside the other terms.
151
+ *
152
+ * Built from `LEGAL_ORIGIN` (AGL-2196), which this module already depends on:
153
+ * `publisherAgreementIsPublished` below calls `isPublishedLegalUrl`, and that
154
+ * accepts ONLY `LEGAL_ORIGIN`. So the gate was operator-aware while the link
155
+ * it gates was a bare `aglyn.com` literal — meaning on a self-host install
156
+ * with `NEXT_PUBLIC_OPERATOR_LEGAL_ORIGIN` set, the gate rejected the very URL
157
+ * this file handed it, and every publisher was blocked from accepting. One
158
+ * origin for both closes that, and leaves Aglyn's own URL byte-identical.
159
+ */
160
+ export declare const PUBLISHER_AGREEMENT_URL: string;
161
+ /**
162
+ * Whether that document can actually be read (AGL-1660).
163
+ *
164
+ * It could not, from the day this gate shipped until the day this check did:
165
+ * the URL above 404ed, and the console still rendered it as "Read the full
166
+ * Marketplace Publisher Agreement" above an Accept button. An acceptance
167
+ * collected that way is a signature on a blank page — the same
168
+ * publication-first principle the clickwrap snapshots are built on, failing in
169
+ * the one place the text was never published at all.
170
+ *
171
+ * Derived, not a second flag: it reads `PUBLISHED_LEGAL_PATHS`, so the ONE
172
+ * edit that adds the path when the page goes live is what re-opens acceptance
173
+ * everywhere. There is no boolean to forget to flip, and no way for the link
174
+ * and the gate to disagree.
175
+ */
176
+ export declare function publisherAgreementIsPublished(url?: string): boolean;
177
+ /**
178
+ * What a publisher is told while the document has no page.
179
+ *
180
+ * Deliberately not "try again later" — it names the reason, because the fix is
181
+ * ours and the publisher can do nothing about it. It must never read as though
182
+ * accepting is something they merely have not got round to.
183
+ */
184
+ export declare const PUBLISHER_AGREEMENT_UNAVAILABLE_NOTICE: string;
185
+ /**
186
+ * What the agreement actually commits a publisher to.
187
+ *
188
+ * Shown above the accept control. A link alone is the pattern that produces
189
+ * agreements nobody has read; these are the terms most likely to surprise
190
+ * someone later, in the words they would need at that moment. They summarise
191
+ * the document — they are not it, and the copy says so.
192
+ */
193
+ export declare const PUBLISHER_AGREEMENT_POINTS: readonly {
194
+ id: string;
195
+ label: string;
196
+ detail: string;
197
+ }[];
198
+ /**
199
+ * A recorded acceptance: which version, of which exact bytes, by whom, when.
200
+ *
201
+ * `sha256`/`bytes` (AGL-1678) pin the acceptance to the archived snapshot of
202
+ * the text the publisher was shown. Optional because records written before
203
+ * the pin existed carry only the version string — absence means "accepted
204
+ * before 2026-08-17", not "accepted nothing".
205
+ */
206
+ export interface PublisherAgreementAcceptance {
207
+ version?: string;
208
+ sha256?: string;
209
+ bytes?: number;
210
+ acceptedBy?: string;
211
+ acceptedAt?: unknown;
212
+ }
213
+ /**
214
+ * Where an org stands with the agreement.
215
+ *
216
+ * `none` and `outdated` are deliberately different answers. "You have never
217
+ * agreed to anything" and "the terms changed since you agreed" are different
218
+ * situations with different copy, and collapsing them into a boolean is how
219
+ * a re-acceptance ends up reading like a first-time setup step.
220
+ */
221
+ export type PublisherAgreementState = 'none' | 'outdated' | 'current';
222
+ export declare function publisherAgreementState(acceptance: PublisherAgreementAcceptance | null | undefined, currentVersion?: string): PublisherAgreementState;
223
+ /**
224
+ * Whether a publish may proceed.
225
+ *
226
+ * An older acceptance is NOT carried forward. Whoever publishes next reads
227
+ * the changed agreement and accepts it, or does not publish — silently
228
+ * inheriting an acceptance across a rewrite is precisely what makes the
229
+ * record worthless.
230
+ */
231
+ export declare function hasCurrentPublisherAgreement(acceptance: PublisherAgreementAcceptance | null | undefined, currentVersion?: string): boolean;
232
+ /**
233
+ * What the acceptance UI may show (AGL-1660).
234
+ *
235
+ * The gate lives HERE rather than in the panel, for the reason every "check it
236
+ * in the component" control eventually fails: the component is not the only
237
+ * caller. The accept route consults the same function, so a client that skips
238
+ * the UI entirely meets the same answer.
239
+ *
240
+ * `documentUrl` is null, not the URL, when the document is unpublished — the
241
+ * console reads the link target from this, so an unreadable document is
242
+ * structurally unable to reach an href.
243
+ */
244
+ export interface PublisherAgreementPresentation {
245
+ /** The document to link, or null when there is no page to link to. */
246
+ documentUrl: string | null;
247
+ /** Whether the accept control may be offered at all. */
248
+ canAccept: boolean;
249
+ /** Why acceptance is unavailable, or null when it is available. */
250
+ unavailableNotice: string | null;
251
+ }
252
+ export declare function publisherAgreementPresentation(state: PublisherAgreementState, published?: boolean): PublisherAgreementPresentation;
253
+ /** The refusal a publisher sees, saying which of the two problems it is. */
254
+ export declare function publisherAgreementRefusal(state: PublisherAgreementState, published?: boolean): string;