unspaghettit 0.2.0 → 0.3.0

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 (270) hide show
  1. package/build/client/_app/immutable/assets/0.DSctqr5I.css +1 -0
  2. package/build/client/_app/immutable/assets/0.DSctqr5I.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.DSctqr5I.css.gz +0 -0
  4. package/build/client/_app/immutable/assets/BehaviorGraph.Bk0xQRZk.css +1 -0
  5. package/build/client/_app/immutable/assets/BehaviorGraph.Bk0xQRZk.css.br +0 -0
  6. package/build/client/_app/immutable/assets/BehaviorGraph.Bk0xQRZk.css.gz +0 -0
  7. package/build/client/_app/immutable/chunks/9nXQ5qrY2.js +1 -0
  8. package/build/client/_app/immutable/chunks/9nXQ5qrY2.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/9nXQ5qrY2.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/B439_FLv.js +1 -0
  11. package/build/client/_app/immutable/chunks/B439_FLv.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/B439_FLv.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/BCEY79Dw.js +1 -0
  14. package/build/client/_app/immutable/chunks/BCEY79Dw.js.br +2 -0
  15. package/build/client/_app/immutable/chunks/BCEY79Dw.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/{DBJWcC6Y.js → BYIrIC5L.js} +1 -1
  17. package/build/client/_app/immutable/chunks/BYIrIC5L.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/BYIrIC5L.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/B_9TWPrx2.js +1 -0
  20. package/build/client/_app/immutable/chunks/B_9TWPrx2.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/B_9TWPrx2.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/BvOhVtZg.js +1 -0
  23. package/build/client/_app/immutable/chunks/BvOhVtZg.js.br +1 -0
  24. package/build/client/_app/immutable/chunks/BvOhVtZg.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/CY3em1ma2.js +1 -0
  26. package/build/client/_app/immutable/chunks/CY3em1ma2.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/CY3em1ma2.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/CgdRZPgI.js +1 -0
  29. package/build/client/_app/immutable/chunks/CgdRZPgI.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/CgdRZPgI.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/D5speDV82.js +908 -0
  32. package/build/client/_app/immutable/chunks/D5speDV82.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/D5speDV82.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/DkxwAIfJ2.js +1 -0
  35. package/build/client/_app/immutable/chunks/DkxwAIfJ2.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/DkxwAIfJ2.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/{DatGSObE.js → OJscNS3T.js} +1 -1
  38. package/build/client/_app/immutable/chunks/OJscNS3T.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/OJscNS3T.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/U9p9CtKG2.js +2 -0
  41. package/build/client/_app/immutable/chunks/U9p9CtKG2.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/U9p9CtKG2.js.gz +0 -0
  43. package/build/client/_app/immutable/entry/app.Cd4S3giu.js +2 -0
  44. package/build/client/_app/immutable/entry/app.Cd4S3giu.js.br +0 -0
  45. package/build/client/_app/immutable/entry/app.Cd4S3giu.js.gz +0 -0
  46. package/build/client/_app/immutable/entry/start.C3xXQVkq.js +1 -0
  47. package/build/client/_app/immutable/entry/start.C3xXQVkq.js.br +0 -0
  48. package/build/client/_app/immutable/entry/start.C3xXQVkq.js.gz +0 -0
  49. package/build/client/_app/immutable/nodes/0.dIOlQ-0y.js +4 -0
  50. package/build/client/_app/immutable/nodes/0.dIOlQ-0y.js.br +0 -0
  51. package/build/client/_app/immutable/nodes/0.dIOlQ-0y.js.gz +0 -0
  52. package/build/client/_app/immutable/nodes/{1.KYdA6ppX.js → 1.Dyte3Ggf.js} +1 -1
  53. package/build/client/_app/immutable/nodes/1.Dyte3Ggf.js.br +2 -0
  54. package/build/client/_app/immutable/nodes/1.Dyte3Ggf.js.gz +0 -0
  55. package/build/client/_app/immutable/nodes/10.ivxAosDg.js +2 -0
  56. package/build/client/_app/immutable/nodes/10.ivxAosDg.js.br +0 -0
  57. package/build/client/_app/immutable/nodes/10.ivxAosDg.js.gz +0 -0
  58. package/build/client/_app/immutable/nodes/{9.CMW6a2Lg.js → 11.wvMfJKC2.js} +1 -1
  59. package/build/client/_app/immutable/nodes/11.wvMfJKC2.js.br +0 -0
  60. package/build/client/_app/immutable/nodes/11.wvMfJKC2.js.gz +0 -0
  61. package/build/client/_app/immutable/nodes/{2.DBz20KgG.js → 2.CmPPom9Z.js} +1 -1
  62. package/build/client/_app/immutable/nodes/2.CmPPom9Z.js.br +0 -0
  63. package/build/client/_app/immutable/nodes/2.CmPPom9Z.js.gz +0 -0
  64. package/build/client/_app/immutable/nodes/3.D-iCGCEx.js +1 -0
  65. package/build/client/_app/immutable/nodes/3.D-iCGCEx.js.br +0 -0
  66. package/build/client/_app/immutable/nodes/3.D-iCGCEx.js.gz +0 -0
  67. package/build/client/_app/immutable/nodes/{4.BvMzqBJj.js → 4.DbfAvO8Z.js} +1 -1
  68. package/build/client/_app/immutable/nodes/4.DbfAvO8Z.js.br +0 -0
  69. package/build/client/_app/immutable/nodes/4.DbfAvO8Z.js.gz +0 -0
  70. package/build/client/_app/immutable/nodes/5.CC5Q7lVw.js +42 -0
  71. package/build/client/_app/immutable/nodes/5.CC5Q7lVw.js.br +0 -0
  72. package/build/client/_app/immutable/nodes/5.CC5Q7lVw.js.gz +0 -0
  73. package/build/client/_app/immutable/nodes/6.CHIjlzpO.js +1 -0
  74. package/build/client/_app/immutable/nodes/6.CHIjlzpO.js.br +0 -0
  75. package/build/client/_app/immutable/nodes/6.CHIjlzpO.js.gz +0 -0
  76. package/build/client/_app/immutable/nodes/{6.BOHISqs-.js → 7.Ejs18ZUc.js} +1 -1
  77. package/build/client/_app/immutable/nodes/7.Ejs18ZUc.js.br +0 -0
  78. package/build/client/_app/immutable/nodes/7.Ejs18ZUc.js.gz +0 -0
  79. package/build/client/_app/immutable/nodes/{7.CemgNJfw.js → 8.B-HweAc8.js} +1 -1
  80. package/build/client/_app/immutable/nodes/8.B-HweAc8.js.br +0 -0
  81. package/build/client/_app/immutable/nodes/8.B-HweAc8.js.gz +0 -0
  82. package/build/client/_app/immutable/nodes/9.CKPeM6tx.js +5 -0
  83. package/build/client/_app/immutable/nodes/9.CKPeM6tx.js.br +0 -0
  84. package/build/client/_app/immutable/nodes/9.CKPeM6tx.js.gz +0 -0
  85. package/build/client/_app/version.json +1 -1
  86. package/build/client/_app/version.json.br +0 -0
  87. package/build/client/_app/version.json.gz +0 -0
  88. package/build/client/lyriks_logo.svg +148 -0
  89. package/build/client/lyriks_logo.svg.br +0 -0
  90. package/build/client/lyriks_logo.svg.gz +0 -0
  91. package/build/server/chunks/{0-C_o0oz-N.js → 0-Co8kcANG.js} +4 -4
  92. package/build/server/chunks/{0-C_o0oz-N.js.map → 0-Co8kcANG.js.map} +1 -1
  93. package/build/server/chunks/1-BSUItTig.js +9 -0
  94. package/build/server/chunks/{1-DPpKAKXV.js.map → 1-BSUItTig.js.map} +1 -1
  95. package/build/server/chunks/10-BygvxrZp.js +9 -0
  96. package/build/server/chunks/10-BygvxrZp.js.map +1 -0
  97. package/build/server/chunks/11-DRx0tRx2.js +9 -0
  98. package/build/server/chunks/11-DRx0tRx2.js.map +1 -0
  99. package/build/server/chunks/{2-AlfFqtL1.js → 2-BQT3m1vc.js} +3 -3
  100. package/build/server/chunks/{2-AlfFqtL1.js.map → 2-BQT3m1vc.js.map} +1 -1
  101. package/build/server/chunks/{3-vbjUt_51.js → 3-DPZ9BquJ.js} +3 -3
  102. package/build/server/chunks/{3-vbjUt_51.js.map → 3-DPZ9BquJ.js.map} +1 -1
  103. package/build/server/chunks/{4-BNow4x6D.js → 4-DHo47YX6.js} +3 -3
  104. package/build/server/chunks/{4-BNow4x6D.js.map → 4-DHo47YX6.js.map} +1 -1
  105. package/build/server/chunks/5-Cp9evBAG.js +9 -0
  106. package/build/server/chunks/5-Cp9evBAG.js.map +1 -0
  107. package/build/server/chunks/6-DiBq3bOV.js +9 -0
  108. package/build/server/chunks/6-DiBq3bOV.js.map +1 -0
  109. package/build/server/chunks/{6-QQ7r8Rd5.js → 7-C4hmS0dG.js} +3 -3
  110. package/build/server/chunks/{6-QQ7r8Rd5.js.map → 7-C4hmS0dG.js.map} +1 -1
  111. package/build/server/chunks/{7-CbPLGaIG.js → 8-CFFuDzBC.js} +4 -4
  112. package/build/server/chunks/{7-CbPLGaIG.js.map → 8-CFFuDzBC.js.map} +1 -1
  113. package/build/server/chunks/9-nhhKZJrs.js +9 -0
  114. package/build/server/chunks/9-nhhKZJrs.js.map +1 -0
  115. package/build/server/chunks/BehaviorGraph-m5kYj5HH.js +757 -0
  116. package/build/server/chunks/BehaviorGraph-m5kYj5HH.js.map +1 -0
  117. package/build/server/chunks/{FeatureCard-BQOY6gJQ.js → FeatureCard-CfbXNYe8.js} +2 -2
  118. package/build/server/chunks/{FeatureCard-BQOY6gJQ.js.map → FeatureCard-CfbXNYe8.js.map} +1 -1
  119. package/build/server/chunks/{ProgressBar-CfhccQ83.js → ProgressBar-DDoQJ_C9.js} +2 -2
  120. package/build/server/chunks/ProgressBar-DDoQJ_C9.js.map +1 -0
  121. package/build/server/chunks/{ProjectsIndex-CoDrvRya.js → ProjectsIndex-DUVJ3hyL.js} +2 -2
  122. package/build/server/chunks/{ProjectsIndex-CoDrvRya.js.map → ProjectsIndex-DUVJ3hyL.js.map} +1 -1
  123. package/build/server/chunks/TransitionCatalog-B8zHs-2E.js +271 -0
  124. package/build/server/chunks/TransitionCatalog-B8zHs-2E.js.map +1 -0
  125. package/build/server/chunks/{_layout.svelte-BREws55o.js → _layout.svelte-CLTmk0xU.js} +66 -15
  126. package/build/server/chunks/_layout.svelte-CLTmk0xU.js.map +1 -0
  127. package/build/server/chunks/{_page.svelte-De508ek8.js → _page.svelte-B1nG3PKn.js} +4 -4
  128. package/build/server/chunks/{_page.svelte-De508ek8.js.map → _page.svelte-B1nG3PKn.js.map} +1 -1
  129. package/build/server/chunks/{_page.svelte-Zf9H4KOP.js → _page.svelte-BW_nbAAH.js} +11 -315
  130. package/build/server/chunks/_page.svelte-BW_nbAAH.js.map +1 -0
  131. package/build/server/chunks/{_page.svelte-BqSC-1vK.js → _page.svelte-Caq7J0jU.js} +91 -47
  132. package/build/server/chunks/_page.svelte-Caq7J0jU.js.map +1 -0
  133. package/build/server/chunks/{_page.svelte-B7hT3P8E.js → _page.svelte-Cham-dsM.js} +4 -4
  134. package/build/server/chunks/{_page.svelte-B7hT3P8E.js.map → _page.svelte-Cham-dsM.js.map} +1 -1
  135. package/build/server/chunks/_page.svelte-Dhwjwph_.js +41 -0
  136. package/build/server/chunks/_page.svelte-Dhwjwph_.js.map +1 -0
  137. package/build/server/chunks/{_page.svelte-BKKCa9H5.js → _page.svelte-DlFVT40-.js} +3 -3
  138. package/build/server/chunks/{_page.svelte-BKKCa9H5.js.map → _page.svelte-DlFVT40-.js.map} +1 -1
  139. package/build/server/chunks/{_page.svelte-BtI2zZ_Z.js → _page.svelte-NVT2dzpG.js} +176 -327
  140. package/build/server/chunks/_page.svelte-NVT2dzpG.js.map +1 -0
  141. package/build/server/chunks/{_page.svelte-BKTveFAj.js → _page.svelte-Oj-W7G5s.js} +5 -5
  142. package/build/server/chunks/{_page.svelte-BKTveFAj.js.map → _page.svelte-Oj-W7G5s.js.map} +1 -1
  143. package/build/server/chunks/_page.svelte-Z_kK2lHY.js +68 -0
  144. package/build/server/chunks/_page.svelte-Z_kK2lHY.js.map +1 -0
  145. package/build/server/chunks/{builderModeStore.svelte-ihupr-3p.js → builderModeStore.svelte-BpRIU_zP.js} +217 -6
  146. package/build/server/chunks/builderModeStore.svelte-BpRIU_zP.js.map +1 -0
  147. package/build/server/chunks/client-DeX3TC3s.js +51 -0
  148. package/build/server/chunks/{client-DfpLcAZ9.js.map → client-DeX3TC3s.js.map} +1 -1
  149. package/build/server/chunks/{error.svelte-C35KOpru.js → error.svelte-Cdjeq3L2.js} +4 -4
  150. package/build/server/chunks/{error.svelte-C35KOpru.js.map → error.svelte-Cdjeq3L2.js.map} +1 -1
  151. package/build/server/chunks/featureStore.svelte-DIYgPBVm.js +161 -0
  152. package/build/server/chunks/featureStore.svelte-DIYgPBVm.js.map +1 -0
  153. package/build/server/chunks/{hooks.server-Rv301GTB.js → hooks.server-y3jdg_sB.js} +6 -2
  154. package/build/server/chunks/hooks.server-y3jdg_sB.js.map +1 -0
  155. package/build/server/chunks/{internal-BPKrFkK1.js → internal-KYK0WpL7.js} +4 -4
  156. package/build/server/chunks/{internal-BPKrFkK1.js.map → internal-KYK0WpL7.js.map} +1 -1
  157. package/build/server/chunks/projectFeaturesStore.svelte-2o-72_vr.js +313 -0
  158. package/build/server/chunks/projectFeaturesStore.svelte-2o-72_vr.js.map +1 -0
  159. package/build/server/chunks/{reconcile-Dv7jS3C8.js → reconcile-B5xqb6-s.js} +3 -272
  160. package/build/server/chunks/reconcile-B5xqb6-s.js.map +1 -0
  161. package/build/server/chunks/registry-DqAn_hVE.js +21 -0
  162. package/build/server/chunks/registry-DqAn_hVE.js.map +1 -0
  163. package/build/server/chunks/{state-CpLVNZq7.js → state-DBjl9lhV.js} +2 -2
  164. package/build/server/chunks/{state-CpLVNZq7.js.map → state-DBjl9lhV.js.map} +1 -1
  165. package/build/server/index.js +1 -1
  166. package/build/server/index.js.map +1 -1
  167. package/build/server/manifest.js +33 -17
  168. package/build/server/manifest.js.map +1 -1
  169. package/cli/commands/dashboard.ts +14 -0
  170. package/cli/commands/init.ts +26 -0
  171. package/cli/commands/theme.ts +62 -0
  172. package/cli/unspa.ts +38 -2
  173. package/cli/util/context-files.ts +5 -0
  174. package/cli/util/theme.ts +34 -0
  175. package/mcp-server/sync-notifier.ts +88 -35
  176. package/package.json +2 -1
  177. package/src/app.css +187 -0
  178. package/src/app.html +15 -1
  179. package/src/features/behavior-model/domain/services/BehaviorGraphModel.ts +531 -0
  180. package/src/features/behavior-model/presentation/adapters/VisBehaviorGraphRenderer.ts +492 -0
  181. package/src/features/behavior-model/presentation/components/BehaviorGraph.svelte +370 -0
  182. package/src/features/behavior-model/presentation/components/FeatureHeader.svelte +13 -5
  183. package/src/features/behavior-model/presentation/view-models/BehaviorGraphTheme.ts +43 -0
  184. package/src/features/builder-mode/domain/BuilderModeDashboard.ts +7 -1
  185. package/src/features/builder-mode/presentation/components/BuilderModeDashboard.svelte +78 -16
  186. package/src/features/builder-mode/presentation/components/BuilderTagChips.svelte +25 -0
  187. package/src/features/builder-mode/presentation/stores/builderModeStore.svelte.ts +247 -3
  188. package/src/features/projects/presentation/components/ProjectEditor.svelte +7 -0
  189. package/src/features/simulator/application/use-cases/RunScenarios.ts +15 -1
  190. package/src/hooks.server.ts +11 -1
  191. package/src/lib/theme/registry.ts +77 -0
  192. package/src/lib/theme/themeStore.svelte.ts +64 -0
  193. package/src/routes/+layout.svelte +184 -30
  194. package/src/routes/features/[id]/graph/+page.svelte +34 -0
  195. package/src/routes/projects/[id]/graph/+page.svelte +79 -0
  196. package/src/shared/presentation/components/ProgressBar.svelte +1 -1
  197. package/src/shared/presentation/toast/SyncToast.svelte +14 -3
  198. package/src/shared/presentation/toast/viewLinkResolver.ts +32 -0
  199. package/static/lyriks_logo.svg +148 -0
  200. package/build/client/_app/immutable/assets/0.DFMDYAU9.css +0 -1
  201. package/build/client/_app/immutable/assets/0.DFMDYAU9.css.br +0 -0
  202. package/build/client/_app/immutable/assets/0.DFMDYAU9.css.gz +0 -0
  203. package/build/client/_app/immutable/chunks/BO66rBOa2.js +0 -1
  204. package/build/client/_app/immutable/chunks/BO66rBOa2.js.br +0 -0
  205. package/build/client/_app/immutable/chunks/BO66rBOa2.js.gz +0 -0
  206. package/build/client/_app/immutable/chunks/DBJWcC6Y.js.br +0 -0
  207. package/build/client/_app/immutable/chunks/DBJWcC6Y.js.gz +0 -0
  208. package/build/client/_app/immutable/chunks/DHoA038D.js +0 -1
  209. package/build/client/_app/immutable/chunks/DHoA038D.js.br +0 -2
  210. package/build/client/_app/immutable/chunks/DHoA038D.js.gz +0 -0
  211. package/build/client/_app/immutable/chunks/DatGSObE.js.br +0 -0
  212. package/build/client/_app/immutable/chunks/DatGSObE.js.gz +0 -0
  213. package/build/client/_app/immutable/chunks/DjWKKtqp.js +0 -1
  214. package/build/client/_app/immutable/chunks/DjWKKtqp.js.br +0 -1
  215. package/build/client/_app/immutable/chunks/DjWKKtqp.js.gz +0 -0
  216. package/build/client/_app/immutable/chunks/Dq0DUAz1.js +0 -1
  217. package/build/client/_app/immutable/chunks/Dq0DUAz1.js.br +0 -0
  218. package/build/client/_app/immutable/chunks/Dq0DUAz1.js.gz +0 -0
  219. package/build/client/_app/immutable/chunks/iQu0D9Ux.js +0 -1
  220. package/build/client/_app/immutable/chunks/iQu0D9Ux.js.br +0 -0
  221. package/build/client/_app/immutable/chunks/iQu0D9Ux.js.gz +0 -0
  222. package/build/client/_app/immutable/entry/app.CLgh6Mx_.js +0 -2
  223. package/build/client/_app/immutable/entry/app.CLgh6Mx_.js.br +0 -0
  224. package/build/client/_app/immutable/entry/app.CLgh6Mx_.js.gz +0 -0
  225. package/build/client/_app/immutable/entry/start.D5GPCQZD.js +0 -1
  226. package/build/client/_app/immutable/entry/start.D5GPCQZD.js.br +0 -0
  227. package/build/client/_app/immutable/entry/start.D5GPCQZD.js.gz +0 -0
  228. package/build/client/_app/immutable/nodes/0.BOoI-hsu.js +0 -4
  229. package/build/client/_app/immutable/nodes/0.BOoI-hsu.js.br +0 -0
  230. package/build/client/_app/immutable/nodes/0.BOoI-hsu.js.gz +0 -0
  231. package/build/client/_app/immutable/nodes/1.KYdA6ppX.js.br +0 -2
  232. package/build/client/_app/immutable/nodes/1.KYdA6ppX.js.gz +0 -0
  233. package/build/client/_app/immutable/nodes/2.DBz20KgG.js.br +0 -0
  234. package/build/client/_app/immutable/nodes/2.DBz20KgG.js.gz +0 -0
  235. package/build/client/_app/immutable/nodes/3.19DIoFtw.js +0 -1
  236. package/build/client/_app/immutable/nodes/3.19DIoFtw.js.br +0 -0
  237. package/build/client/_app/immutable/nodes/3.19DIoFtw.js.gz +0 -0
  238. package/build/client/_app/immutable/nodes/4.BvMzqBJj.js.br +0 -0
  239. package/build/client/_app/immutable/nodes/4.BvMzqBJj.js.gz +0 -0
  240. package/build/client/_app/immutable/nodes/5.Dq6obSGG.js +0 -42
  241. package/build/client/_app/immutable/nodes/5.Dq6obSGG.js.br +0 -0
  242. package/build/client/_app/immutable/nodes/5.Dq6obSGG.js.gz +0 -0
  243. package/build/client/_app/immutable/nodes/6.BOHISqs-.js.br +0 -0
  244. package/build/client/_app/immutable/nodes/6.BOHISqs-.js.gz +0 -0
  245. package/build/client/_app/immutable/nodes/7.CemgNJfw.js.br +0 -0
  246. package/build/client/_app/immutable/nodes/7.CemgNJfw.js.gz +0 -0
  247. package/build/client/_app/immutable/nodes/8.DejSfIYh.js +0 -5
  248. package/build/client/_app/immutable/nodes/8.DejSfIYh.js.br +0 -0
  249. package/build/client/_app/immutable/nodes/8.DejSfIYh.js.gz +0 -0
  250. package/build/client/_app/immutable/nodes/9.CMW6a2Lg.js.br +0 -0
  251. package/build/client/_app/immutable/nodes/9.CMW6a2Lg.js.gz +0 -0
  252. package/build/server/chunks/1-DPpKAKXV.js +0 -9
  253. package/build/server/chunks/5-D7OCJpxD.js +0 -9
  254. package/build/server/chunks/5-D7OCJpxD.js.map +0 -1
  255. package/build/server/chunks/8-CVO-E-sf.js +0 -9
  256. package/build/server/chunks/8-CVO-E-sf.js.map +0 -1
  257. package/build/server/chunks/9-DxT1baO5.js +0 -9
  258. package/build/server/chunks/9-DxT1baO5.js.map +0 -1
  259. package/build/server/chunks/ProgressBar-CfhccQ83.js.map +0 -1
  260. package/build/server/chunks/_layout.svelte-BREws55o.js.map +0 -1
  261. package/build/server/chunks/_page.svelte-BqSC-1vK.js.map +0 -1
  262. package/build/server/chunks/_page.svelte-BtI2zZ_Z.js.map +0 -1
  263. package/build/server/chunks/_page.svelte-Zf9H4KOP.js.map +0 -1
  264. package/build/server/chunks/builderModeStore.svelte-ihupr-3p.js.map +0 -1
  265. package/build/server/chunks/client-DfpLcAZ9.js +0 -24
  266. package/build/server/chunks/hooks.server-Rv301GTB.js.map +0 -1
  267. package/build/server/chunks/reconcile-Dv7jS3C8.js.map +0 -1
  268. /package/build/client/_app/immutable/assets/{9.nv0I59TU.css → 11.nv0I59TU.css} +0 -0
  269. /package/build/client/_app/immutable/assets/{9.nv0I59TU.css.br → 11.nv0I59TU.css.br} +0 -0
  270. /package/build/client/_app/immutable/assets/{9.nv0I59TU.css.gz → 11.nv0I59TU.css.gz} +0 -0
@@ -1,42 +0,0 @@
1
- import{$ as e,A as t,C as n,D as r,E as i,F as a,G as o,H as s,I as c,L as l,M as u,N as d,O as f,Q as p,R as m,V as h,W as g,X as _,Z as v,_ as y,a as b,at as x,c as S,ct as C,d as w,et as T,f as E,g as D,h as O,it as k,j as A,k as j,l as M,lt as N,m as P,mt as F,o as I,p as L,pt as ee,q as te,r as R,rt as z,s as B,tt as V,u as H,v as U,y as W,z as G}from"../chunks/BPl9BITm.js";import{t as ne}from"../chunks/DatGSObE.js";import"../chunks/xihTtKlq.js";import{t as re}from"../chunks/iQu0D9Ux.js";import{n as ie,t as ae}from"../chunks/ib21i2T_.js";import{A as oe,B as se,C as K,D as ce,F as le,G as ue,H as de,J as q,K as J,L as fe,M as Y,N as pe,O as me,P as he,Q as ge,R as X,S as _e,T as ve,U as ye,V as be,W as xe,X as Se,Y as Z,Z as Ce,b as we,c as Te,dt as Ee,f as De,gt as Oe,i as ke,j as Ae,l as je,p as Me,q as Q,t as Ne,w as Pe,x as Fe,y as Ie,z as Le}from"../chunks/Bp2_Vghh.js";import"../chunks/suTxxv1t.js";import"../chunks/DHoA038D.js";import{t as Re}from"../chunks/Cl7Z3e6-.js";import{t as ze}from"../chunks/cMamJTsF.js";import{$ as Be,A as Ve,B as He,C as Ue,D as We,E as Ge,F as Ke,G as qe,H as Je,I as Ye,J as Xe,K as Ze,L as Qe,M as $e,N as et,O as tt,P as nt,Q as rt,R as it,S as at,T as ot,U as st,V as ct,W as lt,X as ut,Y as dt,Z as ft,a as pt,b as mt,c as ht,d as gt,f as _t,g as vt,h as yt,i as bt,j as xt,k as St,l as Ct,m as wt,n as Tt,o as Et,p as Dt,q as Ot,r as kt,s as At,t as jt,u as Mt,w as Nt,x as Pt,y as Ft,z as It}from"../chunks/Dg0acPpT.js";import{t as Lt}from"../chunks/D8YEa1po.js";import{t as Rt}from"../chunks/D9dKmajw.js";import{t as zt}from"../chunks/Dhqg7r_2.js";import{t as Bt}from"../chunks/aNMRV4sP2.js";import{a as Vt,i as Ht,n as Ut,o as Wt,r as Gt,s as Kt,t as qt}from"../chunks/BO66rBOa2.js";import{r as Jt}from"../chunks/Bp8HpEPe2.js";import{t as $}from"../chunks/hpWJNn0t2.js";import{a as Yt,i as Xt,n as Zt,o as Qt,r as $t,s as en,t as tn}from"../chunks/CJjJLwzv2.js";var nn=new class{#e=V(!1);get loading(){return G(this.#e)}set loading(e){T(this.#e,e,!0)}#t=V(!1);get refreshing(){return G(this.#t)}set refreshing(e){T(this.#t,e,!0)}#n=V(null);get status(){return G(this.#n)}set status(e){T(this.#n,e,!0)}#r=V(null);get error(){return G(this.#r)}set error(e){T(this.#r,e,!0)}#i=V(null);get lastFetchedAt(){return G(this.#i)}set lastFetchedAt(e){T(this.#i,e,!0)}#a=V(null);get lastUpdateSignalAt(){return G(this.#a)}set lastUpdateSignalAt(e){T(this.#a,e,!0)}currentId=null;client=null;clientUnsubscribe=null;async load(e){this.currentId=e,this.error=null,this.loading=!0;try{await this.fetchOnce(e),this.subscribeRoom(e)}finally{this.loading=!1}}async refresh(){if(!(!this.currentId||this.refreshing)){this.refreshing=!0,this.error=null;try{await this.fetchOnce(this.currentId)}finally{this.refreshing=!1}}}reset(){this.clientUnsubscribe&&=(this.clientUnsubscribe(),null),this.client=null,this.currentId=null,this.status=null,this.error=null,this.loading=!1,this.refreshing=!1,this.lastFetchedAt=null,this.lastUpdateSignalAt=null}async fetchOnce(e){try{let t=await Ee(`/api/snapshots/${e}/implementation-status`);if(!t.ok){this.status=null;return}let n=await t.json();this.status=n??null,this.lastFetchedAt=new Date().toISOString()}catch(e){this.error=e.message}}subscribeRoom(e){this.clientUnsubscribe&&=(this.clientUnsubscribe(),null);let t=Jt(`implementation-status`,e);this.client=t,this.clientUnsubscribe=t.observe((t,n)=>{this.currentId===e&&n!==`local`&&(this.lastUpdateSignalAt=new Date().toISOString(),this.status=t,this.lastFetchedAt=this.lastUpdateSignalAt)})}},rn=new class{#e=V(!1);get loading(){return G(this.#e)}set loading(e){T(this.#e,e,!0)}#t=V(null);get project(){return G(this.#t)}set project(e){T(this.#t,e,!0)}#n=V(e([]));get siblings(){return G(this.#n)}set siblings(e){T(this.#n,e,!0)}#r=V(null);get error(){return G(this.#r)}set error(e){T(this.#r,e,!0)}currentFeatureId=null;async load(e){this.currentFeatureId=e,this.loading=!0,this.error=null;try{let t=await Ne(),n=await t.useCases.findProjectContainingFeature(e);if(this.currentFeatureId!==e)return;if(this.project=n,!n){this.siblings=[];return}let r=n.featureIds.filter(t=>t!==e),i=[];for(let n of r){let r=await t.useCases.getFeature(n);if(this.currentFeatureId!==e)return;r&&i.push(r)}this.siblings=i}catch(e){this.error=e.message}finally{this.currentFeatureId===e&&(this.loading=!1)}}reset(){this.currentFeatureId=null,this.project=null,this.siblings=[],this.error=null,this.loading=!1}get isInProject(){return this.project!==null}isActionQueued(e,t){let n=this.project?.implementationQueue??[],r=`action:${String(e)}:${String(t)}`;return n.some(e=>ke(e)===r)}isSurfaceQueued(e,t){let n=this.project?.implementationQueue??[],r=`surface:${String(e)}:${String(t)}`;return n.some(e=>ke(e)===r)}async enqueueAction(e,t){let n=this.project;if(!n)return!1;try{let r=await(await Ne()).useCases.enqueueQueueItem(n.id,{kind:`action`,featureId:e,actionId:t});return this.project=r.project,!0}catch(e){return this.error=e.message,!1}}async enqueueSurface(e,t){let n=this.project;if(!n)return!1;try{let r=await(await Ne()).useCases.enqueueQueueItem(n.id,{kind:`surface`,featureId:e,surfaceId:t});return this.project=r.project,!0}catch(e){return this.error=e.message,!1}}async dequeueByItemId(e){let t=this.project;if(t)try{let n=await(await Ne()).useCases.dequeueQueueItem(t.id,e);this.project=n}catch(e){this.error=e.message}}findQueueItemIdForAction(e,t){let n=this.project?.implementationQueue??[],r=`action:${String(e)}:${String(t)}`,i=n.find(e=>ke(e)===r);return i?i.id:null}findQueueItemIdForSurface(e,t){let n=this.project?.implementationQueue??[],r=`surface:${String(e)}:${String(t)}`,i=n.find(e=>ke(e)===r);return i?i.id:null}},an=`unspa:editor:rail-tab`,on=`unspa:editor:rail-collapsed`,sn=()=>{let e=window.localStorage.getItem(an);return e===`simulator`||e===`maturity`||e===`implementation`?e:`maturity`},cn=()=>window.localStorage.getItem(on)===`1`,ln=new class{#e=V(null);get selectedSurfaceId(){return G(this.#e)}set selectedSurfaceId(e){T(this.#e,e,!0)}#t=V(null);get selectedCapabilityId(){return G(this.#t)}set selectedCapabilityId(e){T(this.#t,e,!0)}#n=V(`actions`);get surfacePanelTab(){return G(this.#n)}set surfacePanelTab(e){T(this.#n,e,!0)}#r=V(`build`);get topLevelTab(){return G(this.#r)}set topLevelTab(e){T(this.#r,e,!0)}#i=V(e(sn()));get railTab(){return G(this.#i)}set railTab(e){T(this.#i,e,!0)}#a=V(e(cn()));get railCollapsed(){return G(this.#a)}set railCollapsed(e){T(this.#a,e,!0)}#o=V(null);get focusTarget(){return G(this.#o)}set focusTarget(e){T(this.#o,e,!0)}#s=V(0);get focusToken(){return G(this.#s)}set focusToken(e){T(this.#s,e,!0)}selectSurface(e){this.selectedSurfaceId=e,this.selectedCapabilityId=null,e&&Re(`editor.surface.selected`,{surfaceId:String(e)})}selectCapability(e){this.selectedCapabilityId=e}setSurfacePanelTab(e){this.surfacePanelTab=e,Re(`editor.panel.switched`,{tab:e})}setTopLevelTab(e){this.topLevelTab=e}setRailTab(e){this.railTab=e,window.localStorage.setItem(an,e)}setRailCollapsed(e){this.railCollapsed=e,window.localStorage.setItem(on,e?`1`:`0`)}toggleRail(){this.setRailCollapsed(!this.railCollapsed)}openRail(e){this.setRailTab(e),this.setRailCollapsed(!1)}navigateTo(e){this.topLevelTab=`build`,e.surfaceId&&this.selectSurface(e.surfaceId),e.actionId&&this.selectCapability(e.actionId),e.surfacePanelTab&&(this.surfacePanelTab=e.surfacePanelTab),e.actionId?this.focusTarget=`action:${e.actionId}`:e.surfaceId&&e.surfacePanelTab?this.focusTarget=`tab:${e.surfaceId}:${e.surfacePanelTab}`:e.surfaceId?this.focusTarget=`surface:${e.surfaceId}`:e.surfacePanelTab&&(this.focusTarget=`tab:${e.surfacePanelTab}`),this.focusToken+=1}reset(){this.selectedSurfaceId=null,this.selectedCapabilityId=null,this.surfacePanelTab=`actions`,this.topLevelTab=`build`}},un=(e,t)=>{let n=new Map;for(let e of t.stateDefinitions)n.set(String(e.path),e);for(let r of e.surfaces)if(r.id!==t.id)for(let e of r.stateDefinitions){if(!e.sharedWith?.includes(t.id))continue;let r=String(e.path);n.has(r)||n.set(r,e)}return[...n.values()]},dn=(e,t)=>({...t,stateDefinitions:un(e,t)}),fn=d(`<input type="text" class="w-full rounded-md border border-slate-300 bg-white px-2 py-1 text-2xl font-semibold outline-none focus:border-slate-900"/> <input type="text" placeholder="Short description" class="w-full rounded-md border border-slate-300 bg-white px-2 py-1 text-sm text-slate-600 outline-none focus:border-slate-900"/> <div class="flex gap-2 pt-1"><button type="button" class="rounded-md bg-slate-900 px-3 py-1.5 text-xs font-medium text-white">Save</button> <button type="button" class="rounded-md border border-slate-300 px-3 py-1.5 text-xs font-medium text-slate-700 hover:bg-slate-50">Cancel</button></div>`,1),pn=d(`<p class="max-w-3xl text-sm leading-6 text-slate-600"> </p>`),mn=d(`<div class="pt-1"><!></div>`),hn=d(`<h1 class="truncate text-3xl font-semibold tracking-tight text-slate-950"> </h1> <!> <!> <div class="flex flex-wrap items-center gap-3 text-xs text-slate-500"><button class="font-medium text-brand-700 hover:underline">Edit metadata</button> <span> </span></div>`,1),gn=d(`<header class="border-b border-slate-200 pb-4"><div class="flex flex-wrap items-start justify-between gap-3"><div class="min-w-0 flex-1 space-y-1"><a class="inline-flex items-center gap-1 text-[11px] font-semibold uppercase tracking-wide text-brand-700 hover:underline"><span aria-hidden="true">←</span> </a> <!></div> <div class="flex shrink-0 flex-wrap items-center gap-2 rounded-xl border border-slate-200 bg-white p-1.5 shadow-sm shadow-slate-950/5"><div class="flex rounded-lg border border-hairline bg-white p-1"><button type="button" class="rounded-md px-2 py-1.5 text-xs font-medium text-slate-700 hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-40">Undo</button> <button type="button" class="rounded-md px-2 py-1.5 text-xs font-medium text-slate-700 hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-40">Redo</button> <button type="button" title="Show history" aria-label="Show history"> </button></div></div></div></header>`);function _n(e,n){N(n,!0);let r=b(n,`historyOpen`,3,!1),i=typeof navigator<`u`&&/Mac|iPhone|iPad|iPod/.test(navigator.platform)?`Cmd`:`Ctrl`,a=`Undo (${i}+Z)`,s=`Redo (${i}+Shift+Z)`,c=V(!1),u=V(``),d=V(``);o(()=>{n.feature&&(G(c)||(T(u,n.feature.name,!0),T(d,n.feature.description??``,!0)))}),o(()=>{let e=n.feature?.tags??[];e.length>0&&Lt.registerTypes(e.map(e=>e.type))});async function f(){let e=G(u).trim();e.length!==0&&(await $.mutate(t=>({...t,name:e,description:G(d).trim()||void 0})),T(c,!1))}let m=z(()=>rn.project?`/projects/${rn.project.id}`:`/features`),h=z(()=>rn.project?`Back to ${rn.project.name}`:`Back to features`);var y=gn(),x=_(y),w=_(x),E=_(w),D=p(_(E));F(E);var O=p(E,2),k=e=>{var t=fn(),n=v(t);M(n);var r=p(n,2);M(r);var i=p(r,2),a=_(i),o=p(a,2);F(i),S(n,()=>G(u),e=>T(u,e)),S(r,()=>G(d),e=>T(d,e)),l(`click`,a,f),l(`click`,o,()=>T(c,!1)),A(e,t)},P=e=>{var r=hn(),i=v(r),a=_(i,!0);F(i);var o=p(i,2),s=e=>{var r=pn(),i=_(r,!0);F(r),g(()=>t(i,n.feature.description)),A(e,r)};j(o,e=>{n.feature.description&&e(s)});var u=p(o,2),d=e=>{var t=mn();Rt(_(t),{get tags(){return n.feature.tags}}),F(t),A(e,t)};j(u,e=>{n.feature.tags&&n.feature.tags.length>0&&e(d)});var f=p(u,2),m=_(f),h=p(m,2),y=_(h,!0);F(h),F(f),g(()=>{t(a,n.feature.name),t(y,n.saving?`Saving…`:`Saved`)}),l(`click`,m,()=>T(c,!0)),A(e,r)};j(O,e=>{G(c)?e(k):e(P,-1)}),F(w);var I=p(w,2),L=_(I),ee=_(L),te=p(ee,2),R=p(te,2),B=_(R);F(R),F(L),F(I),F(x),F(y),g(()=>{H(E,`href`,G(m)),t(D,` ${G(h)??``}`),H(ee,`title`,a),H(ee,`aria-label`,a),ee.disabled=!$.canUndo,H(te,`title`,s),H(te,`aria-label`,s),te.disabled=!$.canRedo,H(R,`aria-pressed`,r()),U(R,1,`rounded-md px-2 py-1.5 text-xs font-medium text-slate-700 hover:bg-slate-50 ${r()?`bg-slate-100`:``}`),t(B,`History ${$.historyEntries.length??``}`)}),l(`click`,ee,()=>$.undo()),l(`click`,te,()=>$.redo()),l(`click`,R,()=>n.onToggleHistory?.()),A(e,y),C()}c([`click`]);var vn=d(`<span class="rounded-md bg-red-100 px-1.5 py-0.5 text-[10px] font-semibold text-red-800"> </span>`),yn=d(`<span class="rounded-md bg-sky-100 px-1.5 py-0.5 text-[10px] font-semibold text-sky-800"> </span>`),bn=d(`<span class="text-emerald-700">All checks pass</span>`),xn=d(`<span class="text-slate-500">no report yet</span>`),Sn=d(`· <span class="text-red-700"> </span>`,1),Cn=d(` <!>`,1),wn=d(`<div class="flex flex-wrap items-stretch gap-2"><button type="button" data-tour="maturity-toggle" class="group flex min-w-[10rem] flex-1 items-center gap-3 rounded-xl border border-slate-200 bg-white px-3 py-2 text-left shadow-sm shadow-slate-950/5 transition hover:border-slate-300 hover:bg-slate-50" title="Open Maturity panel"><span class="grid h-8 w-8 shrink-0 place-items-center rounded-full text-[10px] font-bold text-white"> </span> <span class="min-w-0"><span class="block text-[10px] font-semibold uppercase tracking-wide text-slate-500">Maturity</span> <span class="flex items-center gap-1.5 text-xs font-medium text-slate-700"><!> <!> <!></span></span></button> <button type="button" data-tour="implementation-toggle" class="group flex min-w-[10rem] flex-1 items-center gap-3 rounded-xl border border-slate-200 bg-white px-3 py-2 text-left shadow-sm shadow-slate-950/5 transition hover:border-slate-300 hover:bg-slate-50" title="Open Implementation panel"><span class="grid h-8 w-8 shrink-0 place-items-center rounded-full text-[10px] font-bold text-white"> </span> <span class="min-w-0"><span class="block text-[10px] font-semibold uppercase tracking-wide text-slate-500">Implementation</span> <span class="text-xs font-medium text-slate-700"><!></span></span></button> <button type="button" data-tour="simulator-toggle" class="flex items-center gap-2 rounded-xl border border-slate-200 bg-white px-3 py-2 text-left shadow-sm shadow-slate-950/5 transition hover:border-slate-300 hover:bg-slate-50" title="Open Simulator panel"><span class="grid h-8 w-8 shrink-0 place-items-center rounded-full bg-brand-100 text-brand-800" aria-hidden="true"><span class="text-sm">▶</span></span> <span class="min-w-0"><span class="block text-[10px] font-semibold uppercase tracking-wide text-slate-500">Simulator</span> <span class="text-xs font-medium text-slate-700">Run an action</span></span></button></div>`);function Tn(e,n){N(n,!0);let r=z(()=>ce(n.feature).global),i=z(()=>ve(n.feature,nn.status));function a(e){let t=e/100*120;return`hsl(${Math.round(t)}, 70%, 45%)`}function o(){let e=G(r).criticalIssues.length;if(e===0)return a(G(r).percentage);let t=Math.max(0,35-(e-1)*18);return`hsl(${Math.round(t)}, 75%, 50%)`}var s=wn(),c=_(s),u=_(c),d=_(u);F(u);var f=p(u,2),m=p(_(f),2),h=_(m),b=e=>{var n=vn(),i=_(n);F(n),g(()=>t(i,`${G(r).criticalIssues.length??``} critical`)),A(e,n)};j(h,e=>{G(r).criticalIssues.length>0&&e(b)});var x=p(h,2),S=e=>{var n=yn(),i=_(n);F(n),g(()=>t(i,`${G(r).recommendedIssues.length??``} suggestion${G(r).recommendedIssues.length===1?``:`s`}`)),A(e,n)};j(x,e=>{G(r).recommendedIssues.length>0&&e(S)});var w=p(x,2),T=e=>{A(e,bn())};j(w,e=>{G(r).criticalIssues.length===0&&G(r).recommendedIssues.length===0&&e(T)}),F(m),F(f),F(c);var E=p(c,2),D=_(E),O=_(D,!0);F(D);var k=p(D,2),M=p(_(k),2),P=_(M),I=e=>{A(e,xn())},L=e=>{var n=Cn(),r=v(n),a=p(r),o=e=>{var n=Sn(),r=p(v(n)),a=_(r);F(r),g(()=>t(a,`${G(i).missingCount??``} missing`)),A(e,n)};j(a,e=>{G(i).missingCount>0&&e(o)}),g(()=>t(r,`${G(i).foundCount??``}/${G(i).expectedCount??``} tagged `)),A(e,n)};j(P,e=>{G(i).hasReport?e(L,-1):e(I)}),F(M),F(k),F(E);var ee=p(E,2);F(s),g((e,n)=>{y(u,`background-color: ${e??``}`),t(d,`${G(r).percentage??``}%`),y(D,`background-color: ${n??``}`),t(O,G(i).expectedCount===0?`-`:`${G(i).percentage}%`)},[()=>o(),()=>G(i).expectedCount===0?`hsl(220, 10%, 70%)`:a(G(i).percentage)]),l(`click`,c,()=>ln.openRail(`maturity`)),l(`click`,E,()=>ln.openRail(`implementation`)),l(`click`,ee,()=>ln.openRail(`simulator`)),A(e,s),C()}c([`click`]);var En=d(`<div class="flex flex-1 items-center justify-center px-4 text-center text-xs text-neutral-500">No edits yet. Make a change and it will appear here.</div>`),Dn=d(`<span class="ml-1 text-purple-700"> </span>`),On=d(`<span class="ml-1 text-brand-700">· current</span>`),kn=d(`<li><button type="button"><span> </span> <span class="flex-1 space-y-0.5"><span class="block font-medium text-neutral-800"> </span> <span class="block text-[11px] text-neutral-500"> <!> <!></span></span></button></li>`),An=d(`<ol class="flex-1 overflow-y-auto py-1"></ol>`),jn=d(`<aside><header class="flex items-center justify-between border-b border-neutral-200 px-3 py-2"><div><h2 class="text-sm font-semibold text-neutral-900">History</h2> <p class="text-[11px] text-neutral-500"> </p></div> <div class="flex items-center gap-1"><button type="button" class="rounded-md px-2 py-1 text-[11px] font-medium text-neutral-600 transition hover:bg-red-50 hover:text-red-700 disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent disabled:hover:text-neutral-600">Clear</button> <button type="button" class="rounded-md p-1 text-neutral-500 hover:bg-neutral-100 hover:text-neutral-900" aria-label="Close history" title="Close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" aria-hidden="true"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></button></div></header> <!></aside>`);function Mn(e,n){N(n,!0);let r=b(n,`open`,15,!1),a=z(()=>[...$.historyEntries].reverse()),o=z(()=>$.historyEntries.length>1);async function s(){let e=$.historyEntries.length;e<=1||await Oe({title:`Clear history?`,message:`${e} entries will be wiped from this feature's shared timeline. The feature's current state is kept — only the past edits and the ability to time-travel to them are removed. This cannot be undone.`,confirmLabel:`Clear history`,cancelLabel:`Keep history`,tone:`danger`})&&$.clearHistory()}let c=e=>{let t=new Date(e),n=new Date,r=t.getFullYear()===n.getFullYear()&&t.getMonth()===n.getMonth()&&t.getDate()===n.getDate(),i=t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`});return r?i:`${t.toLocaleDateString([],{month:`short`,day:`numeric`})} ${i}`},u=e=>e===`mcp`?`bg-purple-100 text-purple-700`:e===`system`?`bg-neutral-100 text-neutral-600`:`bg-sky-100 text-sky-700`,d=e=>e===`mcp`?`AI`:e===`system`?`sys`:e.replace(/^user-/,``).replace(/^Anon-/,``);var f=jn();let m;var h=_(f),v=_(h),y=p(_(v),2),x=_(y);F(y),F(v);var S=p(v,2),w=_(S),T=p(w,2);F(S),F(h);var E=p(h,2),D=e=>{A(e,En())},O=e=>{var n=An();i(n,23,()=>G(a),e=>e.id,(e,n,r)=>{let i=z(()=>$.historyEntries.length-1-G(r)),a=z(()=>G(i)===$.historyCursor),o=z(()=>G(i)<$.historyCursor);var s=kn(),f=_(s),m=_(f),h=_(m,!0);F(m);var v=p(m,2),y=_(v),b=_(y,!0);F(y);var x=p(y,2),S=_(x),C=p(S),w=e=>{var r=Dn(),i=_(r);F(r),g(()=>t(i,`· for ${G(n).actingFor??``}`)),A(e,r)};j(C,e=>{G(n).actingFor&&e(w)});var T=p(C,2),E=e=>{A(e,On())};j(T,e=>{G(a)&&e(E)}),F(x),F(v),F(f),F(s),g((e,r,i)=>{U(f,1,`flex w-full items-start gap-2 border-l-2 px-3 py-2 text-left text-xs transition hover:bg-neutral-50 ${G(a)?`border-brand-600 bg-brand-50/40`:G(o)?`border-transparent`:`border-transparent opacity-60`}`),H(f,`title`,G(a)?`Current state`:`Jump to this state`),U(m,1,`mt-0.5 inline-flex shrink-0 items-center rounded px-1.5 py-0.5 text-[10px] font-semibold ${e??``}`),t(h,r),t(b,G(n).label??`Edit`),t(S,`${i??``} `)},[()=>u(G(n).author),()=>d(G(n).author),()=>c(G(n).ts)]),l(`click`,f,()=>$.jumpToHistory(G(n).id)),A(e,s)}),F(n),A(e,n)};j(E,e=>{G(a).length===0?e(D):e(O,-1)}),F(f),g(()=>{m=U(f,1,`flex h-full w-80 flex-col border-l border-neutral-200 bg-white`,null,m,{hidden:!r()}),t(x,`${$.historyEntries.length??``} edit(s) · shared timeline`),w.disabled=!G(o),H(w,`title`,G(o)?`Clear the shared history (keeps current state)`:`Nothing to clear`)}),l(`click`,w,s),l(`click`,T,()=>r(!1)),A(e,f),C()}c([`click`]);var Nn=[`screen`,`canvas`,`terminal`,`board`,`workflow`,`command_palette`,`api_playground`,`map`,`dialog_area`,`custom`],Pn=e=>{switch(e){case`screen`:return`Screen`;case`canvas`:return`Canvas`;case`terminal`:return`Terminal`;case`board`:return`Board`;case`workflow`:return`Workflow`;case`command_palette`:return`Command palette`;case`api_playground`:return`API playground`;case`map`:return`Map`;case`dialog_area`:return`Dialog area`;case`custom`:return`Custom`}},Fn=(e,t)=>({id:Se(e()),name:t.name,type:t.type,description:t.description,stateDefinitions:[],actions:[],rules:[],invariants:[],transitions:[]}),In=(e,t)=>({id:fe(e()),name:t.name,intent:t.intent??``,parameters:[],requiredStates:[],rules:[],invariants:[],effects:[],emittedEvents:[],transitions:[]}),Ln=(e,t)=>{let n=t.type===`number`?0:t.type===`boolean`?!1:t.type===`object`?{}:t.type===`array`?[]:(t.type,``);return{id:Z(e()),path:Y(t.path),type:t.type,defaultValue:n}},Rn=(e,t)=>({id:Q(e()),category:t.category,condition:{left:Y(t.left),operator:t.operator},effect:{id:X(e()),type:`block_action`,reason:``}}),zn=(e,t)=>{switch(t){case`set_state`:return{id:X(e()),type:`set_state`,path:Y(`state.path`),value:``};case`show_message`:return{id:X(e()),type:`show_message`,message:``,tone:`info`};case`emit_event`:return{id:X(e()),type:`emit_event`,event:`event.name`};case`block_action`:return{id:X(e()),type:`block_action`,reason:``};case`allow_action`:return{id:X(e()),type:`allow_action`};case`transition_surface`:return{id:X(e()),type:`transition_surface`,target:Se(``)}}},Bn=(e,t)=>({id:ye(e()),name:t.name,condition:{left:Y(t.left),operator:`exists`},message:``}),Vn=(e,t,n)=>{let r=new Map;for(let e of t)r.set(e.id,Se(n()));let i=e,a=[];for(let e of t){let t=r.get(e.id);if(!t)continue;let o={ids:n,ownSurfaceId:t,linkTargets:r},s=e.build(o);i=Hn(i,s.surface,s.resources,s.personas),a.push(t)}return{feature:i,addedSurfaceIds:a}},Hn=(e,t,n,r)=>{let i=new Set(e.resources.map(e=>e.name)),a=(n??[]).filter(e=>!i.has(e.name)),o=new Set(e.personas.map(e=>e.name)),s=(r??[]).filter(e=>!o.has(e.name));return{...e,surfaces:[...e.surfaces,t],resources:[...e.resources,...a],personas:[...e.personas,...s]}},Un=(e,t)=>{let n=new Set,r=[],i=e=>{if(!n.has(e.id)){n.add(e.id),r.push(e);for(let n of e.siblings??[]){let e=t(n);e&&i(e)}}};for(let t of e)i(t);return r},Wn=(e,t,n,r,i={})=>{let a=n.map(t=>e.findById(t)).filter(e=>e!==void 0);return Vn(t,i.includeSiblings?Un(a,t=>e.findById(t)):a,r)},Gn=e=>e,Kn={signIn:Gn(`library.auth.signin`),signUp:Gn(`library.auth.signup`),verifyEmail:Gn(`library.auth.verify_email`),resetPassword:Gn(`library.auth.reset_password`)},qn=[{id:J(`library-auth-res-users`),name:`Users (Postgres)`,description:`Primary customer account records. PII; GDPR-relevant.`,kind:`relational_db`,provider:`PostgreSQL`,scope:`cloud`,location:`eu-west (configurable)`,database:`auth`,container:`users`,field:void 0,sensitivity:`confidential`,containsPii:!0,complianceTags:[`gdpr`,`iso27001`],accessMode:`read_write`,authentication:`iam_role`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`until account deletion + 30 days`,owner:`identity-team`},{id:J(`library-auth-res-tokens`),name:`Auth tokens (Redis)`,description:`Short-lived cache for verification codes and password-reset tokens. TTL on each key.`,kind:`cache`,provider:`Redis`,scope:`cloud`,location:`eu-west (configurable)`,database:`auth-cache`,container:`tokens:*`,field:void 0,sensitivity:`confidential`,containsPii:!1,complianceTags:[],accessMode:`read_write`,authentication:`iam_role`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`15 min TTL`,owner:`identity-team`}],Jn=[{id:ue(`library-persona-anonymous`),name:`Anonymous visitor`,description:`Not signed in, no verified email. The default user on entry surfaces (sign in, sign up, public catalog).`,stateOverrides:[{path:Y(`user.authenticated`),value:!1},{path:Y(`user.emailVerified`),value:!1}],parameterOverrides:[]},{id:ue(`library-persona-authenticated`),name:`Authenticated user`,description:`Signed in with a verified email. The standard happy-path user across most authenticated surfaces.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`user.emailVerified`),value:!0},{path:Y(`user.role`),value:`member`},{path:Y(`user.tier`),value:`standard`}],parameterOverrides:[]},{id:ue(`library-persona-admin`),name:`Admin`,description:`Authenticated, verified, role=admin. Use to test privileged actions and admin-only paths.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`user.emailVerified`),value:!0},{path:Y(`user.role`),value:`admin`},{path:Y(`user.tier`),value:`standard`}],parameterOverrides:[]},{id:ue(`library-persona-premium`),name:`Premium customer`,description:`Authenticated, verified, tier=premium. Use to test tier-gated features (price overrides, exclusive content, no ads).`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`user.emailVerified`),value:!0},{path:Y(`user.role`),value:`member`},{path:Y(`user.tier`),value:`premium`}],parameterOverrides:[]},{id:ue(`library-persona-suspended`),name:`Suspended account`,description:`Authenticated but flagged or suspended. Use to test rules that gate sensitive actions on account status.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`user.emailVerified`),value:!0},{path:Y(`user.role`),value:`member`},{path:Y(`user.tier`),value:`standard`},{path:Y(`user.suspended`),value:!0}],parameterOverrides:[]}],Yn={id:Kn.resetPassword,name:`Reset password`,category:`auth`,surfaceType:`screen`,summary:`Forgot-password request and token-gated new-password flow.`,description:`Two actions: Request reset (sends a token-bearing email. Fail-open to avoid account enumeration) and Set new password (requires a valid, non-expired token plus a strong new password). Wires back to Sign in.`,platforms:[`web`,`mobile`],tags:[`forgot-password`,`reset`,`token`,`password`,`enumeration`],siblings:[Kn.signIn],build:({ids:e,ownSurfaceId:t,linkTargets:n})=>{let r=J(`library-auth-res-tokens`),i=J(`library-auth-res-users`),a=[n.get(Kn.signIn)&&{id:Ce(e()),target:n.get(Kn.signIn),label:`Back to sign in`}].filter(e=>!!e);return{surface:{id:t,name:`Reset password`,type:`screen`,description:`Forgot-password flow. Request a reset link, then submit a new password using the token from the email.`,stateDefinitions:[{id:Z(e()),path:Y(`user.authenticated`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`user.email`),type:`string`,defaultValue:``,description:`Email entered for the reset request. Bound from "email".`},{id:Z(e()),path:Y(`form.emailValid`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`reset.token`),type:`string`,defaultValue:``,description:`Reset token entered by the user. Bound from "token".`},{id:Z(e()),path:Y(`reset.tokenValid`),type:`boolean`,defaultValue:!1,description:`Result of validating the reset token against the cache.`},{id:Z(e()),path:Y(`reset.tokenExpired`),type:`boolean`,defaultValue:!0,description:`True when the token has aged past its TTL.`},{id:Z(e()),path:Y(`reset.passwordStrong`),type:`boolean`,defaultValue:!1,description:`Result of the password-strength check on the new password.`}],rules:[],invariants:[{id:ye(e()),name:`reset.tokenValid is observable`,condition:{left:Y(`reset.tokenValid`),operator:`exists`},message:`Token-valid flag must always be present.`}],transitions:a,actions:[{id:fe(e()),name:`Request reset`,intent:`Send a password reset link to the user email if the account exists.`,parameters:[{id:xe(e()),name:`email`,type:`string`,required:!0,description:`Email address to receive the reset link. Bound to user.email.`,resourceId:i,bindToStatePath:Y(`user.email`),validations:[{type:`email`},{type:`non_empty`}]}],requiredStates:[Y(`form.emailValid`)],rules:[{id:Q(e()),category:`validation`,condition:{left:Y(`form.emailValid`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Enter a valid email address.`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`password.reset_requested`)},{id:X(e()),type:`show_message`,message:`If an account exists with that email, a reset link is on its way.`,tone:`info`}],emittedEvents:[K(`password.reset_requested`)],transitions:[],scenarios:[{id:q(e()),name:`Valid email`,description:`Visitor enters a well-formed email; reset request is sent fail-open.`,stateOverrides:[{path:Y(`form.emailValid`),value:!0}],parameterOverrides:[{parameterName:`email`,value:`user@example.com`}]},{id:q(e()),name:`Malformed email`,description:`Visitor enters something that is not an email. Validation rule blocks.`,stateOverrides:[{path:Y(`form.emailValid`),value:!1}],parameterOverrides:[{parameterName:`email`,value:`not-an-email`}]}]},{id:fe(e()),name:`Set new password`,intent:`Set a new password using the reset token from the email.`,parameters:[{id:xe(e()),name:`token`,type:`string`,required:!0,description:`Single-use reset token delivered by email. Bound to reset.token.`,resourceId:r,bindToStatePath:Y(`reset.token`),validations:[{type:`non_empty`},{type:`min_length`,value:32}]},{id:xe(e()),name:`newPassword`,type:`string`,required:!0,description:`New password to set.`,validations:[{type:`non_empty`},{type:`min_length`,value:8}]}],requiredStates:[Y(`reset.tokenValid`),Y(`reset.tokenExpired`),Y(`reset.passwordStrong`)],rules:[{id:Q(e()),category:`security`,condition:{left:Y(`reset.tokenExpired`),operator:`is_true`},effect:{id:X(e()),type:`block_action`,reason:`This reset link has expired. Request a new one.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`reset.tokenValid`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`This reset link is invalid.`}},{id:Q(e()),category:`security`,condition:{left:Y(`reset.passwordStrong`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`New password must be at least 8 characters with letters and numbers.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`user.authenticated`),value:!0},{id:X(e()),type:`emit_event`,event:K(`password.reset_completed`)},...n.get(Kn.signIn)?[{id:X(e()),type:`transition_surface`,target:n.get(Kn.signIn)}]:[]],emittedEvents:[K(`password.reset_completed`)],transitions:[],scenarios:[{id:q(e()),name:`Token expired`,description:`Reset link is past its TTL. Security rule blocks.`,stateOverrides:[{path:Y(`reset.tokenValid`),value:!0},{path:Y(`reset.tokenExpired`),value:!0},{path:Y(`reset.passwordStrong`),value:!0}],parameterOverrides:[{parameterName:`token`,value:`expired-token-1234567890123456789012`},{parameterName:`newPassword`,value:`NewPass2026!`}]},{id:q(e()),name:`Invalid token`,description:`Reset link does not match anything in the cache.`,stateOverrides:[{path:Y(`reset.tokenValid`),value:!1},{path:Y(`reset.tokenExpired`),value:!1},{path:Y(`reset.passwordStrong`),value:!0}],parameterOverrides:[{parameterName:`token`,value:`tampered-token-12345678901234567890ab`},{parameterName:`newPassword`,value:`NewPass2026!`}]},{id:q(e()),name:`Weak new password`,description:`Token is valid but the chosen new password fails the strength check.`,stateOverrides:[{path:Y(`reset.tokenValid`),value:!0},{path:Y(`reset.tokenExpired`),value:!1},{path:Y(`reset.passwordStrong`),value:!1}],parameterOverrides:[{parameterName:`token`,value:`valid-token-12345678901234567890abcdef`},{parameterName:`newPassword`,value:`short`}]},{id:q(e()),name:`Happy path`,description:`Valid token, strong password. Reset succeeds and the action transitions to Sign in.`,stateOverrides:[{path:Y(`reset.tokenValid`),value:!0},{path:Y(`reset.tokenExpired`),value:!1},{path:Y(`reset.passwordStrong`),value:!0}],parameterOverrides:[{parameterName:`token`,value:`valid-token-12345678901234567890abcdef`},{parameterName:`newPassword`,value:`NewPass2026!`}]}]}]},resources:qn,personas:Jn}}},Xn=[{id:Kn.signIn,name:`Sign in`,category:`auth`,surfaceType:`screen`,summary:`Email + password sign-in with rate limiting and account lockout.`,description:`A complete sign-in surface: validates credentials, enforces a failed-attempts threshold, blocks locked accounts, and emits a signed-in event. Wires transitions to the matching Sign up, Verify email, and Reset password surfaces if those blueprints are added in the same operation.`,platforms:[`web`,`mobile`],tags:[`login`,`authentication`,`rate-limit`,`lockout`,`gdpr`],siblings:[Kn.signUp,Kn.verifyEmail,Kn.resetPassword],build:({ids:e,ownSurfaceId:t,linkTargets:n})=>{let r=J(`library-auth-res-users`),i=[n.get(Kn.signUp)&&{id:Ce(e()),target:n.get(Kn.signUp),label:`Don't have an account? Sign up`},n.get(Kn.resetPassword)&&{id:Ce(e()),target:n.get(Kn.resetPassword),label:`Forgot password?`},n.get(Kn.verifyEmail)&&{id:Ce(e()),target:n.get(Kn.verifyEmail),label:`Verify your email`}].filter(e=>!!e);return{surface:{id:t,name:`Sign in`,type:`screen`,description:`Authenticate an existing user with email and password. Failed attempts are tracked; the account is locked after 5 consecutive failures.`,stateDefinitions:[{id:Z(e()),path:Y(`user.authenticated`),type:`boolean`,defaultValue:!1,description:`Whether the user has a valid session.`},{id:Z(e()),path:Y(`user.email`),type:`string`,defaultValue:``,description:`Email used for sign-in. Bound from the "email" parameter.`},{id:Z(e()),path:Y(`auth.credentialsValid`),type:`boolean`,defaultValue:!1,description:`Result of the credentials check against the user store.`},{id:Z(e()),path:Y(`auth.failedAttempts`),type:`number`,defaultValue:0,description:`Consecutive failed sign-in attempts on this account.`},{id:Z(e()),path:Y(`auth.locked`),type:`boolean`,defaultValue:!1,description:`Set to true when failedAttempts crosses the threshold.`}],rules:[{id:Q(e()),category:`business`,condition:{left:Y(`user.authenticated`),operator:`is_true`},effect:{id:X(e()),type:`show_message`,message:`You are already signed in.`,tone:`info`},description:`Surface-level guard: if the user is already authenticated, the sign-in form is a no-op. Surface a hint rather than letting them re-submit.`}],invariants:[{id:ye(e()),name:`auth.failedAttempts is non-negative`,condition:{left:Y(`auth.failedAttempts`),operator:`greater_than`,right:-1},message:`Failed-attempts counter must be ≥ 0.`}],transitions:i,actions:[{id:fe(e()),name:`Sign in`,intent:`Authenticate an existing user with email and password.`,parameters:[{id:xe(e()),name:`email`,type:`string`,required:!0,description:`Email used as the login identifier. Bound to user.email.`,resourceId:r,bindToStatePath:Y(`user.email`),validations:[{type:`email`},{type:`non_empty`}]},{id:xe(e()),name:`password`,type:`string`,required:!0,description:`Plain-text password (hashed before storage).`,validations:[{type:`non_empty`},{type:`min_length`,value:8}]}],requiredStates:[Y(`auth.credentialsValid`),Y(`auth.failedAttempts`),Y(`auth.locked`)],rules:[{id:Q(e()),category:`permissions`,condition:{left:Y(`auth.locked`),operator:`is_true`},effect:{id:X(e()),type:`block_action`,reason:`Account is locked. Reset your password or contact support.`}},{id:Q(e()),category:`security`,condition:{left:Y(`auth.failedAttempts`),operator:`greater_than`,right:4},effect:{id:X(e()),type:`block_action`,reason:`Too many failed attempts. Try again later.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`auth.credentialsValid`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Email or password incorrect.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`user.authenticated`),value:!0},{id:X(e()),type:`emit_event`,event:K(`user.signed_in`)},...n.get(Kn.verifyEmail)?[{id:X(e()),type:`transition_surface`,target:n.get(Kn.verifyEmail)}]:[]],emittedEvents:[K(`user.signed_in`)],transitions:[],scenarios:[{id:q(e()),name:`Account is locked`,description:`Existing account that has been locked after too many failed attempts. Verifies the lockout rule fires before the credentials check.`,stateOverrides:[{path:Y(`auth.locked`),value:!0},{path:Y(`auth.failedAttempts`),value:5},{path:Y(`auth.credentialsValid`),value:!0}],parameterOverrides:[{parameterName:`email`,value:`locked@example.com`},{parameterName:`password`,value:`CorrectHorse!`}]},{id:q(e()),name:`Bad credentials`,description:`Account exists but the password is wrong. Verifies the validation rule fires.`,stateOverrides:[{path:Y(`auth.credentialsValid`),value:!1},{path:Y(`auth.failedAttempts`),value:1},{path:Y(`auth.locked`),value:!1}],parameterOverrides:[{parameterName:`email`,value:`user@example.com`},{parameterName:`password`,value:`WrongGuess1`}]},{id:q(e()),name:`Already signed in`,description:`Authenticated user lands on the sign-in surface again. Verifies the surface-level "already signed in" hint shows.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0}],parameterOverrides:[]},{id:q(e()),name:`Happy path`,description:`Valid credentials, account not locked. Action succeeds.`,stateOverrides:[{path:Y(`auth.credentialsValid`),value:!0},{path:Y(`auth.locked`),value:!1},{path:Y(`auth.failedAttempts`),value:0}],parameterOverrides:[{parameterName:`email`,value:`user@example.com`},{parameterName:`password`,value:`CorrectHorse!`}]}]}]},resources:qn,personas:Jn}}},{id:Kn.signUp,name:`Sign up`,category:`auth`,surfaceType:`screen`,summary:`Create-account flow with email validation, terms acceptance, and password strength.`,description:`A complete sign-up surface. Validates the email format, enforces password strength, requires Terms acceptance (compliance), blocks duplicate accounts, and emits an account-created event. Wires transitions to Sign in (existing user) and Verify email (next step).`,platforms:[`web`,`mobile`],tags:[`register`,`create-account`,`terms`,`gdpr`,`password-strength`],siblings:[Kn.signIn,Kn.verifyEmail],build:({ids:e,ownSurfaceId:t,linkTargets:n})=>{let r=J(`library-auth-res-users`),i=[n.get(Kn.signIn)&&{id:Ce(e()),target:n.get(Kn.signIn),label:`Already have an account? Sign in`},n.get(Kn.verifyEmail)&&{id:Ce(e()),target:n.get(Kn.verifyEmail),label:`Verify your email`}].filter(e=>!!e);return{surface:{id:t,name:`Sign up`,type:`screen`,description:`Create a new customer account from email and password. The flow gates on email format, password strength, terms acceptance, and uniqueness.`,stateDefinitions:[{id:Z(e()),path:Y(`user.authenticated`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`user.email`),type:`string`,defaultValue:``,description:`Email of the new account. Bound from the "email" parameter.`},{id:Z(e()),path:Y(`user.exists`),type:`boolean`,defaultValue:!1,description:`Whether an account already exists for this email.`},{id:Z(e()),path:Y(`form.emailValid`),type:`boolean`,defaultValue:!1,description:`Result of the email format check.`},{id:Z(e()),path:Y(`form.passwordStrong`),type:`boolean`,defaultValue:!1,description:`Result of the password-strength check.`},{id:Z(e()),path:Y(`form.termsAccepted`),type:`boolean`,defaultValue:!1,description:`True once the user has ticked the Terms of Service box.`}],rules:[{id:Q(e()),category:`business`,condition:{left:Y(`user.authenticated`),operator:`is_true`},effect:{id:X(e()),type:`show_message`,message:`You already have an account.`,tone:`info`},description:`Surface-level guard: signed-in users have no business creating a second account on this surface.`}],invariants:[{id:ye(e()),name:`form.termsAccepted is observable`,condition:{left:Y(`form.termsAccepted`),operator:`exists`},message:`Terms-accepted flag must always be present.`}],transitions:i,actions:[{id:fe(e()),name:`Create account`,intent:`Create a new customer account from email and password.`,parameters:[{id:xe(e()),name:`email`,type:`string`,required:!0,description:`New user email address. Bound to user.email so downstream rules and actions can read the value the user typed.`,resourceId:r,bindToStatePath:Y(`user.email`),validations:[{type:`email`},{type:`non_empty`}]},{id:xe(e()),name:`password`,type:`string`,required:!0,description:`New user password.`,validations:[{type:`non_empty`},{type:`min_length`,value:8}]},{id:xe(e()),name:`acceptTerms`,type:`boolean`,required:!0,defaultValue:!1,description:`Must be true. Bound to form.termsAccepted so the compliance rule reads the actual checkbox value before evaluating.`,bindToStatePath:Y(`form.termsAccepted`)}],requiredStates:[Y(`form.emailValid`),Y(`form.passwordStrong`),Y(`form.termsAccepted`),Y(`user.exists`)],rules:[{id:Q(e()),category:`compliance`,condition:{left:Y(`form.termsAccepted`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Accept the Terms of Service to continue.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`form.emailValid`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Enter a valid email address.`}},{id:Q(e()),category:`security`,condition:{left:Y(`form.passwordStrong`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Password must be at least 8 characters with letters and numbers.`}},{id:Q(e()),category:`business`,condition:{left:Y(`user.exists`),operator:`is_true`},effect:{id:X(e()),type:`block_action`,reason:`An account with this email already exists. Sign in instead.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`user.authenticated`),value:!0},{id:X(e()),type:`emit_event`,event:K(`user.account.created`)},...n.get(Kn.verifyEmail)?[{id:X(e()),type:`transition_surface`,target:n.get(Kn.verifyEmail)}]:[]],emittedEvents:[K(`user.account.created`)],transitions:[],scenarios:[{id:q(e()),name:`Email already taken`,description:`A new visitor tries to sign up with an address that already has an account.`,stateOverrides:[{path:Y(`user.exists`),value:!0},{path:Y(`form.emailValid`),value:!0},{path:Y(`form.passwordStrong`),value:!0},{path:Y(`form.termsAccepted`),value:!0}],parameterOverrides:[{parameterName:`email`,value:`existing@example.com`},{parameterName:`password`,value:`Welcome2026!`},{parameterName:`acceptTerms`,value:!0}]},{id:q(e()),name:`Terms not accepted`,description:`Form filled but the visitor has not ticked the Terms box.`,stateOverrides:[{path:Y(`user.exists`),value:!1},{path:Y(`form.emailValid`),value:!0},{path:Y(`form.passwordStrong`),value:!0},{path:Y(`form.termsAccepted`),value:!1}],parameterOverrides:[{parameterName:`email`,value:`new@example.com`},{parameterName:`password`,value:`Welcome2026!`},{parameterName:`acceptTerms`,value:!1}]},{id:q(e()),name:`Weak password`,description:`Visitor picks a password that fails the strength check.`,stateOverrides:[{path:Y(`user.exists`),value:!1},{path:Y(`form.emailValid`),value:!0},{path:Y(`form.passwordStrong`),value:!1},{path:Y(`form.termsAccepted`),value:!0}],parameterOverrides:[{parameterName:`email`,value:`new@example.com`},{parameterName:`password`,value:`short`},{parameterName:`acceptTerms`,value:!0}]},{id:q(e()),name:`Happy path`,description:`Everything passes. Account is created, action transitions to Verify email.`,stateOverrides:[{path:Y(`user.exists`),value:!1},{path:Y(`form.emailValid`),value:!0},{path:Y(`form.passwordStrong`),value:!0},{path:Y(`form.termsAccepted`),value:!0}],parameterOverrides:[{parameterName:`email`,value:`new@example.com`},{parameterName:`password`,value:`Welcome2026!`},{parameterName:`acceptTerms`,value:!0}]}]}]},resources:qn,personas:Jn}}},{id:Kn.verifyEmail,name:`Verify email`,category:`auth`,surfaceType:`screen`,summary:`One-time-code email verification with attempt limiting and resend.`,description:`Confirms email ownership using a 6-digit code. Caps the number of attempts, requires authentication, and exposes a Resend code action with implicit throttling. Wires back to Sign in.`,platforms:[`web`,`mobile`],tags:[`otp`,`email`,`verification`,`6-digit`,`gdpr`],siblings:[Kn.signIn,Kn.signUp],build:({ids:e,ownSurfaceId:t,linkTargets:n})=>{let r=J(`library-auth-res-tokens`),i=[n.get(Kn.signIn)&&{id:Ce(e()),target:n.get(Kn.signIn),label:`Back to sign in`}].filter(e=>!!e);return{surface:{id:t,name:`Verify email`,type:`screen`,description:`Enter the 6-digit code sent to the user email. Limited to 5 attempts; resend is available with a cooldown.`,stateDefinitions:[{id:Z(e()),path:Y(`user.authenticated`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`user.emailVerified`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`verification.code`),type:`string`,defaultValue:``,description:`Code typed by the user. Bound from the "code" parameter.`},{id:Z(e()),path:Y(`verification.codeMatches`),type:`boolean`,defaultValue:!1,description:`Result of comparing the entered code to the cached one.`},{id:Z(e()),path:Y(`verification.attempts`),type:`number`,defaultValue:0,description:`Consecutive failed verification attempts.`}],rules:[{id:Q(e()),category:`security`,condition:{left:Y(`user.authenticated`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Sign in before verifying your email.`},description:`Surface-level gate that applies to every action here.`}],invariants:[{id:ye(e()),name:`verification.attempts is non-negative`,condition:{left:Y(`verification.attempts`),operator:`greater_than`,right:-1},message:`Verification-attempts counter must be ≥ 0.`}],transitions:i,actions:[{id:fe(e()),name:`Verify email`,intent:`Confirm email ownership using the 6-digit code.`,parameters:[{id:xe(e()),name:`code`,type:`string`,required:!0,description:`The 6-digit code from the verification email. Bound to verification.code.`,resourceId:r,bindToStatePath:Y(`verification.code`),validations:[{type:`non_empty`},{type:`length`,value:6},{type:`alphanumeric`}]}],requiredStates:[Y(`verification.codeMatches`),Y(`verification.attempts`)],rules:[{id:Q(e()),category:`security`,condition:{left:Y(`verification.attempts`),operator:`greater_than`,right:4},effect:{id:X(e()),type:`block_action`,reason:`Too many failed attempts. Request a new code.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`verification.codeMatches`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`That code is incorrect.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`user.emailVerified`),value:!0},{id:X(e()),type:`emit_event`,event:K(`user.email_verified`)},...n.get(Kn.signIn)?[{id:X(e()),type:`transition_surface`,target:n.get(Kn.signIn)}]:[]],emittedEvents:[K(`user.email_verified`)],transitions:[],scenarios:[{id:q(e()),name:`Pending verification`,description:`Just signed up. Authenticated, email unverified, no failed attempts yet. The default starting point for this surface.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`user.emailVerified`),value:!1},{path:Y(`verification.codeMatches`),value:!0},{path:Y(`verification.attempts`),value:0}],parameterOverrides:[{parameterName:`code`,value:`482919`}]},{id:q(e()),name:`Wrong code`,description:`User enters a code that does not match what was emailed.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`verification.codeMatches`),value:!1},{path:Y(`verification.attempts`),value:1}],parameterOverrides:[{parameterName:`code`,value:`111111`}]},{id:q(e()),name:`Too many attempts`,description:`User has burned through the attempt limit; the security rule blocks further tries.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`verification.attempts`),value:5},{path:Y(`verification.codeMatches`),value:!0}],parameterOverrides:[{parameterName:`code`,value:`482919`}]}]},{id:fe(e()),name:`Resend code`,intent:`Send a new 6-digit verification code to the user email.`,parameters:[],requiredStates:[],rules:[{id:Q(e()),category:`security`,condition:{left:Y(`verification.attempts`),operator:`greater_than`,right:9},effect:{id:X(e()),type:`block_action`,reason:`Resend cooldown. Try again in a few minutes.`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`verification.code_resent`)},{id:X(e()),type:`show_message`,message:`A new code has been sent to your email.`,tone:`info`}],emittedEvents:[K(`verification.code_resent`)],transitions:[],scenarios:[{id:q(e()),name:`Within cooldown`,description:`Resend triggered too soon after the previous one. The security rule blocks.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`verification.attempts`),value:12}],parameterOverrides:[]},{id:q(e()),name:`Fresh resend`,description:`No recent activity. The resend goes through.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`verification.attempts`),value:0}],parameterOverrides:[]}]}]},resources:qn,personas:Jn}}},Yn],Zn={catalog:Gn(`library.commerce.catalog`),productDetails:Gn(`library.commerce.product_details`),cart:Gn(`library.commerce.cart`),checkout:Gn(`library.commerce.checkout`),orderConfirmation:Gn(`library.commerce.order_confirmation`)},Qn=[{id:J(`library-commerce-res-products`),name:`Product catalog`,description:`Catalog of products with prices, stock, and metadata.`,kind:`document_db`,provider:`MongoDB Atlas`,scope:`cloud`,location:`multi-region`,database:`commerce`,container:`products`,field:void 0,sensitivity:`public`,containsPii:!1,complianceTags:[],accessMode:`read`,authentication:`service_account`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`indefinite`,owner:`catalog-team`},{id:J(`library-commerce-res-cart`),name:`Cart (browser)`,description:`Per-device cart, synced to server when authenticated.`,kind:`browser_storage`,provider:`IndexedDB`,scope:`local`,location:`User's browser`,database:`shop`,container:`cart`,field:void 0,sensitivity:`internal`,containsPii:!1,complianceTags:[],accessMode:`read_write`,authentication:`none`,encryptionAtRest:!1,encryptionInTransit:!1,retention:`until browser data is cleared`,owner:`web-team`},{id:J(`library-commerce-res-orders`),name:`Orders (Postgres)`,description:`Order ledger. Source of truth for fulfillment and finance.`,kind:`relational_db`,provider:`PostgreSQL`,scope:`cloud`,location:`eu-west (configurable)`,database:`commerce`,container:`orders`,field:void 0,sensitivity:`confidential`,containsPii:!0,complianceTags:[`gdpr`,`sox`],accessMode:`read_write`,authentication:`iam_role`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`7 years (tax compliance)`,owner:`orders-team`},{id:J(`library-commerce-res-payments`),name:`Payments API`,description:`External payment processor. Card details never touch our servers.`,kind:`http_api`,provider:`Stripe`,scope:`external`,location:`us-east`,database:`https://api.stripe.com`,container:`/v1/payment_intents`,field:void 0,sensitivity:`restricted`,containsPii:!0,complianceTags:[`pci_dss`],accessMode:`read_write`,authentication:`api_key`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`managed by provider`,owner:`payments-team`}],$n={id:Zn.cart,name:`Cart`,category:`commerce`,surfaceType:`screen`,summary:`Shopping cart with quantity edits, auth gate, and checkout entry.`,description:`Cart review surface. Edits quantities, gates checkout on authentication, and emits navigation events. Cross-links to the auth library when both bundles are present (sign-in gate).`,platforms:[`web`,`mobile`],tags:[`cart`,`checkout-gate`,`quantity`],siblings:[Zn.catalog,Zn.checkout,Kn.signIn],build:({ids:e,ownSurfaceId:t,linkTargets:n})=>{let r=J(`library-commerce-res-cart`),i=[n.get(Zn.catalog)&&{id:Ce(e()),target:n.get(Zn.catalog),label:`Continue shopping`},n.get(Kn.signIn)&&{id:Ce(e()),target:n.get(Kn.signIn),label:`Sign in to checkout`},n.get(Zn.checkout)&&{id:Ce(e()),target:n.get(Zn.checkout),label:`Checkout`}].filter(e=>!!e);return{surface:{id:t,name:`Cart`,type:`screen`,description:`Cart review with quantity edits, auth gate, and checkout entry. Empty-cart hint blocks navigation onward.`,stateDefinitions:[{id:Z(e()),path:Y(`cart.itemCount`),type:`number`,defaultValue:0},{id:Z(e()),path:Y(`cart.subtotal`),type:`number`,defaultValue:0,description:`Subtotal in cents.`},{id:Z(e()),path:Y(`user.authenticated`),type:`boolean`,defaultValue:!1}],rules:[],invariants:[{id:ye(e()),name:`cart.itemCount ≥ 0`,condition:{left:Y(`cart.itemCount`),operator:`greater_than`,right:-1},message:`Cart count must be ≥ 0.`}],transitions:i,actions:[{id:fe(e()),name:`Update quantity`,intent:`Change the quantity of an item already in the cart.`,parameters:[{id:xe(e()),name:`newQuantity`,type:`number`,required:!0,description:`New quantity for the line item. Bound to cart.itemCount.`,resourceId:r,bindToStatePath:Y(`cart.itemCount`),validations:[{type:`min`,value:0},{type:`integer`}]}],requiredStates:[Y(`cart.itemCount`)],rules:[{id:Q(e()),category:`validation`,condition:{left:Y(`cart.itemCount`),operator:`lower_than`,right:0},effect:{id:X(e()),type:`block_action`,reason:`Quantity cannot be negative.`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`cart.quantity.updated`)}],emittedEvents:[K(`cart.quantity.updated`)],transitions:[]},{id:fe(e()),name:`Proceed to checkout`,intent:`Move from the cart to checkout, gated on authentication.`,parameters:[],requiredStates:[Y(`cart.itemCount`),Y(`user.authenticated`)],rules:[{id:Q(e()),category:`business`,condition:{left:Y(`cart.itemCount`),operator:`equals`,right:0},effect:{id:X(e()),type:`block_action`,reason:`Add something to your cart first.`}},{id:Q(e()),category:`permissions`,condition:{left:Y(`user.authenticated`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Sign in to continue to checkout.`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`checkout.started`)},...n.get(Zn.checkout)?[{id:X(e()),type:`transition_surface`,target:n.get(Zn.checkout)}]:[]],emittedEvents:[K(`checkout.started`)],transitions:[],scenarios:[{id:q(e()),name:`Guest with items`,description:`Cart has items but the user is not signed in. Auth rule blocks.`,stateOverrides:[{path:Y(`cart.itemCount`),value:2},{path:Y(`user.authenticated`),value:!1}],parameterOverrides:[]},{id:q(e()),name:`Signed-in with items`,description:`Authenticated user with a non-empty cart. Checkout proceeds.`,stateOverrides:[{path:Y(`cart.itemCount`),value:2},{path:Y(`user.authenticated`),value:!0}],parameterOverrides:[]},{id:q(e()),name:`Empty cart`,description:`No items. Empty-cart rule blocks.`,stateOverrides:[{path:Y(`cart.itemCount`),value:0}],parameterOverrides:[]}]}]},resources:Qn}}},er={id:Zn.catalog,name:`Catalog`,category:`commerce`,surfaceType:`screen`,summary:`Browse and search products. Empty-query hints, navigation to product details and cart.`,description:`Storefront catalog page. Customers can search by keyword, navigate to product details, or jump to their cart. Search query binds to state so filter / suggestion rules can react.`,platforms:[`web`,`mobile`],tags:[`catalog`,`search`,`browse`,`storefront`],siblings:[Zn.productDetails,Zn.cart],build:({ids:e,ownSurfaceId:t,linkTargets:n})=>{let r=J(`library-commerce-res-products`),i=[n.get(Zn.productDetails)&&{id:Ce(e()),target:n.get(Zn.productDetails),label:`Open product`},n.get(Zn.cart)&&{id:Ce(e()),target:n.get(Zn.cart),label:`View cart`}].filter(e=>!!e);return{surface:{id:t,name:`Catalog`,type:`screen`,description:`Open browsing surface. Anonymous and authenticated users can search and add to a cart.`,stateDefinitions:[{id:Z(e()),path:Y(`search.query`),type:`string`,defaultValue:``,description:`Active keyword query. Bound from the search input.`},{id:Z(e()),path:Y(`search.resultCount`),type:`number`,defaultValue:0,description:`Number of products matching the active query.`},{id:Z(e()),path:Y(`cart.itemCount`),type:`number`,defaultValue:0}],rules:[],invariants:[{id:ye(e()),name:`search.resultCount is non-negative`,condition:{left:Y(`search.resultCount`),operator:`greater_than`,right:-1},message:`Result count must be ≥ 0.`}],transitions:i,actions:[{id:fe(e()),name:`Search products`,intent:`Run a keyword search and update the catalog grid.`,parameters:[{id:xe(e()),name:`query`,type:`string`,required:!0,description:`Keyword(s) typed by the user. Bound to search.query.`,resourceId:r,bindToStatePath:Y(`search.query`),validations:[{type:`max_length`,value:200}]}],requiredStates:[Y(`search.query`)],rules:[{id:Q(e()),category:`validation`,condition:{left:Y(`search.query`),operator:`equals`,right:``},effect:{id:X(e()),type:`show_message`,message:`Type something to start searching.`,tone:`info`},description:`Soft hint when the query is empty. Non-blocking.`}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`catalog.search.executed`)}],emittedEvents:[K(`catalog.search.executed`)],transitions:[],scenarios:[{id:q(e()),name:`Empty query`,description:`User submits an empty search. Soft hint fires.`,stateOverrides:[{path:Y(`search.query`),value:``}],parameterOverrides:[{parameterName:`query`,value:``}]},{id:q(e()),name:`Specific keyword`,description:`A focused query that should match products.`,stateOverrides:[{path:Y(`search.resultCount`),value:12}],parameterOverrides:[{parameterName:`query`,value:`kindle`}]}]},{id:fe(e()),name:`View cart`,intent:`Navigate to the cart surface.`,parameters:[],requiredStates:[Y(`cart.itemCount`)],rules:[{id:Q(e()),category:`ux_feedback`,condition:{left:Y(`cart.itemCount`),operator:`equals`,right:0},effect:{id:X(e()),type:`show_message`,message:`Your cart is empty.`,tone:`info`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`navigation.cart.opened`)},...n.get(Zn.cart)?[{id:X(e()),type:`transition_surface`,target:n.get(Zn.cart)}]:[]],emittedEvents:[K(`navigation.cart.opened`)],transitions:[]}]},resources:Qn}}},tr={id:Zn.checkout,name:`Checkout`,category:`commerce`,surfaceType:`workflow`,summary:`Multi-step checkout: address, payment, place order. PCI-aware.`,description:`Multi-step purchase flow. Each step is gated by the previous one (address → payment → review → place). Place order runs fraud + compliance rules and emits the order.placed event.`,platforms:[`web`,`mobile`],tags:[`checkout`,`payment`,`pci`,`fraud`,`compliance`],siblings:[Zn.cart,Zn.orderConfirmation],build:({ids:e,ownSurfaceId:t,linkTargets:n})=>{let r=J(`library-commerce-res-payments`),i=[n.get(Zn.cart)&&{id:Ce(e()),target:n.get(Zn.cart),label:`Back to cart`},n.get(Zn.orderConfirmation)&&{id:Ce(e()),target:n.get(Zn.orderConfirmation),label:`Order confirmation`}].filter(e=>!!e);return{surface:{id:t,name:`Checkout`,type:`workflow`,description:`Linear three-step checkout. State machine progresses through address → payment → review.`,stateDefinitions:[{id:Z(e()),path:Y(`checkout.step`),type:`enum`,enumValues:[`address`,`payment`,`review`],defaultValue:`address`,description:`Active step in the checkout funnel.`},{id:Z(e()),path:Y(`payment.method`),type:`enum`,enumValues:[`card`,`paypal`,`gift_card`],defaultValue:`card`},{id:Z(e()),path:Y(`payment.cardValid`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`shipping.addressConfirmed`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`order.amount`),type:`number`,defaultValue:0,description:`Order total in cents.`},{id:Z(e()),path:Y(`fraud.flagged`),type:`boolean`,defaultValue:!1}],rules:[{id:Q(e()),category:`security`,condition:{left:Y(`fraud.flagged`),operator:`is_true`},effect:{id:X(e()),type:`block_action`,reason:`This account is under review and cannot place orders.`},description:`Surface-level fraud gate. Blocks every action if the account is flagged.`}],invariants:[{id:ye(e()),name:`order.amount is non-negative`,condition:{left:Y(`order.amount`),operator:`greater_than`,right:-1},message:`Order total must be ≥ 0.`}],transitions:i,actions:[{id:fe(e()),name:`Select payment method`,intent:`Pick how the customer will pay and advance to review.`,parameters:[{id:xe(e()),name:`method`,type:`enum`,enumValues:[`card`,`paypal`,`gift_card`],required:!0,description:`Payment method picked. Bound to payment.method.`,resourceId:r,bindToStatePath:Y(`payment.method`)}],requiredStates:[Y(`checkout.step`),Y(`shipping.addressConfirmed`),Y(`payment.cardValid`),Y(`fraud.flagged`)],rules:[{id:Q(e()),category:`security`,condition:{left:Y(`fraud.flagged`),operator:`is_true`},effect:{id:X(e()),type:`block_action`,reason:`Account under review. Cannot select a payment method.`}},{id:Q(e()),category:`business`,condition:{left:Y(`checkout.step`),operator:`not_equals`,right:`payment`},effect:{id:X(e()),type:`block_action`,reason:`You are not on the payment step.`}},{id:Q(e()),category:`business`,condition:{left:Y(`shipping.addressConfirmed`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Confirm a shipping address first.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`payment.cardValid`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Card declined. Try a different payment method.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`checkout.step`),value:`review`},{id:X(e()),type:`emit_event`,event:K(`checkout.payment.selected`)}],emittedEvents:[K(`checkout.payment.selected`)],transitions:[]},{id:fe(e()),name:`Place order`,intent:`Finalize the order, run fraud + compliance, advance to confirmation.`,parameters:[],requiredStates:[Y(`checkout.step`),Y(`order.amount`),Y(`fraud.flagged`)],rules:[{id:Q(e()),category:`business`,condition:{left:Y(`checkout.step`),operator:`not_equals`,right:`review`},effect:{id:X(e()),type:`block_action`,reason:`Complete the previous steps first.`}},{id:Q(e()),category:`compliance`,condition:{left:Y(`order.amount`),operator:`greater_than`,right:2e5},effect:{id:X(e()),type:`show_message`,message:`Large order. Additional review may apply.`,tone:`warning`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`order.placed`)},{id:X(e()),type:`show_message`,message:`Order placed. Confirmation on its way.`,tone:`success`},...n.get(Zn.orderConfirmation)?[{id:X(e()),type:`transition_surface`,target:n.get(Zn.orderConfirmation)}]:[]],emittedEvents:[K(`order.placed`)],transitions:[],scenarios:[{id:q(e()),name:`Wrong step`,description:`Customer is on the address step. Place order should block.`,stateOverrides:[{path:Y(`checkout.step`),value:`address`},{path:Y(`fraud.flagged`),value:!1}],parameterOverrides:[]},{id:q(e()),name:`Fraud flagged`,description:`Account is flagged. Surface-level rule blocks.`,stateOverrides:[{path:Y(`fraud.flagged`),value:!0}],parameterOverrides:[]},{id:q(e()),name:`Large order`,description:`Order over $2,000. Compliance warning fires (non-blocking).`,stateOverrides:[{path:Y(`checkout.step`),value:`review`},{path:Y(`fraud.flagged`),value:!1},{path:Y(`order.amount`),value:25e4}],parameterOverrides:[]},{id:q(e()),name:`Happy path`,description:`Standard order. Action succeeds.`,stateOverrides:[{path:Y(`checkout.step`),value:`review`},{path:Y(`fraud.flagged`),value:!1},{path:Y(`order.amount`),value:4598}],parameterOverrides:[]}]}]},resources:Qn}}},nr={id:Zn.orderConfirmation,name:`Order confirmation`,category:`commerce`,surfaceType:`screen`,summary:`Post-purchase confirmation with order summary and cancel option.`,description:`Shows the customer their order id and total. Cancel-order action is gated on order status (cancellable until shipped).`,platforms:[`web`,`mobile`],tags:[`order`,`confirmation`,`cancel`],siblings:[Zn.catalog],build:({ids:e,ownSurfaceId:t,linkTargets:n})=>{let r=[n.get(Zn.catalog)&&{id:Ce(e()),target:n.get(Zn.catalog),label:`Continue shopping`}].filter(e=>!!e);return{surface:{id:t,name:`Order confirmation`,type:`screen`,description:`Order summary screen shown after a successful purchase.`,stateDefinitions:[{id:Z(e()),path:Y(`order.status`),type:`enum`,enumValues:[`pending`,`paid`,`shipped`,`delivered`,`cancelled`],defaultValue:`paid`},{id:Z(e()),path:Y(`order.amount`),type:`number`,defaultValue:0},{id:Z(e()),path:Y(`order.id`),type:`string`,defaultValue:``}],rules:[],invariants:[{id:ye(e()),name:`order.id is observable`,condition:{left:Y(`order.id`),operator:`exists`},message:`Order id must always be present on the confirmation surface.`}],transitions:r,actions:[{id:fe(e()),name:`Cancel order`,intent:`Customer-initiated cancellation while the order is still cancellable.`,parameters:[],requiredStates:[Y(`order.status`)],rules:[{id:Q(e()),category:`business`,condition:{left:Y(`order.status`),operator:`equals`,right:`shipped`},effect:{id:X(e()),type:`block_action`,reason:`Order has shipped. Contact support for a return.`}},{id:Q(e()),category:`business`,condition:{left:Y(`order.status`),operator:`equals`,right:`cancelled`},effect:{id:X(e()),type:`block_action`,reason:`Order is already cancelled.`}},{id:Q(e()),category:`permissions`,condition:{left:Y(`order.status`),operator:`equals`,right:`delivered`},effect:{id:X(e()),type:`block_action`,reason:`Order has been delivered. Start a return instead.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`order.status`),value:`cancelled`},{id:X(e()),type:`emit_event`,event:K(`order.cancelled`)},{id:X(e()),type:`show_message`,message:`Order cancelled. Refund on its way.`,tone:`success`}],emittedEvents:[K(`order.cancelled`)],transitions:[],scenarios:[{id:q(e()),name:`Already shipped`,description:`Order has shipped. Cancel blocks.`,stateOverrides:[{path:Y(`order.status`),value:`shipped`}],parameterOverrides:[]},{id:q(e()),name:`Pending cancel`,description:`Order is paid but not yet shipped. Cancel succeeds.`,stateOverrides:[{path:Y(`order.status`),value:`paid`}],parameterOverrides:[]}]}]},resources:[Qn.find(e=>e.id===J(`library-commerce-res-orders`))]}}},rr=[er,{id:Zn.productDetails,name:`Product details`,category:`commerce`,surfaceType:`screen`,summary:`Product page with stock-aware add-to-cart and age-gating.`,description:`Standard PDP. Customers view a product, pick a quantity, and add it to the cart. Out-of-stock and age-restricted products are blocked at the rule layer.`,platforms:[`web`,`mobile`],tags:[`product`,`pdp`,`add-to-cart`,`stock`],siblings:[Zn.catalog,Zn.cart],build:({ids:e,ownSurfaceId:t,linkTargets:n})=>{let r=J(`library-commerce-res-products`),i=J(`library-commerce-res-cart`),a=[n.get(Zn.catalog)&&{id:Ce(e()),target:n.get(Zn.catalog),label:`Back to catalog`},n.get(Zn.cart)&&{id:Ce(e()),target:n.get(Zn.cart),label:`Go to cart`}].filter(e=>!!e);return{surface:{id:t,name:`Product details`,type:`screen`,description:`Detail page for a single product. Shows price, stock, add-to-cart button.`,stateDefinitions:[{id:Z(e()),path:Y(`product.viewing`),type:`string`,defaultValue:``,description:`ID of the product currently displayed. Bound from "productId".`},{id:Z(e()),path:Y(`product.stock`),type:`number`,defaultValue:12,description:`Stock count for the focused product.`},{id:Z(e()),path:Y(`product.price`),type:`number`,defaultValue:1999,description:`Unit price in cents.`},{id:Z(e()),path:Y(`product.ageRestricted`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`user.age`),type:`number`,defaultValue:30},{id:Z(e()),path:Y(`cart.itemCount`),type:`number`,defaultValue:0},{id:Z(e()),path:Y(`user.suspended`),type:`boolean`,defaultValue:!1}],rules:[],invariants:[{id:ye(e()),name:`product.stock is non-negative`,condition:{left:Y(`product.stock`),operator:`greater_than`,right:-1},message:`Stock must never go below zero.`}],transitions:a,actions:[{id:fe(e()),name:`View product`,intent:`Open the product detail page.`,parameters:[{id:xe(e()),name:`productId`,type:`string`,required:!0,description:`ID of the product to display. Bound to product.viewing.`,resourceId:r,bindToStatePath:Y(`product.viewing`),validations:[{type:`non_empty`},{type:`slug`}]}],requiredStates:[Y(`product.viewing`),Y(`product.ageRestricted`)],rules:[{id:Q(e()),category:`validation`,condition:{left:Y(`product.viewing`),operator:`equals`,right:``},effect:{id:X(e()),type:`block_action`,reason:`No product selected.`}},{id:Q(e()),category:`compliance`,condition:{left:Y(`user.age`),operator:`lower_than`,right:18},effect:{id:X(e()),type:`block_action`,reason:`You must be 18+ to view this product.`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`product.viewed`)}],emittedEvents:[K(`product.viewed`)],transitions:[],scenarios:[{id:q(e()),name:`Underage on age-restricted`,description:`Under-18 user views an age-gated product. Block fires.`,stateOverrides:[{path:Y(`user.age`),value:14},{path:Y(`product.ageRestricted`),value:!0}],parameterOverrides:[{parameterName:`productId`,value:`knife-set-pro`}]},{id:q(e()),name:`Standard product`,description:`Adult user views a regular product. No rules block.`,stateOverrides:[{path:Y(`user.age`),value:30},{path:Y(`product.ageRestricted`),value:!1}],parameterOverrides:[{parameterName:`productId`,value:`kindle-paperwhite`}]}]},{id:fe(e()),name:`Add to cart`,intent:`Add the focused product to the cart with the chosen quantity.`,parameters:[{id:xe(e()),name:`quantity`,type:`number`,required:!0,defaultValue:1,description:`How many units to add.`,resourceId:i,validations:[{type:`min`,value:1},{type:`integer`}]}],requiredStates:[Y(`product.stock`),Y(`cart.itemCount`)],rules:[{id:Q(e()),category:`permissions`,condition:{left:Y(`user.suspended`),operator:`is_true`},effect:{id:X(e()),type:`block_action`,reason:`Account is suspended. Cannot add to cart.`}},{id:Q(e()),category:`business`,condition:{left:Y(`product.stock`),operator:`lower_than`,right:1},effect:{id:X(e()),type:`block_action`,reason:`Out of stock.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`product.viewing`),operator:`equals`,right:``},effect:{id:X(e()),type:`block_action`,reason:`No product selected.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`cart.itemCount`),value:1},{id:X(e()),type:`emit_event`,event:K(`cart.item.added`)},{id:X(e()),type:`show_message`,message:`Added to cart.`,tone:`success`}],emittedEvents:[K(`cart.item.added`)],transitions:[],scenarios:[{id:q(e()),name:`Out of stock`,description:`Product has zero stock. Block fires.`,stateOverrides:[{path:Y(`product.stock`),value:0}],parameterOverrides:[{parameterName:`quantity`,value:1}]},{id:q(e()),name:`Happy path`,description:`Stock available, valid product. Action succeeds.`,stateOverrides:[{path:Y(`product.stock`),value:10},{path:Y(`product.viewing`),value:`kindle-paperwhite`}],parameterOverrides:[{parameterName:`quantity`,value:1}]}]}]},resources:Qn}}},$n,tr,nr],ir=Gn(`library.content.reviews`),ar=J(`library-content-res-reviews`),or=J(`library-content-res-moderation`),sr=[{id:ar,name:`Product reviews (DynamoDB)`,description:`Customer-written reviews. Public read, moderated write. PII via reviewer name.`,kind:`document_db`,provider:`AWS DynamoDB`,scope:`cloud`,location:`eu-west`,database:`commerce`,container:`product-reviews`,field:void 0,sensitivity:`internal`,containsPii:!0,complianceTags:[`gdpr`],accessMode:`read_write`,authentication:`iam_role`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`until product delisted + 1 year`,owner:`community-team`},{id:or,name:`Text moderation API`,description:`External moderation API used to flag profanity in user-generated text.`,kind:`http_api`,provider:`Perspective API`,scope:`external`,location:`us-east`,database:`https://commentanalyzer.googleapis.com`,container:`/v1alpha1/comments:analyze`,field:void 0,sensitivity:`internal`,containsPii:!0,complianceTags:[`gdpr`],accessMode:`read_write`,authentication:`api_key`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`managed by provider`,owner:`trust-and-safety-team`}],cr=[{id:ir,name:`Reviews`,category:`content`,surfaceType:`screen`,summary:`Read, filter, and submit product reviews with profanity moderation.`,description:`A reviews surface for any catalog item. Filter by minimum stars or verified-only, submit a new review (moderated), or upvote helpful ones. Cross-links to Product details when both bundles are present.`,platforms:[`web`,`mobile`],tags:[`reviews`,`comments`,`rating`,`moderation`,`community`],siblings:[Zn.productDetails],build:({ids:e,ownSurfaceId:t,linkTargets:n})=>{let r=[n.get(Zn.productDetails)&&{id:Ce(e()),target:n.get(Zn.productDetails),label:`Back to product`}].filter(e=>!!e);return{surface:{id:t,name:`Reviews`,type:`screen`,description:`Browse and submit reviews for the product currently in product.viewing.`,stateDefinitions:[{id:Z(e()),path:Y(`product.viewing`),type:`string`,defaultValue:``},{id:Z(e()),path:Y(`reviews.filter.minRating`),type:`number`,defaultValue:1,description:`Minimum-stars filter. Bound from "minRating".`},{id:Z(e()),path:Y(`review.rating`),type:`number`,defaultValue:5,description:`Star rating typed by the user. Bound from "rating".`},{id:Z(e()),path:Y(`review.text`),type:`string`,defaultValue:``,description:`Review body. Bound from "reviewText".`},{id:Z(e()),path:Y(`review.profanityFlagged`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`user.authenticated`),type:`boolean`,defaultValue:!1}],rules:[{id:Q(e()),category:`permissions`,condition:{left:Y(`user.authenticated`),operator:`is_false`},effect:{id:X(e()),type:`show_message`,message:`Sign in to submit or vote on reviews.`,tone:`info`},description:`Surface-level hint for guests; specific actions still gate.`}],invariants:[{id:ye(e()),name:`review.rating in [1, 5]`,condition:{left:Y(`review.rating`),operator:`greater_than`,right:0},message:`Rating must be at least 1 star.`}],transitions:r,actions:[{id:fe(e()),name:`Filter reviews`,intent:`Narrow the list by minimum rating.`,parameters:[{id:xe(e()),name:`minRating`,type:`number`,required:!0,description:`Minimum stars to show. Bound to reviews.filter.minRating.`,resourceId:ar,bindToStatePath:Y(`reviews.filter.minRating`),validations:[{type:`min`,value:1},{type:`max`,value:5},{type:`integer`}]}],requiredStates:[Y(`reviews.filter.minRating`)],rules:[{id:Q(e()),category:`validation`,condition:{left:Y(`reviews.filter.minRating`),operator:`lower_than`,right:1},effect:{id:X(e()),type:`block_action`,reason:`Minimum rating must be at least 1.`}},{id:Q(e()),category:`ux_feedback`,condition:{left:Y(`reviews.filter.minRating`),operator:`equals`,right:5},effect:{id:X(e()),type:`show_message`,message:`Only 5-star reviews shown. Widen the filter for balance.`,tone:`info`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`reviews.filtered`)}],emittedEvents:[K(`reviews.filtered`)],transitions:[]},{id:fe(e()),name:`Submit review`,intent:`Post a customer review of the focused product.`,parameters:[{id:xe(e()),name:`rating`,type:`number`,required:!0,description:`Star rating 1–5. Bound to review.rating.`,resourceId:ar,bindToStatePath:Y(`review.rating`),validations:[{type:`min`,value:1},{type:`max`,value:5},{type:`integer`}]},{id:xe(e()),name:`reviewText`,type:`string`,required:!0,description:`Free-text review body. Bound to review.text.`,resourceId:ar,bindToStatePath:Y(`review.text`),validations:[{type:`non_empty`},{type:`min_length`,value:10},{type:`max_length`,value:5e3}]}],requiredStates:[Y(`review.rating`),Y(`review.text`),Y(`review.profanityFlagged`),Y(`user.authenticated`)],rules:[{id:Q(e()),category:`permissions`,condition:{left:Y(`user.authenticated`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Sign in to submit a review.`}},{id:Q(e()),category:`compliance`,condition:{left:Y(`review.profanityFlagged`),operator:`is_true`},effect:{id:X(e()),type:`block_action`,reason:`Review violates community guidelines.`}},{id:Q(e()),category:`business`,condition:{left:Y(`review.text`),operator:`contains`,right:`http`},effect:{id:X(e()),type:`block_action`,reason:`Reviews cannot contain links.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`review.rating`),operator:`lower_than`,right:1},effect:{id:X(e()),type:`block_action`,reason:`Pick a rating between 1 and 5.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`review.profanityFlagged`),value:!1},{id:X(e()),type:`emit_event`,event:K(`review.submitted`)},{id:X(e()),type:`show_message`,message:`Thanks. Your review is published.`,tone:`success`}],emittedEvents:[K(`review.submitted`)],transitions:[],scenarios:[{id:q(e()),name:`Guest tries to post`,description:`Unauthenticated user. Permissions rule blocks.`,stateOverrides:[{path:Y(`user.authenticated`),value:!1}],parameterOverrides:[{parameterName:`rating`,value:5},{parameterName:`reviewText`,value:`Loved it. Buying again.`}]},{id:q(e()),name:`Contains a link`,description:`Review body has "http". No-links rule blocks.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`review.profanityFlagged`),value:!1}],parameterOverrides:[{parameterName:`rating`,value:1},{parameterName:`reviewText`,value:`Bad. See https://example.com`}]},{id:q(e()),name:`Profanity flagged`,description:`Moderation API flagged the text. Compliance rule blocks.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`review.profanityFlagged`),value:!0}],parameterOverrides:[{parameterName:`rating`,value:2},{parameterName:`reviewText`,value:`Average quality, fits my needs.`}]},{id:q(e()),name:`Happy path`,description:`Authenticated, clean text. Review posts.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`review.profanityFlagged`),value:!1}],parameterOverrides:[{parameterName:`rating`,value:5},{parameterName:`reviewText`,value:`Loved it. Buying again.`}]}]}]},resources:sr}}}],lr=[{id:Gn(`library.onboarding.wizard`),name:`Onboarding wizard`,category:`onboarding`,surfaceType:`workflow`,summary:`Multi-step welcome flow: profile, preferences, finish.`,description:`A linear three-step wizard for new users. Each step gates on the previous one; the final step marks the user as onboarded and emits an event analytics can listen to.`,platforms:[`web`,`mobile`],tags:[`onboarding`,`wizard`,`first-run`,`profile`],build:({ids:e,ownSurfaceId:t})=>{let n=J(`library-onboarding-res-profile`);return{surface:{id:t,name:`Onboarding wizard`,type:`workflow`,description:`Three-step welcome: 1) profile, 2) preferences, 3) finish. State machine progresses through onboarding.step.`,stateDefinitions:[{id:Z(e()),path:Y(`onboarding.step`),type:`enum`,enumValues:[`profile`,`preferences`,`finish`],defaultValue:`profile`},{id:Z(e()),path:Y(`user.authenticated`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`user.fullName`),type:`string`,defaultValue:``},{id:Z(e()),path:Y(`user.onboarded`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`preferences.theme`),type:`enum`,enumValues:[`light`,`dark`,`system`],defaultValue:`system`}],rules:[{id:Q(e()),category:`security`,condition:{left:Y(`user.authenticated`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Sign in to continue your onboarding.`},description:`Surface-level gate. Every wizard step requires authentication.`}],invariants:[{id:ye(e()),name:`onboarding.step is observable`,condition:{left:Y(`onboarding.step`),operator:`exists`},message:`Wizard step must always be present.`}],transitions:[],actions:[{id:fe(e()),name:`Save profile`,intent:`Capture the user full name and advance to preferences.`,parameters:[{id:xe(e()),name:`fullName`,type:`string`,required:!0,description:`Display name. Bound to user.fullName.`,resourceId:n,bindToStatePath:Y(`user.fullName`),validations:[{type:`non_empty`},{type:`min_length`,value:2},{type:`max_length`,value:80}]}],requiredStates:[Y(`onboarding.step`),Y(`user.fullName`)],rules:[{id:Q(e()),category:`business`,condition:{left:Y(`onboarding.step`),operator:`not_equals`,right:`profile`},effect:{id:X(e()),type:`block_action`,reason:`You are not on the profile step.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`user.fullName`),operator:`equals`,right:``},effect:{id:X(e()),type:`block_action`,reason:`Full name is required.`}},{id:Q(e()),category:`compliance`,condition:{left:Y(`user.fullName`),operator:`contains`,right:`@`},effect:{id:X(e()),type:`block_action`,reason:`Use a real name, not an email address.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`onboarding.step`),value:`preferences`},{id:X(e()),type:`emit_event`,event:K(`onboarding.profile.saved`)}],emittedEvents:[K(`onboarding.profile.saved`)],transitions:[],scenarios:[{id:q(e()),name:`Wrong step`,description:`User is on preferences but somehow triggers profile-save.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`onboarding.step`),value:`preferences`}],parameterOverrides:[{parameterName:`fullName`,value:`Anna`}]},{id:q(e()),name:`Email instead of name`,description:`User pastes an email. Compliance rule blocks.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`onboarding.step`),value:`profile`}],parameterOverrides:[{parameterName:`fullName`,value:`a@b.co`}]}]},{id:fe(e()),name:`Save preferences`,intent:`Capture theme preference and advance to finish.`,parameters:[{id:xe(e()),name:`theme`,type:`enum`,enumValues:[`light`,`dark`,`system`],required:!0,description:`UI theme. Bound to preferences.theme.`,resourceId:n,bindToStatePath:Y(`preferences.theme`)}],requiredStates:[Y(`onboarding.step`),Y(`preferences.theme`)],rules:[{id:Q(e()),category:`business`,condition:{left:Y(`onboarding.step`),operator:`not_equals`,right:`preferences`},effect:{id:X(e()),type:`block_action`,reason:`Complete the profile step first.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`preferences.theme`),operator:`equals`,right:``},effect:{id:X(e()),type:`block_action`,reason:`Pick a theme.`}},{id:Q(e()),category:`permissions`,condition:{left:Y(`user.authenticated`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Sign in required.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`onboarding.step`),value:`finish`},{id:X(e()),type:`emit_event`,event:K(`onboarding.preferences.saved`)}],emittedEvents:[K(`onboarding.preferences.saved`)],transitions:[]},{id:fe(e()),name:`Finish onboarding`,intent:`Mark the user as onboarded and exit the wizard.`,parameters:[],requiredStates:[Y(`onboarding.step`)],rules:[{id:Q(e()),category:`business`,condition:{left:Y(`onboarding.step`),operator:`not_equals`,right:`finish`},effect:{id:X(e()),type:`block_action`,reason:`Complete the previous steps first.`}},{id:Q(e()),category:`permissions`,condition:{left:Y(`user.authenticated`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Sign in required.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`user.onboarded`),value:!0},{id:X(e()),type:`emit_event`,event:K(`onboarding.completed`)},{id:X(e()),type:`show_message`,message:`Welcome aboard!`,tone:`success`}],emittedEvents:[K(`onboarding.completed`)],transitions:[]}]},resources:[{id:n,name:`User profiles (Postgres)`,description:`User profile record. Name, preferences, onboarding state.`,kind:`relational_db`,provider:`PostgreSQL`,scope:`cloud`,location:`eu-west`,database:`identity`,container:`user_profiles`,field:void 0,sensitivity:`confidential`,containsPii:!0,complianceTags:[`gdpr`],accessMode:`read_write`,authentication:`iam_role`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`until account deletion + 30 days`,owner:`identity-team`}]}}}],ur={id:Gn(`library.utility.canvas`),name:`Canvas`,category:`utility`,surfaceType:`canvas`,summary:`Free-form Figma/Miro-style canvas with shape add, move, and selection.`,description:`A blank infinite canvas. Authenticated users add shapes/text/images, select and move them, and save snapshots. Element-count cap and viewer-vs-editor permission gating.`,platforms:[`web`],tags:[`canvas`,`whiteboard`,`figma`,`miro`,`collaboration`],build:({ids:e,ownSurfaceId:t})=>{let n=J(`library-utility-res-canvas-doc`),r=J(`library-utility-res-canvas-assets`);return{surface:{id:t,name:`Canvas`,type:`canvas`,description:`Free-form drawing surface. Each element has a position; selection state drives the right-side properties panel.`,stateDefinitions:[{id:Z(e()),path:Y(`canvas.elementCount`),type:`number`,defaultValue:0,description:`Total elements currently on the canvas.`},{id:Z(e()),path:Y(`canvas.maxElements`),type:`number`,defaultValue:500,description:`Plan limit. Writes are blocked once elementCount reaches this.`},{id:Z(e()),path:Y(`canvas.selectedId`),type:`string`,defaultValue:``,description:`ID of the currently focused element. Bound from selection actions.`},{id:Z(e()),path:Y(`canvas.role`),type:`enum`,enumValues:[`editor`,`viewer`],defaultValue:`viewer`,description:`Per-canvas access role for the active user.`},{id:Z(e()),path:Y(`user.authenticated`),type:`boolean`,defaultValue:!1}],rules:[{id:Q(e()),category:`permissions`,condition:{left:Y(`user.authenticated`),operator:`is_false`},effect:{id:X(e()),type:`show_message`,message:`You are viewing a shared canvas. Sign in to edit.`,tone:`info`},description:`Surface-level guard: anonymous visitors can view but each action gates writes.`}],invariants:[{id:ye(e()),name:`elementCount is non-negative`,condition:{left:Y(`canvas.elementCount`),operator:`greater_than`,right:-1},message:`Element count must be ≥ 0.`}],transitions:[],actions:[{id:fe(e()),name:`Add element`,intent:`Drop a new shape, text, or image on the canvas at a chosen position.`,parameters:[{id:xe(e()),name:`kind`,type:`enum`,enumValues:[`rectangle`,`ellipse`,`line`,`text`,`image`,`sticky_note`],required:!0,description:`What to add. Bound nowhere. Just drives the new element type.`,resourceId:n},{id:xe(e()),name:`position`,type:`string`,required:!0,description:"Stringified `{x, y}` of the drop point.",resourceId:n,validations:[{type:`non_empty`}]}],requiredStates:[Y(`canvas.elementCount`),Y(`canvas.maxElements`),Y(`canvas.role`)],rules:[{id:Q(e()),category:`permissions`,condition:{left:Y(`canvas.role`),operator:`not_equals`,right:`editor`},effect:{id:X(e()),type:`block_action`,reason:`You need editor access to add elements.`}},{id:Q(e()),category:`business`,condition:{left:Y(`canvas.elementCount`),operator:`greater_than`,right:499},effect:{id:X(e()),type:`block_action`,reason:`Element limit reached for this plan.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`canvas.role`),operator:`equals`,right:``},effect:{id:X(e()),type:`block_action`,reason:`Canvas role missing. Refresh.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`canvas.elementCount`),value:1},{id:X(e()),type:`emit_event`,event:K(`canvas.element.added`)}],emittedEvents:[K(`canvas.element.added`)],transitions:[],scenarios:[{id:q(e()),name:`Viewer tries to add`,description:`Viewer role. Permissions rule blocks.`,stateOverrides:[{path:Y(`canvas.role`),value:`viewer`},{path:Y(`canvas.elementCount`),value:12}],parameterOverrides:[{parameterName:`kind`,value:`rectangle`},{parameterName:`position`,value:`{"x":120,"y":80}`}]},{id:q(e()),name:`At plan limit`,description:`elementCount reached the cap. Business rule blocks.`,stateOverrides:[{path:Y(`canvas.role`),value:`editor`},{path:Y(`canvas.elementCount`),value:500}],parameterOverrides:[{parameterName:`kind`,value:`sticky_note`},{parameterName:`position`,value:`{"x":40,"y":40}`}]},{id:q(e()),name:`Happy path`,description:`Editor with room to add. Action succeeds.`,stateOverrides:[{path:Y(`canvas.role`),value:`editor`},{path:Y(`canvas.elementCount`),value:12}],parameterOverrides:[{parameterName:`kind`,value:`sticky_note`},{parameterName:`position`,value:`{"x":200,"y":150}`}]}]},{id:fe(e()),name:`Select element`,intent:`Focus a single element so the properties panel can edit it.`,parameters:[{id:xe(e()),name:`elementId`,type:`string`,required:!0,description:`ID to select. Bound to canvas.selectedId.`,resourceId:n,bindToStatePath:Y(`canvas.selectedId`),validations:[{type:`non_empty`}]}],requiredStates:[Y(`canvas.selectedId`)],rules:[{id:Q(e()),category:`validation`,condition:{left:Y(`canvas.selectedId`),operator:`equals`,right:``},effect:{id:X(e()),type:`block_action`,reason:`No element id provided.`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`canvas.element.selected`)}],emittedEvents:[K(`canvas.element.selected`)],transitions:[]},{id:fe(e()),name:`Delete selection`,intent:`Remove the currently selected element.`,parameters:[],requiredStates:[Y(`canvas.selectedId`),Y(`canvas.role`)],rules:[{id:Q(e()),category:`permissions`,condition:{left:Y(`canvas.role`),operator:`not_equals`,right:`editor`},effect:{id:X(e()),type:`block_action`,reason:`Editor access required to delete.`}},{id:Q(e()),category:`business`,condition:{left:Y(`canvas.selectedId`),operator:`equals`,right:``},effect:{id:X(e()),type:`block_action`,reason:`Select an element first.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`canvas.selectedId`),value:``},{id:X(e()),type:`emit_event`,event:K(`canvas.element.deleted`)}],emittedEvents:[K(`canvas.element.deleted`)],transitions:[]},{id:fe(e()),name:`Save canvas`,intent:`Persist the canvas snapshot to storage.`,parameters:[],requiredStates:[Y(`canvas.role`),Y(`user.authenticated`)],rules:[{id:Q(e()),category:`permissions`,condition:{left:Y(`user.authenticated`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Sign in to save your canvas.`}},{id:Q(e()),category:`permissions`,condition:{left:Y(`canvas.role`),operator:`not_equals`,right:`editor`},effect:{id:X(e()),type:`block_action`,reason:`Editor access required.`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`canvas.saved`)},{id:X(e()),type:`show_message`,message:`Canvas saved.`,tone:`success`}],emittedEvents:[K(`canvas.saved`)],transitions:[]}]},resources:[{id:n,name:`Canvas documents (Postgres)`,description:`Per-canvas document with elements, layers, and metadata.`,kind:`relational_db`,provider:`PostgreSQL`,scope:`cloud`,location:`eu-west`,database:`project`,container:`canvas_documents`,field:void 0,sensitivity:`internal`,containsPii:!1,complianceTags:[],accessMode:`read_write`,authentication:`iam_role`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`until canvas deleted`,owner:`project-team`},{id:r,name:`Canvas assets (S3)`,description:`Uploaded images and binary assets referenced by canvas elements.`,kind:`object_storage`,provider:`AWS S3`,scope:`cloud`,location:`eu-west`,database:`project-assets`,container:`canvas/`,field:void 0,sensitivity:`internal`,containsPii:!1,complianceTags:[],accessMode:`read_write`,authentication:`iam_role`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`90 days after canvas deleted`,owner:`project-team`}]}}},dr={id:Gn(`library.utility.cookie_consent`),name:`Cookie consent`,category:`utility`,surfaceType:`dialog_area`,summary:`GDPR cookie banner with granular consent toggles.`,description:`Modal dialog shown on first visit. The visitor accepts/rejects analytics, marketing, and functional cookies; choices persist in local storage and are auditable.`,platforms:[`web`,`mobile`],tags:[`gdpr`,`consent`,`cookies`,`compliance`,`modal`],build:({ids:e,ownSurfaceId:t})=>{let n=J(`library-utility-res-consent-log`);return{surface:{id:t,name:`Cookie consent`,type:`dialog_area`,description:`Modal banner. Visitors accept all, reject non-essential, or pick categories.`,stateDefinitions:[{id:Z(e()),path:Y(`consent.required`),type:`boolean`,defaultValue:!0,description:`True until the visitor has made a choice.`},{id:Z(e()),path:Y(`consent.analytics`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`consent.marketing`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`consent.functional`),type:`boolean`,defaultValue:!0,description:`Strictly-necessary cookies. Always on, not togglable.`}],rules:[],invariants:[{id:ye(e()),name:`consent.functional is always true`,condition:{left:Y(`consent.functional`),operator:`is_true`},message:`Functional cookies are strictly necessary and cannot be disabled.`}],transitions:[],actions:[{id:fe(e()),name:`Save preferences`,intent:`Persist the chosen consent toggles and dismiss the banner.`,parameters:[{id:xe(e()),name:`analytics`,type:`boolean`,required:!0,defaultValue:!1,description:`Allow analytics cookies. Bound to consent.analytics.`,resourceId:n,bindToStatePath:Y(`consent.analytics`)},{id:xe(e()),name:`marketing`,type:`boolean`,required:!0,defaultValue:!1,description:`Allow marketing cookies. Bound to consent.marketing.`,resourceId:n,bindToStatePath:Y(`consent.marketing`)}],requiredStates:[Y(`consent.required`),Y(`consent.functional`)],rules:[{id:Q(e()),category:`compliance`,condition:{left:Y(`consent.functional`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Functional cookies cannot be disabled.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`consent.required`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Consent already recorded.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`consent.required`),value:!1},{id:X(e()),type:`emit_event`,event:K(`consent.recorded`)},{id:X(e()),type:`show_message`,message:`Preferences saved.`,tone:`success`}],emittedEvents:[K(`consent.recorded`)],transitions:[],scenarios:[{id:q(e()),name:`Accept all`,description:`Visitor opts in to everything.`,stateOverrides:[{path:Y(`consent.required`),value:!0}],parameterOverrides:[{parameterName:`analytics`,value:!0},{parameterName:`marketing`,value:!0}]},{id:q(e()),name:`Reject non-essential`,description:`Visitor disables analytics and marketing.`,stateOverrides:[{path:Y(`consent.required`),value:!0}],parameterOverrides:[{parameterName:`analytics`,value:!1},{parameterName:`marketing`,value:!1}]}]}]},resources:[{id:n,name:`Consent log (Postgres)`,description:`Append-only log of consent choices for compliance audits.`,kind:`relational_db`,provider:`PostgreSQL`,scope:`cloud`,location:`eu-west`,database:`compliance`,container:`consent_log`,field:void 0,sensitivity:`confidential`,containsPii:!0,complianceTags:[`gdpr`],accessMode:`write`,authentication:`iam_role`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`7 years`,owner:`compliance-team`}]}}},fr={id:Gn(`library.utility.not_found`),name:`404. Not found`,category:`utility`,surfaceType:`screen`,summary:`A friendly not-found page that emits a missing-resource event for telemetry.`,description:`Drop-in catch-all surface for unknown routes. Emits page.not_found with the requested path so analytics can spot dead links.`,platforms:[`web`,`mobile`],tags:[`404`,`not-found`,`error`,`telemetry`],build:({ids:e,ownSurfaceId:t})=>({surface:{id:t,name:`404`,type:`screen`,description:`Shown when the user lands on a path the feature does not recognise.`,stateDefinitions:[{id:Z(e()),path:Y(`error.requestedPath`),type:`string`,defaultValue:``,description:`The path the user tried to reach. Recorded for telemetry.`}],rules:[],invariants:[{id:ye(e()),name:`requestedPath is observable`,condition:{left:Y(`error.requestedPath`),operator:`exists`},message:`The 404 surface should always know which path was missed.`}],transitions:[],actions:[{id:fe(e()),name:`Report missing route`,intent:`Emit a telemetry event for the missed path.`,parameters:[],requiredStates:[Y(`error.requestedPath`)],rules:[{id:Q(e()),category:`audit`,condition:{left:Y(`error.requestedPath`),operator:`equals`,right:``},effect:{id:X(e()),type:`show_message`,message:`No path captured. Telemetry will be skipped.`,tone:`warning`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`page.not_found`)}],emittedEvents:[K(`page.not_found`)],transitions:[]}]}})},pr={id:Gn(`library.utility.search_palette`),name:`Search palette`,category:`utility`,surfaceType:`command_palette`,summary:`Cmd-K style overlay for quick navigation, search, and command execution.`,description:`A command-palette surface. Opens with a global hotkey, accepts a fuzzy query, suggests results, and executes the picked command. Common across modern apps (Slack, Linear, GitHub).`,platforms:[`web`,`mobile`],tags:[`cmd-k`,`palette`,`search`,`shortcut`,`quick-nav`],build:({ids:e,ownSurfaceId:t})=>{let n=J(`library-utility-res-search-index`);return{surface:{id:t,name:`Search palette`,type:`command_palette`,description:`Floating overlay launched by Cmd/Ctrl+K. Query routes through a search index.`,stateDefinitions:[{id:Z(e()),path:Y(`palette.open`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`palette.query`),type:`string`,defaultValue:``},{id:Z(e()),path:Y(`palette.resultCount`),type:`number`,defaultValue:0}],rules:[],invariants:[{id:ye(e()),name:`palette.resultCount is non-negative`,condition:{left:Y(`palette.resultCount`),operator:`greater_than`,right:-1},message:`Result count must be ≥ 0.`}],transitions:[],actions:[{id:fe(e()),name:`Run query`,intent:`Run a fuzzy search and refresh suggestions in the palette.`,parameters:[{id:xe(e()),name:`query`,type:`string`,required:!0,description:`What the user typed. Bound to palette.query.`,resourceId:n,bindToStatePath:Y(`palette.query`),validations:[{type:`max_length`,value:200}]}],requiredStates:[Y(`palette.query`),Y(`palette.open`)],rules:[{id:Q(e()),category:`validation`,condition:{left:Y(`palette.query`),operator:`equals`,right:``},effect:{id:X(e()),type:`show_message`,message:`Type at least one character.`,tone:`info`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`palette.query.executed`)}],emittedEvents:[K(`palette.query.executed`)],transitions:[],scenarios:[{id:q(e()),name:`Empty query`,description:`User submits a blank query. Soft hint fires.`,stateOverrides:[{path:Y(`palette.open`),value:!0}],parameterOverrides:[{parameterName:`query`,value:``}]},{id:q(e()),name:`Specific keyword`,description:`A focused query that should produce results.`,stateOverrides:[{path:Y(`palette.open`),value:!0},{path:Y(`palette.resultCount`),value:8}],parameterOverrides:[{parameterName:`query`,value:`invoice`}]}]},{id:fe(e()),name:`Close palette`,intent:`Dismiss the palette overlay.`,parameters:[],requiredStates:[Y(`palette.open`)],rules:[{id:Q(e()),category:`permissions`,condition:{left:Y(`palette.open`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Palette is already closed.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`palette.open`),value:!1},{id:X(e()),type:`emit_event`,event:K(`palette.closed`)}],emittedEvents:[K(`palette.closed`)],transitions:[]}]},resources:[{id:n,name:`Global search index (OpenSearch)`,description:`Cross-feature search index used by the command palette.`,kind:`document_db`,provider:`OpenSearch`,scope:`cloud`,location:`eu-west`,database:`global-search`,container:`documents`,field:void 0,sensitivity:`internal`,containsPii:!1,complianceTags:[],accessMode:`read`,authentication:`service_account`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`rebuilt nightly`,owner:`platform-team`}]}}},mr={id:Gn(`library.utility.map`),name:`Map`,category:`utility`,surfaceType:`map`,summary:`Generic map view with geocoding, place search, and consent-gated geolocation.`,description:`A drop-in geographic surface. Search by address, use the current location (gated on consent), and render points of interest as pins. Suits store locators, branch finders, ride-pickup, delivery zones, real-estate browsers. Anything map-driven.`,platforms:[`web`,`mobile`],tags:[`map`,`geocoding`,`gdpr`,`geolocation`,`places`,`pins`],build:({ids:e,ownSurfaceId:t})=>{let n=J(`library-utility-res-geocoding`),r=J(`library-utility-res-places`);return{surface:{id:t,name:`Map`,type:`map`,description:`Map view with search box, optional geolocation, and a list of nearby pins.`,stateDefinitions:[{id:Z(e()),path:Y(`locator.query`),type:`string`,defaultValue:``},{id:Z(e()),path:Y(`locator.resultCount`),type:`number`,defaultValue:0},{id:Z(e()),path:Y(`locator.usingGeolocation`),type:`boolean`,defaultValue:!1},{id:Z(e()),path:Y(`consent.geolocation`),type:`boolean`,defaultValue:!1,description:`True once the visitor has granted geolocation permission.`}],rules:[],invariants:[{id:ye(e()),name:`locator.resultCount is non-negative`,condition:{left:Y(`locator.resultCount`),operator:`greater_than`,right:-1},message:`Result count must be ≥ 0.`}],transitions:[],actions:[{id:fe(e()),name:`Search by address`,intent:`Geocode the entered address and load nearby stores.`,parameters:[{id:xe(e()),name:`address`,type:`string`,required:!0,description:`Free-text address. Bound to locator.query.`,resourceId:n,bindToStatePath:Y(`locator.query`),validations:[{type:`non_empty`},{type:`min_length`,value:3}]}],requiredStates:[Y(`locator.query`)],rules:[{id:Q(e()),category:`validation`,condition:{left:Y(`locator.query`),operator:`equals`,right:``},effect:{id:X(e()),type:`block_action`,reason:`Type an address.`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`locator.address.searched`)}],emittedEvents:[K(`locator.address.searched`)],transitions:[]},{id:fe(e()),name:`Use my location`,intent:`Snap the map to the user current location.`,parameters:[],requiredStates:[Y(`consent.geolocation`),Y(`locator.usingGeolocation`)],rules:[{id:Q(e()),category:`compliance`,condition:{left:Y(`consent.geolocation`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Grant location permission first.`}}],invariants:[],effects:[{id:X(e()),type:`set_state`,path:Y(`locator.usingGeolocation`),value:!0},{id:X(e()),type:`emit_event`,event:K(`locator.geolocation.used`)}],emittedEvents:[K(`locator.geolocation.used`)],transitions:[],scenarios:[{id:q(e()),name:`No consent yet`,description:`Visitor hasn’t granted geolocation. Compliance rule blocks.`,stateOverrides:[{path:Y(`consent.geolocation`),value:!1}],parameterOverrides:[]},{id:q(e()),name:`Consent granted`,description:`Visitor has consented. Action succeeds.`,stateOverrides:[{path:Y(`consent.geolocation`),value:!0}],parameterOverrides:[]}]}]},resources:[{id:n,name:`Geocoding API`,description:`External geocoding service (address → lat/lng).`,kind:`http_api`,provider:`Mapbox`,scope:`external`,location:`us-east`,database:`https://api.mapbox.com`,container:`/geocoding/v5`,field:void 0,sensitivity:`internal`,containsPii:!0,complianceTags:[`gdpr`],accessMode:`read`,authentication:`api_key`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`managed by provider`,owner:`platform-team`},{id:r,name:`Places`,description:`Directory of mappable points of interest. Stores, branches, drop-off points, listings, anything pinnable.`,kind:`document_db`,provider:`MongoDB`,scope:`cloud`,location:`multi-region`,database:`platform`,container:`places`,field:void 0,sensitivity:`public`,containsPii:!1,complianceTags:[],accessMode:`read`,authentication:`service_account`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`indefinite`,owner:`platform-team`}]}}},hr=[fr,pr,dr,{id:Gn(`library.utility.task_board`),name:`Task board`,category:`utility`,surfaceType:`board`,summary:`Kanban-style task board with column moves and limit-aware drops.`,description:`A column-and-card layout. Cards move between columns (todo → doing → done). A WIP limit on the doing column blocks over-loading.`,platforms:[`web`],tags:[`kanban`,`tasks`,`board`,`productivity`],build:({ids:e,ownSurfaceId:t})=>{let n=J(`library-utility-res-tasks`);return{surface:{id:t,name:`Task board`,type:`board`,description:`Three-column kanban: Todo / Doing / Done.`,stateDefinitions:[{id:Z(e()),path:Y(`board.activeColumn`),type:`enum`,enumValues:[`todo`,`doing`,`done`],defaultValue:`todo`},{id:Z(e()),path:Y(`board.doingCount`),type:`number`,defaultValue:0,description:`Number of cards currently in the Doing column.`},{id:Z(e()),path:Y(`board.wipLimit`),type:`number`,defaultValue:3,description:`Max cards allowed in Doing.`},{id:Z(e()),path:Y(`user.authenticated`),type:`boolean`,defaultValue:!1}],rules:[],invariants:[{id:ye(e()),name:`doingCount is non-negative`,condition:{left:Y(`board.doingCount`),operator:`greater_than`,right:-1},message:`Card count must be ≥ 0.`}],transitions:[],actions:[{id:fe(e()),name:`Move card to column`,intent:`Move a task card from its current column to another.`,parameters:[{id:xe(e()),name:`targetColumn`,type:`enum`,enumValues:[`todo`,`doing`,`done`],required:!0,description:`Where to drop the card. Bound to board.activeColumn.`,resourceId:n,bindToStatePath:Y(`board.activeColumn`)}],requiredStates:[Y(`board.activeColumn`),Y(`board.doingCount`),Y(`board.wipLimit`)],rules:[{id:Q(e()),category:`permissions`,condition:{left:Y(`user.authenticated`),operator:`is_false`},effect:{id:X(e()),type:`block_action`,reason:`Sign in to move cards.`}},{id:Q(e()),category:`validation`,condition:{left:Y(`board.activeColumn`),operator:`equals`,right:``},effect:{id:X(e()),type:`block_action`,reason:`Pick a target column.`}},{id:Q(e()),category:`business`,condition:{left:Y(`board.doingCount`),operator:`greater_than`,right:2},effect:{id:X(e()),type:`show_message`,message:`WIP limit reached. Finish something before pulling new work.`,tone:`warning`}}],invariants:[],effects:[{id:X(e()),type:`emit_event`,event:K(`board.card.moved`)}],emittedEvents:[K(`board.card.moved`)],transitions:[],scenarios:[{id:q(e()),name:`WIP at limit`,description:`Doing column is at its limit. Soft warning fires.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`board.doingCount`),value:3}],parameterOverrides:[{parameterName:`targetColumn`,value:`doing`}]},{id:q(e()),name:`Happy path`,description:`Authenticated user moves a card to done.`,stateOverrides:[{path:Y(`user.authenticated`),value:!0},{path:Y(`board.doingCount`),value:1}],parameterOverrides:[{parameterName:`targetColumn`,value:`done`}]}]}]},resources:[{id:n,name:`Tasks (Postgres)`,description:`Task records with column, owner, due date.`,kind:`relational_db`,provider:`PostgreSQL`,scope:`cloud`,location:`eu-west`,database:`project`,container:`tasks`,field:void 0,sensitivity:`internal`,containsPii:!1,complianceTags:[],accessMode:`read_write`,authentication:`iam_role`,encryptionAtRest:!0,encryptionInTransit:!0,retention:`until project archived`,owner:`project-team`}]}}},mr,ur],gr=[...Xn,...rr,...cr,...lr,...hr],_r=new Map(gr.map(e=>[e.id,e])),vr={list:()=>gr,findById:e=>_r.get(e)},yr=[`auth`,`commerce`,`content`,`settings`,`onboarding`,`utility`],br=e=>{switch(e){case`auth`:return`Auth`;case`commerce`:return`Commerce`;case`content`:return`Content`;case`settings`:return`Settings`;case`onboarding`:return`Onboarding`;case`utility`:return`Utility`}},xr={query:``,category:`all`,surfaceType:`all`,sort:`name`},Sr=(e,t)=>[e.name,e.summary,e.description,...e.tags].join(` `).toLowerCase().includes(t),Cr=(e,t)=>{let n=t.query.trim().toLowerCase(),r=e.filter(e=>!(t.category!==`all`&&e.category!==t.category||t.surfaceType!==`all`&&e.surfaceType!==t.surfaceType||n.length>0&&!Sr(e,n))),i=t.sort===`name`?(e,t)=>e.name.localeCompare(t.name):(e,t)=>e.category.localeCompare(t.category)||e.name.localeCompare(t.name);return[...r].sort(i)},wr=d(`<span class="ml-auto inline-flex h-5 w-5 items-center justify-center rounded-full bg-brand-700 text-[11px] font-bold text-white" aria-hidden="true">✓</span>`),Tr=d(`<li class="rounded-md bg-slate-100 px-1.5 py-0.5 text-[10px] text-slate-600"> </li>`),Er=d(`<ul class="flex flex-wrap gap-1"></ul>`),Dr=d(`<button type="button"><header class="flex flex-wrap items-center gap-2"><h3 class="text-sm font-semibold text-slate-950"> </h3> <span class="rounded-md bg-slate-100 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-slate-600"> </span> <span class="rounded-full bg-emerald-50 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-emerald-700" title="Verified to score 100% on the maturity check">100% mature</span> <!></header> <p class="text-xs leading-relaxed text-slate-600"> </p> <!></button>`);function Or(e,n){N(n,!0);var r=Dr(),a=_(r),o=_(a),s=_(o,!0);F(o);var c=p(o,2),u=_(c,!0);F(c);var d=p(c,4),f=e=>{A(e,wr())};j(d,e=>{n.selected&&e(f)}),F(a);var m=p(a,2),h=_(m,!0);F(m);var v=p(m,2),y=e=>{var r=Er();i(r,20,()=>n.blueprint.tags,e=>e,(e,n)=>{var r=Tr(),i=_(r,!0);F(r),g(()=>t(i,n)),A(e,r)}),F(r),A(e,r)};j(v,e=>{n.blueprint.tags.length>0&&e(y)}),F(r),g(e=>{H(r,`aria-pressed`,n.selected),U(r,1,`flex w-full flex-col gap-2 rounded-lg border bg-white p-3 text-left transition ${n.selected?`border-brand-600 ring-2 ring-brand-100`:`border-hairline hover:border-slate-300`}`),t(s,n.blueprint.name),t(u,e),t(h,n.blueprint.summary)},[()=>br(n.blueprint.category)]),l(`click`,r,function(...e){n.onToggle?.apply(this,e)}),A(e,r),C()}c([`click`]);var kr=d(`<button type="button" class="rounded-md px-2 py-1 text-sm text-slate-500 hover:bg-slate-100 hover:text-slate-950" aria-label="Back to chooser" title="Back">&larr;</button>`),Ar=d(`<div class="grid flex-1 grid-cols-1 gap-4 p-6 sm:grid-cols-2"><button type="button" data-tour="chooser-create-new" class="group flex h-full flex-col items-start gap-3 rounded-2xl border-2 border-slate-200 bg-white p-6 text-left transition hover:-translate-y-0.5 hover:border-brand-500 hover:bg-cyan-50/40 hover:shadow-md focus:outline-none focus:ring-2 focus:ring-brand-400"><span class="grid h-12 w-12 place-items-center rounded-xl bg-slate-100 text-2xl text-slate-700 transition group-hover:bg-brand-100 group-hover:text-brand-800" aria-hidden="true">+</span> <span class="block"><span class="block text-base font-semibold text-slate-950 group-hover:text-brand-900">Create new</span> <span class="mt-1 block text-xs leading-5 text-slate-500">Start from a blank surface. You choose the type and name; everything inside is yours to define.</span></span></button> <button type="button" class="group flex h-full flex-col items-start gap-3 rounded-2xl border-2 border-slate-200 bg-white p-6 text-left transition hover:-translate-y-0.5 hover:border-brand-500 hover:bg-cyan-50/40 hover:shadow-md focus:outline-none focus:ring-2 focus:ring-brand-400"><span class="grid h-12 w-12 place-items-center rounded-xl bg-emerald-50 text-2xl text-emerald-700 transition group-hover:bg-emerald-100 group-hover:text-emerald-800" aria-hidden="true">*</span> <span class="block"><span class="block text-base font-semibold text-slate-950 group-hover:text-brand-900">From template</span> <span class="mt-1 block text-xs leading-5 text-slate-500">Pick from a library of ready-made surfaces - auth, checkout, dashboards - each pre-modeled to 100% maturity.</span></span></button></div>`),jr=d(`<option> </option>`),Mr=d(`<form class="flex flex-1 flex-col gap-4 p-6" data-tour="blank-surface-form"><label class="block"><span class="block text-xs font-medium text-slate-700">Surface name</span> <input type="text" placeholder="e.g. Checkout, Project board, MCP Server" class="mt-1 h-11 w-full rounded-lg border border-slate-300 bg-white px-3 text-base outline-none focus:border-brand-700 focus:ring-2 focus:ring-brand-100" required=""/></label> <label class="block"><span class="block text-xs font-medium text-slate-700">Surface type</span> <select class="mt-1 h-11 w-full rounded-lg border border-slate-300 bg-white px-3 text-sm outline-none focus:border-brand-700 focus:ring-2 focus:ring-brand-100"></select></label> <div class="mt-2 flex justify-end gap-2"><button type="button" class="rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50">Back</button> <button type="submit" class="rounded-md bg-slate-900 px-4 py-2 text-sm font-semibold text-white transition disabled:cursor-not-allowed disabled:bg-slate-300">Create surface</button></div></form>`),Nr=d(`<button type="button"> </button>`),Pr=d(`<option> </option>`),Fr=d(`<p class="text-center text-sm italic text-slate-500">No blueprint matches this filter.</p>`),Ir=d(`<li><!></li>`),Lr=d(`<ul class="grid grid-cols-1 gap-3 sm:grid-cols-2"></ul>`),Rr=d(`<span class="text-emerald-500">&rarr;</span> <span class="text-emerald-800"> </span>`,1),zr=d(`<li class="flex flex-wrap items-baseline gap-x-2"><span class="min-w-26 font-medium text-emerald-900"> </span> <!></li>`),Br=d(`<div class="border-t border-hairline bg-emerald-50/70 px-5 py-2"><h4 class="mb-1.5 text-[10px] font-semibold uppercase tracking-wide text-emerald-800"> </h4> <ul class="space-y-1 text-xs"></ul></div>`),Vr=d(`<div class="border-t border-hairline bg-slate-50 px-5 py-2 text-[11px] italic text-slate-500">These surfaces don't link to each other.</div>`),Hr=d(`<div class="flex flex-wrap items-center gap-2 border-b border-hairline bg-slate-50/70 px-5 py-3"><input type="search" placeholder="Search by name, summary, or tag..." class="min-w-55 flex-1 rounded-md border border-slate-300 bg-white px-3 py-1.5 text-sm outline-none focus:border-slate-900"/> <div class="flex items-center gap-1 text-xs"><button type="button">All</button> <!></div> <label class="flex items-center gap-1 text-xs text-slate-600">Type <select class="rounded-md border border-slate-300 bg-white px-2 py-1 text-xs"><option>All types</option><!></select></label> <label class="flex items-center gap-1 text-xs text-slate-600">Sort <select class="rounded-md border border-slate-300 bg-white px-2 py-1 text-xs"><option>Name</option><option>Category</option></select></label></div> <div class="flex-1 overflow-y-auto px-5 py-4"><!></div> <!> <footer class="flex flex-wrap items-center justify-end gap-2 border-t border-hairline bg-slate-50 px-5 py-3"><button type="button" class="rounded-md border border-slate-300 bg-white px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50">Back</button> <button type="button" class="rounded-md bg-slate-900 px-4 py-2 text-sm font-semibold text-white transition disabled:cursor-not-allowed disabled:bg-slate-300"> </button></footer>`,1),Ur=d(`<dialog><div class="flex h-full max-h-[85vh] flex-col"><header class="flex items-center justify-between border-b border-hairline px-5 py-4"><div class="flex min-w-0 items-center gap-2"><!> <div class="min-w-0"><h2 class="truncate text-base font-semibold text-slate-950"><!></h2> <p class="mt-0.5 truncate text-xs text-slate-500"><!></p></div></div> <button type="button" aria-label="Close" class="rounded-md px-2 py-1 text-slate-500 hover:bg-slate-100 hover:text-slate-950">x</button></header> <!></div></dialog>`);function Wr(n,s){N(s,!0);function c(e){if(e.length<2)return[];let t=new Map;for(let n of e)t.set(n.id,Se(`preview-${n.id}`));let n=0,r=()=>`preview-id-${n++}`,i=[];for(let n of e){let a=t.get(n.id);if(!a)continue;let o=n.build({ids:r,ownSurfaceId:a,linkTargets:t});for(let r of o.surface.transitions){let a=e.find(e=>t.get(e.id)===r.target);a&&i.push({from:n.name,to:a.name,label:r.label})}}return i}let u=V(null),d=V(null),f=V(`chooser`),y=V(e({...xr})),b=V(e(new Set)),x=V(``),w=V(`screen`),E=z(()=>zt(ze.currentStep,`blank-surface`,G(x)));o(()=>{G(u)&&(s.open&&!G(u).open?(T(f,`chooser`),T(b,new Set,!0),T(y,{...xr},!0),T(x,``),T(w,`screen`),G(u).showModal()):!s.open&&G(u).open&&G(u).close())}),o(()=>{G(f)===`blank`&&h().then(()=>G(d)?.focus())});let k=z(()=>Cr(vr.list(),G(y))),I=z(()=>G(b).size),ee=z(()=>{let e=[];for(let t of G(b)){let n=vr.findById(t);n&&e.push(n)}return e}),te=z(()=>c(G(ee))),R=z(()=>{let e=new Map;for(let t of G(te))e.has(t.from)||e.set(t.from,[]),e.get(t.from).push(t.to);return Array.from(e.entries()).map(([e,t])=>({from:e,targets:t})).sort((e,t)=>e.from.localeCompare(t.from))});function W(){s.onClose()}function ne(e){let t=new Set(G(b));t.has(e)?t.delete(e):t.add(e),T(b,t,!0)}async function re(){if(G(b).size===0)return;let e=Array.from(G(b)),t=[];await $.mutate(n=>{let r=Wn(vr,n,e,ge,{includeSiblings:!1});return t=r.addedSurfaceIds,r.feature}),s.onSurfacesAdded(t),W()}async function ie(){let e=G(x).trim();if(e.length===0)return;let t=Fn(ge,{name:e,type:G(w)});await $.mutate(e=>Dt(e,t)),s.onSurfacesAdded([t.id]),T(x,``),W()}function ae(e){T(y,{...G(y),category:e},!0)}function oe(e){T(y,{...G(y),sort:e},!0)}function se(e){T(y,{...G(y),query:e},!0)}function K(e){T(y,{...G(y),surfaceType:e},!0)}function ce(e){e.key===`Enter`&&G(x).trim().length>0&&(e.preventDefault(),ie())}var le=Ur(),ue=_(le),de=_(ue),q=_(de),J=_(q),fe=e=>{var t=kr();l(`click`,t,()=>T(f,`chooser`)),A(e,t)};j(J,e=>{G(f)!==`chooser`&&e(fe)});var Y=p(J,2),pe=_(Y),me=_(pe),he=e=>{A(e,a(`Add a surface`))},X=e=>{A(e,a(`Create a new surface`))},_e=e=>{A(e,a(`Surface library`))};j(me,e=>{G(f)===`chooser`?e(he):G(f)===`blank`?e(X,1):e(_e,-1)}),F(pe);var ve=p(pe,2),ye=_(ve),be=e=>{A(e,a(`How do you want to start?`))},xe=e=>{A(e,a(`You'll define states, actions, and rules yourself.`))},Z=e=>{A(e,a(`Pick one or many ready-made surfaces. Each scores 100% maturity.`))};j(ye,e=>{G(f)===`chooser`?e(be):G(f)===`blank`?e(xe,1):e(Z,-1)}),F(ve),F(Y),F(q);var Ce=p(q,2);F(de);var we=p(de,2),Te=e=>{var t=Ar(),n=_(t),r=p(n,2);F(t),l(`click`,n,()=>T(f,`blank`)),l(`click`,r,()=>T(f,`library`)),A(e,t)},Ee=e=>{var n=Mr(),r=_(n),a=p(_(r),2);M(a),B(a,e=>T(d,e),()=>G(d)),F(r);var o=p(r,2),s=p(_(o),2);i(s,20,()=>Nn,e=>e,(e,n)=>{var r=jr(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=n)&&(r.value=(r.__value=n)??``)},[()=>Pn(n)]),A(e,r)}),F(s),F(o);var c=p(o,2),u=_(c),h=p(u,2);F(c),F(n),g(e=>{h.disabled=e,H(h,`title`,G(E).blocked?`Tutorial: name must be exactly "${G(E).requiredValue}"`:void 0)},[()=>G(x).trim().length===0||G(E).blocked]),m(`submit`,n,e=>{e.preventDefault(),ie()}),l(`keydown`,a,ce),S(a,()=>G(x),e=>T(x,e)),P(s,()=>G(w),e=>T(w,e)),l(`click`,u,()=>T(f,`chooser`)),A(e,n)},De=e=>{var n=Hr(),a=v(n),o=_(a);M(o);var s=p(o,2),c=_(s);i(p(c,2),16,()=>yr,e=>e,(e,n)=>{var r=Nr(),i=_(r,!0);F(r),g(e=>{U(r,1,`rounded-full px-2 py-1 transition ${G(y).category===n?`bg-slate-900 text-white`:`bg-white text-slate-700 ring-1 ring-hairline hover:bg-slate-50`}`),t(i,e)},[()=>br(n)]),l(`click`,r,()=>ae(n)),A(e,r)}),F(s);var u=p(s,2),d=p(_(u)),m=_(d);m.value=m.__value=`all`,i(p(m),16,()=>Nn,e=>e,(e,n)=>{var r=Pr(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=n)&&(r.value=(r.__value=n)??``)},[()=>Pn(n)]),A(e,r)}),F(d);var h;O(d),F(u);var x=p(u,2),S=p(_(x)),C=_(S);C.value=C.__value=`name`;var w=p(C);w.value=w.__value=`category`,F(S);var E;O(S),F(x),F(a);var N=p(a,2),P=_(N),ee=e=>{A(e,Fr())},B=e=>{var t=Lr();i(t,21,()=>G(k),e=>e.id,(e,t)=>{var n=Ir(),r=_(n);{let e=z(()=>G(b).has(G(t).id));Or(r,{get blueprint(){return G(t)},get selected(){return G(e)},onToggle:()=>ne(G(t).id)})}F(n),A(e,n)}),F(t),A(e,t)};j(P,e=>{G(k).length===0?e(ee):e(B,-1)}),F(N);var V=p(N,2),H=e=>{var n=Br(),a=_(n),o=_(a);F(a);var s=p(a,2);i(s,21,()=>G(R),e=>e.from,(e,n)=>{var a=zr(),o=_(a),s=_(o,!0);F(o),i(p(o,2),17,()=>G(n).targets,r,(e,n)=>{var r=Rr(),i=p(v(r),2),a=_(i,!0);F(i),g(()=>t(a,G(n))),A(e,r)}),F(a),g(()=>t(s,G(n).from)),A(e,a)}),F(s),F(n),g(()=>t(o,`${G(te).length??``} connection${G(te).length===1?``:`s`} will be created`)),A(e,n)},W=e=>{A(e,Vr())};j(V,e=>{G(R).length>0?e(H):G(I)>1&&e(W,1)});var ie=p(V,2),ce=_(ie),le=p(ce,2),ue=_(le);F(le),F(ie),g(()=>{L(o,G(y).query),U(c,1,`rounded-full px-2 py-1 transition ${G(y).category===`all`?`bg-slate-900 text-white`:`bg-white text-slate-700 ring-1 ring-hairline hover:bg-slate-50`}`),h!==(h=G(y).surfaceType)&&(d.value=(d.__value=G(y).surfaceType)??``,D(d,G(y).surfaceType)),E!==(E=G(y).sort)&&(S.value=(S.__value=G(y).sort)??``,D(S,G(y).sort)),le.disabled=G(I)===0,t(ue,`Add${G(I)>0?` (${G(I)})`:``}`)}),l(`input`,o,e=>se(e.target.value)),l(`click`,c,()=>ae(`all`)),l(`change`,d,e=>K(e.target.value)),l(`change`,S,e=>oe(e.target.value)),l(`click`,ce,()=>T(f,`chooser`)),l(`click`,le,re),A(e,n)};j(we,e=>{G(f)===`chooser`?e(Te):G(f)===`blank`?e(Ee,1):e(De,-1)}),F(ue),F(le),B(le,e=>T(u,e),()=>G(u)),g(()=>U(le,1,`fixed left-1/2 top-1/2 max-h-[85vh] ${G(f)===`chooser`||G(f)===`blank`?`w-[min(560px,95vw)]`:`w-[min(960px,95vw)]`} -translate-x-1/2 -translate-y-1/2 rounded-xl border border-hairline bg-white p-0 shadow-xl backdrop:bg-slate-950/40 backdrop:backdrop-blur-sm`)),m(`close`,le,W),l(`click`,Ce,W),A(n,le),C()}c([`click`,`keydown`,`input`,`change`]);var Gr=d(`<div class="pointer-events-none absolute left-0 right-0 top-0 h-0.5 bg-brand-600"></div>`),Kr=d(`<div class="pointer-events-none absolute bottom-0 left-0 right-0 h-0.5 bg-brand-600"></div>`),qr=d(`<span class="text-slate-400">↳</span>`),Jr=d(`<li draggable="true"><!> <!> <button type="button" class="min-w-0 flex-1 text-left"><div><!> <span class="truncate"> </span></div> <div> </div></button> <div class="flex shrink-0 items-center gap-0.5"><button type="button" class="rounded px-1 text-xs text-slate-400 opacity-0 transition-opacity hover:bg-slate-100 hover:text-slate-700 group-hover:opacity-100 disabled:cursor-not-allowed disabled:opacity-0 group-hover:disabled:opacity-30" title="Outdent (lift out of parent)">◀</button> <button type="button" class="rounded px-1 text-xs text-slate-400 opacity-0 transition-opacity hover:bg-slate-100 hover:text-slate-700 group-hover:opacity-100 disabled:cursor-not-allowed disabled:opacity-0 group-hover:disabled:opacity-30" title="Indent under previous surface">▶</button> <span class="mx-0.5 h-3 w-px bg-slate-200 opacity-0 group-hover:opacity-100"></span> <button type="button" class="rounded px-1 text-xs text-slate-400 opacity-0 transition-opacity hover:bg-slate-100 hover:text-slate-700 group-hover:opacity-100 disabled:cursor-not-allowed disabled:opacity-0 group-hover:disabled:opacity-30" title="Move up">▲</button> <button type="button" class="rounded px-1 text-xs text-slate-400 opacity-0 transition-opacity hover:bg-slate-100 hover:text-slate-700 group-hover:opacity-100 disabled:cursor-not-allowed disabled:opacity-0 group-hover:disabled:opacity-30" title="Move down">▼</button> <button type="button">✕</button></div></li>`),Yr=d(`<li class="px-3 py-4 text-center text-xs text-slate-500">No surfaces yet.</li>`),Xr=d(`<section class="rounded-lg border border-hairline bg-white"><header class="flex items-center justify-between border-b border-hairline px-3 py-2.5"><h2 class="text-sm font-semibold text-slate-950">Surfaces</h2> <button type="button" data-tour="add-surface-button" class="inline-flex items-center gap-1 rounded-md bg-slate-900 px-2.5 py-1.5 text-xs font-medium text-white disabled:opacity-50"><span aria-hidden="true">+</span> <span>Add surface</span></button></header> <ul class="max-h-[60vh] divide-y divide-slate-100 overflow-auto"><!> <!></ul></section> <!>`,1);function Zr(e,n){N(n,!0);let r=V(!1),a=V(null),o=V(null),s=V(null);async function c(e){confirm(`Delete this surface and everything inside it?`)&&(await $.mutate(t=>Ye(t,e)),Re(`editor.surface.removed`,{surfaceId:String(e)}))}async function u(e,t){await $.mutate(n=>at(n,e,t))}async function d(e,t){let r=n.feature.surfaces,i=He(r,e);for(let n=t-1;n>=0;n--){let t=r[n];if(t&&He(r,t.id)<=i){await $.mutate(n=>It(n,e,t.id));return}}}async function f(e){let t=n.feature.surfaces,r=t.find(t=>t.id===e);if(!r?.parentSurfaceId)return;let i=t.find(e=>e.id===r.parentSurfaceId)?.parentSurfaceId??null;await $.mutate(t=>It(t,e,i))}function h(e,t){if(t===0)return!1;let r=n.feature.surfaces,i=He(r,e);for(let e=t-1;e>=0;e--){let t=r[e];if(t&&He(r,t.id)<=i)return!0}return!1}function b(e){for(let t of e){let e=n.feature.surfaces.find(e=>e.id===t);Re(`editor.surface.added`,{surfaceId:String(t),name:e?.name??``})}let t=e[0];t&&n.onSelect(t)}function x(e,t){if(e===t)return!0;let r=n.feature.surfaces,i=r.find(e=>e.id===t),a=0;for(;i?.parentSurfaceId&&a<32;){if(i.parentSurfaceId===e)return!0;i=r.find(e=>e.id===i.parentSurfaceId),a++}return!1}function S(e,t){T(a,t,!0),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t))}function w(e,t){if(!G(a)||G(a)===t||x(G(a),t))return;e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`move`);let n=e.currentTarget.getBoundingClientRect(),r=e.clientY-n.top,i=n.height,c;c=r<i*.3?`before`:r>i*.7?`after`:`inside`,T(o,t,!0),T(s,c,!0)}function E(e){let t=e.relatedTarget,n=e.currentTarget;t&&n.contains(t)||(T(o,null),T(s,null))}async function D(e,t){e.preventDefault();let n=G(a),r=G(s);k(),!(!n||n===t||!r)&&(x(n,t)||await $.mutate(e=>Ue(e,n,{kind:r,targetId:t})))}function O(){k()}function k(){T(a,null),T(o,null),T(s,null)}var M=Xr(),P=v(M),I=_(P),L=p(_(I),2);F(I);var ee=p(I,2),te=_(ee);i(te,19,()=>n.feature.surfaces,e=>e.id,(e,r,i)=>{let v=z(()=>n.selectedId===G(r).id),b=z(()=>vt(n.feature.surfaces,G(r).id)),C=z(()=>yt(n.feature.surfaces,G(r).id)),T=z(()=>He(n.feature.surfaces,G(r).id)),k=z(()=>h(G(r).id,G(i))),M=z(()=>G(T)>0),N=z(()=>G(a)!==null&&x(G(a),G(r).id)),P=z(()=>G(o)===G(r).id&&G(s)!==null);var I=Jr(),L=_(I),ee=e=>{A(e,Gr())};j(L,e=>{G(P)&&G(s)===`before`&&e(ee)});var te=p(L,2),R=e=>{A(e,Kr())};j(te,e=>{G(P)&&G(s)===`after`&&e(R)});var B=p(te,2),V=_(B),W=_(V),ne=e=>{A(e,qr())};j(W,e=>{G(T)>0&&e(ne)});var re=p(W,2),ie=_(re,!0);F(re),F(V);var ae=p(V,2),oe=_(ae);F(ae),F(B);var se=p(B,2),K=_(se),ce=p(K,2),le=p(ce,4),ue=p(le,2),de=p(ue,2);F(se),F(I),g(e=>{U(I,1,`group relative flex items-start justify-between gap-2 py-2 pr-3 text-sm transition-colors ${G(v)?`border-l-4 border-brand-700 bg-brand-50`:`border-l-4 border-transparent hover:bg-slate-50`} ${G(N)?`opacity-60 ring-2 ring-brand-200`:``} ${G(P)&&G(s)===`inside`?`bg-brand-50 ring-2 ring-brand-300 ring-inset`:``}`),y(I,`padding-left: ${(G(v)?8:12)+G(T)*14}px`),U(V,1,`flex items-center gap-1 truncate font-medium ${G(v)?`text-brand-900`:`text-slate-950`}`),t(ie,G(r).name),U(ae,1,`text-xs ${G(v)?`text-brand-700`:`text-slate-500`}`),t(oe,`${e??``} · ${G(r).actions.length??``} action(s)`),K.disabled=!G(M),H(K,`aria-label`,`Outdent ${G(r).name}`),ce.disabled=!G(k),H(ce,`aria-label`,`Indent ${G(r).name} as child of previous`),le.disabled=!G(b),H(le,`aria-label`,`Move ${G(r).name} up`),ue.disabled=!G(C),H(ue,`aria-label`,`Move ${G(r).name} down`),U(de,1,`rounded px-1 text-xs text-slate-400 opacity-0 transition-opacity hover:bg-red-50 hover:text-red-600 group-hover:opacity-100 ${G(v)?`opacity-100 text-brand-700`:``}`),H(de,`aria-label`,`Delete surface ${G(r).name}`)},[()=>Pn(G(r).type)]),m(`dragstart`,I,e=>S(e,G(r).id)),m(`dragover`,I,e=>w(e,G(r).id)),m(`dragleave`,I,E),m(`drop`,I,e=>D(e,G(r).id)),m(`dragend`,I,O),l(`click`,B,()=>n.onSelect(G(r).id)),l(`click`,K,()=>f(G(r).id)),l(`click`,ce,()=>d(G(r).id,G(i))),l(`click`,le,()=>u(G(r).id,-1)),l(`click`,ue,()=>u(G(r).id,1)),l(`click`,de,()=>c(G(r).id)),A(e,I)});var R=p(te,2),B=e=>{A(e,Yr())};j(R,e=>{n.feature.surfaces.length===0&&e(B)}),F(ee),F(P),Wr(p(P,2),{get open(){return G(r)},onClose:()=>T(r,!1),onSurfacesAdded:e=>b(e)}),l(`click`,L,()=>T(r,!0)),A(e,M),C()}c([`click`]);var Qr=d(`<span class="mono mt-1 block text-[10px] text-slate-500" title="Canonical state path"> </span>`),$r=d(`<p class="mt-2 text-xs text-red-600"> </p>`),ei=d(`<div class="rounded-lg border border-dashed border-slate-300 bg-slate-50/30 p-6 text-center"><p class="text-sm font-medium text-slate-700">No state defined yet</p> <p class="mx-auto mt-1 max-w-sm text-xs text-slate-500">State is the typed data this surface reads and writes. Rules and effects refer to it
2
- by its dotted path. Add a slot above to get started.</p></div>`),ti=d(`<select class="rounded-md border border-slate-300 bg-white px-2 py-0.5 text-xs"><option>false</option><option>true</option></select>`),ni=d(`<textarea class="mono min-h-16 w-48 rounded-md border border-slate-300 bg-white px-2 py-1 text-xs"></textarea>`),ri=d(`<input class="w-32 rounded-md border border-slate-300 bg-white px-2 py-0.5 text-xs"/>`),ii=d(`<label class="block text-[11px] font-medium text-slate-600">Enum values <input type="text" class="mono mt-1 w-full rounded-md border border-slate-300 bg-white px-2 py-1 text-xs" placeholder="draft, published, archived"/></label>`),ai=d(`<p class="mt-1 text-xs text-red-600"> </p>`),oi=d(`<label class="inline-flex max-w-full items-center gap-1 rounded-md border border-hairline px-2 py-1 text-[11px] text-slate-700"><input type="checkbox"/> <span class="truncate"> </span></label>`),si=d(`<div class="mt-2 flex flex-wrap items-center gap-2 border-t border-slate-100 pt-2"><span class="text-[10px] font-medium uppercase tracking-wide text-slate-500">Shared with</span> <!></div>`),ci=d(`<li class="px-3 py-2 text-sm"><div class="flex items-center gap-2"><div class="min-w-0 flex-1"><div class="truncate text-slate-950"> </div> <div class="mono truncate text-[10px] text-slate-400" title="Canonical state path"> </div></div> <select class="rounded-md border border-slate-300 bg-white px-2 py-0.5 text-xs"><option>string</option><option>number</option><option>boolean</option><option>enum</option><option>object</option><option>array</option></select> <!> <button type="button" class="rounded px-2 py-1 text-xs text-slate-400 hover:bg-red-50 hover:text-red-600" aria-label="Remove state">x</button></div> <div class="mt-2 grid grid-cols-1 gap-2 sm:grid-cols-2"><label class="block text-[11px] font-medium text-slate-600">Description <input type="text" class="mt-1 w-full rounded-md border border-slate-300 bg-white px-2 py-1 text-xs" placeholder="What does this state represent?"/></label> <!></div> <!> <!></li>`),li=d(`<ul class="divide-y divide-slate-100 rounded-lg border border-hairline bg-white"></ul>`),ui=d(`<li class="flex items-center justify-between gap-3 text-xs"><span class="min-w-0"><span class="text-slate-950"> </span> <span class="mono ml-1 text-[10px] text-slate-500"> </span></span> <span class="shrink-0 text-[11px] text-emerald-800"> </span></li>`),di=d(`<section class="rounded-md border border-emerald-200 bg-emerald-50/50 p-3"><h3 class="text-xs font-semibold text-emerald-900">Shared onto this surface</h3> <ul class="mt-2 space-y-1"></ul></section>`),fi=d(`<div class="space-y-3"><div class="rounded-lg border border-slate-200 bg-slate-50/60 p-2.5"><div class="flex flex-col gap-2 sm:flex-row sm:items-end"><label class="block flex-1 text-xs font-medium text-slate-600">Name <input type="text" placeholder="Cart item count" class="mt-1 h-9 w-full rounded-md border border-slate-300 bg-white px-2.5 text-sm outline-none focus:border-slate-900 focus:ring-1 focus:ring-slate-900"/> <!></label> <label class="block w-32 text-xs font-medium text-slate-600">Type <select class="mt-1 h-9 w-full rounded-md border border-slate-300 bg-white px-2 text-sm outline-none focus:border-slate-900"><option>string</option><option>number</option><option>boolean</option><option>enum</option><option>object</option><option>array</option></select></label> <button type="button" class="h-9 inline-flex items-center gap-1 rounded-md bg-slate-900 px-3 text-xs font-medium text-white transition hover:bg-slate-800 disabled:opacity-50"><span class="text-base leading-none">+</span> Add state</button></div> <!></div> <!> <!></div>`);function pi(n,r){N(r,!0);let a=b(r,`surfaces`,19,()=>[r.surface]),o=V(``),s=V(`string`),c=V(null),u=V(e({})),d=z(()=>Me(G(o))),f=z(()=>G(o).trim().length>0&&G(d)!==G(o).trim()),h=z(()=>a().filter(e=>e.id!==r.surface.id)),v=z(()=>a().filter(e=>e.id!==r.surface.id).flatMap(e=>e.stateDefinitions.filter(e=>e.sharedWith?.includes(r.surface.id)).map(t=>({source:e,def:t}))));async function y(){T(c,null);let e=G(d);if(e.length===0){T(c,`Type a name first.`);return}if(!pe(e)){T(c,`Could not derive a valid path. Try "Cart item count" or type the path directly (cart.itemCount).`);return}if(r.surface.stateDefinitions.some(t=>t.path===e)){T(c,`State "${e}" is already defined on this surface.`);return}let t=Ln(ge,{path:e,type:G(s)});await $.mutate(e=>_t(e,r.surface.id,t)),Re(`editor.state.added`,{surfaceId:String(r.surface.id),path:e,type:G(s)}),T(o,``)}async function x(e){await $.mutate(t=>Ke(t,r.surface.id,e))}function E(e){return e===`number`?0:e===`boolean`?!1:e===`object`?{}:e===`array`?[]:``}function k(e,t){if(t===`number`){let t=Number(e);if(!Number.isFinite(t))throw Error(`Use a finite number.`);return t}if(t===`boolean`)return e===`true`;if(t===`object`||t===`array`){let n=JSON.parse(e);if(t===`object`&&(typeof n!=`object`||!n||Array.isArray(n)))throw Error(`Use a JSON object, for example {"enabled":true}.`);if(t===`array`&&!Array.isArray(n))throw Error(`Use a JSON array, for example [].`);return n}return e}async function I(e,t,n){let i;try{i=k(t,n),T(u,{...G(u),[e]:``},!0)}catch(t){T(u,{...G(u),[e]:t instanceof Error?t.message:`Invalid default value.`},!0);return}await $.mutate(t=>rt(t,r.surface.id,e,{defaultValue:i}))}async function ee(e,t){await $.mutate(n=>rt(n,r.surface.id,e,{type:t,defaultValue:E(t),enumValues:t===`enum`?[]:void 0}))}async function R(e,t){let n=t.split(`,`).map(e=>e.trim()).filter(Boolean);await $.mutate(t=>rt(t,r.surface.id,e,{enumValues:n}))}async function B(e,t,n){let i=r.surface.stateDefinitions.find(t=>t.id===e);if(!i)return;let a=new Set(i.sharedWith??[]);n?a.add(t):a.delete(t);let o=[...a];await $.mutate(t=>rt(t,r.surface.id,e,{sharedWith:o.length>0?o:void 0}))}var U=fi(),W=_(U),ne=_(W),re=_(ne),ie=p(_(re));M(ie);var ae=p(ie,2),oe=e=>{var n=Qr(),r=_(n);F(n),g(()=>t(r,`→ ${G(d)??``}`)),A(e,n)};j(ae,e=>{G(f)&&e(oe)}),F(re);var se=p(re,2),K=p(_(se)),ce=_(K);ce.value=ce.__value=`string`;var le=p(ce);le.value=le.__value=`number`;var ue=p(le);ue.value=ue.__value=`boolean`;var de=p(ue);de.value=de.__value=`enum`;var q=p(de);q.value=q.__value=`object`;var J=p(q);J.value=J.__value=`array`,F(K),F(se);var fe=p(se,2);F(ne);var Y=p(ne,2),me=e=>{var n=$r(),r=_(n,!0);F(n),g(()=>t(r,G(c))),A(e,n)};j(Y,e=>{G(c)&&e(me)}),F(W);var he=p(W,2),X=e=>{A(e,ei())},_e=e=>{var n=li();i(n,21,()=>r.surface.stateDefinitions,e=>e.id,(e,n)=>{var a=ci(),o=_(a),s=_(o),c=_(s),d=_(c,!0);F(c);var f=p(c,2),v=_(f,!0);F(f),F(s);var y=p(s,2),b=_(y);b.value=b.__value=`string`;var S=p(b);S.value=S.__value=`number`;var C=p(S);C.value=C.__value=`boolean`;var T=p(C);T.value=T.__value=`enum`;var k=p(T);k.value=k.__value=`object`;var N=p(k);N.value=N.__value=`array`,F(y);var P;O(y);var z=p(y,2),V=e=>{var t=ti(),r=_(t);r.value=r.__value=`false`;var i=p(r);i.value=i.__value=`true`,F(t);var a;O(t),g(e=>{a!==(a=e)&&(t.value=(t.__value=e)??``,D(t,e))},[()=>String(G(n).defaultValue)]),l(`change`,t,e=>I(G(n).id,e.target.value,G(n).type)),A(e,t)},U=e=>{var t=ni();te(t),g(e=>L(t,e),[()=>JSON.stringify(G(n).defaultValue??E(G(n).type),null,2)]),l(`change`,t,e=>I(G(n).id,e.target.value,G(n).type)),A(e,t)},W=e=>{var t=ri();M(t),g(e=>{H(t,`type`,G(n).type===`number`?`number`:`text`),L(t,e)},[()=>String(G(n).defaultValue??``)]),l(`change`,t,e=>I(G(n).id,e.target.value,G(n).type)),A(e,t)};j(z,e=>{G(n).type===`boolean`?e(V):G(n).type===`object`||G(n).type===`array`?e(U,1):e(W,-1)});var ne=p(z,2);F(o);var re=p(o,2),ie=_(re),ae=p(_(ie));M(ae),F(ie);var oe=p(ie,2),se=e=>{var t=ii(),r=p(_(t));M(r),F(t),g(e=>L(r,e),[()=>(G(n).enumValues??[]).join(`, `)]),m(`blur`,r,e=>R(G(n).id,e.target.value)),A(e,t)};j(oe,e=>{G(n).type===`enum`&&e(se)}),F(re);var K=p(re,2),ce=e=>{var r=ai(),i=_(r,!0);F(r),g(()=>t(i,G(u)[G(n).id])),A(e,r)};j(K,e=>{G(u)[G(n).id]&&e(ce)});var le=p(K,2),ue=e=>{var r=si();i(p(_(r),2),17,()=>G(h),e=>e.id,(e,r)=>{var i=oi(),a=_(i);M(a);var o=p(a,2),s=_(o,!0);F(o),F(i),g((e,n)=>{w(a,e),H(a,`aria-label`,n),t(s,G(r).name)},[()=>G(n).sharedWith?.includes(G(r).id)??!1,()=>`Share ${String(G(n).path)} with ${G(r).name}`]),l(`change`,a,e=>B(G(n).id,G(r).id,e.target.checked)),A(e,i)}),F(r),A(e,r)};j(le,e=>{G(h).length>0&&e(ue)}),F(a),g(e=>{t(d,e),t(v,G(n).path),P!==(P=G(n).type)&&(y.value=(y.__value=G(n).type)??``,D(y,G(n).type)),L(ae,G(n).description??``)},[()=>De(G(n).path)]),l(`change`,y,e=>ee(G(n).id,e.target.value)),l(`click`,ne,()=>x(G(n).id)),m(`blur`,ae,e=>$.mutate(t=>rt(t,r.surface.id,G(n).id,{description:e.target.value||void 0}))),A(e,a)}),F(n),A(e,n)};j(he,e=>{r.surface.stateDefinitions.length===0?e(X):e(_e,-1)});var ve=p(he,2),ye=e=>{var n=di(),r=p(_(n),2);i(r,21,()=>G(v),e=>`${e.source.id}:${e.def.id}`,(e,n)=>{var r=ui(),i=_(r),a=_(i),o=_(a,!0);F(a);var s=p(a,2),c=_(s,!0);F(s),F(i);var l=p(i,2),u=_(l,!0);F(l),F(r),g(e=>{t(o,e),t(c,G(n).def.path),t(u,G(n).source.name)},[()=>De(G(n).def.path)]),A(e,r)}),F(r),F(n),A(e,n)};j(ve,e=>{G(v).length>0&&e(ye)}),F(U),g(()=>fe.disabled=G(d).length===0),l(`keydown`,ie,e=>{e.key===`Enter`&&(e.preventDefault(),y())}),S(ie,()=>G(o),e=>T(o,e)),P(K,()=>G(s),e=>T(s,e)),l(`click`,fe,y),A(n,U),C()}c([`keydown`,`click`,`change`]);var mi=[`equals`,`not_equals`,`greater_than`,`lower_than`,`contains`,`is_true`,`is_false`,`exists`,`does_not_exist`],hi=e=>{switch(e){case`is_true`:case`is_false`:case`exists`:case`does_not_exist`:return!1;default:return!0}},gi=e=>{switch(e){case`equals`:return`equals`;case`not_equals`:return`does not equal`;case`greater_than`:return`is greater than`;case`lower_than`:return`is lower than`;case`contains`:return`contains`;case`is_true`:return`is true`;case`is_false`:return`is false`;case`exists`:return`exists`;case`does_not_exist`:return`does not exist`}},_i=[`set_state`,`show_message`,`emit_event`,`block_action`,`allow_action`,`transition_surface`],vi=e=>{switch(e){case`set_state`:return`Set state`;case`show_message`:return`Show message`;case`emit_event`:return`Emit event`;case`block_action`:return`Block action`;case`allow_action`:return`Allow action`;case`transition_surface`:return`Transition to surface`}},yi=d(`<option disabled="">- pick a state -</option>`),bi=d(`<option> </option>`),xi=d(`<span class="mono text-[10px] text-neutral-400" title="Canonical state path"> </span>`),Si=d(`<select><!><!><option>Custom path…</option></select> <!>`,1),Ci=d(`<button type="button" class="text-[10px] text-brand-700 hover:underline">↩ Pick from list</button>`),wi=d(`<span class="text-[10px] text-amber-700">Not defined on this surface</span>`),Ti=d(`<input type="text"/> <div class="flex items-center gap-2"><!> <!></div>`,1),Ei=d(`<div class="flex flex-col gap-0.5"><!></div>`);function Di(e,n){N(n,!0);let a=b(n,`placeholder`,3,`state.path`),s=b(n,`width`,3,`min-w-44`),c=`__custom__`,u=z(()=>new Set(n.availablePaths)),d=z(()=>n.value.length>0&&!G(u).has(n.value)),f=V(!1);o(()=>{T(f,G(d),!0)});function h(e){if(e===c){T(f,!0);return}T(f,!1),n.onCommit(e)}function y(e){n.onCommit(e)}function x(){if(T(f,!1),G(u).has(n.value))return;let e=n.availablePaths[0];e&&n.onCommit(e)}var S=Ei(),w=_(S),E=e=>{var a=Si(),o=v(a),d=_(o),f=e=>{var t=yi();t.value=t.__value=``,A(e,t)},m=z(()=>!G(u).has(n.value));j(d,e=>{G(m)&&e(f)});var y=p(d);i(y,17,()=>n.availablePaths,r,(e,n)=>{var r=bi(),i=_(r,!0);F(r);var a={};g(e=>{H(r,`title`,G(n)),t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>De(G(n))]),A(e,r)});var b=p(y);b.value=b.__value=c,F(o);var x;O(o);var S=p(o,2),C=e=>{var r=xi(),i=_(r,!0);F(r),g(()=>t(i,n.value)),A(e,r)},w=z(()=>G(u).has(n.value));j(S,e=>{G(w)&&e(C)}),g(e=>{U(o,1,`${s()??``} rounded-md border border-neutral-300 px-2 py-1 text-xs`),x!==(x=e)&&(o.value=(o.__value=e)??``,D(o,e))},[()=>G(u).has(n.value)?n.value:``]),l(`change`,o,e=>h(e.target.value)),A(e,a)},k=e=>{var t=Ti(),r=v(t);M(r);var i=p(r,2),o=_(i),c=e=>{var t=Ci();l(`click`,t,x),A(e,t)};j(o,e=>{n.availablePaths.length>0&&e(c)});var u=p(o,2),f=e=>{A(e,wi())};j(u,e=>{G(d)&&e(f)}),F(i),g(()=>{U(r,1,`mono ${s()??``} rounded-md border px-2 py-1 text-xs ${G(d)?`border-amber-400 bg-amber-50`:`border-neutral-300`}`),L(r,n.value),H(r,`placeholder`,a())}),m(`blur`,r,e=>y(e.target.value)),A(e,t)};j(w,e=>{!G(f)&&n.availablePaths.length>0?e(E):e(k,-1)}),F(S),A(e,S),C()}c([`change`,`click`]);var Oi=d(`<button type="button" class="block w-full rounded px-2 py-1 text-left hover:bg-violet-50"><div class="font-medium text-slate-800"> </div> <div class="text-[10px] text-slate-500"> </div></button>`),ki=d(`<div class="absolute left-0 z-10 mt-1 max-h-72 w-72 overflow-y-auto rounded-md border border-slate-300 bg-white p-1 text-[11px] shadow-lg"><p class="px-2 py-1 text-[10px] text-slate-500">Picks a template; you can edit values after.</p> <!></div>`),Ai=d(`<span class="text-[10px] text-red-600"> </span>`),ji=d(`<span class="text-[10px] text-slate-500">Edit the AST directly, or use "Insert kind…" to pick a template for any Expression
3
- shape (sum, count_where, switch, etc.).</span>`),Mi=d(`<div class="flex min-w-64 flex-col gap-0.5"><div class="relative"><button type="button" class="rounded-md border border-slate-300 bg-white px-1.5 py-0.5 text-[10px] font-medium text-slate-700 hover:bg-slate-50">+ Insert kind…</button> <!></div> <textarea class="mono mt-0.5 min-h-20 w-full rounded-md border border-slate-300 px-2 py-1 text-xs" title="Advanced expression JSON"></textarea> <!></div>`),Ni=d(`<input type="text" class="mono mt-0.5 w-32 rounded-md border border-slate-300 px-2 py-1 text-xs" placeholder="value"/>`),Pi=d(`<div class="flex flex-wrap items-start gap-1"><div class="mt-0.5 flex rounded-md border border-slate-200 bg-white p-0.5 text-[10px]" role="tablist" aria-label="Right side type"><button type="button">Literal</button> <button type="button">State</button> <button type="button">JSON</button></div> <!></div>`);function Fi(e,n){N(n,!0);let r=z(()=>me(n.value)?n.value.kind===`state`?`state`:`expression`:`literal`),a=z(()=>n.value===void 0||me(n.value)?``:typeof n.value==`string`?n.value:JSON.stringify(n.value)),o=z(()=>me(n.value)&&n.value.kind===`state`?String(n.value.path):``),s=z(()=>me(n.value)&&n.value.kind!==`state`?JSON.stringify(n.value,null,2):``),c=V(``),u=V(null);function d(e){return e===`true`||e===`false`?e===`true`:e===`null`?null:e!==``&&!Number.isNaN(Number(e))?Number(e):e}function f(e){if(e!==G(r)){if(e===`literal`){n.onChange(``);return}if(e===`state`){let e=n.availablePaths[0]??Y(`state.path`);n.onChange({kind:`state`,path:e});return}T(c,G(s)||JSON.stringify({kind:`literal`,value:``},null,2),!0),T(u,null),n.onChange({kind:`literal`,value:``})}}function h(e){n.onChange(d(e))}function v(e){pe(e)&&n.onChange({kind:`state`,path:Y(e)})}function y(e){T(c,e,!0)}function b(){T(u,null);try{let e=JSON.parse(G(c)||G(s)||`null`);if(!me(e)){T(u,`Expression JSON needs a valid kind field.`);return}n.onChange(e)}catch{T(u,`Expression JSON is not valid.`)}}let x=[{kind:`literal`,label:`Literal`,hint:`A constant value.`,template:{kind:`literal`,value:``}},{kind:`state`,label:`Read state path`,hint:`Reads another state slot.`,template:{kind:`state`,path:`state.path`}},{kind:`param`,label:`Read parameter`,hint:`Reads an action parameter.`,template:{kind:`param`,name:`paramName`}},{kind:`add`,label:`+ Add (a + b)`,hint:`Sum of two expressions.`,template:{kind:`add`,left:{kind:`literal`,value:1},right:{kind:`literal`,value:1}}},{kind:`sub`,label:`− Subtract`,hint:`Difference of two expressions.`,template:{kind:`sub`,left:{kind:`literal`,value:1},right:{kind:`literal`,value:1}}},{kind:`mul`,label:`× Multiply`,hint:`Product of two expressions.`,template:{kind:`mul`,left:{kind:`literal`,value:1},right:{kind:`literal`,value:1}}},{kind:`div`,label:`÷ Divide`,hint:`Quotient. Division by 0 returns undefined.`,template:{kind:`div`,left:{kind:`literal`,value:1},right:{kind:`literal`,value:1}}},{kind:`min`,label:`min(a, b)`,hint:`Smaller of two values.`,template:{kind:`min`,left:{kind:`literal`,value:0},right:{kind:`literal`,value:1}}},{kind:`max`,label:`max(a, b)`,hint:`Larger of two values.`,template:{kind:`max`,left:{kind:`literal`,value:0},right:{kind:`literal`,value:1}}},{kind:`neg`,label:`neg(x), negate number`,hint:`Multiplies a number by -1.`,template:{kind:`neg`,operand:{kind:`state`,path:`state.path`}}},{kind:`not`,label:`not(x), flip boolean`,hint:`Inverts true/false. Use for toggle effects.`,template:{kind:`not`,operand:{kind:`state`,path:`state.path`}}},{kind:`sum`,label:`Σ sum(array)`,hint:`Sum of a numeric array.`,template:{kind:`sum`,operand:{kind:`state`,path:`shares`}}},{kind:`count`,label:`# count(array)`,hint:`Length of an array.`,template:{kind:`count`,operand:{kind:`state`,path:`items`}}},{kind:`sum_pluck`,label:`Σ sum_pluck, sum a field across objects`,hint:"Σ of `field` plucked from each object in an array (e.g. share.amount).",template:{kind:`sum_pluck`,operand:{kind:`state`,path:`shares`},field:`amount`}},{kind:`count_where`,label:`# count_where, count by field value`,hint:"Count of objects whose `field` equals a value (e.g. status=enrolled).",template:{kind:`count_where`,operand:{kind:`state`,path:`applications`},field:`status`,equals:{kind:`literal`,value:`enrolled`}}},{kind:`switch`,label:`⎇ switch, case / branch`,hint:`First case whose condition holds wins; falls through to default. Replaces multiple rules.`,template:{kind:`switch`,cases:[{when:{left:`enrolledCount`,operator:`lower_than`,right:{kind:`state`,path:`capacity`}},then:{kind:`literal`,value:`enrolled`}}],default:{kind:`literal`,value:`waitlisted`}}}],S=V(!1);function w(e){T(c,JSON.stringify(e.template,null,2),!0),T(u,null),T(S,!1),n.onChange(e.template)}var E=Pi(),D=_(E),O=_(D),k=p(O,2),P=p(k,2);F(D);var I=p(D,2),ee=e=>{Di(e,{get value(){return G(o)},get availablePaths(){return n.availablePaths},onCommit:v,width:`min-w-44`})},R=e=>{var n=Mi(),r=_(n),a=_(r),o=p(a,2),d=e=>{var n=ki();i(p(_(n),2),17,()=>x,e=>e.kind,(e,n)=>{var r=Oi(),i=_(r),a=_(i,!0);F(i);var o=p(i,2),s=_(o,!0);F(o),F(r),g(()=>{t(a,G(n).label),t(s,G(n).hint)}),l(`click`,r,()=>w(G(n))),A(e,r)}),F(n),A(e,n)};j(o,e=>{G(S)&&e(d)}),F(r);var f=p(r,2);te(f);var h=p(f,2),v=e=>{var n=Ai(),r=_(n,!0);F(n),g(()=>t(r,G(u))),A(e,n)},C=e=>{A(e,ji())};j(h,e=>{G(u)?e(v):e(C,-1)}),F(n),g(()=>L(f,G(c)||G(s))),l(`click`,a,()=>T(S,!G(S))),l(`input`,f,e=>y(e.target.value)),m(`blur`,f,b),A(e,n)},B=e=>{var t=Ni();M(t),g(()=>L(t,G(a))),l(`change`,t,e=>h(e.target.value)),A(e,t)};j(I,e=>{G(r)===`state`?e(ee):G(r)===`expression`?e(R,1):e(B,-1)}),F(E),g(()=>{U(O,1,`rounded px-1.5 py-0.5 ${G(r)===`literal`?`bg-slate-900 text-white`:`text-slate-600 hover:text-slate-900`}`),H(O,`aria-pressed`,G(r)===`literal`),U(k,1,`rounded px-1.5 py-0.5 ${G(r)===`state`?`bg-slate-900 text-white`:`text-slate-600 hover:text-slate-900`}`),H(k,`aria-pressed`,G(r)===`state`),U(P,1,`rounded px-1.5 py-0.5 ${G(r)===`expression`?`bg-slate-900 text-white`:`text-slate-600 hover:text-slate-900`}`),H(P,`aria-pressed`,G(r)===`expression`)}),l(`click`,O,()=>f(`literal`)),l(`click`,k,()=>f(`state`)),l(`click`,P,()=>f(`expression`)),A(e,E),C()}c([`click`,`input`,`change`]);var Ii=d(`<option> </option>`),Li=d(`<div class="flex items-start gap-2"><!> <span class="mt-1.5 text-xs text-neutral-500">=</span> <!></div>`),Ri=d(`<div class="flex items-center gap-2"><select class="rounded-md border border-neutral-300 px-2 py-1 text-xs"><option>info</option><option>success</option><option>warning</option><option>error</option></select> <input type="text" class="flex-1 rounded-md border border-neutral-300 px-2 py-1 text-xs"/></div>`),zi=d(`<input type="text" class="mono w-full rounded-md border border-neutral-300 px-2 py-1 text-xs" placeholder="domain.event_name"/>`),Bi=d(`<input type="text" class="w-full rounded-md border border-neutral-300 px-2 py-1 text-xs" placeholder="Reason for blocking"/>`),Vi=d(`<option> </option>`),Hi=d(`<select class="w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"><option>- pick a surface -</option><!></select> <p class="text-xs text-neutral-500">Navigate to the chosen surface after this action succeeds.</p>`,1),Ui=d(`<input type="text" class="mono w-full rounded-md border border-neutral-300 px-2 py-1 text-xs" placeholder="surface-id"/> <p class="text-xs text-neutral-500">Paste a surface id from the same feature.</p>`,1),Wi=d(`<p class="text-xs text-neutral-500">No configuration. Marks the action as allowed.</p>`),Gi=d(`<div class="space-y-2"><div class="flex items-center gap-2"><select class="rounded-md border border-neutral-300 px-2 py-1 text-xs"></select></div> <!></div>`);function Ki(e,n){N(n,!0);let a=b(n,`availablePaths`,19,()=>[]),o=b(n,`availableSurfaces`,19,()=>[]);function s(e){let t=n.effect.id;switch(e){case`set_state`:n.onChange({id:t,type:`set_state`,path:Y(`state.path`),value:``});break;case`show_message`:n.onChange({id:t,type:`show_message`,message:``});break;case`emit_event`:n.onChange({id:t,type:`emit_event`,event:K(`event.name`)});break;case`block_action`:n.onChange({id:t,type:`block_action`,reason:``});break;case`allow_action`:n.onChange({id:t,type:`allow_action`});break;case`transition_surface`:n.onChange({id:t,type:`transition_surface`,target:Se(``)});break}}function c(e){!pe(e)||n.effect.type!==`set_state`||n.onChange({...n.effect,path:Y(e)})}function d(e){n.effect.type===`emit_event`&&Pe(e)&&n.onChange({...n.effect,event:K(e)})}var f=Gi(),h=_(f),y=_(h);i(y,21,()=>_i,r,(e,n)=>{var r=Ii(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>vi(G(n))]),A(e,r)}),F(y);var x;O(y),F(h);var S=p(h,2),w=e=>{var t=Li(),r=_(t);Di(r,{get value(){return n.effect.path},get availablePaths(){return a()},onCommit:c}),Fi(p(r,4),{get value(){return n.effect.value},get availablePaths(){return a()},onChange:e=>n.onChange({...n.effect,value:e})}),F(t),A(e,t)},T=e=>{var t=Ri(),r=_(t),i=_(r);i.value=i.__value=`info`;var a=p(i);a.value=a.__value=`success`;var o=p(a);o.value=o.__value=`warning`;var s=p(o);s.value=s.__value=`error`,F(r);var c;O(r);var u=p(r,2);M(u),F(t),g(()=>{c!==(c=n.effect.tone??`info`)&&(r.value=(r.__value=n.effect.tone??`info`)??``,D(r,n.effect.tone??`info`)),L(u,n.effect.message)}),l(`change`,r,e=>n.onChange({...n.effect,tone:e.target.value})),m(`blur`,u,e=>n.onChange({...n.effect,message:e.target.value})),A(e,t)},E=e=>{var t=zi();M(t),g(()=>L(t,n.effect.event)),m(`blur`,t,e=>d(e.target.value)),A(e,t)},k=e=>{var t=Bi();M(t),g(()=>L(t,n.effect.reason)),m(`blur`,t,e=>n.onChange({...n.effect,reason:e.target.value})),A(e,t)},P=e=>{var r=u(),a=v(r),s=e=>{var r=Hi(),a=v(r),s=_(a);s.value=s.__value=``,i(p(s),17,o,e=>e.id,(e,n)=>{var r=Vi(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n).name),a!==(a=G(n).id)&&(r.value=(r.__value=G(n).id)??``)}),A(e,r)}),F(a);var c;O(a),ee(2),g(e=>{c!==(c=e)&&(a.value=(a.__value=e)??``,D(a,e))},[()=>String(n.effect.target??``)]),l(`change`,a,e=>n.onChange({...n.effect,target:Se(e.target.value)})),A(e,r)},c=e=>{var t=Ui(),r=v(t);M(r),ee(2),g(()=>L(r,n.effect.target)),m(`blur`,r,e=>n.onChange({...n.effect,target:Se(e.target.value)})),A(e,t)};j(a,e=>{o().length>0?e(s):e(c,-1)}),A(e,r)},I=e=>{A(e,Wi())};j(S,e=>{n.effect.type===`set_state`?e(w):n.effect.type===`show_message`?e(T,1):n.effect.type===`emit_event`?e(E,2):n.effect.type===`block_action`?e(k,3):n.effect.type===`transition_surface`?e(P,4):n.effect.type===`allow_action`&&e(I,5)}),F(f),g(()=>{x!==(x=n.effect.type)&&(y.value=(y.__value=n.effect.type)??``,D(y,n.effect.type))}),l(`change`,y,e=>s(e.target.value)),A(e,f),C()}c([`change`]);var qi=d(`<option> </option>`),Ji=d(`<div class="mt-0.5 inline-flex rounded-md border border-slate-300 bg-white p-0.5 text-[10px] font-medium"><button type="button">State</button> <button type="button">Param</button></div>`),Yi=d(`<option> </option>`),Xi=d(`<select class="mt-0.5 rounded-md border border-slate-300 px-2 py-1 text-xs font-mono"></select>`),Zi=d(`<option> </option>`),Qi=d(`<div class="flex flex-wrap items-start gap-2 text-sm"><span class="mt-1.5 font-mono text-xs text-slate-500">IF</span> <!> <!> <select class="mt-0.5 rounded-md border border-slate-300 px-2 py-1 text-xs"></select> <!></div>`),$i=d(`<div class="rounded-md border border-dashed border-slate-300 bg-white p-2 text-xs italic text-slate-500">Unconditional, this rule's effect always fires when the action runs.</div>`),ea=d(`<p class="text-[11px] text-red-600"> </p>`),ta=d(`<p class="text-[11px] text-slate-500">Saved on blur. Switch back to "Single" to use the visual editor.</p>`),na=d(`<div class="space-y-1"><p class="text-[11px] text-slate-500">Composite condition (<span class="font-mono"> </span>). Edit the tree as JSON.
4
- Each item may itself be a leaf <span class="mono"></span> or
5
- another composite <span class="mono"></span>.</p> <textarea class="mono min-h-32 w-full rounded-md border border-slate-300 px-2 py-1 text-xs"></textarea> <!></div>`),ra=d(`<div class="space-y-2 rounded-md border border-slate-200 bg-white p-3"><div class="flex items-center gap-2"><select class="rounded-md border border-slate-300 px-2 py-1 text-xs"></select> <span class="flex-1"></span> <button type="button" class="text-xs text-slate-400 hover:text-red-600" aria-label="Remove rule">Remove</button></div> <div class="rounded-md bg-slate-50 p-3"><div class="mb-2 flex flex-wrap items-center gap-1 text-[10px]"><span class="text-slate-500">Condition:</span> <button type="button" title="One comparison (e.g. count equals 0)">Single</button> <button type="button" title="ALL conditions must hold (logical AND)">All of</button> <button type="button" title="ANY condition holds (logical OR)">Any of</button> <button type="button" title="Effect always fires when the action runs">Always</button></div> <!> <div class="mt-2 flex items-start gap-2 text-sm"><span class="mt-2 font-mono text-xs text-slate-500">THEN</span> <div class="flex-1"><!></div></div></div> <input type="text" placeholder="Optional rationale" class="w-full rounded-md border border-slate-200 px-2 py-1 text-xs text-slate-600"/></div>`);function ia(e,n){N(n,!0);let a=b(n,`availableParameters`,19,()=>[]),s=z(()=>n.rule.condition!==void 0&&!oe(n.rule.condition)),c=z(()=>G(s)?n.rule.condition:null);function u(e){if(G(c)===null)return;let t={...n.rule,condition:{...G(c),...e}};n.onChange(t)}function d(e){pe(e)&&u({left:Y(e)})}function f(e){u({left:{kind:`param`,name:e}})}function h(e){G(c)!==null&&u(e===`state`?{left:n.availablePaths[0]??Y(`state.path`)}:{left:{kind:`param`,name:a()[0]?.name??``}})}let v=z(()=>G(c)&&Ae(G(c).left)?`param`:`state`),y=z(()=>G(c)&&!Ae(G(c).left)?G(c).left:``),x=z(()=>G(c)&&Ae(G(c).left)?G(c).left.name:``);function w(e){if(G(c)===null)return;let t=hi(e),r={...n.rule,condition:{left:G(c).left,operator:e,...t?{right:G(c).right??``}:{}}};n.onChange(r)}function E(e){n.onChange({...n.rule,category:e})}function k(e){n.onChange({...n.rule,effect:e})}function P(e){n.onChange({...n.rule,description:e.trim()||void 0})}function I(){let e={...n.rule};delete e.condition,n.onChange(e)}function R(){let e=n.availablePaths[0]??Y(`state.path`);n.onChange({...n.rule,condition:{left:e,operator:`is_true`}})}function B(e){let t=G(c)?[{left:G(c).left,operator:G(c).operator,...G(c).right===void 0?{}:{right:G(c).right}}]:[];n.onChange({...n.rule,condition:{kind:e,conditions:t}})}let H=V(``),W=V(null);o(()=>{if(n.rule.condition!==void 0&&oe(n.rule.condition)){let e=JSON.stringify(n.rule.condition,null,2);G(H).trim().length===0&&T(H,e,!0)}});function ne(){try{let e=JSON.parse(G(H));if(!e||typeof e!=`object`||!(`kind`in e)){T(W,'Top-level must be an object with `kind: "all" | "any" | "not"`.');return}let t=e.kind;if(t!==`all`&&t!==`any`&&t!==`not`){T(W,'`kind` must be "all", "any", or "not".');return}T(W,null),n.onChange({...n.rule,condition:e})}catch(e){T(W,e.message,!0)}}var re=ra(),ie=_(re),ae=_(ie);i(ae,21,()=>Ie,r,(e,n)=>{var r=qi(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>we(G(n))]),A(e,r)}),F(ae);var se;O(ae);var K=p(ae,4);F(ie);var ce=p(ie,2),le=_(ce),ue=p(_(le),2),de=p(ue,2),q=p(de,2),J=p(q,2);F(le);var fe=p(le,2),me=e=>{var o=Qi(),s=p(_(o),2),m=e=>{var t=Ji(),n=_(t),r=p(n,2);F(t),g(()=>{U(n,1,`rounded px-2 py-0.5 transition ${G(v)===`state`?`bg-slate-900 text-white`:`text-slate-600 hover:text-slate-900`}`),U(r,1,`rounded px-2 py-0.5 transition ${G(v)===`param`?`bg-slate-900 text-white`:`text-slate-600 hover:text-slate-900`}`)}),l(`click`,n,()=>h(`state`)),l(`click`,r,()=>h(`param`)),A(e,t)};j(s,e=>{a().length>0&&e(m)});var b=p(s,2),S=e=>{var n=Xi();i(n,21,a,e=>e.name,(e,n)=>{var r=Yi(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n).name),a!==(a=G(n).name)&&(r.value=(r.__value=G(n).name)??``)}),A(e,r)}),F(n);var r;O(n),g(()=>{r!==(r=G(x))&&(n.value=(n.__value=G(x))??``,D(n,G(x)))}),l(`change`,n,e=>f(e.target.value)),A(e,n)},C=e=>{Di(e,{get value(){return G(y)},get availablePaths(){return n.availablePaths},onCommit:d})};j(b,e=>{G(v)===`param`?e(S):e(C,-1)});var T=p(b,2);i(T,21,()=>mi,r,(e,n)=>{var r=Zi(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>gi(G(n))]),A(e,r)}),F(T);var E;O(T);var k=p(T,2),M=e=>{Fi(e,{get value(){return G(c).right},get availablePaths(){return n.availablePaths},onChange:e=>u({right:e})})},N=z(()=>hi(G(c).operator));j(k,e=>{G(N)&&e(M)}),F(o),g(()=>{E!==(E=G(c).operator)&&(T.value=(T.__value=G(c).operator)??``,D(T,G(c).operator))}),l(`change`,T,e=>w(e.target.value)),A(e,o)},he=e=>{A(e,$i())},ge=e=>{var r=na(),i=_(r),a=p(_(i)),o=_(a,!0);F(a);var s=p(a,2);s.textContent=`{left, operator, right}`;var c=p(s,2);c.textContent=`{kind, conditions}`,ee(),F(i);var l=p(i,2);te(l);var u=p(l,2),d=e=>{var n=ea(),r=_(n,!0);F(n),g(()=>t(r,G(W))),A(e,n)},f=e=>{A(e,ta())};j(u,e=>{G(W)?e(d):e(f,-1)}),F(r),g(()=>t(o,n.rule.condition.kind)),m(`blur`,l,ne),S(l,()=>G(H),e=>T(H,e)),A(e,r)};j(fe,e=>{G(c)?e(me):n.rule.condition===void 0?e(he,1):e(ge,-1)});var X=p(fe,2),_e=p(_(X),2);Ki(_(_e),{get effect(){return n.rule.effect},get availablePaths(){return n.availablePaths},onChange:k}),F(_e),F(X),F(ce);var ve=p(ce,2);M(ve),F(re),g((e,t)=>{se!==(se=n.rule.category)&&(ae.value=(ae.__value=n.rule.category)??``,D(ae,n.rule.category)),U(ue,1,`rounded px-1.5 py-0.5 ${G(c)?`bg-slate-900 text-white`:`border border-slate-300 text-slate-600 hover:bg-white`}`),ue.disabled=G(c)!==null,U(de,1,`rounded px-1.5 py-0.5 ${e??``}`),U(q,1,`rounded px-1.5 py-0.5 ${t??``}`),U(J,1,`rounded px-1.5 py-0.5 ${n.rule.condition===void 0?`bg-slate-900 text-white`:`border border-slate-300 text-slate-600 hover:bg-white`}`),L(ve,n.rule.description??``)},[()=>n.rule.condition!==void 0&&oe(n.rule.condition)&&n.rule.condition.kind===`all`?`bg-slate-900 text-white`:`border border-slate-300 text-slate-600 hover:bg-white`,()=>n.rule.condition!==void 0&&oe(n.rule.condition)&&n.rule.condition.kind===`any`?`bg-slate-900 text-white`:`border border-slate-300 text-slate-600 hover:bg-white`]),l(`change`,ae,e=>E(e.target.value)),l(`click`,K,function(...e){n.onRemove?.apply(this,e)}),l(`click`,ue,R),l(`click`,de,()=>B(`all`)),l(`click`,q,()=>B(`any`)),l(`click`,J,I),m(`blur`,ve,e=>P(e.target.value)),A(e,re),C()}c([`change`,`click`]);var aa=d(`<option> </option>`),oa=d(`<div class="flex flex-wrap items-start gap-2 text-sm"><span class="mt-1.5 font-mono text-xs text-slate-500">MUST</span> <!> <select class="mt-0.5 rounded-md border border-slate-300 px-2 py-1 text-xs"></select> <!></div>`),sa=d(`<p class="text-[11px] text-red-600"> </p>`),ca=d(`<p class="text-[11px] text-slate-500">Saved on blur. Switch back to "Single" for visual editing.</p>`),la=d(`<div class="space-y-1"><p class="text-[11px] text-slate-500">Composite condition (<span class="font-mono"> </span>). Each entry can be a leaf or another composite.</p> <textarea class="mono min-h-32 w-full rounded-md border border-slate-300 px-2 py-1 text-xs"></textarea> <!></div>`),ua=d(`<div class="space-y-2 rounded-md border border-slate-200 bg-white p-3"><div class="flex items-center gap-2"><input type="text" class="flex-1 rounded-md border border-slate-300 px-2 py-1 text-sm font-medium" placeholder="Invariant name"/> <button type="button" class="text-xs text-slate-400 hover:text-red-600" aria-label="Remove invariant">Remove</button></div> <div class="rounded-md bg-slate-50 p-3"><div class="mb-2 flex flex-wrap items-center gap-1 text-[10px]"><span class="text-slate-500">Condition:</span> <button type="button">Single</button> <button type="button">All of</button> <button type="button">Any of</button></div> <!></div> <input type="text" class="w-full rounded-md border border-slate-200 px-2 py-1 text-xs" placeholder="Violation message"/></div>`);function da(e,n){N(n,!0);let a=z(()=>oe(n.invariant.condition)?null:n.invariant.condition);function s(e){G(a)!==null&&n.onChange({...n.invariant,condition:{...G(a),...e}})}function c(e){pe(e)&&s({left:Y(e)})}function u(e){if(G(a)===null)return;let t=hi(e);n.onChange({...n.invariant,condition:{left:G(a).left,operator:e,...t?{right:G(a).right??``}:{}}})}function d(){let e=n.availablePaths[0]??Y(`state.path`);n.onChange({...n.invariant,condition:{left:e,operator:`is_true`}})}function f(e){let t=G(a)?[{left:G(a).left,operator:G(a).operator,...G(a).right===void 0?{}:{right:G(a).right}}]:[];n.onChange({...n.invariant,condition:{kind:e,conditions:t}})}let h=V(``),v=V(null);o(()=>{if(oe(n.invariant.condition)){let e=JSON.stringify(n.invariant.condition,null,2);G(h).trim().length===0&&T(h,e,!0)}});function y(){try{let e=JSON.parse(G(h));if(!e||typeof e!=`object`||!(`kind`in e)){T(v,'Top-level must be an object with `kind: "all" | "any" | "not"`.');return}let t=e.kind;if(t!==`all`&&t!==`any`&&t!==`not`){T(v,'`kind` must be "all", "any", or "not".');return}T(v,null),n.onChange({...n.invariant,condition:e})}catch(e){T(v,e.message,!0)}}var b=ua(),x=_(b),w=_(x);M(w);var E=p(w,2);F(x);var k=p(x,2),P=_(k),I=p(_(P),2),R=p(I,2),B=p(R,2);F(P);var H=p(P,2),W=e=>{var o=oa(),d=p(_(o),2);{let e=z(()=>typeof G(a).left==`string`?G(a).left:``);Di(d,{get value(){return G(e)},get availablePaths(){return n.availablePaths},onCommit:c})}var f=p(d,2);i(f,21,()=>mi,r,(e,n)=>{var r=aa(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>gi(G(n))]),A(e,r)}),F(f);var m;O(f);var h=p(f,2),v=e=>{Fi(e,{get value(){return G(a).right},get availablePaths(){return n.availablePaths},onChange:e=>s({right:e})})},y=z(()=>hi(G(a).operator));j(h,e=>{G(y)&&e(v)}),F(o),g(()=>{m!==(m=G(a).operator)&&(f.value=(f.__value=G(a).operator)??``,D(f,G(a).operator))}),l(`change`,f,e=>u(e.target.value)),A(e,o)},ne=e=>{var r=la(),i=_(r),a=p(_(i)),o=_(a,!0);F(a),ee(),F(i);var s=p(i,2);te(s);var c=p(s,2),l=e=>{var n=sa(),r=_(n,!0);F(n),g(()=>t(r,G(v))),A(e,n)},u=e=>{A(e,ca())};j(c,e=>{G(v)?e(l):e(u,-1)}),F(r),g(()=>t(o,n.invariant.condition.kind)),m(`blur`,s,y),S(s,()=>G(h),e=>T(h,e)),A(e,r)};j(H,e=>{G(a)?e(W):e(ne,-1)}),F(k);var re=p(k,2);M(re),F(b),g((e,t)=>{L(w,n.invariant.name),U(I,1,`rounded px-1.5 py-0.5 ${G(a)?`bg-slate-900 text-white`:`border border-slate-300 text-slate-600 hover:bg-white`}`),I.disabled=G(a)!==null,U(R,1,`rounded px-1.5 py-0.5 ${e??``}`),U(B,1,`rounded px-1.5 py-0.5 ${t??``}`),L(re,n.invariant.message)},[()=>oe(n.invariant.condition)&&n.invariant.condition.kind===`all`?`bg-slate-900 text-white`:`border border-slate-300 text-slate-600 hover:bg-white`,()=>oe(n.invariant.condition)&&n.invariant.condition.kind===`any`?`bg-slate-900 text-white`:`border border-slate-300 text-slate-600 hover:bg-white`]),m(`blur`,w,e=>n.onChange({...n.invariant,name:e.target.value})),l(`click`,E,function(...e){n.onRemove?.apply(this,e)}),l(`click`,I,d),l(`click`,R,()=>f(`all`)),l(`click`,B,()=>f(`any`)),m(`blur`,re,e=>n.onChange({...n.invariant,message:e.target.value})),A(e,b),C()}c([`click`,`change`]);var fa=[`relational_db`,`document_db`,`key_value_store`,`object_storage`,`file_system`,`cache`,`message_queue`,`event_stream`,`http_api`,`graphql_api`,`browser_storage`,`in_memory`,`other`],pa=e=>{switch(e){case`relational_db`:return`Relational DB`;case`document_db`:return`Document DB`;case`key_value_store`:return`Key/Value store`;case`object_storage`:return`Object storage`;case`file_system`:return`File system`;case`cache`:return`Cache`;case`message_queue`:return`Message queue`;case`event_stream`:return`Event stream`;case`http_api`:return`HTTP API`;case`graphql_api`:return`GraphQL API`;case`browser_storage`:return`Browser storage`;case`in_memory`:return`In-memory`;case`other`:return`Other`}},ma=e=>{switch(e){case`relational_db`:return{database:`Database`,container:`Table`,field:`Column`};case`document_db`:return{database:`Database`,container:`Collection`,field:`Field`};case`key_value_store`:return{database:`Namespace`,container:`Key prefix`,field:`Sub-key`};case`object_storage`:return{database:`Bucket`,container:`Prefix`,field:`Object key`};case`file_system`:return{database:`Volume`,container:`Directory`,field:`File`};case`cache`:return{database:`Namespace`,container:`Key pattern`,field:`Field`};case`message_queue`:return{database:`Cluster`,container:`Queue / topic`,field:`Message attribute`};case`event_stream`:return{database:`Cluster`,container:`Stream / topic`,field:`Field`};case`http_api`:return{database:`Base URL`,container:`Path`,field:`Field`};case`graphql_api`:return{database:`Endpoint`,container:`Type`,field:`Field`};case`browser_storage`:return{database:`Database`,container:`Store / key`,field:`Field`};case`in_memory`:return{database:`Process`,container:`Module`,field:`Field`};case`other`:return{database:`Container`,container:`Sub-container`,field:`Field`}}},ha=[`local`,`external`,`cloud`,`on_prem`],ga=e=>{switch(e){case`local`:return`Local (browser/device)`;case`external`:return`External third-party`;case`cloud`:return`Cloud`;case`on_prem`:return`On-premise`}},_a=[`public`,`internal`,`confidential`,`restricted`],va=e=>{switch(e){case`public`:return`Public`;case`internal`:return`Internal`;case`confidential`:return`Confidential`;case`restricted`:return`Restricted`}},ya=[`none`,`api_key`,`oauth2`,`jwt`,`basic_auth`,`iam_role`,`mtls`,`session_cookie`,`service_account`],ba=e=>{switch(e){case`none`:return`None`;case`api_key`:return`API key`;case`oauth2`:return`OAuth 2.0`;case`jwt`:return`JWT`;case`basic_auth`:return`Basic auth`;case`iam_role`:return`IAM role`;case`mtls`:return`Mutual TLS`;case`session_cookie`:return`Session cookie`;case`service_account`:return`Service account`}},xa=[`read`,`write`,`read_write`],Sa=e=>{switch(e){case`read`:return`Read-only`;case`write`:return`Write-only`;case`read_write`:return`Read & write`}},Ca=[`gdpr`,`ccpa`,`hipaa`,`pci_dss`,`sox`,`iso27001`,`soc2`,`ferpa`,`coppa`],wa=[{category:`presence`,label:`Presence`,types:[`non_empty`]},{category:`format`,label:`Format`,types:[`email`,`url`,`uuid`,`ipv4`,`ipv6`,`hex`,`base64`,`slug`,`phone_e164`,`color_hex`,`semver`,`json`,`iso_date`,`iso_datetime`,`iso_time`]},{category:`shape`,label:`Shape`,types:[`min_length`,`max_length`,`length`,`pattern`,`starts_with`,`ends_with`,`contains`,`alphanumeric`,`alphabetic`,`lowercase`,`uppercase`,`no_whitespace`]},{category:`range`,label:`Range`,types:[`min`,`max`,`multiple_of`,`integer`,`finite`,`safe_integer`,`positive`,`negative`,`non_negative`,`non_positive`]}];wa.flatMap(e=>e.types);var Ta=e=>{switch(e){case`non_empty`:return`Non-empty`;case`min_length`:return`Min length`;case`max_length`:return`Max length`;case`length`:return`Exact length`;case`pattern`:return`Match regex`;case`starts_with`:return`Starts with`;case`ends_with`:return`Ends with`;case`contains`:return`Contains substring`;case`alphanumeric`:return`Alphanumeric only`;case`alphabetic`:return`Letters only`;case`lowercase`:return`Lowercase only`;case`uppercase`:return`Uppercase only`;case`no_whitespace`:return`No whitespace`;case`email`:return`Email address`;case`url`:return`URL`;case`uuid`:return`UUID`;case`ipv4`:return`IPv4 address`;case`ipv6`:return`IPv6 address`;case`hex`:return`Hex string`;case`base64`:return`Base64`;case`slug`:return`Slug (URL-safe)`;case`phone_e164`:return`Phone (E.164)`;case`color_hex`:return`Hex color`;case`semver`:return`SemVer`;case`json`:return`Valid JSON`;case`iso_date`:return`ISO date (YYYY-MM-DD)`;case`iso_datetime`:return`ISO datetime`;case`iso_time`:return`ISO time`;case`min`:return`Min value`;case`max`:return`Max value`;case`multiple_of`:return`Multiple of`;case`integer`:return`Integer`;case`finite`:return`Finite`;case`safe_integer`:return`Safe integer`;case`positive`:return`Positive`;case`negative`:return`Negative`;case`non_negative`:return`Non-negative`;case`non_positive`:return`Non-positive`}},Ea=e=>{switch(e){case`min_length`:case`max_length`:case`length`:case`min`:case`max`:case`multiple_of`:return`number`;case`pattern`:case`starts_with`:case`ends_with`:case`contains`:return`string`;default:return null}},Da=e=>{switch(e){case`non_empty`:case`min_length`:case`max_length`:case`length`:case`pattern`:case`starts_with`:case`ends_with`:case`contains`:case`alphanumeric`:case`alphabetic`:case`lowercase`:case`uppercase`:case`no_whitespace`:case`email`:case`url`:case`uuid`:case`ipv4`:case`ipv6`:case`hex`:case`base64`:case`slug`:case`phone_e164`:case`color_hex`:case`semver`:case`json`:case`iso_date`:case`iso_datetime`:case`iso_time`:return`string`;case`min`:case`max`:case`multiple_of`:case`integer`:case`finite`:case`safe_integer`:case`positive`:case`negative`:case`non_negative`:case`non_positive`:return`number`}},Oa=d(`<p class="text-[11px] text-neutral-500">No built-in validations available for this type.</p>`),ka=d(`<p class="rounded-md border border-dashed border-neutral-300 p-2 text-center text-[11px] text-neutral-500">No validations. Only the type and "required" check apply.</p>`),Aa=d(`<option> </option>`),ja=d(`<optgroup></optgroup>`),Ma=d(`<input type="number" class="w-20 rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]"/>`),Na=d(`<input type="text" class="mono flex-1 rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]" placeholder="^[A-Z]+$"/>`),Pa=d(`<li class="space-y-1 rounded-md border border-neutral-200 bg-neutral-50 p-2"><div class="flex flex-wrap items-center gap-1.5"><select class="rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]"></select> <!> <button type="button" class="ml-auto text-neutral-400 hover:text-red-600" aria-label="Remove validation">✕</button></div> <input type="text" class="w-full rounded-md border border-neutral-200 px-1.5 py-0.5 text-[11px] text-neutral-600" placeholder="Custom error message (optional)"/></li>`),Fa=d(`<ul class="space-y-1"></ul>`),Ia=d(`<div class="space-y-2"><button type="button" class="rounded-md border border-neutral-300 px-2 py-1 text-[11px] hover:bg-neutral-50">+ Validation</button> <!> <!></div>`);function La(e,n){N(n,!0);function a(e){let t=Da(e);return t===`any`?!0:n.parameter.type===`string`||n.parameter.type===`enum`?t===`string`:n.parameter.type===`number`?t===`number`:!1}let o=z(()=>wa.map(e=>({label:e.label,types:e.types.filter(a)})).filter(e=>e.types.length>0)),s=z(()=>G(o).flatMap(e=>e.types)),c=z(()=>n.parameter.validations??[]);function u(e){switch(e){case`min_length`:case`max_length`:case`length`:return{type:e,value:1};case`min`:case`max`:return{type:e,value:0};case`multiple_of`:return{type:e,value:1};case`pattern`:return{type:e,value:`^.+$`};case`starts_with`:case`ends_with`:case`contains`:return{type:e,value:``};default:return{type:e}}}function d(){let e=G(s)[0];e&&n.onChange({validations:[...G(c),u(e)]})}function f(e,t){n.onChange({validations:G(c).map((n,r)=>r===e?t:n)})}function h(e){n.onChange({validations:G(c).filter((t,n)=>n!==e)})}function v(e,t){f(e,u(t))}function y(e,t){let n=G(c)[e];if(!n)return;let r=Ea(n.type);if(r===`number`){let r=Number(t);Number.isFinite(r)&&f(e,{...n,value:r});return}r===`string`&&f(e,{...n,value:t})}function b(e,t){let n=G(c)[e];n&&f(e,{...n,message:t.length===0?void 0:t})}var x=Ia(),S=_(x),w=p(S,2),T=e=>{A(e,Oa())};j(w,e=>{G(s).length===0&&e(T)});var E=p(w,2),k=e=>{A(e,ka())},P=e=>{var n=Fa();i(n,21,()=>G(c),r,(e,n,r)=>{let a=z(()=>Ea(G(n).type));var s=Pa(),c=_(s),u=_(c);i(u,21,()=>G(o),e=>e.label,(e,n)=>{var r=ja();i(r,20,()=>G(n).types,e=>e,(e,n)=>{var r=Aa(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=n)&&(r.value=(r.__value=n)??``)},[()=>Ta(n)]),A(e,r)}),F(r),g(()=>H(r,`label`,G(n).label)),A(e,r)}),F(u);var d;O(u);var f=p(u,2),x=e=>{var t=Ma();M(t),g(e=>L(t,e),[()=>String(G(n).value)]),l(`change`,t,e=>y(r,e.target.value)),A(e,t)},S=e=>{var t=Na();M(t),g(e=>L(t,e),[()=>String(G(n).value)]),l(`change`,t,e=>y(r,e.target.value)),A(e,t)};j(f,e=>{G(a)===`number`&&`value`in G(n)?e(x):G(a)===`string`&&`value`in G(n)&&e(S,1)});var C=p(f,2);F(c);var w=p(c,2);M(w),F(s),g(()=>{d!==(d=G(n).type)&&(u.value=(u.__value=G(n).type)??``,D(u,G(n).type)),L(w,G(n).message??``)}),l(`change`,u,e=>v(r,e.target.value)),l(`click`,C,()=>h(r)),m(`blur`,w,e=>b(r,e.target.value)),A(e,s)}),F(n),A(e,n)};j(E,e=>{G(c).length===0?e(k):e(P,-1)}),F(x),g(()=>S.disabled=G(s).length===0),l(`click`,S,d),A(e,x),C()}c([`click`,`change`]);var Ra=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-center text-xs text-neutral-500">No parameters.</p>`),za=d(`<option> </option>`),Ba=d(`<span class="rounded-md bg-sky-50 px-1.5 py-0.5 text-[10px] text-sky-800"> </span>`),Va=d(`<span class="rounded-md bg-emerald-50 px-1.5 py-0.5 text-[10px] text-emerald-800">bound</span>`),Ha=d(`<span class="rounded-md bg-violet-50 px-1.5 py-0.5 text-[10px] text-violet-800"> </span>`),Ua=d(`<select class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"><option>false</option><option>true</option></select>`),Wa=d(`<textarea class="mono mt-1 min-h-16 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"></textarea>`),Ga=d(`<input class="mono mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs" placeholder="optional default"/>`),Ka=d(`<span class="mt-1 block text-[10px] text-red-600"> </span>`),qa=d(`<label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Enum values</span> <input type="text" class="mono mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs" placeholder="small, medium, large"/></label>`),Ja=d(`<button type="button" class="text-[10px] text-neutral-400 hover:text-red-600">clear</button>`),Ya=d(`<p class="text-[11px] text-neutral-400">Define some state on the surface to make bindings available.</p>`),Xa=d(`<button type="button" class="text-[10px] text-neutral-400 hover:text-red-600">clear</button>`),Za=d(`<p class="text-[11px] text-neutral-400">No resources defined yet. Add some in the Resources tab.</p>`),Qa=d(`<option> </option>`),$a=d(`<span class="ml-1 text-red-700">· PII</span>`),eo=d(`<span class="ml-1 mono text-neutral-500"> </span>`),to=d(`<p class="mt-1 text-[11px] text-neutral-500"> <!> <!></p>`),no=d(`<select class="w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"><option>- No resource -</option><!></select> <!>`,1),ro=d(`<div class="space-y-3 border-t border-neutral-200 p-3 text-xs"><label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Description</span> <input type="text" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs" placeholder="What does this parameter mean?"/></label> <section class="grid grid-cols-1 gap-2 sm:grid-cols-2"><label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Default value</span> <!> <!></label> <!></section> <section><header class="mb-1 flex items-center gap-2"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Bind to state</span> <!></header> <p class="mb-1 text-[11px] text-neutral-500 leading-snug">When the action runs, the parameter value is written into this state path
6
- before rules evaluate. Useful for "the user picked X → store X in state".</p> <!></section> <section><header class="mb-1 flex items-center gap-2"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Linked resource</span> <!></header> <p class="mb-1 text-[11px] leading-snug text-neutral-500">Where this parameter's value comes from or is persisted to. Define resources in
7
- the Resources tab.</p> <!></section> <section><header class="mb-1 text-[10px] font-medium uppercase tracking-wide text-neutral-500">Validations</header> <!></section></div>`),io=d(`<li><header class="flex flex-wrap items-center gap-2 px-2 py-1 text-xs"><button type="button" class="text-neutral-400 hover:text-neutral-700"> </button> <input type="text" class="mono rounded-md border border-neutral-300 px-2 py-0.5 text-xs"/> <select class="rounded-md border border-neutral-300 px-2 py-0.5 text-xs"></select> <label class="flex items-center gap-1 text-neutral-600"><input type="checkbox"/> required</label> <!> <!> <!> <button type="button" class="ml-auto text-neutral-400 hover:text-red-600" aria-label="Remove parameter">✕</button></header> <!></li>`),ao=d(`<ul class="space-y-2"></ul>`),oo=d(`<div class="space-y-2"><button type="button" class="rounded-md border border-neutral-300 px-2 py-1 text-xs hover:bg-neutral-50">+ Parameter</button> <!></div>`);function so(n,a){N(a,!0);let o=V(null),s=V(e({})),c=z(()=>a.surface.stateDefinitions.map(e=>e.path));async function u(){let e={id:xe(ge()),name:``,type:`string`,required:!0};await $.mutate(t=>ct(t,a.surface.id,a.action.id,{parameters:[...a.action.parameters,e]})),T(o,e.id,!0),await h(),document.querySelector(`[data-parameter-id="${e.id}"] input[type="text"]`)?.focus()}async function d(e,t){await $.mutate(n=>Ot(n,a.surface.id,a.action.id,e,t))}async function f(e){await $.mutate(t=>ct(t,a.surface.id,a.action.id,{parameters:a.action.parameters.filter(t=>t.id!==e)}))}function y(e,t){if(t.length===0){d(e.id,{bindToStatePath:void 0});return}pe(t)&&d(e.id,{bindToStatePath:Y(t)})}function b(e,t){if(t.length===0){d(e.id,{resourceId:void 0});return}d(e.id,{resourceId:J(t)})}function x(e){if(e)return a.resources.find(t=>t.id===e)}function S(e,t){let n=P(e);if(n===`number`){let e=Number(t);if(!Number.isFinite(e))throw Error(`Use a finite number.`);return e}if(n===`boolean`)return t===`true`;if(n===`object`||n===`array`){let e=JSON.parse(t);if(n===`object`&&(typeof e!=`object`||!e||Array.isArray(e)))throw Error(`Use a JSON object.`);if(n===`array`&&!Array.isArray(e))throw Error(`Use a JSON array.`);return e}return t}async function E(e,t){try{let n=S(e,t);T(s,{...G(s),[e.id]:``},!0),await d(e.id,{defaultValue:n})}catch(t){T(s,{...G(s),[e.id]:t instanceof Error?t.message:`Invalid default value.`},!0)}}async function k(e,t){let n=t.split(`,`).map(e=>e.trim()).filter(Boolean);await d(e.id,{enumValues:n})}function P(e){return _e(e.type)}var I=oo(),R=_(I),B=p(R,2),W=e=>{A(e,Ra())},ne=e=>{var n=ao();i(n,21,()=>a.action.parameters,e=>e.id,(e,n)=>{let u=z(()=>G(o)===G(n).id),h=z(()=>G(n).validations?.length??0);var S=io(),C=_(S),N=_(C),I=_(N,!0);F(N);var R=p(N,2);M(R);var B=p(R,2);i(B,21,()=>Fe,r,(e,n)=>{var r=za(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n)),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)}),A(e,r)}),F(B);var V;O(B);var W=p(B,2),ne=_(W);M(ne),ee(),F(W);var re=p(W,2),ie=e=>{var n=Ba(),r=_(n);F(n),g(()=>t(r,`${G(h)??``} validation${G(h)===1?``:`s`}`)),A(e,n)};j(re,e=>{G(h)>0&&e(ie)});var ae=p(re,2),oe=e=>{A(e,Va())};j(ae,e=>{G(n).bindToStatePath&&e(oe)});var se=p(ae,2),K=e=>{let r=z(()=>x(G(n).resourceId));var i=Ha(),a=_(i,!0);F(i),g(()=>{H(i,`title`,G(r)?.provider??``),t(a,G(r)?.name)}),A(e,i)},ce=z(()=>x(G(n).resourceId));j(se,e=>{G(ce)&&e(K)});var le=p(se,2);F(C);var ue=p(C,2),de=e=>{var r=ro(),o=_(r),u=p(_(o),2);M(u),F(o);var f=p(o,2),h=_(f),S=p(_(h),2),C=e=>{var t=Ua(),r=_(t);r.value=r.__value=`false`;var i=p(r);i.value=i.__value=`true`,F(t);var a;O(t),g(e=>{a!==(a=e)&&(t.value=(t.__value=e)??``,D(t,e))},[()=>String(G(n).defaultValue??!1)]),l(`change`,t,e=>E(G(n),e.target.value)),A(e,t)},w=z(()=>P(G(n))===`boolean`),T=e=>{var t=Wa();te(t),g(e=>L(t,e),[()=>JSON.stringify(G(n).defaultValue??(P(G(n))===`array`?[]:{}),null,2)]),m(`blur`,t,e=>E(G(n),e.target.value)),A(e,t)},N=z(()=>P(G(n))===`object`||P(G(n))===`array`),I=e=>{var t=Ga();M(t),g((e,n)=>{H(t,`type`,e),L(t,n)},[()=>P(G(n))===`number`?`number`:`text`,()=>String(G(n).defaultValue??``)]),m(`blur`,t,e=>E(G(n),e.target.value)),A(e,t)};j(S,e=>{G(w)?e(C):G(N)?e(T,1):e(I,-1)});var ee=p(S,2),R=e=>{var r=Ka(),i=_(r,!0);F(r),g(()=>t(i,G(s)[G(n).id])),A(e,r)};j(ee,e=>{G(s)[G(n).id]&&e(R)}),F(h);var B=p(h,2),V=e=>{var t=qa(),r=p(_(t),2);M(r),F(t),g(e=>L(r,e),[()=>(G(n).enumValues??[]).join(`, `)]),m(`blur`,r,e=>k(G(n),e.target.value)),A(e,t)};j(B,e=>{G(n).type===`enum`&&e(V)}),F(f);var U=p(f,2),W=_(U),ne=p(_(W),2),re=e=>{var t=Ja();l(`click`,t,()=>y(G(n),``)),A(e,t)};j(ne,e=>{G(n).bindToStatePath&&e(re)}),F(W);var ie=p(W,4),ae=e=>{{let t=z(()=>G(n).bindToStatePath??``);Di(e,{get value(){return G(t)},get availablePaths(){return G(c)},onCommit:e=>y(G(n),e)})}},oe=e=>{A(e,Ya())};j(ie,e=>{G(n).bindToStatePath||G(c).length>0?e(ae):e(oe,-1)}),F(U);var se=p(U,2),K=_(se),ce=p(_(K),2),le=e=>{var t=Xa();l(`click`,t,()=>b(G(n),``)),A(e,t)};j(ce,e=>{G(n).resourceId&&e(le)}),F(K);var ue=p(K,4),de=e=>{A(e,Za())},q=e=>{let r=z(()=>x(G(n).resourceId));var o=no(),s=v(o),c=_(s);c.value=c.__value=``,i(p(c),17,()=>a.resources,e=>e.id,(e,n)=>{var r=Qa(),i=_(r);F(r);var a={};g((e,o)=>{t(i,`${G(n).name??``} (${e??``} · ${o??``})`),a!==(a=G(n).id)&&(r.value=(r.__value=G(n).id)??``)},[()=>pa(G(n).kind),()=>va(G(n).sensitivity)]),A(e,r)}),F(s);var u;O(s);var d=p(s,2),f=e=>{var n=to(),i=_(n),a=p(i),o=e=>{A(e,$a())};j(a,e=>{G(r).containsPii&&e(o)});var s=p(a,2),c=e=>{var n=eo(),i=_(n);F(n),g(e=>t(i,`· ${e??``}`),[()=>G(r).complianceTags.join(`, `)]),A(e,n)};j(s,e=>{G(r).complianceTags.length>0&&e(c)}),F(n),g(()=>t(i,`${G(r).provider??``}${G(r).location?` · ${G(r).location}`:``} `)),A(e,n)};j(d,e=>{G(r)&&e(f)}),g(()=>{u!==(u=G(n).resourceId??``)&&(s.value=(s.__value=G(n).resourceId??``)??``,D(s,G(n).resourceId??``))}),l(`change`,s,e=>b(G(n),e.target.value)),A(e,o)};j(ue,e=>{a.resources.length===0?e(de):e(q,-1)}),F(se);var J=p(se,2);La(p(_(J),2),{get parameter(){return G(n)},onChange:e=>d(G(n).id,e)}),F(J),F(r),g(()=>L(u,G(n).description??``)),m(`blur`,u,e=>d(G(n).id,{description:e.target.value||void 0})),A(e,r)};j(ue,e=>{G(u)&&e(de)}),F(S),g(()=>{H(S,`data-parameter-id`,G(n).id),U(S,1,`rounded-md border bg-white ${G(u)?`border-brand-300 ring-1 ring-brand-200`:`border-neutral-200`}`),H(N,`aria-label`,G(u)?`Collapse`:`Expand`),t(I,G(u)?`▾`:`▸`),L(R,G(n).name),V!==(V=G(n).type)&&(B.value=(B.__value=G(n).type)??``,D(B,G(n).type)),w(ne,G(n).required)}),l(`click`,N,()=>T(o,G(u)?null:G(n).id,!0)),m(`blur`,R,e=>d(G(n).id,{name:e.target.value})),l(`change`,B,e=>d(G(n).id,{type:e.target.value})),l(`change`,ne,e=>d(G(n).id,{required:e.target.checked})),l(`click`,le,()=>f(G(n).id)),A(e,S)}),F(n),A(e,n)};j(B,e=>{a.action.parameters.length===0?e(W):e(ne,-1)}),F(I),l(`click`,R,u),A(n,I),C()}c([`click`,`change`]);var co=d(`<option disabled="">- pick a parameter -</option>`),lo=d(`<option> </option>`),uo=d(`<select><!><!><option>Custom name…</option></select>`),fo=d(`<button type="button" class="text-[10px] text-brand-700 hover:underline">↩ Pick from list</button>`),po=d(`<span class="text-[10px] text-amber-700">Not used by any action yet</span>`),mo=d(`<input type="text"/> <div class="flex items-center gap-2"><!> <!></div>`,1),ho=d(`<div class="flex flex-col gap-0.5"><!></div>`);function go(e,n){N(n,!0);let a=b(n,`placeholder`,3,`parameterName`),s=b(n,`width`,3,`min-w-32`),c=`__custom__`,u=z(()=>new Set(n.availableNames)),d=z(()=>n.value.length>0&&!G(u).has(n.value)),f=V(!1);o(()=>{T(f,G(d),!0)});function h(e){if(e===c){T(f,!0);return}T(f,!1),n.onCommit(e)}function y(){if(T(f,!1),G(u).has(n.value))return;let e=n.availableNames[0];e&&n.onCommit(e)}var x=ho(),S=_(x),w=e=>{var a=uo(),o=_(a),d=e=>{var t=co();t.value=t.__value=``,A(e,t)},f=z(()=>!G(u).has(n.value));j(o,e=>{G(f)&&e(d)});var m=p(o);i(m,17,()=>n.availableNames,r,(e,n)=>{var r=lo(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n)),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)}),A(e,r)});var v=p(m);v.value=v.__value=c,F(a);var y;O(a),g(e=>{U(a,1,`${s()??``} rounded-md border border-neutral-300 px-2 py-1 text-xs`),y!==(y=e)&&(a.value=(a.__value=e)??``,D(a,e))},[()=>G(u).has(n.value)?n.value:``]),l(`change`,a,e=>h(e.target.value)),A(e,a)},E=e=>{var t=mo(),r=v(t);M(r);var i=p(r,2),o=_(i),c=e=>{var t=fo();l(`click`,t,y),A(e,t)};j(o,e=>{n.availableNames.length>0&&e(c)});var u=p(o,2),f=e=>{A(e,po())};j(u,e=>{G(d)&&e(f)}),F(i),g(()=>{U(r,1,`mono ${s()??``} rounded-md border px-2 py-1 text-xs ${G(d)?`border-amber-400 bg-amber-50`:`border-neutral-300`}`),L(r,n.value),H(r,`placeholder`,a())}),m(`blur`,r,e=>n.onCommit(e.target.value)),A(e,t)};j(S,e=>{!G(f)&&n.availableNames.length>0?e(w):e(E,-1)}),F(x),A(e,x),C()}c([`change`,`click`]);var _o=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-center text-xs text-neutral-500">No scenarios yet.</p>`),vo=d(`<span class="rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] text-neutral-700"> </span>`),yo=d(`<option> </option>`),bo=d(`<li class="flex flex-wrap items-start gap-1.5"><!> <input type="text" class="mono mt-0.5 w-32 rounded-md border border-neutral-300 px-2 py-1 text-xs"/> <button type="button" class="mt-1 text-neutral-400 hover:text-red-600">x</button></li>`),xo=d(`<li class="flex flex-wrap items-center gap-1.5"><!> <input type="text" class="mono w-32 rounded-md border border-neutral-300 px-2 py-1 text-xs"/> <button type="button" class="text-neutral-400 hover:text-red-600">x</button></li>`),So=d(`<option> </option>`),Co=d(`<li class="flex flex-wrap items-start gap-1.5 rounded-md bg-neutral-50 p-2"><!> <select class="mt-0.5 rounded-md border border-neutral-300 px-2 py-1 text-xs"></select> <!> <input type="text" class="min-w-40 flex-1 rounded-md border border-neutral-300 px-2 py-1 text-xs" placeholder="Description"/> <button type="button" class="mt-1 text-neutral-400 hover:text-red-600">x</button></li>`),wo=d(`<div class="space-y-3 border-t border-neutral-200 p-3 text-xs"><div class="grid grid-cols-1 gap-2 sm:grid-cols-2"><label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Name</span> <input type="text" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"/></label> <label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Expected status</span> <select class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"><option>No expectation</option><option>success</option><option>blocked</option></select></label></div> <label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Expected transition</span> <select class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"><option>No expectation</option><option>Asserts NO transition fires</option><!></select> <span class="mt-0.5 block text-[10px] text-neutral-500">Run the action and confirm it lands on the chosen surface (or asserts none).</span></label> <label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Description</span> <input type="text" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"/></label> <section><header class="mb-1 flex items-center justify-between"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500"> </span> <button type="button" class="rounded-md border border-neutral-300 px-2 py-0.5 text-[11px] hover:bg-neutral-50">+ State</button></header> <ul class="space-y-1"></ul></section> <section><header class="mb-1 flex items-center justify-between"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500"> </span> <button type="button" class="rounded-md border border-neutral-300 px-2 py-0.5 text-[11px] hover:bg-neutral-50">+ Parameter</button></header> <ul class="space-y-1"></ul></section> <section><header class="mb-1 flex items-center justify-between"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500"> </span> <button type="button" class="rounded-md border border-neutral-300 px-2 py-0.5 text-[11px] hover:bg-neutral-50">+ Assertion</button></header> <ul class="space-y-1"></ul></section></div>`),To=d(`<li><header class="flex items-center gap-2 px-2 py-1 text-xs"><button type="button" class="text-neutral-400 hover:text-neutral-700"> </button> <span class="flex-1 font-medium text-neutral-900"> </span> <!> <button type="button" class="text-neutral-400 hover:text-neutral-700 disabled:opacity-30" aria-label="Move scenario up">up</button> <button type="button" class="text-neutral-400 hover:text-neutral-700 disabled:opacity-30" aria-label="Move scenario down">down</button> <button type="button" class="text-neutral-400 hover:text-red-600" aria-label="Remove scenario">x</button></header> <!></li>`),Eo=d(`<ul class="space-y-2"></ul>`),Do=d(`<section class="space-y-2"><div class="flex items-center justify-between gap-2"><p class="text-xs text-neutral-500">Named setups for simulator and CI-grade scenario runs.</p> <button type="button" class="rounded-md border border-neutral-300 px-2 py-0.5 text-xs hover:bg-neutral-50">+ Scenario</button></div> <!></section>`);function Oo(e,n){N(n,!0);let a=z(()=>$.feature?.surfaces??[]),o=z(()=>n.action.scenarios??[]),s=z(()=>n.surface.stateDefinitions.map(e=>e.path)),c=z(()=>n.action.parameters.map(e=>e.name)),u=V(null);function d(e){return e===`true`||e===`false`?e===`true`:e===`null`?null:e!==``&&!Number.isNaN(Number(e))?Number(e):e}async function f(){let e={id:q(ge()),name:`Scenario ${(n.action.scenarios?.length??0)+1}`,stateOverrides:[],parameterOverrides:[]};await $.mutate(t=>gt(t,n.surface.id,n.action.id,e)),T(u,e.id,!0)}async function h(e,t){await $.mutate(r=>ft(r,n.surface.id,n.action.id,e,t))}async function v(e){await $.mutate(t=>ct(t,n.surface.id,n.action.id,{scenarios:e}))}async function y(e){confirm(`Delete this scenario?`)&&await $.mutate(t=>nt(t,n.surface.id,n.action.id,e))}function b(e){let t=G(s)[0]??Y(`state.path`);h(e.id,{stateOverrides:[...e.stateOverrides,{path:t,value:``}]})}function x(e,t,n,r){h(e.id,{stateOverrides:e.stateOverrides.map((e,i)=>i===t?{path:n,value:r}:e)})}function S(e,t){h(e.id,{stateOverrides:e.stateOverrides.filter((e,n)=>n!==t)})}function w(e){h(e.id,{parameterOverrides:[...e.parameterOverrides,{parameterName:G(c)[0]??`parameter`,value:``}]})}function E(e,t,n,r){h(e.id,{parameterOverrides:e.parameterOverrides.map((e,i)=>i===t?{parameterName:n,value:r}:e)})}function k(e,t){h(e.id,{parameterOverrides:e.parameterOverrides.filter((e,n)=>n!==t)})}function P(e){let t={path:G(s)[0]??Y(`state.path`),operator:`equals`,value:``};h(e.id,{expectedAssertions:[...e.expectedAssertions??[],t]})}function I(e,t,n){let r=e.expectedAssertions??[];h(e.id,{expectedAssertions:r.map((e,r)=>r===t?{...e,...n}:e)})}function te(e,t){let n=(e.expectedAssertions??[]).filter((e,n)=>n!==t);h(e.id,{expectedAssertions:n.length>0?n:void 0})}function R(e,t){let n=G(o).findIndex(t=>t.id===e.id),r=n+t;if(n<0||r<0||r>=G(o).length)return;let i=G(o).slice(),[a]=i.splice(n,1);a&&(i.splice(r,0,a),v(i))}var B=Do(),W=_(B),ne=p(_(W),2);F(W);var re=p(W,2),ie=e=>{A(e,_o())},ae=e=>{var n=Eo();i(n,23,()=>G(o),e=>e.id,(e,n,f)=>{let v=z(()=>G(u)===G(n).id);var C=To(),N=_(C),B=_(N),V=_(B,!0);F(B);var W=p(B,2),ne=_(W,!0);F(W);var re=p(W,2),ie=e=>{var r=vo(),i=_(r);F(r),g(()=>t(i,`expects ${G(n).expectedStatus??``}`)),A(e,r)};j(re,e=>{G(n).expectedStatus&&e(ie)});var ae=p(re,2),oe=p(ae,2),se=p(oe,2);F(N);var K=p(N,2),ce=e=>{var o=wo(),u=_(o),f=_(u),v=p(_(f),2);M(v),F(f);var y=p(f,2),C=p(_(y),2),T=_(C);T.value=T.__value=``;var N=p(T);N.value=N.__value=`success`;var R=p(N);R.value=R.__value=`blocked`,F(C);var B;O(C),F(y),F(u);var V=p(u,2),H=p(_(V),2),U=_(H);U.value=U.__value=``;var W=p(U);W.value=W.__value=`__none__`,i(p(W),17,()=>G(a),e=>e.id,(e,n)=>{var r=yo(),i=_(r);F(r);var a={};g(()=>{t(i,`→ ${G(n).name??``}`),a!==(a=G(n).id)&&(r.value=(r.__value=G(n).id)??``)}),A(e,r)}),F(H);var ne;O(H),ee(2),F(V);var re=p(V,2),ie=p(_(re),2);M(ie),F(re);var ae=p(re,2),oe=_(ae),se=_(oe),K=_(se);F(se);var ce=p(se,2);F(oe);var le=p(oe,2);i(le,21,()=>G(n).stateOverrides,r,(e,t,r)=>{var i=bo(),a=_(i);Di(a,{get value(){return G(t).path},get availablePaths(){return G(s)},onCommit:e=>{pe(e)&&x(G(n),r,Y(e),G(t).value)}});var o=p(a,2);M(o);var c=p(o,2);F(i),g(e=>L(o,e),[()=>String(G(t).value??``)]),l(`change`,o,e=>x(G(n),r,G(t).path,d(e.target.value))),l(`click`,c,()=>S(G(n),r)),A(e,i)}),F(le),F(ae);var ue=p(ae,2),de=_(ue),q=_(de),J=_(q);F(q);var fe=p(q,2);F(de);var me=p(de,2);i(me,21,()=>G(n).parameterOverrides,r,(e,t,r)=>{var i=xo(),a=_(i);go(a,{get value(){return G(t).parameterName},get availableNames(){return G(c)},onCommit:e=>E(G(n),r,e,G(t).value)});var o=p(a,2);M(o);var s=p(o,2);F(i),g(e=>L(o,e),[()=>String(G(t).value??``)]),l(`change`,o,e=>E(G(n),r,G(t).parameterName,d(e.target.value))),l(`click`,s,()=>k(G(n),r)),A(e,i)}),F(me),F(ue);var he=p(ue,2),ge=_(he),X=_(ge),_e=_(X);F(X);var ve=p(X,2);F(ge);var ye=p(ge,2);i(ye,21,()=>G(n).expectedAssertions??[],r,(e,a,o)=>{var c=Co(),u=_(c);Di(u,{get value(){return G(a).path},get availablePaths(){return G(s)},onCommit:e=>{pe(e)&&I(G(n),o,{path:Y(e)})}});var d=p(u,2);i(d,21,()=>mi,r,(e,n)=>{var r=So(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>gi(G(n))]),A(e,r)}),F(d);var f;O(d);var h=p(d,2),v=e=>{Fi(e,{get value(){return G(a).value},get availablePaths(){return G(s)},onChange:e=>I(G(n),o,{value:e})})},y=z(()=>hi(G(a).operator));j(h,e=>{G(y)&&e(v)});var b=p(h,2);M(b);var x=p(b,2);F(c),g(()=>{f!==(f=G(a).operator)&&(d.value=(d.__value=G(a).operator)??``,D(d,G(a).operator)),L(b,G(a).description??``)}),l(`change`,d,e=>{let t=e.target.value;I(G(n),o,{operator:t,...hi(t)?{value:G(a).value??``}:{value:void 0}})}),m(`blur`,b,e=>I(G(n),o,{description:e.target.value||void 0})),l(`click`,x,()=>te(G(n),o)),A(e,c)}),F(ye),F(he),F(o),g(()=>{L(v,G(n).name),B!==(B=G(n).expectedStatus??``)&&(C.value=(C.__value=G(n).expectedStatus??``)??``,D(C,G(n).expectedStatus??``)),ne!==(ne=G(n).expectedTransition===null?`__none__`:G(n).expectedTransition??``)&&(H.value=(H.__value=G(n).expectedTransition===null?`__none__`:G(n).expectedTransition??``)??``,D(H,G(n).expectedTransition===null?`__none__`:G(n).expectedTransition??``)),L(ie,G(n).description??``),t(K,`State overrides (${G(n).stateOverrides.length??``})`),t(J,`Parameter values (${G(n).parameterOverrides.length??``})`),t(_e,`Expected assertions (${G(n).expectedAssertions?.length??0??``})`)}),m(`blur`,v,e=>h(G(n).id,{name:e.target.value||G(n).name})),l(`change`,C,e=>{let t=e.target.value;h(G(n).id,{expectedStatus:t===``?void 0:t})}),l(`change`,H,e=>{let t=e.target.value;t===``?h(G(n).id,{expectedTransition:void 0}):t===`__none__`?h(G(n).id,{expectedTransition:null}):h(G(n).id,{expectedTransition:t})}),m(`blur`,ie,e=>h(G(n).id,{description:e.target.value||void 0})),l(`click`,ce,()=>b(G(n))),l(`click`,fe,()=>w(G(n))),l(`click`,ve,()=>P(G(n))),A(e,o)};j(K,e=>{G(v)&&e(ce)}),F(C),g(()=>{U(C,1,`rounded-md border bg-white ${G(v)?`border-brand-300 ring-1 ring-brand-200`:`border-neutral-200`}`),H(B,`aria-label`,G(v)?`Collapse scenario`:`Expand scenario`),t(V,G(v)?`v`:`>`),t(ne,G(n).name),ae.disabled=G(f)===0,oe.disabled=G(f)===G(o).length-1}),l(`click`,B,()=>T(u,G(v)?null:G(n).id,!0)),l(`click`,ae,()=>R(G(n),-1)),l(`click`,oe,()=>R(G(n),1)),l(`click`,se,()=>y(G(n).id)),A(e,C)}),F(n),A(e,n)};j(re,e=>{G(o).length===0?e(ie):e(ae,-1)}),F(B),l(`click`,ne,f),A(e,B),C()}c([`click`,`change`]);var ko=d(`<span class="rounded-full border border-violet-300 bg-violet-100 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-violet-700" title="Proposed improvement — not committed behavior yet"> </span>`),Ao=d(`<span class="text-xs text-slate-500"> </span>`),jo=d(`<button type="button" class="rounded px-1.5 text-xs font-medium text-violet-700 opacity-0 transition hover:bg-violet-100 group-hover:opacity-100" aria-label="Accept this proposal as a committed action" title="Accept: clear the proposal marker and make this a committed action">✓ accept</button>`),Mo=d(`<button type="button"> </button>`),No=d(`<button type="button" class="rounded px-1 text-xs text-slate-400 opacity-0 transition-opacity hover:bg-slate-100 hover:text-slate-700 group-hover:opacity-100 disabled:cursor-not-allowed disabled:opacity-0 group-hover:disabled:opacity-30" aria-label="Move action up" title="Move up">↑</button> <button type="button" class="rounded px-1 text-xs text-slate-400 opacity-0 transition-opacity hover:bg-slate-100 hover:text-slate-700 group-hover:opacity-100 disabled:cursor-not-allowed disabled:opacity-0 group-hover:disabled:opacity-30" aria-label="Move action down" title="Move down">↓</button>`,1),Po=d(`<p class="-mt-1 px-3 pb-2 text-xs leading-snug text-violet-700/90"><span aria-hidden="true">💡</span> </p>`),Fo=d(`<span class="mt-1 inline-block rounded bg-amber-100 px-1.5 py-0.5 text-[10px] font-semibold text-amber-800">! Repair action, invariants OFF</span>`),Io=d(`<option> </option>`),Lo=d(`<select class="mt-1 w-full rounded-md border border-slate-300 px-2 py-1 text-xs"><option>, Not a handler ,</option><!></select>`),Ro=d(`<input type="text" class="mono mt-1 w-full rounded-md border border-slate-300 px-2 py-1 text-xs" placeholder="domain.event_name"/>`),zo=d(`<span class="mt-1 inline-block rounded bg-violet-100 px-1.5 py-0.5 text-[10px] font-semibold text-violet-800"> </span>`),Bo=d(`<span class="inline-flex max-w-full items-center gap-1 rounded-md bg-white px-2 py-1 text-[11px] text-slate-700"><span class="mono truncate"> </span> <button type="button" class="text-slate-400 hover:text-red-600">x</button></span>`),Vo=d(`<div class="mt-2 flex flex-wrap gap-1"></div>`),Ho=d(`<option> </option>`),Uo=d(`<select class="min-w-0 flex-1 rounded-md border border-slate-300 px-2 py-1 text-xs"><option>Pick an event</option><!></select>`),Wo=d(`<input type="text" class="mono min-w-0 flex-1 rounded-md border border-slate-300 px-2 py-1 text-xs" placeholder="audit.started"/>`),Go=d(`<span class="inline-flex max-w-full items-center gap-1 rounded-md bg-white px-2 py-1 text-[11px] text-slate-700"><span class="mono truncate"> </span> <button type="button" class="text-slate-400 hover:text-red-600">x</button></span>`),Ko=d(`<div class="mt-2 flex flex-wrap gap-1"></div>`),qo=d(`<p class="rounded-md border border-dashed border-slate-300 p-3 text-center text-xs text-slate-500">No rules yet.</p>`),Jo=d(`<div class="space-y-2"></div>`),Yo=d(`<p class="rounded-md border border-dashed border-slate-300 p-3 text-center text-xs text-slate-500">No on-success effects yet.</p>`),Xo=d(`<li class="flex items-start gap-2 rounded-md border border-slate-200 bg-white p-3"><div class="flex-1"><!></div> <button type="button" class="text-xs text-slate-400 hover:text-red-600" aria-label="Remove effect">?</button></li>`),Zo=d(`<ul class="space-y-2"></ul>`),Qo=d(`<p class="rounded-md border border-dashed border-slate-300 p-3 text-center text-xs text-slate-500">No on-block effects yet.</p>`),$o=d(`<li class="flex items-start gap-2 rounded-md border border-amber-200 bg-amber-50/50 p-3"><div class="flex-1"><!></div> <button type="button" class="text-xs text-slate-400 hover:text-red-600" aria-label="Remove on-block effect">?</button></li>`),es=d(`<ul class="space-y-2"></ul>`),ts=d(`<p class="rounded-md border border-dashed border-slate-300 p-3 text-center text-xs text-slate-500">No invariants yet.</p>`),ns=d(`<div class="space-y-2"></div>`),rs=d(`<div class="space-y-4 border-t border-slate-200 p-3"><div class="grid grid-cols-1 gap-2 sm:grid-cols-2"><label class="block text-xs font-medium text-slate-600">Name <input type="text" class="mt-1 w-full rounded-md border border-slate-300 px-2 py-1 text-sm"/></label> <label class="block text-xs font-medium text-slate-600">Intent <input type="text" placeholder="What does this action do?" class="mt-1 w-full rounded-md border border-slate-300 px-2 py-1 text-sm"/></label></div> <section class="space-y-3 rounded-md border border-slate-200 bg-slate-50 p-3"><div class="grid grid-cols-1 gap-3 sm:grid-cols-2"><label class="flex items-start gap-2 rounded-md border border-slate-200 bg-white p-2 text-xs"><input type="checkbox" class="mt-0.5"/> <span><span class="font-semibold text-slate-800">Bypass invariants</span> <span class="block text-[11px] text-slate-500">Skip every invariant check when this action runs. Use ONLY for repair / admin
8
- actions that exist to fix a broken invariant (a regular action staying inside the
9
- invariants is safer).</span> <!></span></label> <label class="block rounded-md border border-slate-200 bg-white p-2 text-xs"><span class="font-semibold text-slate-800">Triggered by event</span> <span class="block text-[11px] text-slate-500">When another action emits this event anywhere in the project, this action runs
10
- automatically as a cascade. Leave empty for a normal user-triggered action.</span> <!> <!></label></div> <div class="grid grid-cols-1 gap-3 sm:grid-cols-2"><div><h3 class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-slate-500"> </h3> <div class="flex items-start gap-2"><!> <button type="button" class="rounded-md border border-slate-300 px-2 py-1 text-xs hover:bg-white disabled:opacity-50">Add</button></div> <!></div> <div><h3 class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-slate-500"> </h3> <div class="flex items-center gap-2"><!> <button type="button" class="rounded-md border border-slate-300 px-2 py-1 text-xs hover:bg-white disabled:opacity-50">Add</button></div> <!></div></div></section> <section data-tour="action-parameters-section"><h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-slate-500">Parameters</h3> <!></section> <section><h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-slate-500"> </h3> <!></section> <section data-tour="action-rules-section"><h3 class="mb-2 flex items-center justify-between text-xs font-semibold uppercase tracking-wide text-slate-500"><span> </span> <button type="button" class="rounded-md border border-slate-300 px-2 py-0.5 text-xs hover:bg-slate-50">+ Rule</button></h3> <!></section> <section data-tour="action-effects-section"><h3 class="mb-2 flex items-center justify-between text-xs font-semibold uppercase tracking-wide text-slate-500"><span> </span> <button type="button" class="rounded-md border border-slate-300 px-2 py-0.5 text-xs hover:bg-slate-50">+ Effect</button></h3> <p class="mb-2 text-xs text-slate-500">Applied when no rule blocks the action.</p> <!></section> <section><h3 class="mb-2 flex items-center justify-between text-xs font-semibold uppercase tracking-wide text-slate-500"><span> </span> <button type="button" class="rounded-md border border-slate-300 px-2 py-0.5 text-xs hover:bg-slate-50">+ Effect</button></h3> <p class="mb-2 text-xs text-slate-500">Applied when at least one rule blocks the action. Useful for graceful redirects (e.g.
11
- "? Sign in") or audit events on every reject. State mutations stay suppressed; events,
12
- messages, and transitions still fire.</p> <!></section> <section><h3 class="mb-2 flex items-center justify-between text-xs font-semibold uppercase tracking-wide text-slate-500"><span> </span> <button type="button" class="rounded-md border border-slate-300 px-2 py-0.5 text-xs hover:bg-slate-50">+ Invariant</button></h3> <!></section></div>`),is=d(`<article><header class="flex items-center justify-between gap-2 px-3 py-2"><button type="button" class="flex flex-1 items-center gap-2 text-left"><span class="text-xs text-slate-400" aria-hidden="true"> </span> <span> </span> <!></button> <div class="flex items-center gap-0.5"><!> <!> <!> <button type="button" class="rounded px-1 text-xs text-slate-400 hover:text-red-600" aria-label="Remove action" title="Remove">x</button></div></header> <!> <!></article>`);function as(e,n){N(n,!0);let r=b(n,`availableSurfaces`,19,()=>[]),a=b(n,`availableEvents`,19,()=>[]),o=z(()=>n.surface.stateDefinitions.map(e=>e.path)),s=z(()=>n.action.onBlockedEffects??[]),c=V(``),u=V(``);async function d(e){await $.mutate(t=>ct(t,n.surface.id,n.action.id,e))}async function f(){let e=Rn(ge,{category:`business`,left:n.surface.stateDefinitions[0]?.path??`state.path`,operator:`equals`});await $.mutate(t=>Ct(t,n.surface.id,n.action.id,e))}async function h(e){await $.mutate(t=>dt(t,n.surface.id,n.action.id,e))}async function y(e){await $.mutate(t=>$e(t,n.surface.id,n.action.id,e))}async function x(){let e=zn(ge,`set_state`);await $.mutate(t=>Tt(t,n.surface.id,n.action.id,e))}async function E(e){await $.mutate(t=>ct(t,n.surface.id,n.action.id,{effects:n.action.effects.map(t=>t.id===e.id?e:t)}))}async function k(e){await $.mutate(t=>ot(t,n.surface.id,n.action.id,e))}async function I(){let e=zn(ge,`transition_surface`),t=n.action.onBlockedEffects??[];await $.mutate(r=>ct(r,n.surface.id,n.action.id,{onBlockedEffects:[...t,e]}))}async function ee(e){let t=n.action.onBlockedEffects??[];await $.mutate(r=>ct(r,n.surface.id,n.action.id,{onBlockedEffects:t.map(t=>t.id===e.id?e:t)}))}async function te(e){let t=n.action.onBlockedEffects??[];await $.mutate(r=>ct(r,n.surface.id,n.action.id,{onBlockedEffects:t.filter(t=>t.id!==e)}))}async function R(){let e=Bn(ge,{name:`New invariant`,left:n.surface.stateDefinitions[0]?.path??`state.path`});await $.mutate(t=>Et(t,n.surface.id,n.action.id,e))}async function B(e){await $.mutate(t=>ct(t,n.surface.id,n.action.id,{invariants:n.action.invariants.map(t=>t.id===e.id?e:t)}))}async function ne(e){await $.mutate(t=>St(t,n.surface.id,n.action.id,e))}async function re(e){!pe(e)||n.action.requiredStates.includes(e)||(await d({requiredStates:[...n.action.requiredStates,Y(e)]}),T(c,``))}async function ie(e){await d({requiredStates:n.action.requiredStates.filter(t=>t!==e)})}async function ae(e){!Pe(e)||n.action.emittedEvents.includes(e)||(await d({emittedEvents:[...n.action.emittedEvents,K(e)]}),T(u,``))}async function oe(e){await d({emittedEvents:n.action.emittedEvents.filter(t=>t!==e)})}let se=z(()=>$.feature?.id),ce=z(()=>G(se)?rn.isActionQueued(G(se),n.action.id):!1);async function le(){if(G(se))if(G(ce)){let e=rn.findQueueItemIdForAction(G(se),n.action.id);e&&await rn.dequeueByItemId(e)}else await rn.enqueueAction(G(se),n.action.id)}let ue=z(()=>n.action.evolution),de=z(()=>[`group rounded-md border bg-white`,G(ue)?`border-dashed`:``,n.expanded?`border-brand-300 ring-1 ring-brand-200`:G(ue)?`border-violet-300 bg-violet-50/40`:`border-slate-200`].filter(Boolean).join(` `));async function q(){await d({evolution:void 0})}var J=is(),fe=_(J),me=_(fe),he=_(me),X=_(he,!0);F(he);var _e=p(he,2),ve=_(_e,!0);F(_e);var ye=p(_e,2),be=e=>{var n=ko(),r=_(n);F(n),g(()=>t(r,`Evolution${G(ue).category?` · ${G(ue).category}`:``}`)),A(e,n)},xe=e=>{var r=Ao(),i=_(r);F(r),g(()=>t(i,`${n.action.rules.length??``} rule(s) · ${n.action.effects.length??``} effect(s)`)),A(e,r)};j(ye,e=>{G(ue)?e(be):e(xe,-1)}),F(me);var Se=p(me,2),Z=_(Se),Ce=e=>{var t=jo();l(`click`,t,q),A(e,t)};j(Z,e=>{G(ue)&&e(Ce)});var we=p(Z,2),Te=e=>{var n=Mo(),r=_(n,!0);F(n),g(()=>{U(n,1,`rounded px-1.5 text-xs transition-opacity ${G(ce)?`text-brand-700 opacity-100`:`text-slate-400 opacity-0 hover:bg-slate-100 hover:text-slate-700 group-hover:opacity-100`}`),H(n,`aria-label`,G(ce)?`Remove action from queue`:`Add action to implementation queue`),H(n,`title`,G(ce)?`In queue (click to remove)`:`Add to implementation queue`),t(r,G(ce)?`✓ queued`:`+ queue`)}),l(`click`,n,le),A(e,n)};j(we,e=>{rn.isInProject&&G(se)&&e(Te)});var Ee=p(we,2),De=e=>{var t=No(),r=v(t),i=p(r,2);g(()=>{r.disabled=n.onMoveUp===void 0,i.disabled=n.onMoveDown===void 0}),l(`click`,r,function(...e){n.onMoveUp?.apply(this,e)}),l(`click`,i,function(...e){n.onMoveDown?.apply(this,e)}),A(e,t)};j(Ee,e=>{(n.onMoveUp!==void 0||n.onMoveDown!==void 0)&&e(De)});var Oe=p(Ee,2);F(Se),F(fe);var ke=p(fe,2),Ae=e=>{var n=Po(),r=p(_(n));F(n),g(()=>t(r,` ${G(ue).rationale??``}${G(ue).source?` — ${G(ue).source}`:``}`)),A(e,n)};j(ke,e=>{G(ue)&&e(Ae)});var je=p(ke,2),Me=e=>{var v=rs(),b=_(v),C=_(b),N=p(_(C));M(N),F(C);var z=p(C,2),V=p(_(z));M(V),F(z),F(b);var U=p(b,2),W=_(U),se=_(W),ce=_(se);M(ce);var le=p(ce,2),ue=p(_(le),4),de=e=>{A(e,Fo())};j(ue,e=>{n.action.bypassInvariants===!0&&e(de)}),F(le),F(se);var q=p(se,2),J=p(_(q),4),fe=e=>{var r=Lo(),o=_(r);o.value=o.__value=``,i(p(o),17,a,e=>e.id,(e,n)=>{var r=Io(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n).name),a!==(a=G(n).name)&&(r.value=(r.__value=G(n).name)??``)}),A(e,r)}),F(r);var s;O(r),g(()=>{s!==(s=n.action.triggeredByEvent??``)&&(r.value=(r.__value=n.action.triggeredByEvent??``)??``,D(r,n.action.triggeredByEvent??``))}),l(`change`,r,e=>{let t=e.target.value;d({triggeredByEvent:t.length>0?K(t):void 0})}),A(e,r)},Y=e=>{var t=Ro();M(t),g(()=>L(t,n.action.triggeredByEvent??``)),m(`blur`,t,e=>{let t=e.target.value;d({triggeredByEvent:t.length>0&&Pe(t)?K(t):void 0})}),A(e,t)};j(J,e=>{a().length>0?e(fe):e(Y,-1)});var me=p(J,2),he=e=>{var r=zo(),i=_(r);F(r),g(()=>t(i,`? Handler, fires on "${n.action.triggeredByEvent??``}"`)),A(e,r)};j(me,e=>{n.action.triggeredByEvent&&e(he)}),F(q),F(W);var ge=p(W,2),X=_(ge),_e=_(X),ve=_(_e);F(_e);var ye=p(_e,2),be=_(ye);Di(be,{get value(){return G(c)},get availablePaths(){return G(o)},onCommit:e=>T(c,e,!0),width:`min-w-0 flex-1`});var xe=p(be,2);F(ye);var Se=p(ye,2),Z=e=>{var r=Vo();i(r,20,()=>n.action.requiredStates,e=>e,(e,n)=>{var r=Bo(),i=_(r),a=_(i,!0);F(i);var o=p(i,2);F(r),g(()=>{t(a,n),H(o,`aria-label`,`Remove required state ${n}`)}),l(`click`,o,()=>ie(n)),A(e,r)}),F(r),A(e,r)};j(Se,e=>{n.action.requiredStates.length>0&&e(Z)}),F(X);var Ce=p(X,2),we=_(Ce),Te=_(we);F(we);var Ee=p(we,2),De=_(Ee),Oe=e=>{var n=Uo(),r=_(n);r.value=r.__value=``,i(p(r),17,a,e=>e.id,(e,n)=>{var r=Ho(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n).name),a!==(a=G(n).name)&&(r.value=(r.__value=G(n).name)??``)}),A(e,r)}),F(n),P(n,()=>G(u),e=>T(u,e)),A(e,n)},ke=e=>{var t=Wo();M(t),S(t,()=>G(u),e=>T(u,e)),A(e,t)};j(De,e=>{a().length>0?e(Oe):e(ke,-1)});var Ae=p(De,2);F(Ee);var je=p(Ee,2),Me=e=>{var r=Ko();i(r,20,()=>n.action.emittedEvents,e=>e,(e,n)=>{var r=Go(),i=_(r),a=_(i,!0);F(i);var o=p(i,2);F(r),g(()=>{t(a,n),H(o,`aria-label`,`Remove emitted event ${n}`)}),l(`click`,o,()=>oe(n)),A(e,r)}),F(r),A(e,r)};j(je,e=>{n.action.emittedEvents.length>0&&e(Me)}),F(Ce),F(ge),F(U);var Q=p(U,2);so(p(_(Q),2),{get surface(){return n.surface},get action(){return n.action},get resources(){return n.resources}}),F(Q);var Ne=p(Q,2),Fe=_(Ne),Ie=_(Fe);F(Fe),Oo(p(Fe,2),{get surface(){return n.surface},get action(){return n.action}}),F(Ne);var Le=p(Ne,2),Re=_(Le),ze=_(Re),Be=_(ze);F(ze);var Ve=p(ze,2);F(Re);var He=p(Re,2),Ue=e=>{A(e,qo())},We=e=>{var t=Jo();i(t,21,()=>n.action.rules,e=>e.id,(e,t)=>{ia(e,{get rule(){return G(t)},get availablePaths(){return G(o)},get availableParameters(){return n.action.parameters},onChange:e=>h(e),onRemove:()=>y(G(t).id)})}),F(t),A(e,t)};j(He,e=>{n.action.rules.length===0?e(Ue):e(We,-1)}),F(Le);var Ge=p(Le,2),Ke=_(Ge),qe=_(Ke),Je=_(qe);F(qe);var Ye=p(qe,2);F(Ke);var Xe=p(Ke,4),Ze=e=>{A(e,Yo())},Qe=e=>{var t=Zo();i(t,21,()=>n.action.effects,e=>e.id,(e,t)=>{var n=Xo(),i=_(n);Ki(_(i),{get effect(){return G(t)},get availablePaths(){return G(o)},get availableSurfaces(){return r()},onChange:e=>E(e)}),F(i);var a=p(i,2);F(n),l(`click`,a,()=>k(G(t).id)),A(e,n)}),F(t),A(e,t)};j(Xe,e=>{n.action.effects.length===0?e(Ze):e(Qe,-1)}),F(Ge);var $e=p(Ge,2),et=_($e),tt=_(et),nt=_(tt);F(tt);var rt=p(tt,2);F(et);var it=p(et,4),at=e=>{A(e,Qo())},ot=e=>{var t=es();i(t,21,()=>G(s),e=>e.id,(e,t)=>{var n=$o(),i=_(n);Ki(_(i),{get effect(){return G(t)},get availablePaths(){return G(o)},get availableSurfaces(){return r()},onChange:e=>ee(e)}),F(i);var a=p(i,2);F(n),l(`click`,a,()=>te(G(t).id)),A(e,n)}),F(t),A(e,t)};j(it,e=>{G(s).length===0?e(at):e(ot,-1)}),F($e);var st=p($e,2),ct=_(st),lt=_(ct),ut=_(lt);F(lt);var dt=p(lt,2);F(ct);var ft=p(ct,2),pt=e=>{A(e,ts())},mt=e=>{var t=ns();i(t,21,()=>n.action.invariants,e=>e.id,(e,t)=>{da(e,{get invariant(){return G(t)},get availablePaths(){return G(o)},onChange:e=>B(e),onRemove:()=>ne(G(t).id)})}),F(t),A(e,t)};j(ft,e=>{n.action.invariants.length===0?e(pt):e(mt,-1)}),F(st),F(v),g((e,r)=>{L(N,n.action.name),L(V,n.action.intent),w(ce,n.action.bypassInvariants===!0),t(ve,`Required states (${n.action.requiredStates.length??``})`),xe.disabled=e,t(Te,`Emitted events (${n.action.emittedEvents.length??``})`),Ae.disabled=r,t(Ie,`Scenarios (${n.action.scenarios?.length??0??``})`),t(Be,`Rules (${n.action.rules.length??``})`),t(Je,`On success effects (${n.action.effects.length??``})`),t(nt,`On block effects (${G(s).length??``})`),t(ut,`Invariants (${n.action.invariants.length??``})`)},[()=>!pe(G(c)),()=>!Pe(G(u))]),m(`blur`,N,e=>d({name:e.target.value})),m(`blur`,V,e=>d({intent:e.target.value})),l(`change`,ce,e=>d({bypassInvariants:e.target.checked||void 0})),l(`click`,xe,()=>re(G(c))),l(`click`,Ae,()=>ae(G(u))),l(`click`,Ve,f),l(`click`,Ye,x),l(`click`,rt,I),l(`click`,dt,R),A(e,v)};j(je,e=>{n.expanded&&e(Me)}),F(J),g(()=>{U(J,1,W(G(de))),H(J,`data-focus-target`,`action:${n.action.id}`),t(X,n.expanded?`▾`:`▸`),U(_e,1,`font-medium ${G(ue)?`text-violet-900`:`text-slate-900`}`),t(ve,n.action.name)}),l(`click`,me,function(...e){n.onToggle?.apply(this,e)}),l(`click`,Oe,function(...e){n.onRemove?.apply(this,e)}),A(e,J),C()}c([`click`,`change`]);var os=d(`<div class="flex items-center gap-2 text-xs text-slate-600"><span class="text-slate-500">Group by:</span> <div class="inline-flex rounded-md border border-slate-200 bg-white p-0.5"><button type="button">None</button> <button type="button">Rule category</button></div></div>`),ss=d(`<div class="rounded-lg border border-dashed border-slate-300 bg-slate-50/30 p-6 text-center"><p class="text-sm font-medium text-slate-700">No actions yet</p> <p class="mx-auto mt-1 max-w-sm text-xs text-slate-500">An action is something the user or system can do on this surface. Add one above to get
13
- started, parameters, rules, and effects come next.</p></div>`),cs=d(`<li><!></li>`),ls=d(`<section><header class="mb-1 flex items-center gap-2"><span class="text-[10px] font-semibold uppercase tracking-wide text-slate-500"> </span> <span class="rounded-md bg-slate-100 px-1.5 py-0.5 text-[10px] text-slate-600"> </span></header> <ul class="space-y-2"></ul></section>`),us=d(`<div class="space-y-4"></div>`),ds=d(`<li><!></li>`),fs=d(`<ul class="space-y-2"></ul>`),ps=d(`<div class="space-y-3"><form class="flex items-center gap-2 rounded-lg border border-slate-200 bg-slate-50/60 p-2" data-tour="add-action-form"><input type="text" placeholder="Name a new action (e.g. Delete selection)" class="h-9 flex-1 rounded-md border border-slate-300 bg-white px-2.5 text-sm outline-none focus:border-slate-900 focus:ring-1 focus:ring-slate-900"/> <button type="submit" class="h-9 inline-flex items-center gap-1 rounded-md bg-slate-900 px-3 text-xs font-medium text-white transition hover:bg-slate-800 disabled:opacity-50"><span class="text-base leading-none">+</span> Add action</button></form> <!> <!></div>`);function ms(e,n){N(n,!0);let r=b(n,`availableSurfaces`,19,()=>[]),a=b(n,`availableEvents`,19,()=>[]),o=V(``),s=V(`none`),c=z(()=>zt(ze.currentStep,`add-action`,G(o)));async function u(){let e=G(o).trim();if(e.length===0)return;let t=In(ge,{name:e});await $.mutate(e=>jt(e,n.surface.id,t)),ln.selectCapability(t.id),Re(`editor.action.added`,{surfaceId:String(n.surface.id),actionId:String(t.id),name:e}),T(o,``)}async function d(e){confirm(`Delete this action?`)&&await $.mutate(t=>Nt(t,n.surface.id,e.id))}async function f(e,t){await $.mutate(r=>Ft(r,n.surface.id,e.id,t))}function h(e){if(e.rules.length===0)return`uncategorized`;let t=new Map;for(let n of e.rules)t.set(n.category,(t.get(n.category)??0)+1);let n=null,r=0;for(let[e,i]of t)i>r&&(n=e,r=i);return n??`uncategorized`}function v(e){return e===`uncategorized`?`Uncategorized`:we(e)}let y=z(()=>{if(G(s)===`none`)return[];let e=new Map;for(let t of n.surface.actions){let n=h(t);e.has(n)||e.set(n,[]),e.get(n).push(t)}return Array.from(e.entries()).sort(([e],[t])=>e===`uncategorized`?1:t===`uncategorized`?-1:v(e).localeCompare(v(t))).map(([e,t])=>({key:e,actions:t}))});var x=ps(),w=_(x),E=_(w);M(E);var D=p(E,2);F(w);var O=p(w,2),k=e=>{var t=os(),n=p(_(t),2),r=_(n),i=p(r,2);F(n),F(t),g(()=>{U(r,1,`rounded px-2 py-0.5 transition ${G(s)===`none`?`bg-slate-900 text-white`:`text-slate-600 hover:text-slate-900`}`),U(i,1,`rounded px-2 py-0.5 transition ${G(s)===`category`?`bg-slate-900 text-white`:`text-slate-600 hover:text-slate-900`}`)}),l(`click`,r,()=>T(s,`none`)),l(`click`,i,()=>T(s,`category`)),A(e,t)};j(O,e=>{n.surface.actions.length>1&&e(k)});var P=p(O,2),I=e=>{A(e,ss())},L=e=>{var o=us();i(o,21,()=>G(y),e=>e.key,(e,o)=>{var s=ls(),c=_(s),l=_(c),u=_(l,!0);F(l);var f=p(l,2),m=_(f,!0);F(f),F(c);var h=p(c,2);i(h,21,()=>G(o).actions,e=>e.id,(e,t)=>{var i=cs(),o=_(i);{let e=z(()=>ln.selectedCapabilityId===G(t).id);as(o,{get surface(){return n.surface},get action(){return G(t)},get resources(){return n.resources},get availableSurfaces(){return r()},get availableEvents(){return a()},get expanded(){return G(e)},onToggle:()=>ln.selectCapability(ln.selectedCapabilityId===G(t).id?null:G(t).id),onRemove:()=>d(G(t))})}F(i),A(e,i)}),F(h),F(s),g(e=>{t(u,e),t(m,G(o).actions.length)},[()=>v(G(o).key)]),A(e,s)}),F(o),A(e,o)},ee=e=>{var t=fs();i(t,23,()=>n.surface.actions,e=>e.id,(e,t,i)=>{var o=ds(),s=_(o);{let e=z(()=>ln.selectedCapabilityId===G(t).id),o=z(()=>G(i)>0?()=>f(G(t),-1):void 0),c=z(()=>G(i)<n.surface.actions.length-1?()=>f(G(t),1):void 0);as(s,{get surface(){return n.surface},get action(){return G(t)},get resources(){return n.resources},get availableSurfaces(){return r()},get availableEvents(){return a()},get expanded(){return G(e)},onToggle:()=>ln.selectCapability(ln.selectedCapabilityId===G(t).id?null:G(t).id),onRemove:()=>d(G(t)),get onMoveUp(){return G(o)},get onMoveDown(){return G(c)}})}F(o),A(e,o)}),F(t),A(e,t)};j(P,e=>{n.surface.actions.length===0?e(I):G(s)===`category`?e(L,1):e(ee,-1)}),F(x),g(e=>{D.disabled=e,H(D,`title`,G(c).blocked?`Tutorial: name must be exactly "${G(c).requiredValue}"`:void 0)},[()=>G(o).trim().length===0||G(c).blocked]),m(`submit`,w,e=>{e.preventDefault(),u()}),S(E,()=>G(o),e=>T(o,e)),A(e,x),C()}c([`click`]);var hs=d(`<div class="rounded-lg border border-dashed border-slate-300 bg-slate-50/30 p-6 text-center"><p class="text-sm font-medium text-slate-700">No surface-level rules</p> <p class="mx-auto mt-1 max-w-sm text-xs text-slate-500">Surface rules fire before every action on this surface. Use them for cross-cutting
14
- gates: signed-in check, role gate, kill-switch.</p></div>`),gs=d(`<div class="space-y-2"></div>`),_s=d(`<div class="space-y-3"><div class="flex justify-end"><button type="button" class="inline-flex items-center gap-1 rounded-md border border-slate-300 bg-white px-3 py-1.5 text-xs font-medium text-slate-700 transition hover:bg-slate-50"><span class="text-base leading-none">+</span> Add surface rule</button></div> <!></div>`);function vs(e,t){N(t,!0);let n=z(()=>t.surface.stateDefinitions.map(e=>e.path));async function r(){let e=Rn(ge,{category:`permissions`,left:t.surface.stateDefinitions[0]?.path??`state.path`,operator:`equals`});await $.mutate(n=>Mt(n,t.surface.id,e))}async function a(e){await $.mutate(n=>ut(n,t.surface.id,e))}async function o(e){await $.mutate(n=>et(n,t.surface.id,e.id))}var s=_s(),c=_(s),u=_(c);F(c);var d=p(c,2),f=e=>{A(e,hs())},m=e=>{var r=gs();i(r,21,()=>t.surface.rules,e=>e.id,(e,t)=>{ia(e,{get rule(){return G(t)},get availablePaths(){return G(n)},onChange:e=>a(e),onRemove:()=>o(G(t))})}),F(r),A(e,r)};j(d,e=>{t.surface.rules.length===0?e(f):e(m,-1)}),F(s),l(`click`,u,r),A(e,s),C()}c([`click`]);var ys=d(`<div class="rounded-lg border border-dashed border-slate-300 bg-slate-50/30 p-6 text-center"><p class="text-sm font-medium text-slate-700">No invariants on this surface</p> <p class="mx-auto mt-1 max-w-sm text-xs text-slate-500">Invariants are properties that must hold after every action runs on this surface, like
15
- "count is never negative". Violations block the simulation.</p></div>`),bs=d(`<div class="space-y-2"></div>`),xs=d(`<div class="space-y-3"><div class="flex justify-end"><button type="button" class="inline-flex items-center gap-1 rounded-md border border-slate-300 bg-white px-3 py-1.5 text-xs font-medium text-slate-700 transition hover:bg-slate-50"><span class="text-base leading-none">+</span> Add invariant</button></div> <!></div>`);function Ss(e,t){N(t,!0);let n=z(()=>t.surface.stateDefinitions.map(e=>e.path));async function r(){let e=Bn(ge,{name:`New invariant`,left:t.surface.stateDefinitions[0]?.path??`state.path`});await $.mutate(n=>At(n,t.surface.id,e))}async function a(e){await $.mutate(n=>({...n,surfaces:n.surfaces.map(n=>n.id===t.surface.id?{...n,invariants:n.invariants.map(t=>t.id===e.id?e:t)}:n)}))}async function o(e){await $.mutate(n=>Ve(n,t.surface.id,e.id))}var s=xs(),c=_(s),u=_(c);F(c);var d=p(c,2),f=e=>{A(e,ys())},m=e=>{var r=bs();i(r,21,()=>t.surface.invariants,e=>e.id,(e,t)=>{da(e,{get invariant(){return G(t)},get availablePaths(){return G(n)},onChange:e=>a(e),onRemove:()=>o(G(t))})}),F(r),A(e,r)};j(d,e=>{t.surface.invariants.length===0?e(f):e(m,-1)}),F(s),l(`click`,u,r),A(e,s),C()}c([`click`]);var Cs=d(`<option> </option>`),ws=d(`<div class="space-y-3"><div class="grid grid-cols-1 gap-3 sm:grid-cols-2"><label class="block text-xs font-medium text-slate-600">Name <input type="text" class="mt-1 w-full rounded-md border border-slate-300 px-2 py-1 text-sm outline-none focus:border-slate-900"/></label> <label class="block text-xs font-medium text-slate-600">Type <select class="mt-1 w-full rounded-md border border-slate-300 px-2 py-1 text-sm outline-none focus:border-slate-900"></select></label></div> <label class="block text-xs font-medium text-slate-600">Description <textarea rows="4" placeholder="What happens on this surface? Who lands here, and what can they do?" class="mt-1 w-full resize-y rounded-md border border-slate-300 px-2 py-1.5 text-sm font-normal leading-snug outline-none focus:border-slate-900"></textarea></label> <div class="flex justify-end gap-2"><button type="button" class="rounded-md bg-slate-900 px-3 py-1.5 text-xs font-medium text-white">Done</button></div></div>`),Ts=d(`<button type="button"> </button>`),Es=d(`<p class="whitespace-pre-wrap text-sm leading-6 text-slate-600"> </p>`),Ds=d(`<p class="text-sm italic text-slate-400">No description yet.</p>`),Os=d(`<div class="space-y-2"><div class="flex items-start justify-between gap-3"><div class="flex flex-wrap items-center gap-2"><h2 class="text-lg font-semibold leading-tight text-slate-950"> </h2> <span class="rounded-md bg-slate-100 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-slate-600"> </span></div> <div class="flex shrink-0 items-center gap-1"><!> <button type="button" aria-label="Edit surface metadata" class="rounded-md border border-transparent px-2 py-1 text-xs font-medium text-slate-500 hover:border-hairline hover:bg-slate-50 hover:text-slate-950">Edit</button></div></div> <!></div>`),ks=d(`<div class="group border-b border-hairline px-4 pt-3 pb-4"><!></div>`);function As(e,n){N(n,!0);let a=z(()=>$.feature?.id),s=z(()=>G(a)?rn.isSurfaceQueued(G(a),n.surface.id):!1);async function c(){if(G(a))if(G(s)){let e=rn.findQueueItemIdForSurface(G(a),n.surface.id);e&&await rn.dequeueByItemId(e)}else await rn.enqueueSurface(G(a),n.surface.id)}let u=V(!1),d=V(``),f=V(`screen`),h=V(``);o(()=>{T(d,n.surface.name,!0),T(f,n.surface.type,!0),T(h,n.surface.description??``,!0)});async function v(){G(d).trim()===n.surface.name&&G(f)===n.surface.type&&G(h).trim()===(n.surface.description??``)||await $.mutate(e=>it(e,n.surface.id,{name:G(d).trim()||n.surface.name,type:G(f),description:G(h).trim()||void 0}))}async function y(){await v(),T(u,!1)}var b=ks(),x=_(b),w=e=>{var n=ws(),a=_(n),o=_(a),s=p(_(o));M(s),F(o);var c=p(o,2),u=p(_(c));i(u,21,()=>Nn,r,(e,n)=>{var r=Cs(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>Pn(G(n))]),A(e,r)}),F(u),F(c),F(a);var b=p(a,2),x=p(_(b));te(x),F(b);var C=p(b,2),w=_(C);F(C),F(n),m(`blur`,s,v),S(s,()=>G(d),e=>T(d,e)),l(`change`,u,v),P(u,()=>G(f),e=>T(f,e)),m(`blur`,x,v),S(x,()=>G(h),e=>T(h,e)),l(`click`,w,y),A(e,n)},E=e=>{var r=Os(),i=_(r),o=_(i),d=_(o),f=_(d,!0);F(d);var m=p(d,2),h=_(m,!0);F(m),F(o);var v=p(o,2),y=_(v),b=e=>{var n=Ts(),r=_(n,!0);F(n),g(()=>{U(n,1,`rounded-md border border-transparent px-2 py-1 text-xs font-medium transition ${G(s)?`text-brand-700 opacity-100 hover:bg-cyan-50 hover:text-brand-900`:`text-slate-500 opacity-0 hover:border-hairline hover:bg-cyan-50 hover:text-brand-800 group-hover:opacity-100 group-focus-within:opacity-100`}`),H(n,`aria-label`,G(s)?`Remove surface from queue`:`Add surface to implementation queue`),H(n,`title`,G(s)?`In queue (click to remove)`:`Add surface to implementation queue`),t(r,G(s)?`✓ queued`:`+ queue`)}),l(`click`,n,c),A(e,n)};j(y,e=>{rn.isInProject&&G(a)&&e(b)});var x=p(y,2);F(v),F(i);var S=p(i,2),C=e=>{var r=Es(),i=_(r,!0);F(r),g(()=>t(i,n.surface.description)),A(e,r)},w=z(()=>n.surface.description&&n.surface.description.trim().length>0),E=e=>{A(e,Ds())};j(S,e=>{G(w)?e(C):e(E,-1)}),F(r),g(e=>{t(f,n.surface.name),t(h,e)},[()=>Pn(n.surface.type)]),l(`click`,x,()=>T(u,!0)),A(e,r)};j(x,e=>{G(u)?e(w):e(E,-1)}),F(b),A(e,b),C()}c([`change`,`click`]);var js=d(`<div class="rounded-lg border border-dashed border-slate-300 bg-slate-50/30 p-6 text-center"><p class="text-sm font-medium text-slate-700">No linked resources here</p> <p class="mx-auto mt-1 max-w-md text-xs text-slate-500">No parameter on this surface points at a resource yet. Open an action, expand a
16
- parameter, and pick one in the <em>Linked resource</em> section. Manage the global
17
- catalogue under <strong>Resources</strong> in the top-level tabs.</p></div>`),Ms=d(`<span class="rounded-md bg-red-50 px-1.5 py-0.5 text-[10px] text-red-700">PII</span>`),Ns=d(`<span> </span>`),Ps=d(`<span> </span>`),Fs=d(`<span class="mono rounded-md bg-slate-100 px-1.5 py-0.5 text-[10px] uppercase text-slate-600"> </span>`),Is=d(`<div class="mt-1 flex flex-wrap gap-1"></div>`),Ls=d(`<li><span class="font-medium"> </span> · <span class="mono"> </span></li>`),Rs=d(`<li class="rounded-md border border-slate-200 bg-white p-3 text-xs"><header class="flex flex-wrap items-center gap-2"><span class="font-medium text-slate-900"> </span> <span> </span> <!></header> <div class="mt-0.5 flex flex-wrap gap-x-2 gap-y-0.5 text-[11px] text-slate-500"><span> </span> <!> <span> </span> <!></div> <!> <div class="mt-2"><p class="text-[10px] font-semibold uppercase tracking-wide text-slate-500">Used on this surface by</p> <ul class="ml-3 list-disc text-[11px] text-slate-700"></ul></div></li>`),zs=d(`<ul class="space-y-2"></ul>`),Bs=d(`<div class="space-y-3 text-sm"><!></div>`);function Vs(e,n){N(n,!0);let a=z(()=>{let e=new Map;for(let t of n.surface.actions)for(let n of t.parameters)n.resourceId&&(e.has(n.resourceId)||e.set(n.resourceId,[]),e.get(n.resourceId).push({actionName:t.name,parameterName:n.name}));let t=[];for(let[r,i]of e){let e=n.resources.find(e=>e.id===r);e&&t.push({resource:e,usedBy:i})}return t});function o(e){switch(e){case`public`:return`bg-emerald-50 text-emerald-700`;case`internal`:return`bg-sky-50 text-sky-700`;case`confidential`:return`bg-amber-50 text-amber-800`;case`restricted`:return`bg-red-50 text-red-700`}}var s=Bs(),c=_(s),l=e=>{A(e,js())},u=e=>{var n=zs();i(n,21,()=>G(a),e=>e.resource.id,(e,n)=>{var a=Rs(),s=_(a),c=_(s),l=_(c,!0);F(c);var u=p(c,2),d=_(u,!0);F(u);var f=p(u,2),m=e=>{A(e,Ms())};j(f,e=>{G(n).resource.containsPii&&e(m)}),F(s);var h=p(s,2),v=_(h),y=_(v,!0);F(v);var b=p(v,2),x=e=>{var r=Ns(),i=_(r);F(r),g(()=>t(i,`· ${G(n).resource.provider??``}`)),A(e,r)};j(b,e=>{G(n).resource.provider&&e(x)});var S=p(b,2),C=_(S);F(S);var w=p(S,2),T=e=>{var r=Ps(),i=_(r);F(r),g(()=>t(i,`· ${G(n).resource.location??``}`)),A(e,r)};j(w,e=>{G(n).resource.location&&e(T)}),F(h);var E=p(h,2),D=e=>{var a=Is();i(a,21,()=>G(n).resource.complianceTags,r,(e,n)=>{var r=Fs(),i=_(r,!0);F(r),g(()=>t(i,G(n))),A(e,r)}),F(a),A(e,a)};j(E,e=>{G(n).resource.complianceTags.length>0&&e(D)});var O=p(E,2),k=p(_(O),2);i(k,21,()=>G(n).usedBy,r,(e,n)=>{var r=Ls(),i=_(r),a=_(i,!0);F(i);var o=p(i,2),s=_(o,!0);F(o),F(r),g(()=>{t(a,G(n).actionName),t(s,G(n).parameterName)}),A(e,r)}),F(k),F(O),F(a),g((e,r,i,a)=>{t(l,G(n).resource.name),U(u,1,`rounded-md px-1.5 py-0.5 text-[10px] font-medium ${e??``}`),t(d,r),t(y,i),t(C,`· ${a??``}`)},[()=>o(G(n).resource.sensitivity),()=>va(G(n).resource.sensitivity),()=>pa(G(n).resource.kind),()=>ga(G(n).resource.scope)]),A(e,a)}),F(n),A(e,n)};j(c,e=>{G(a).length===0?e(l):e(u,-1)}),F(s),A(e,s),C()}var Hs=d(`<div class="rounded-lg border border-dashed border-slate-300 bg-slate-50/30 p-6 text-center"><p class="text-sm font-medium text-slate-700">No entities touched here</p> <p class="mx-auto mt-1 max-w-md text-xs text-slate-500">Entities appear here when a state slot on this surface lives under their namespace.
18
- Define entities under the <strong>Entities</strong> tab at the top of the feature editor.</p></div>`),Us=d(`<span class="rounded-md bg-slate-100 px-1.5 py-0.5 text-[10px] uppercase tracking-wide text-slate-500" title="Auto-derived from state-path namespace">Auto</span>`),Ws=d(`<span class="rounded-md bg-violet-50 px-1.5 py-0.5 text-[10px] text-violet-800"> </span>`),Gs=d(`<p class="mt-0.5 text-[11px] text-slate-500"> </p>`),Ks=d(`<li> <span class="rounded-md bg-slate-100 px-1 text-[10px] text-slate-600"> </span></li>`),qs=d(`<li class="rounded-md border border-slate-200 bg-white p-3 text-xs"><header class="flex flex-wrap items-center gap-2"><span class="font-medium text-slate-900"> </span> <span class="mono rounded-md bg-slate-100 px-1.5 py-0.5 text-[10px] text-slate-600"> </span> <!> <!></header> <!> <div class="mt-2"><p class="text-[10px] font-semibold uppercase tracking-wide text-slate-500">Fields used on this surface</p> <ul class="ml-3 list-disc text-[11px] text-slate-700"></ul></div></li>`),Js=d(`<ul class="space-y-2"></ul>`),Ys=d(`<div class="space-y-3 text-sm"><!></div>`);function Xs(e,n){N(n,!0);let r=z(()=>Vt(n.feature)),a=z(()=>{let e=new Set(n.surface.stateDefinitions.map(e=>String(e.path)));return G(r).map(t=>({entry:t,fieldsUsed:t.fields.filter(t=>e.has(String(t.path)))})).filter(e=>e.fieldsUsed.length>0)});function o(e){if(e)return n.resources.find(t=>t.id===e)}var s=Ys(),c=_(s),l=e=>{A(e,Hs())},u=e=>{var n=Js();i(n,21,()=>G(a),e=>e.entry.namespace,(e,n)=>{let r=z(()=>o(G(n).entry.resourceId));var a=qs(),s=_(a),c=_(s),l=_(c,!0);F(c);var u=p(c,2),d=_(u,!0);F(u);var f=p(u,2),m=e=>{A(e,Us())};j(f,e=>{G(n).entry.isMaterialized||e(m)});var h=p(f,2),v=e=>{var n=Ws(),i=_(n,!0);F(n),g(()=>t(i,G(r).name)),A(e,n)};j(h,e=>{G(r)&&e(v)}),F(s);var y=p(s,2),b=e=>{var r=Gs(),i=_(r,!0);F(r),g(()=>t(i,G(n).entry.description)),A(e,r)};j(y,e=>{G(n).entry.description&&e(b)});var x=p(y,2),S=p(_(x),2);i(S,21,()=>G(n).fieldsUsed,e=>e.path,(e,n)=>{var r=Ks(),i=_(r),a=p(i),o=_(a,!0);F(a),F(r),g(e=>{t(i,`${e??``} `),t(o,G(n).type)},[()=>De(G(n).path)]),A(e,r)}),F(S),F(x),F(a),g(()=>{t(l,G(n).entry.name),t(d,G(n).entry.namespace)}),A(e,a)}),F(n),A(e,n)};j(c,e=>{G(a).length===0?e(l):e(u,-1)}),F(s),A(e,s),C()}var Zs=d(`<div class="rounded-lg border border-dashed border-slate-300 bg-slate-50/30 p-6 text-center"><p class="text-sm font-medium text-slate-700">No personas defined yet</p> <p class="mx-auto mt-1 max-w-md text-xs text-slate-500">Personas are simulator presets that override state and parameters for a specific user
19
- shape. Define them under the <strong>Personas</strong> rail on the right.</p></div>`),Qs=d(`<div class="rounded-lg border border-dashed border-slate-300 bg-slate-50/30 p-6 text-center"><p class="text-sm font-medium text-slate-700">No relevant personas here</p> <p class="mx-auto mt-1 max-w-md text-xs text-slate-500"> </p></div>`),$s=d(`<p class="mt-0.5 text-[11px] text-slate-500"> </p>`),ec=d(`<li class="leading-snug"> <span class="text-slate-400">→</span> <span class="mono text-slate-900"> </span></li>`),tc=d(`<div class="mt-2"><p class="text-[10px] font-semibold uppercase tracking-wide text-slate-500">Sets state on this surface</p> <ul class="ml-3 list-disc text-[11px] text-slate-700"></ul></div>`),nc=d(`<li class="leading-snug"><span class="mono"> </span> <span class="text-slate-400">→</span> <span class="mono text-slate-900"> </span> <span class="text-slate-500"> </span></li>`),rc=d(`<div class="mt-2"><p class="text-[10px] font-semibold uppercase tracking-wide text-slate-500">Pre-fills parameters</p> <ul class="ml-3 list-disc text-[11px] text-slate-700"></ul></div>`),ic=d(`<li class="rounded-md border border-slate-200 bg-white p-3 text-xs"><header class="font-medium text-slate-900"> </header> <!> <!> <!></li>`),ac=d(`<ul class="space-y-2"></ul>`),oc=d(`<div class="space-y-3 text-sm"><!></div>`);function sc(e,n){N(n,!0);let a=z(()=>{let e=new Set(n.surface.stateDefinitions.map(e=>String(e.path))),t=new Map;for(let e of n.surface.actions)for(let n of e.parameters){let r=t.get(n.name)??[];r.push(e.name),t.set(n.name,r)}let r=[];for(let i of n.personas){let n=i.stateOverrides.filter(t=>e.has(String(t.path))).map(e=>({path:String(e.path),value:e.value})),a=i.parameterOverrides.filter(e=>t.has(e.parameterName)).flatMap(e=>(t.get(e.parameterName)??[]).map(t=>({parameterName:e.parameterName,value:e.value,actionName:t})));n.length===0&&a.length===0||r.push({persona:i,stateMatches:n,parameterMatches:a})}return r});function o(e){return e==null?`-`:typeof e==`string`?e.length===0?`""`:e:JSON.stringify(e)}var s=oc(),c=_(s),l=e=>{A(e,Zs())},u=e=>{var r=Qs(),i=p(_(r),2),a=_(i);F(i),F(r),g(()=>t(a,`None of the ${n.personas.length??``} defined persona${n.personas.length===1?``:`s`} target
20
- state or parameters used on this surface. Personas appear here when their overrides
21
- touch a path or parameter declared above.`)),A(e,r)},d=e=>{var n=ac();i(n,21,()=>G(a),e=>e.persona.id,(e,n)=>{var a=ic(),s=_(a),c=_(s,!0);F(s);var l=p(s,2),u=e=>{var r=$s(),i=_(r,!0);F(r),g(()=>t(i,G(n).persona.description)),A(e,r)};j(l,e=>{G(n).persona.description&&e(u)});var d=p(l,2),f=e=>{var r=tc(),a=p(_(r),2);i(a,21,()=>G(n).stateMatches,e=>e.path,(e,n)=>{var r=ec(),i=_(r),a=p(i,3),s=_(a,!0);F(a),F(r),g((e,n)=>{t(i,`${e??``} `),t(s,n)},[()=>De(G(n).path),()=>o(G(n).value)]),A(e,r)}),F(a),F(r),A(e,r)};j(d,e=>{G(n).stateMatches.length>0&&e(f)});var m=p(d,2),h=e=>{var a=rc(),s=p(_(a),2);i(s,21,()=>G(n).parameterMatches,r,(e,n)=>{var r=nc(),i=_(r),a=_(i,!0);F(i);var s=p(i,4),c=_(s,!0);F(s);var l=p(s,2),u=_(l);F(l),F(r),g(e=>{t(a,G(n).parameterName),t(c,e),t(u,`on ${G(n).actionName??``}`)},[()=>o(G(n).value)]),A(e,r)}),F(s),F(a),A(e,a)};j(m,e=>{G(n).parameterMatches.length>0&&e(h)}),F(a),g(()=>t(c,G(n).persona.name)),A(e,a)}),F(n),A(e,n)};j(c,e=>{n.personas.length===0?e(l):G(a).length===0?e(u,1):e(d,-1)}),F(s),A(e,s),C()}var cc=d(`<button type="button" role="tab"><span> </span> <span> </span></button>`),lc=d(`<p class="mt-2 text-[11px] leading-relaxed text-slate-500"> </p>`),uc=d(`<section class="rounded-lg border border-hairline bg-white"><!> <div class="border-b border-hairline bg-slate-50/60 px-3 pt-3 pb-2"><div role="tablist" class="flex flex-wrap gap-1 text-sm"></div> <!></div> <div class="p-4"><!></div></section>`);function dc(e,n){N(n,!0);let r=z(()=>ln.surfacePanelTab),a=z(()=>dn(n.feature,n.surface));function o(e){ln.setSurfacePanelTab(e)}let s=z(()=>{let e=new Set;for(let t of n.surface.actions)for(let n of t.parameters)n.resourceId&&e.add(n.resourceId);return e.size}),c=z(()=>{let e=new Set(G(a).stateDefinitions.map(e=>String(e.path)));if(e.size===0)return 0;let t=Vt(n.feature),r=0;for(let n of t)n.fields.some(t=>e.has(String(t.path)))&&(r+=1);return r}),u=z(()=>{let e=new Set(G(a).stateDefinitions.map(e=>String(e.path))),t=new Set;for(let e of n.surface.actions)for(let n of e.parameters)t.add(n.name);let r=0;for(let i of n.personas)(i.stateOverrides.some(t=>e.has(String(t.path)))||i.parameterOverrides.some(e=>t.has(e.parameterName)))&&(r+=1);return r}),d=z(()=>[{key:`actions`,label:`Actions`,count:n.surface.actions.length,hint:`User- or AI-triggerable actions on this surface, with parameters, rules, and effects.`},{key:`state`,label:`State`,count:n.surface.stateDefinitions.length,hint:`Typed state slots this surface reads or writes. Share with sibling surfaces below each row.`},{key:`rules`,label:`Surface rules`,count:n.surface.rules.length,hint:`Cross-cutting gates that fire before every action on this surface (auth, role, kill-switch).`},{key:`invariants`,label:`Invariants`,count:n.surface.invariants.length,hint:`Conditions that must hold after every action on this surface. A violation blocks the run.`},{key:`data`,label:`Entities`,count:G(c),hint:`Entity namespaces touched on this surface (read or written by any state slot).`},{key:`resources`,label:`Resources`,count:G(s),hint:`External resources (DB, API, queue) referenced by parameters on this surface.`},{key:`personas`,label:`Personas`,count:G(u),hint:`Simulator presets whose state or parameter overrides target paths on this surface.`}]),f=z(()=>G(d).find(e=>e.key===G(r)));var m=uc(),h=_(m);As(h,{get surface(){return n.surface}});var v=p(h,2),y=_(v);i(y,21,()=>G(d),e=>e.key,(e,n)=>{var i=cc(),a=_(i),s=_(a,!0);F(a);var c=p(a,2),u=_(c,!0);F(c),F(i),g(()=>{H(i,`aria-selected`,G(r)===G(n).key),U(i,1,`group inline-flex items-center gap-1.5 rounded-md px-2.5 py-1 text-xs ${G(r)===G(n).key?`bg-white text-slate-950 font-medium shadow-sm ring-1 ring-slate-200`:`text-slate-600 hover:bg-slate-200/60 hover:text-slate-900`}`),t(s,G(n).label),U(c,1,`rounded-full px-1.5 py-0.5 text-[10px] font-semibold tabular-nums ${G(r)===G(n).key?`bg-slate-100 text-slate-700`:G(n).count>0?`bg-slate-200/80 text-slate-700 group-hover:bg-slate-300/80`:`bg-slate-100 text-slate-400`}`),t(u,G(n).count)}),l(`click`,i,()=>o(G(n).key)),A(e,i)}),F(y);var b=p(y,2),x=e=>{var n=lc(),r=_(n,!0);F(n),g(()=>t(r,G(f).hint)),A(e,n)};j(b,e=>{G(f)&&e(x)}),F(v);var S=p(v,2),w=_(S),T=e=>{{let t=z(()=>n.feature.surfaces.map(e=>({id:e.id,name:e.name}))),r=z(()=>n.feature.events??[]);ms(e,{get surface(){return G(a)},get resources(){return n.resources},get availableSurfaces(){return G(t)},get availableEvents(){return G(r)}})}},E=e=>{pi(e,{get surface(){return n.surface},get surfaces(){return n.feature.surfaces}})},D=e=>{vs(e,{get surface(){return G(a)}})},O=e=>{Ss(e,{get surface(){return G(a)}})},k=e=>{Xs(e,{get feature(){return n.feature},get surface(){return n.surface},get resources(){return n.resources}})},M=e=>{Vs(e,{get surface(){return n.surface},get resources(){return n.resources}})},P=e=>{sc(e,{get surface(){return n.surface},get personas(){return n.personas}})};j(w,e=>{G(r)===`actions`?e(T):G(r)===`state`?e(E,1):G(r)===`rules`?e(D,2):G(r)===`invariants`?e(O,3):G(r)===`data`?e(k,4):G(r)===`resources`?e(M,5):e(P,-1)}),F(S),F(m),g(()=>H(S,`data-focus-target`,`tab:${n.surface.id}:${G(r)}`)),A(e,m),C()}c([`click`]);var fc=new class{#e=V(null);get surfaceId(){return G(this.#e)}set surfaceId(e){T(this.#e,e,!0)}#t=V(null);get actionId(){return G(this.#t)}set actionId(e){T(this.#t,e,!0)}#n=V(null);get personaId(){return G(this.#n)}set personaId(e){T(this.#n,e,!0)}#r=V(null);get scenarioId(){return G(this.#r)}set scenarioId(e){T(this.#r,e,!0)}#i=V(e({}));get snapshot(){return G(this.#i)}set snapshot(e){T(this.#i,e,!0)}#a=V(e({}));get parameters(){return G(this.#a)}set parameters(e){T(this.#a,e,!0)}#o=V(null);get lastResult(){return G(this.#o)}set lastResult(e){T(this.#o,e,!0)}#s=V(e([]));get history(){return G(this.#s)}set history(e){T(this.#s,e,!0)}#c=V(!1);get isRunning(){return G(this.#c)}set isRunning(e){T(this.#c,e,!0)}#l=V(null);get lastRunAt(){return G(this.#l)}set lastRunAt(e){T(this.#l,e,!0)}#u=V(!1);get persistAcrossNavigation(){return G(this.#u)}set persistAcrossNavigation(e){T(this.#u,e,!0)}resetTo(e,t={}){this.surfaceId=e.id,this.snapshot=je(e.stateDefinitions),this.parameters={},t.keepPersona||(this.personaId=null),this.lastResult=null,this.history=[]}ensureSnapshotForSurface(e,t){if(this.surfaceId===e.id)return;if(this.persistAcrossNavigation){this.surfaceId=e.id;let t=this.snapshot;for(let n of e.stateDefinitions)he(t,n.path)===void 0&&(t=le(t,n.path,n.defaultValue));this.snapshot=t;return}let n=this.personaId===null?void 0:t.personas.find(e=>e.id===this.personaId&&e.persistAcrossSurfaces===!0);n?(this.resetTo(e,{keepPersona:!0}),this.snapshot=en(n,this.snapshot)):this.resetTo(e)}setPersistAcrossNavigation(e){this.persistAcrossNavigation=e}setStatePath(e,t){this.snapshot=le(this.snapshot,e,t)}setParameter(e,t,n){this.parameters={...this.parameters,[e]:t},n&&(this.snapshot=le(this.snapshot,n,t))}selectCapability(e,t){if(this.actionId=e,this.scenarioId=null,this.parameters={},e&&Re(`sim.action.selected`,{actionId:String(e)}),!t||this.personaId===null)return;let n=t.feature.personas.find(e=>e.id===this.personaId);if(n){this.parameters=Qt(n,t.action,{});for(let e of t.action.parameters){if(!e.bindToStatePath)continue;let t=this.parameters[e.name];t!==void 0&&(this.snapshot=le(this.snapshot,e.bindToStatePath,t))}}}applyScenario(e,t,n,r){this.snapshot=je(r.stateDefinitions),this.parameters={},this.scenarioId=e?e.id:null,e&&Re(`sim.scenario.selected`,{scenarioId:String(e.id)});let i=this.personaId===null?null:t.personas.find(e=>e.id===this.personaId)??null;i&&(this.snapshot=en(i,this.snapshot),this.parameters=Qt(i,n,{})),e&&(this.snapshot=Yt(e,this.snapshot),this.parameters=Xt(e,n,this.parameters));for(let e of n.parameters){if(!e.bindToStatePath)continue;let t=this.parameters[e.name];t!==void 0&&(this.snapshot=le(this.snapshot,e.bindToStatePath,t))}}applyPersona(e,t,n){if(this.snapshot=je(n.stateDefinitions),this.parameters={},this.personaId=e?e.id:null,this.scenarioId=null,e&&Re(`sim.persona.selected`,{personaId:String(e.id)}),e&&(this.snapshot=en(e,this.snapshot),t)){this.parameters=Qt(e,t,{});for(let e of t.parameters){if(!e.bindToStatePath)continue;let t=this.parameters[e.name];t!==void 0&&(this.snapshot=le(this.snapshot,e.bindToStatePath,t))}}}clearHistory(){this.history=[]}run(e,t){this.isRunning=!0;try{let n=Te({surface:e,action:t,snapshot:this.snapshot,parameters:this.parameters});return this.lastResult=n,n.status===`success`&&(this.snapshot=n.nextState),this.history=[n,...this.history].slice(0,10),this.lastRunAt=new Date().toISOString(),Re(`action.simulated`,{actionId:String(t.id),status:n.status}),n}finally{this.isRunning=!1}}},pc=d(`<p class="rounded-md border border-dashed border-neutral-200 bg-neutral-50/50 p-2 text-center text-[11px] italic text-neutral-500">No state on this surface.</p>`),mc=d(`<select class="w-20 shrink-0 rounded border border-neutral-300 bg-white px-1.5 py-0.5 text-[11px] focus:border-brand-500 focus:outline-none"><option>No</option><option>Yes</option></select>`),hc=d(`<option> </option>`),gc=d(`<select class="w-28 shrink-0 rounded border border-neutral-300 bg-white px-1.5 py-0.5 text-[11px] focus:border-brand-500 focus:outline-none"></select>`),_c=d(`<input class="w-28 shrink-0 rounded border border-neutral-300 bg-white px-1.5 py-0.5 text-[11px] focus:border-brand-500 focus:outline-none"/>`),vc=d(`<li class="group flex items-center gap-1.5 px-2 py-1"><div class="min-w-0 flex-1 truncate text-[11px] text-neutral-800"> </div> <!> <div class="flex shrink-0 items-center opacity-0 transition-opacity group-hover:opacity-100"><button type="button" class="rounded px-0.5 text-[10px] text-neutral-400 hover:bg-neutral-200 hover:text-neutral-700 disabled:cursor-not-allowed disabled:opacity-30" aria-label="Move up" title="Move up">▲</button> <button type="button" class="rounded px-0.5 text-[10px] text-neutral-400 hover:bg-neutral-200 hover:text-neutral-700 disabled:cursor-not-allowed disabled:opacity-30" aria-label="Move down" title="Move down">▼</button></div></li>`),yc=d(`<ul class="divide-y divide-neutral-100 rounded-md border border-neutral-200"></ul>`);function bc(e,n){N(n,!0);function a(e,t){if(t===`boolean`)return e===`true`;if(t===`number`){let t=Number(e);return Number.isFinite(t)?t:0}return e}function o(e,t,n){fc.setStatePath(e,a(t,n))}async function s(e,t){await $.mutate(r=>Pt(r,n.surface.id,e,t))}var c=u(),d=v(c),f=e=>{A(e,pc())},m=e=>{var a=yc();i(a,23,()=>n.surface.stateDefinitions,e=>e.id,(e,a,c)=>{let u=z(()=>he(fc.snapshot,G(a).path)),d=z(()=>G(c)>0),f=z(()=>G(c)<n.surface.stateDefinitions.length-1);var m=vc(),h=_(m),v=_(h,!0);F(h);var y=p(h,2),b=e=>{var t=mc(),n=_(t);n.value=n.__value=`false`;var r=p(n);r.value=r.__value=`true`,F(t);var i;O(t),g(e=>{i!==(i=e)&&(t.value=(t.__value=e)??``,D(t,e))},[()=>String(G(u)??!1)]),l(`change`,t,e=>o(G(a).path,e.target.value,G(a).type)),A(e,t)},x=e=>{var n=gc();i(n,21,()=>G(a).enumValues,r,(e,n)=>{var r=hc(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n)),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)}),A(e,r)}),F(n);var s;O(n),g(e=>{s!==(s=e)&&(n.value=(n.__value=e)??``,D(n,e))},[()=>String(G(u)??``)]),l(`change`,n,e=>o(G(a).path,e.target.value,G(a).type)),A(e,n)},S=e=>{var t=_c();M(t),g(e=>{H(t,`type`,G(a).type===`number`?`number`:`text`),L(t,e)},[()=>G(u)===void 0||G(u)===null?``:String(G(u))]),l(`change`,t,e=>o(G(a).path,e.target.value,G(a).type)),A(e,t)};j(y,e=>{G(a).type===`boolean`?e(b):G(a).type===`enum`&&G(a).enumValues?e(x,1):e(S,-1)});var C=p(y,2),w=_(C),T=p(w,2);F(C),F(m),g(e=>{H(m,`title`,G(a).path),t(v,e),w.disabled=!G(d),T.disabled=!G(f)},[()=>De(G(a).path)]),l(`click`,w,()=>s(G(a).id,-1)),l(`click`,T,()=>s(G(a).id,1)),A(e,m)}),F(a),A(e,a)};j(d,e=>{n.surface.stateDefinitions.length===0?e(f):e(m,-1)}),A(e,c),C()}c([`change`,`click`]);var xc=d(`<span class="text-red-500" title="Required">*</span>`),Sc=d(`<span class="rounded-full bg-emerald-50 px-1 py-0 text-[9px] font-medium uppercase tracking-wide text-emerald-700">bound</span>`),Cc=d(`<select class="w-full rounded-md border border-neutral-300 bg-white px-2 py-1 text-xs focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-100"><option>No</option><option>Yes</option></select>`),wc=d(`<option> </option>`),Tc=d(`<select class="w-full rounded-md border border-neutral-300 bg-white px-2 py-1 text-xs focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-100"><option></option><!></select>`),Ec=d(`<textarea rows="3" class="w-full rounded-md border border-neutral-300 bg-white px-2 py-1 font-mono text-[11px] focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-100"></textarea>`),Dc=d(`<div class="flex gap-1"><input type="number" step="any" placeholder="lat" class="w-1/2 rounded-md border border-neutral-300 bg-white px-2 py-1 text-xs focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-100"/> <input type="number" step="any" placeholder="lng" class="w-1/2 rounded-md border border-neutral-300 bg-white px-2 py-1 text-xs focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-100"/></div>`),Oc=d(`<input class="w-full rounded-md border border-neutral-300 bg-white px-2 py-1 text-xs focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-100"/>`),kc=d(`<li class="group"><div class="mb-0.5 flex items-baseline justify-between gap-2"><label class="flex items-baseline gap-1.5 text-[11px] font-medium text-neutral-700"><span> </span> <!> <span class="rounded-full bg-neutral-100 px-1 py-0 text-[9px] font-medium uppercase tracking-wide text-neutral-600"> </span> <!></label> <div class="flex shrink-0 items-center opacity-0 transition-opacity group-hover:opacity-100"><button type="button" class="rounded px-1 text-[10px] text-neutral-400 hover:bg-neutral-200 hover:text-neutral-700 disabled:cursor-not-allowed disabled:opacity-30" title="Move up">▲</button> <button type="button" class="rounded px-1 text-[10px] text-neutral-400 hover:bg-neutral-200 hover:text-neutral-700 disabled:cursor-not-allowed disabled:opacity-30" title="Move down">▼</button></div></div> <!></li>`),Ac=d(`<ul class="space-y-1.5"></ul>`);function jc(e,n){N(n,!0),o(()=>{for(let e of n.action.parameters)e.type===`boolean`&&fc.parameters[e.name]===void 0&&fc.setParameter(e.name,!1,e.bindToStatePath)});function a(e,t){if(t===`boolean`)return e===`true`;if(t===`number`){let t=Number(e);return Number.isFinite(t)?t:0}if(t===`object`||t===`array`){if(e.trim().length===0)return t===`array`?[]:{};try{return JSON.parse(e)}catch{return t===`array`?[]:{}}}return e}function s(e,t,n){fc.setParameter(e,t,n)}function c(e,t,n,r){s(e,a(t,n),r)}function u(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t=e;return{lat:typeof t.lat==`number`?String(t.lat):``,lng:typeof t.lng==`number`?String(t.lng):``}}return{lat:``,lng:``}}function d(e,t,n,r,i){let a={...u(r),[t]:n},o=Number(a.lat),c=Number(a.lng);s(e,{lat:Number.isFinite(o)?o:0,lng:Number.isFinite(c)?c:0},i)}function f(e){switch(e){case`number`:return`number`;case`date`:return`date`;case`time`:return`time`;case`timestamp`:return`datetime-local`;case`url`:return`url`;case`email`:return`email`;default:return`text`}}function m(e){if(e==null)return``;try{return JSON.stringify(e,null,2)}catch{return``}}async function h(e,t){await $.mutate(r=>mt(r,n.surfaceId,n.action.id,e,t))}var v=Ac();i(v,23,()=>n.action.parameters,e=>e.id,(e,a,o)=>{let s=z(()=>G(o)>0),v=z(()=>G(o)<n.action.parameters.length-1);var y=kc(),b=_(y),x=_(b),S=_(x),C=_(S,!0);F(S);var w=p(S,2),T=e=>{A(e,xc())};j(w,e=>{G(a).required&&e(T)});var D=p(w,2),O=_(D,!0);F(D);var k=p(D,2),N=e=>{var t=Sc();g(()=>H(t,`title`,`Bound to ${G(a).bindToStatePath??``}`)),A(e,t)};j(k,e=>{G(a).bindToStatePath&&e(N)}),F(x);var P=p(x,2),I=_(P),ee=p(I,2);F(P),F(b);var R=p(b,2),B=e=>{var t=Cc(),n=_(t);n.value=n.__value=`false`;var r=p(n);r.value=r.__value=`true`,F(t),g((e,i)=>{H(t,`id`,`param-${G(a).id??``}`),E(n,e),E(r,i)},[()=>String(fc.parameters[G(a).name]??!1)!==`true`,()=>String(fc.parameters[G(a).name]??!1)===`true`]),l(`change`,t,e=>c(G(a).name,e.target.value,G(a).type,G(a).bindToStatePath)),A(e,t)},V=e=>{var n=Tc(),o=_(n);o.value=o.__value=``,i(p(o),17,()=>G(a).enumValues,r,(e,n)=>{var r=wc(),i=_(r,!0);F(r);var o={};g(e=>{E(r,e),t(i,G(n)),o!==(o=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>G(n)===String(fc.parameters[G(a).name]??``)]),A(e,r)}),F(n),g(()=>{H(n,`id`,`param-${G(a).id??``}`),E(o,!fc.parameters[G(a).name])}),l(`change`,n,e=>c(G(a).name,e.target.value,G(a).type,G(a).bindToStatePath)),A(e,n)},U=e=>{var t=Ec();te(t),g(e=>{H(t,`id`,`param-${G(a).id??``}`),H(t,`placeholder`,G(a).description??(G(a).type===`array`?`[ ... ]`:`{ ... }`)),L(t,e)},[()=>m(fc.parameters[G(a).name])]),l(`change`,t,e=>c(G(a).name,e.target.value,G(a).type,G(a).bindToStatePath)),A(e,t)},W=e=>{let t=z(()=>u(fc.parameters[G(a).name]));var n=Dc(),r=_(n);M(r);var i=p(r,2);M(i),F(n),g(()=>{H(r,`id`,`param-${G(a).id??``}-lat`),L(r,G(t).lat),H(i,`id`,`param-${G(a).id??``}-lng`),L(i,G(t).lng)}),l(`change`,r,e=>d(G(a).name,`lat`,e.target.value,fc.parameters[G(a).name],G(a).bindToStatePath)),l(`change`,i,e=>d(G(a).name,`lng`,e.target.value,fc.parameters[G(a).name],G(a).bindToStatePath)),A(e,n)},ne=e=>{var t=Oc();M(t),g((e,n)=>{H(t,`id`,`param-${G(a).id??``}`),H(t,`type`,e),H(t,`placeholder`,G(a).description??`Enter ${G(a).name}`),L(t,n)},[()=>f(G(a).type),()=>String(fc.parameters[G(a).name]??``)]),l(`change`,t,e=>c(G(a).name,e.target.value,G(a).type,G(a).bindToStatePath)),A(e,t)};j(R,e=>{G(a).type===`boolean`?e(B):G(a).type===`enum`&&G(a).enumValues?e(V,1):G(a).type===`object`||G(a).type===`array`?e(U,2):G(a).type===`geolocation`?e(W,3):e(ne,-1)}),F(y),g(()=>{H(y,`data-tour-sim-param`,G(a).name),H(x,`for`,`param-${G(a).id??``}`),t(C,G(a).name),t(O,G(a).type),I.disabled=!G(s),H(I,`aria-label`,`Move ${G(a).name} up`),ee.disabled=!G(v),H(ee,`aria-label`,`Move ${G(a).name} down`)}),l(`click`,I,()=>h(G(a).id,-1)),l(`click`,ee,()=>h(G(a).id,1)),A(e,y)}),F(v),A(e,v),C()}c([`click`,`change`]);var Mc=d(`<option selected="">No personas defined</option>`),Nc=d(`<option> </option>`),Pc=d(`<option>- Manual setup -</option> <!>`,1),Fc=d(`<p class="text-[10px] font-medium text-emerald-700">Sticky across surfaces.</p>`),Ic=d(`<div class="space-y-0.5"><label class="text-[11px] font-medium text-neutral-700" for="persona-select">Test as</label> <select id="persona-select" class="w-full rounded-md border border-neutral-300 bg-white px-2 py-1 text-xs focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-100"><!></select> <!></div>`);function Lc(e,n){N(n,!0);let r=z(()=>n.feature.personas.find(e=>e.id===fc.personaId)??null);function a(e){if(!e){fc.applyPersona(null,n.action,n.surface);return}let t=n.feature.personas.find(t=>t.id===e);t&&fc.applyPersona(t,n.action,n.surface)}var o=Ic(),s=p(_(o),2),c=_(s),u=e=>{var t=Mc();t.value=t.__value=``,A(e,t)},d=e=>{var r=Pc(),a=v(r);a.value=a.__value=``,i(p(a,2),17,()=>n.feature.personas,e=>e.id,(e,n)=>{var r=Nc(),i=_(r);F(r);var a={};g(()=>{E(r,G(n).id===fc.personaId),t(i,`${G(n).name??``}${G(n).persistAcrossSurfaces?` · sticky`:``}`),a!==(a=G(n).id)&&(r.value=(r.__value=G(n).id)??``)}),A(e,r)}),g(()=>E(a,!fc.personaId)),A(e,r)};j(c,e=>{n.feature.personas.length===0?e(u):e(d,-1)}),F(s);var f=p(s,2),m=e=>{A(e,Fc())};j(f,e=>{G(r)?.persistAcrossSurfaces&&e(m)}),F(o),g(()=>s.disabled=n.feature.personas.length===0),l(`change`,s,e=>a(e.target.value)),A(e,o),C()}c([`change`]);var Rc=d(`<option> </option>`),zc=d(`<div class="space-y-0.5"><label class="text-[11px] font-medium text-neutral-700" for="scenario-select">Scenario</label> <select id="scenario-select" class="w-full rounded-md border border-neutral-300 bg-white px-2 py-1 text-xs focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-100"><option>- No scenario -</option><!></select></div>`);function Bc(e,n){N(n,!0);let r=z(()=>n.action.scenarios??[]);z(()=>G(r).find(e=>e.id===fc.scenarioId)??null);function a(e){if(!e){fc.applyScenario(null,n.feature,n.action,n.surface);return}let t=G(r).find(t=>t.id===e);t&&fc.applyScenario(t,n.feature,n.action,n.surface)}var o=u(),s=v(o),c=e=>{var n=zc(),o=p(_(n),2),s=_(o);s.value=s.__value=``,i(p(s),17,()=>G(r),e=>e.id,(e,n)=>{var r=Rc(),i=_(r,!0);F(r);var a={};g(()=>{E(r,G(n).id===fc.scenarioId),t(i,G(n).name),a!==(a=G(n).id)&&(r.value=(r.__value=G(n).id)??``)}),A(e,r)}),F(o),F(n),g(()=>E(s,!fc.scenarioId)),l(`change`,o,e=>a(e.target.value)),A(e,n)};j(s,e=>{G(r).length>0&&e(c)}),A(e,o),C()}c([`change`]);var Vc=d(`<button type="button" class="ml-auto rounded-md border border-brand-300 bg-white px-2 py-0.5 text-[11px] font-medium text-brand-700 hover:bg-brand-50"> </button>`),Hc=d(`<span class="ml-auto text-[10px] text-neutral-500"> </span>`),Uc=d(`<li><span class="mono"> </span> </li>`),Wc=d(`<div><p class="mb-1 font-medium text-red-700">Parameter errors</p> <ul class="ml-3 list-disc"></ul></div>`),Gc=d(`<li><span class="text-[10px] font-semibold uppercase tracking-wide opacity-70"> </span> <span class="ml-1"> </span></li>`),Kc=d(`<div><p class="mb-1 font-medium text-neutral-700">Messages</p> <ul class="space-y-1"></ul></div>`),qc=d(`<li class="rounded-md border border-red-200 bg-red-50 px-2 py-1 text-red-900"><span class="font-medium"> </span> </li>`),Jc=d(`<div><p class="mb-1 font-medium text-red-700">Invariant violations</p> <ul class="space-y-1"></ul></div>`),Yc=d(`<div class="text-[11px] text-neutral-500"> </div>`),Xc=d(`<li class="leading-snug"><div class="flex items-center gap-2"><span class="font-medium text-neutral-900"> </span> <span> </span></div> <!></li>`),Zc=d(`<details><summary class="cursor-pointer font-medium text-neutral-700"> </summary> <ul class="ml-3 mt-1 space-y-1.5"></ul></details>`),Qc=d(`<li><span class="mono"> </span> </li>`),$c=d(`<details><summary class="cursor-pointer font-medium text-neutral-700"> </summary> <ul class="ml-3 mt-1 list-disc"></ul></details>`),el=d(`<li class="mono rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] text-neutral-800"> </li>`),tl=d(`<div><p class="mb-1 font-medium text-neutral-700">Events emitted</p> <ul class="flex flex-wrap gap-1"></ul></div>`),nl=d(`<p class="mt-1 text-[11px] text-neutral-500">No state was changed.</p>`),rl=d(`<li class="rounded-md border border-neutral-200 bg-neutral-50 px-2 py-1 text-[11px]"><div class="font-medium text-neutral-900"> </div> <div class="flex items-center gap-2 text-neutral-700"><span class="mono text-neutral-500"> </span> <span class="text-neutral-400" aria-hidden="true">→</span> <span class="mono font-medium text-neutral-900"> </span></div></li>`),il=d(`<ul class="mt-1 space-y-1"></ul>`),al=d(`<li class="text-[10px] text-amber-800">! invariant <span class="mono"> </span> </li>`),ol=d(`<ul class="mt-1 space-y-0.5"></ul>`),sl=d(`<p class="mt-1 text-[10px] text-neutral-600"> </p>`),cl=d(`<p class="mt-1 text-[10px] text-violet-700"> </p>`),ll=d(`<li><div class="flex items-center gap-2 text-[11px]"><span> </span> <span class="mono text-violet-700"> </span> <span class="text-neutral-500"> </span></div></li>`),ul=d(`<li><div class="flex items-center gap-2 text-[11px]"><span> </span> <span class="mono text-violet-700"> </span> <span class="text-neutral-500"> </span></div> <!> <!> <!></li> <!>`,1),dl=d(`<details open=""><summary class="cursor-pointer font-medium text-violet-800"> </summary> <p class="mt-1 text-[11px] text-neutral-500">Other actions that fired automatically when this action emitted events. Indentation =
22
- cascade depth; a child's events trigger its own handlers next.</p> <ul class="mt-2 space-y-2"></ul></details>`),fl=d(`<div><div class="flex flex-wrap items-center gap-1.5"><span class="text-[10px] uppercase tracking-wide text-neutral-500">Call</span> <span> </span> <span class="ml-2 text-[10px] uppercase tracking-wide text-neutral-500">Outcome</span> <span> </span> <!></div> <!> <!> <!> <!> <!> <!> <details><summary class="cursor-pointer font-medium text-neutral-700"> </summary> <!></details> <!></div>`);function pl(e,n){N(n,!0);let a=z(()=>n.result.transition?n.feature.surfaces.find(e=>e.id===n.result.transition)??null:null);function o(){G(a)&&ln.selectSurface(G(a).id)}let s=z(()=>{let e=[];for(let t of n.surface.stateDefinitions){let r=he(n.result.previousState,t.path),i=he(n.result.nextState,t.path);JSON.stringify(r)!==JSON.stringify(i)&&e.push({label:De(t.path),path:t.path,before:r,after:i})}return e}),c=e=>e===void 0?`-`:typeof e==`string`?e.length===0?`""`:e:JSON.stringify(e),d=z(()=>{let e=new Map,t=e=>e===void 0?``:typeof e==`string`?`"${e}"`:JSON.stringify(e),r=(e,n,r)=>{let i=`(unconditional)`,a=r.condition;if(a&&typeof a==`object`){if(`kind`in a&&(a.kind===`all`||a.kind===`any`||a.kind===`not`))i=`(${a.kind} condition)`;else if(`left`in a){let e=t(a.right);i=`${De(a.left)} ${gi(a.operator)}${e?` ${e}`:``}`}}return{title:r.description??`${n} · ${r.category}`,condition:`[${e}] ${i}`}};for(let t of n.surface.rules)e.set(t.id,r(`surface`,n.surface.name,t));for(let t of n.surface.actions)for(let n of t.rules)e.set(n.id,r(`action`,t.name,n));return e}),f=z(()=>n.result.status===`success`?`bg-emerald-100 text-emerald-800`:`bg-amber-100 text-amber-800`),m={ok:0,success:1,info:2,warning:3,error:4},h=z(()=>{let e=`ok`;for(let t of n.result.messages){let n=t.tone??`info`;m[n]>m[e]&&(e=n)}return n.result.invariantViolations.length>0&&m.error>m[e]&&(e=`error`),e}),b=z(()=>G(h)===`error`?`bg-red-100 text-red-800`:G(h)===`warning`?`bg-amber-100 text-amber-800`:G(h)===`info`?`bg-sky-100 text-sky-800`:G(h)===`success`?`bg-emerald-100 text-emerald-800`:`bg-neutral-100 text-neutral-700`),x=z(()=>{let e=n.result.status,t=G(h);return e===`success`&&(t===`ok`||t===`success`||t===`info`)?`good`:e===`blocked`&&(t===`ok`||t===`warning`||t===`error`)?`warn`:`mixed`}),S=z(()=>G(x)===`good`?`border-emerald-200 bg-emerald-50`:G(x)===`warn`?`border-amber-200 bg-amber-50`:`border-neutral-200 bg-white`),w=e=>{switch(e){case`error`:return`bg-red-50 border-red-200 text-red-900`;case`warning`:return`bg-amber-50 border-amber-200 text-amber-900`;case`success`:return`bg-emerald-50 border-emerald-200 text-emerald-900`;case`info`:return`bg-sky-50 border-sky-200 text-sky-900`;default:return`bg-neutral-50 border-neutral-200 text-neutral-800`}};var T=fl(),E=_(T),D=p(_(E),2),O=_(D,!0);F(D);var k=p(D,4),M=_(k,!0);F(k);var P=p(k,2),I=e=>{var n=Vc(),r=_(n);F(n),g(()=>{H(n,`title`,`Open ${G(a).name}`),t(r,`Go to ${G(a).name??``} ?`)}),l(`click`,n,o),A(e,n)},L=e=>{var r=Hc(),i=_(r);F(r),g(()=>t(i,`? ${n.result.transition??``}`)),A(e,r)};j(P,e=>{G(a)?e(I):n.result.transition&&e(L,1)}),F(E);var ee=p(E,2),te=e=>{var a=Wc(),o=p(_(a),2);i(o,21,()=>n.result.parameterErrors,r,(e,n)=>{var r=Uc(),i=_(r),a=_(i,!0);F(i);var o=p(i);F(r),g(()=>{t(a,G(n).parameterName),t(o,` ${G(n).reason??``}`)}),A(e,r)}),F(o),F(a),A(e,a)};j(ee,e=>{n.result.parameterErrors.length>0&&e(te)});var R=p(ee,2),B=e=>{var a=Kc(),o=p(_(a),2);i(o,21,()=>n.result.messages,r,(e,n)=>{var r=Gc(),i=_(r),a=_(i);F(i);var o=p(i,2),s=_(o,!0);F(o),F(r),g(e=>{U(r,1,`rounded-md border px-2 py-1 ${e??``}`),t(a,`[${G(n).tone??``}]`),t(s,G(n).text)},[()=>w(G(n).tone)]),A(e,r)}),F(o),F(a),A(e,a)};j(R,e=>{n.result.messages.length>0&&e(B)});var V=p(R,2),W=e=>{var a=Jc(),o=p(_(a),2);i(o,21,()=>n.result.invariantViolations,r,(e,n)=>{var r=qc(),i=_(r),a=_(i);F(i);var o=p(i);F(r),g(()=>{t(a,`${G(n).invariantName??``}:`),t(o,` ${G(n).message??``}`)}),A(e,r)}),F(o),F(a),A(e,a)};j(V,e=>{n.result.invariantViolations.length>0&&e(W)});var ne=p(V,2),re=e=>{var a=Zc(),o=_(a),s=_(o);F(o);var c=p(o,2);i(c,21,()=>n.result.evaluatedRules,r,(e,n)=>{let r=z(()=>G(d).get(G(n).ruleId));var i=Xc(),a=_(i),o=_(a),s=_(o,!0);F(o);var c=p(o,2),l=_(c,!0);F(c),F(a);var u=p(a,2),f=e=>{var n=Yc(),i=_(n,!0);F(n),g(()=>t(i,G(r).condition)),A(e,n)};j(u,e=>{G(r)&&e(f)}),F(i),g(()=>{t(s,G(r)?.title??G(n).category),U(c,1,`rounded-md px-1.5 py-0.5 text-[10px] font-semibold uppercase ${G(n).conditionHeld?`bg-amber-100 text-amber-800`:`bg-neutral-100 text-neutral-500`}`),t(l,G(n).conditionHeld?`matched`:`no match`)}),A(e,i)}),F(c),F(a),g(()=>t(s,`Rules evaluated (${n.result.evaluatedRules.length??``})`)),A(e,a)};j(ne,e=>{n.result.evaluatedRules.length>0&&e(re)});var ie=p(ne,2),ae=e=>{var a=$c(),o=_(a),s=_(o);F(o);var c=p(o,2);i(c,21,()=>n.result.appliedEffects,r,(e,n)=>{var r=Qc(),i=_(r),a=_(i);F(i);var o=p(i);F(r),g(()=>{t(a,`[${G(n).type??``}]`),t(o,` ${G(n).summary??``}`)}),A(e,r)}),F(c),F(a),g(()=>t(s,`Effects applied (${n.result.appliedEffects.length??``})`)),A(e,a)};j(ie,e=>{n.result.appliedEffects.length>0&&e(ae)});var oe=p(ie,2),se=e=>{var a=tl(),o=p(_(a),2);i(o,21,()=>n.result.emittedEvents,r,(e,n)=>{var r=el(),i=_(r,!0);F(r),g(()=>t(i,G(n))),A(e,r)}),F(o),F(a),A(e,a)};j(oe,e=>{n.result.emittedEvents.length>0&&e(se)});var K=p(oe,2),ce=_(K),le=_(ce);F(ce);var ue=p(ce,2),de=e=>{A(e,nl())},q=e=>{var n=il();i(n,21,()=>G(s),r,(e,n)=>{var r=rl(),i=_(r),a=_(i,!0);F(i);var o=p(i,2),s=_(o),l=_(s,!0);F(s);var u=p(s,4),d=_(u,!0);F(u),F(o),F(r),g((e,r)=>{H(i,`title`,G(n).path),t(a,G(n).label),t(l,e),t(d,r)},[()=>c(G(n).before),()=>c(G(n).after)]),A(e,r)}),F(n),A(e,n)};j(ue,e=>{G(s).length===0?e(de):e(q,-1)}),F(K);var J=p(K,2),fe=e=>{var a=dl(),o=_(a),s=_(o);F(o);var c=p(o,4);i(c,21,()=>n.result.cascadedHandlers,r,(e,n)=>{let a=z(()=>G(n).result.status);var o=ul(),s=v(o),c=_(s),l=_(c),d=_(l,!0);F(l);var f=p(l,2),m=_(f);F(f);var h=p(f,2),b=_(h);F(h),F(c);var x=p(c,2),S=e=>{var a=ol();i(a,21,()=>G(n).result.invariantViolations,r,(e,n)=>{var r=al(),i=p(_(r)),a=_(i,!0);F(i);var o=p(i);F(r),g(()=>{t(a,G(n).invariantName),t(o,`, ${G(n).message??``}`)}),A(e,r)}),F(a),A(e,a)};j(x,e=>{G(n).result.invariantViolations.length>0&&e(S)});var C=p(x,2),w=e=>{var r=sl(),i=_(r);F(r),g(e=>t(i,`Emitted: ${e??``}`),[()=>G(n).result.emittedEvents.join(`, `)]),A(e,r)};j(C,e=>{G(n).result.emittedEvents.length>0&&e(w)});var T=p(C,2),E=e=>{var r=cl(),i=_(r);F(r),g(()=>t(i,`↳ chained into ${G(n).result.cascadedHandlers.length??``} more handler(s) (see below)`)),A(e,r)};j(T,e=>{G(n).result.cascadedHandlers&&G(n).result.cascadedHandlers.length>0&&e(E)}),F(s);var D=p(s,2),O=e=>{var a=u();i(v(a),17,()=>G(n).result.cascadedHandlers,r,(e,n)=>{var r=ll(),i=_(r),a=_(i),o=_(a,!0);F(a);var s=p(a,2),c=_(s);F(s);var l=p(s,2),u=_(l);F(l),F(i),F(r),g(()=>{U(r,1,`rounded-md border bg-white p-2 ${G(n).result.status===`success`?`border-emerald-200`:`border-amber-200 bg-amber-50/40`}`),y(r,`margin-left: ${(G(n).depth-1)*12}px`),U(a,1,`rounded px-1 py-0.5 text-[10px] font-semibold ${G(n).result.status===`success`?`bg-emerald-100 text-emerald-800`:`bg-amber-100 text-amber-800`}`),t(o,G(n).result.status),t(c,`↳ "${G(n).triggeredBy??``}"`),t(u,`· depth ${G(n).depth??``}`)}),A(e,r)}),A(e,a)};j(D,e=>{G(n).result.cascadedHandlers&&e(O)}),g(()=>{U(s,1,`rounded-md border bg-white p-2 ${G(a)===`success`?`border-emerald-200`:`border-amber-200 bg-amber-50/40`}`),y(s,`margin-left: ${(G(n).depth-1)*12}px`),U(l,1,`rounded px-1 py-0.5 text-[10px] font-semibold ${G(a)===`success`?`bg-emerald-100 text-emerald-800`:`bg-amber-100 text-amber-800`}`),t(d,G(a)),t(m,`↳ triggered by "${G(n).triggeredBy??``}"`),t(b,`· depth ${G(n).depth??``}`)}),A(e,o)}),F(c),F(a),g(()=>t(s,`Cascaded handlers (${n.result.cascadedHandlers.length??``})`)),A(e,a)};j(J,e=>{n.result.cascadedHandlers&&n.result.cascadedHandlers.length>0&&e(fe)}),F(T),g(()=>{U(T,1,`space-y-2 rounded-md border p-3 text-xs text-neutral-800 ${G(S)??``}`),U(D,1,`rounded-md px-1.5 py-0.5 text-[10px] font-semibold uppercase ${G(f)??``}`),t(O,n.result.status),U(k,1,`rounded-md px-1.5 py-0.5 text-[10px] font-semibold uppercase ${G(b)??``}`),t(M,G(h)),t(le,`State changes (${G(s).length??``})`)}),A(e,T),C()}c([`click`]);var ml=[`action`,`event`,`rule`,`invariant`,`transition`,`state`,`data`,`surface_rule`,`surface_invariant`],hl=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-xs text-neutral-500">Select an action to see its real implementation.</p>`),gl=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-xs text-neutral-500">Nothing taggable on this action yet. No events, rules, invariants, or transitions
23
- declared.</p>`),_l=d(`<div class="space-y-2 rounded-md border border-amber-200 bg-amber-50 p-3 text-xs text-amber-900"><p class="font-medium">No implementation reported yet.</p> <p>Add this action's implementation to <code>.unspa.json</code> in the implementation
24
- repo, then call <code>sync_from_index</code>. Real values will appear here.</p></div>`),vl=d(`<pre class="mt-0.5 overflow-x-auto rounded bg-neutral-900 px-2 py-1 text-[10px] leading-snug text-neutral-100"> </pre>`),yl=d(`<li><div class="font-mono text-[10px] text-neutral-600"> </div> <!></li>`),bl=d(`<ul class="mt-1 space-y-1"></ul>`),xl=d(`<p class="mt-0.5 text-[10px] italic text-neutral-500">Tag found but no locations recorded.</p>`),Sl=d(`<!> <p class="mt-1 text-[10px] text-neutral-400"> </p>`,1),Cl=d(`<p class="mt-0.5 text-[10px] italic text-neutral-500">No tag captured yet.</p>`),wl=d(`<li class="rounded border border-neutral-200 bg-white px-2 py-1.5"><div class="flex items-baseline justify-between gap-2"><span> </span> <span class="font-mono text-[10px] text-neutral-400 truncate"> </span></div> <!></li>`),Tl=d(`<section><p class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-neutral-500"> </p> <ul class="space-y-1"></ul></section>`),El=d(`<span class="ml-1 text-neutral-500"> </span>`),Dl=d(`<li class="font-mono text-[10px] text-amber-800"> <!></li>`),Ol=d(`<section><p class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-amber-700">Drift. Tags found that aren't declared</p> <ul class="space-y-0.5"></ul></section>`),kl=d(`<div class="space-y-3 text-xs"><div class="flex items-baseline justify-between"><span class="text-[10px] font-semibold uppercase tracking-wide text-neutral-500">Real implementation</span> <span class="text-[10px] text-neutral-500"> </span></div> <!> <!></div>`);function Al(e,n){N(n,!0),o(()=>{nn.load(n.feature.id)});let a=z(()=>ve(n.feature,nn.status)),s=z(()=>n.action?G(a).perSurface.flatMap(e=>e.perAction).find(e=>e.action.id===n.action.id)??null:null),c=z(()=>{if(!G(s))return[];let e=new Map;for(let t of G(s).found)e.set(`${t.entityType}:${t.entityId}`,t);let t=[];for(let n of ml){let r=G(s).expected.filter(e=>e.entityType===n);r.length!==0&&t.push({type:n,rows:r.map(t=>({expected:t,found:e.get(`${t.entityType}:${t.entityId}`)??null}))})}return t});function l(e){switch(e){case`action`:return`Action`;case`event`:return`Events`;case`rule`:return`Rules`;case`invariant`:return`Invariants`;case`transition`:return`Transitions`;case`state`:return`States`;case`data`:return`Entity`;case`surface_rule`:return`Surface rules`;case`surface_invariant`:return`Surface invariants`}}function d(e){let t=Date.parse(e);if(Number.isNaN(t))return e;let n=Date.now()-t;if(n<6e4)return`just now`;if(n<36e5)return`${Math.round(n/6e4)} min ago`;if(n<864e5)return`${Math.round(n/36e5)} h ago`;let r=Math.round(n/864e5);return`${r} day${r===1?``:`s`} ago`}var f=u(),m=v(f),h=e=>{A(e,hl())},y=e=>{A(e,gl())},b=e=>{A(e,_l())},x=e=>{var n=kl(),a=_(n),o=p(_(a),2),u=_(o);F(o),F(a);var f=p(a,2);i(f,17,()=>G(c),e=>e.type,(e,n)=>{var a=Tl(),o=_(a),s=_(o,!0);F(o);var c=p(o,2);i(c,21,()=>G(n).rows,e=>`${e.expected.entityType}:${e.expected.entityId}`,(e,n)=>{var a=wl(),o=_(a),s=_(o),c=_(s);F(s);var l=p(s,2),u=_(l,!0);F(l),F(o);var f=p(o,2),m=e=>{var a=Sl(),o=v(a),s=e=>{var a=bl();i(a,21,()=>G(n).found.locations,r,(e,n)=>{var r=yl(),i=_(r),a=_(i);F(i);var o=p(i,2),s=e=>{var r=vl(),i=_(r,!0);F(r),g(()=>t(i,G(n).snippet)),A(e,r)};j(o,e=>{G(n).snippet&&e(s)}),F(r),g(()=>t(a,`${G(n).file??``}${G(n).line===void 0?``:`:${G(n).line}`}`)),A(e,r)}),F(a),A(e,a)},c=e=>{A(e,xl())};j(o,e=>{G(n).found.locations.length>0?e(s):e(c,-1)});var l=p(o,2),u=_(l);F(l),g(e=>{H(l,`title`,G(n).found.capturedAt),t(u,`captured ${e??``}`)},[()=>d(G(n).found.capturedAt)]),A(e,a)},h=e=>{A(e,Cl())};j(f,e=>{G(n).found?e(m):e(h,-1)}),F(a),g(()=>{U(s,1,`font-mono text-[11px] ${G(n).found?`text-emerald-700`:`text-red-700`}`),t(c,`${G(n).found?`✓`:`✗`} ${G(n).expected.entityName??G(n).expected.entityId??``}`),t(u,G(n).expected.tag)}),A(e,a)}),F(c),F(a),g(e=>t(s,e),[()=>l(G(n).type)]),A(e,a)});var m=p(f,2),h=e=>{var n=Ol(),a=p(_(n),2);i(a,21,()=>G(s).status.extraTags,r,(e,n)=>{var a=Dl(),o=_(a);i(p(o),17,()=>G(n).locations,r,(e,n)=>{var r=El(),i=_(r);F(r),g(()=>t(i,`${G(n).file??``}${G(n).line===void 0?``:`:${G(n).line}`}`)),A(e,r)}),F(a),g(()=>t(o,`${G(n).tag??``} `)),A(e,a)}),F(a),F(n),A(e,n)};j(m,e=>{G(s).status&&G(s).status.extraTags.length>0&&e(h)}),F(n),g(e=>{H(o,`title`,G(s).status?.reportedAt),t(u,`captured ${e??``}`)},[()=>d(G(s).status.reportedAt)]),A(e,n)};j(m,e=>{n.action?!G(s)||G(s).expectedCount===0?e(y,1):G(s).reported?e(x,-1):e(b,2):e(h)}),A(e,f),C()}var jl=d(`<p class="text-[11px] text-slate-500">(no action on this surface)</p>`),Ml=d(`<button type="button"> </button>`),Nl=d(`<div class="flex flex-wrap gap-1"></div>`),Pl=d(`<section class="space-y-2 rounded-lg border border-hairline bg-white p-2.5"><h3 class="text-[10px] font-semibold uppercase tracking-wider text-slate-500">Scenario</h3> <!></section>`),Fl=d(`<section class="space-y-2 rounded-lg border border-hairline bg-white p-2.5"><div class="flex items-baseline justify-between"><h3 class="text-[10px] font-semibold uppercase tracking-wider text-slate-500">Inputs</h3> <span class="text-[10px] text-slate-400"> </span></div> <!></section>`),Il=d(`<div data-tour="simulator-result"><!></div>`),Ll=d(`<li class="flex items-center justify-between gap-2 text-neutral-600"><span class="truncate"> </span> <span> </span></li>`),Rl=d(`<details class="rounded-lg border border-neutral-200 bg-white px-2.5 py-2 text-xs"><summary class="flex cursor-pointer items-center justify-between gap-2 font-medium text-neutral-700"><span> </span> <button type="button" class="rounded-md px-1.5 py-0 text-[10px] font-medium text-neutral-500 hover:bg-neutral-100 hover:text-red-600" aria-label="Clear simulation history">Clear</button></summary> <ul class="mt-2 space-y-1"></ul></details>`),zl=d(`<span class="ml-auto rounded-full bg-brand-50 px-1.5 py-0 text-[10px] font-semibold text-brand-700" title="Rules in this category that will evaluate when you run the action"> </span>`),Bl=d(`<li class="flex items-center gap-1"><span> </span> <!></li>`),Vl=d(`<!> <!> <section class="space-y-2 rounded-lg border border-hairline bg-white p-2.5"><div class="flex items-baseline justify-between"><h3 class="text-[10px] font-semibold uppercase tracking-wider text-slate-500">Current state</h3> <span class="text-[10px] text-slate-400"> </span></div> <!></section> <div class="flex items-center gap-1.5"><button type="button" data-tour="simulator-run" class="flex-1 rounded-md bg-slate-900 px-3 py-1.5 text-xs font-semibold text-white transition disabled:cursor-not-allowed disabled:bg-slate-300"> </button> <button type="button" class="rounded-md border border-slate-300 bg-white px-2 py-1.5 text-[11px] font-medium text-slate-700 transition hover:bg-slate-50" title="Reset state to surface defaults and clear inputs">Reset</button></div> <label class="flex items-start gap-2 rounded-md border border-hairline bg-white px-2.5 py-2 text-[11px] cursor-pointer hover:bg-slate-50" title="When on, switching surfaces keeps existing state values. Testing the feature as a real navigation flow."><input type="checkbox" class="mt-0.5"/> <span class="flex-1"><span class="font-medium text-slate-800">Real-flow mode</span> <span class="block text-slate-500">Keep state when navigating between surfaces. Off = test each surface in isolation.</span></span></label> <!> <!> <details class="rounded-lg border border-neutral-200 bg-white px-2.5 py-2 text-xs"><summary class="cursor-pointer font-medium text-neutral-700">Rule categories reference</summary> <ul class="mt-2 grid grid-cols-2 gap-x-2 gap-y-1"></ul></details>`,1),Hl=d(`<div class="space-y-2 text-sm" data-tour="simulator-panel"><div class="flex rounded-md border border-hairline bg-slate-50 p-0.5 text-[11px] font-medium" role="tablist" aria-label="View mode"><button type="button" role="tab" title="Run the deterministic simulator on the modeled spec">Simulated</button> <button type="button" role="tab" title="Show the real implementation captured from the repo (file paths + code snippets)">Real</button></div> <section class="space-y-2 rounded-lg border border-hairline bg-white p-2.5"><h3 class="text-[10px] font-semibold uppercase tracking-wider text-slate-500"> </h3> <!> <div class="space-y-1"><span class="text-[11px] font-medium text-slate-700"> </span> <!></div></section> <!></div>`);function Ul(e,n){N(n,!0);let a=V(`simulated`);o(()=>{fc.ensureSnapshotForSurface(n.surface,n.feature)});let s=z(()=>n.surface.actions.find(e=>e.id===fc.actionId)??n.surface.actions[0]??null),c=z(()=>{let e={};for(let t of n.surface.rules)e[t.category]=(e[t.category]??0)+1;if(G(s))for(let t of G(s).rules)e[t.category]=(e[t.category]??0)+1;return e});o(()=>{G(s)&&fc.actionId!==G(s).id&&fc.selectCapability(G(s).id,{action:G(s),feature:n.feature})});function u(){G(s)&&fc.run(n.surface,G(s))}function d(){fc.resetTo(n.surface)}var f=Hl(),m=_(f),h=_(m),y=p(h,2);F(m);var b=p(m,2),x=_(b),S=_(x,!0);F(x);var E=p(x,2),D=e=>{Lc(e,{get feature(){return n.feature},get surface(){return n.surface},get action(){return G(s)}})};j(E,e=>{G(a)===`simulated`&&e(D)});var O=p(E,2),k=_(O),P=_(k,!0);F(k);var I=p(k,2),L=e=>{A(e,jl())},te=e=>{var r=Nl();i(r,21,()=>n.surface.actions,e=>e.id,(e,r)=>{var i=Ml(),a=_(i,!0);F(i),g(()=>{U(i,1,`rounded-md border px-2 py-1 text-[11px] font-medium transition ${G(s)?.id===G(r).id?`border-brand-500 bg-brand-50 text-brand-800`:`border-slate-300 bg-white text-slate-700 hover:bg-slate-50`}`),H(i,`aria-pressed`,G(s)?.id===G(r).id),H(i,`title`,G(r).intent),t(a,G(r).name)}),l(`click`,i,()=>fc.selectCapability(G(r).id,{action:G(r),feature:n.feature})),A(e,i)}),F(r),A(e,r)};j(I,e=>{n.surface.actions.length===0?e(L):e(te,-1)}),F(O),F(b);var R=p(b,2),B=e=>{Al(e,{get feature(){return n.feature},get action(){return G(s)}})},ne=e=>{var a=Vl(),o=v(a),f=e=>{var t=Pl();Bc(p(_(t),2),{get feature(){return n.feature},get surface(){return n.surface},get action(){return G(s)}}),F(t),A(e,t)};j(o,e=>{G(s)&&(G(s).scenarios?.length??0)>0&&e(f)});var m=p(o,2),h=e=>{var r=Fl(),i=_(r),a=p(_(i),2),o=_(a);F(a),F(i),jc(p(i,2),{get surfaceId(){return n.surface.id},get action(){return G(s)}}),F(r),g(()=>t(o,`${G(s).parameters.length??``} parameter${G(s).parameters.length===1?``:`s`}`)),A(e,r)};j(m,e=>{G(s)&&G(s).parameters.length>0&&e(h)});var y=p(m,2),b=_(y),x=p(_(b),2),S=_(x);F(x),F(b),bc(p(b,2),{get surface(){return n.surface}}),F(y);var C=p(y,2),T=_(C),E=_(T);F(T);var D=p(T,2);F(C);var O=p(C,2),k=_(O);M(k),ee(2),F(O);var N=p(O,2),P=e=>{var t=Il();pl(_(t),{get feature(){return n.feature},get result(){return fc.lastResult},get surface(){return n.surface}}),F(t),A(e,t)};j(N,e=>{fc.lastResult&&e(P)});var I=p(N,2),L=e=>{var a=Rl(),o=_(a),s=_(o),c=_(s);F(s);var u=p(s,2);F(o);var d=p(o,2);i(d,21,()=>fc.history,r,(e,r)=>{let i=z(()=>n.surface.actions.find(e=>e.id===G(r).actionId));var a=Ll(),o=_(a),s=_(o,!0);F(o);var c=p(o,2),l=_(c,!0);F(c),F(a),g(()=>{t(s,G(i)?.name??`unknown`),U(c,1,`rounded-full px-1.5 py-0 text-[10px] font-semibold uppercase tracking-wide ${G(r).status===`success`?`bg-emerald-100 text-emerald-800`:`bg-amber-100 text-amber-800`}`),t(l,G(r).status)}),A(e,a)}),F(d),F(a),g(()=>t(c,`Recent runs (${fc.history.length??``})`)),l(`click`,u,e=>{e.preventDefault(),e.stopPropagation(),fc.clearHistory()}),A(e,a)};j(I,e=>{fc.history.length>1&&e(L)});var te=p(I,2),R=p(_(te),2);i(R,20,()=>Ie,e=>e,(e,n)=>{let r=z(()=>G(c)[n]??0);var i=Bl(),a=_(i),o=_(a,!0);F(a);var s=p(a,2),l=e=>{var n=zl(),i=_(n,!0);F(n),g(()=>t(i,G(r))),A(e,n)};j(s,e=>{G(r)>0&&e(l)}),F(i),g(e=>{U(a,1,W(G(r)>0?`text-neutral-700`:`text-neutral-400`)),t(o,e)},[()=>we(n)]),A(e,i)}),F(R),F(te),g(()=>{t(S,`${n.surface.stateDefinitions.length??``} value${n.surface.stateDefinitions.length===1?``:`s`}`),T.disabled=!G(s),t(E,`Run ${G(s)?.name??`action`??``}`),w(k,fc.persistAcrossNavigation)}),l(`click`,T,u),l(`click`,D,d),l(`change`,k,e=>fc.setPersistAcrossNavigation(e.target.checked)),A(e,a)};j(R,e=>{G(a)===`real`?e(B):e(ne,-1)}),F(f),g(()=>{H(h,`aria-selected`,G(a)===`simulated`),U(h,1,`flex-1 rounded px-2 py-1 transition ${G(a)===`simulated`?`bg-white text-brand-800`:`text-slate-600 hover:text-slate-950`}`),H(y,`aria-selected`,G(a)===`real`),U(y,1,`flex-1 rounded px-2 py-1 transition ${G(a)===`real`?`bg-white text-brand-800`:`text-slate-600 hover:text-slate-950`}`),t(S,G(a)===`simulated`?`Test setup`:`Inspect action`),t(P,G(a)===`simulated`?`Action to test`:`Action`)}),l(`click`,h,()=>T(a,`simulated`)),l(`click`,y,()=>T(a,`real`)),A(e,f),C()}c([`click`,`change`]);var Wl=d(`<li class="rounded-md border border-red-200 bg-red-50 px-2 py-1 text-xs text-red-900"><span class="text-[10px] font-medium uppercase tracking-wide">[critical]</span> </li>`),Gl=d(`<li class="rounded-md border border-sky-200 bg-sky-50 px-2 py-1 text-xs text-sky-900"><span class="text-[10px] font-medium uppercase tracking-wide">[suggestion]</span> </li>`),Kl=d(`<section><h3 class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-neutral-500">Feature checks</h3> <ul class="space-y-1"><!> <!></ul></section>`),ql=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-center text-xs text-neutral-500">No surfaces yet.</p>`),Jl=d(`<span class="rounded-md bg-red-100 px-1.5 py-0.5 text-[10px] text-red-800"> </span>`),Yl=d(`<span class="rounded-md bg-sky-100 px-1.5 py-0.5 text-[10px] text-sky-800"> </span>`),Xl=d(`<li><span> </span> <span class="min-w-0 flex-1"> </span> <button type="button">Fix →</button></li>`),Zl=d(`<div class="border-t border-neutral-100 px-3 py-2"><h4 class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-neutral-500">Surface checks</h4> <ul class="space-y-1"></ul></div>`),Ql=d(`<p class="border-t border-neutral-100 px-3 py-2 text-[11px] italic text-neutral-500">No actions on this surface yet.</p>`),$l=d(`<span class="rounded-md bg-red-100 px-1.5 py-0.5 text-[10px] text-red-800"> </span>`),eu=d(`<span class="rounded-md bg-sky-100 px-1.5 py-0.5 text-[10px] text-sky-800"> </span>`),tu=d(`<li><span> </span> <span class="min-w-0 flex-1"> </span> <button type="button">Fix →</button></li>`),nu=d(`<ul class="divide-y divide-neutral-100 border-t border-neutral-100 bg-white"></ul>`),ru=d(`<p class="border-t border-neutral-100 px-2 py-1.5 text-[11px] text-emerald-700">✓ All checks pass.</p>`),iu=d(`<li class="flex items-start gap-2 px-2 py-1.5 text-[11px] text-emerald-900"><span class="text-emerald-600">✓</span> <span class="min-w-0 flex-1"> </span></li>`),au=d(`<ul class="divide-y divide-emerald-100 border-t border-emerald-100 bg-emerald-50/30"></ul>`),ou=d(`<div class="border-t border-neutral-100 px-2 py-1"><button type="button" class="text-[11px] text-brand-700 hover:underline"> </button></div> <!>`,1),su=d(`<!> <!>`,1),cu=d(`<li class="rounded-md border border-neutral-200 bg-neutral-50/40"><button type="button" class="flex w-full flex-wrap items-center gap-2 px-2 py-1.5 text-left text-[11px]"><span class="text-neutral-400"> </span> <span class="flex-1 truncate text-neutral-800"> </span> <!> <!></button> <div class="px-2 pb-1.5"><!></div> <!></li>`),lu=d(`<div class="border-t border-neutral-100 px-3 py-2"><h4 class="mb-1.5 text-[10px] font-semibold uppercase tracking-wide text-neutral-500">Actions</h4> <ul class="space-y-1"></ul></div>`),uu=d(`<!> <!>`,1),du=d(`<li class="rounded-md border border-neutral-200 bg-white"><button type="button" class="flex w-full flex-wrap items-center gap-2 px-3 py-2 text-left text-xs"><span class="text-neutral-400"> </span> <span class="flex-1 truncate font-medium text-neutral-900"> </span> <!> <!></button> <div class="px-3 pb-2"><!></div> <!></li>`),fu=d(`<ul class="space-y-1"></ul>`),pu=d(`<div class="space-y-4 text-sm"><section><div class="flex items-center justify-between gap-3"><span class="text-xs font-semibold uppercase tracking-wide opacity-80">Global</span> <span class="text-xs font-bold tabular-nums"> </span></div> <div class="mt-1"><!></div> <div class="mt-2 flex flex-wrap gap-x-3 gap-y-0.5 text-[11px]"><span class="font-bold"> </span> <span class="font-bold"> </span> <span class="font-bold"> </span> <span class="font-bold"> </span></div></section> <!> <section class="space-y-2"><h3 class="text-[10px] font-semibold uppercase tracking-wide text-neutral-500">Per surface</h3> <!></section></div>`);function mu(n,a){N(a,!0);let s=V(null),c=z(()=>ce(a.feature));o(()=>{T(s,new Date().toISOString(),!0),Re(`feature.scored`,{featureId:String(a.feature.id),percentage:G(c).global.percentage,criticalIssues:G(c).global.criticalIssues.length})});function u(e){return e.percentage>=80?`bg-emerald-50 border-emerald-200 text-emerald-900`:e.percentage>=50?`bg-amber-50 border-amber-200 text-amber-900`:`bg-red-50 border-red-200 text-red-900`}function d(e){let t=e.criticalIssues.length;if(t===0){let t=e.percentage/100*120;return`hsl(${Math.round(t)}, 70%, 45%)`}let n=Math.max(0,35-(t-1)*18);return`hsl(${Math.round(n)}, 75%, 50%)`}let f=V(e({})),m=V(e({})),h=V(e({}));function y(e){T(f,{...G(f),[e]:!G(f)[e]},!0)}function b(e){T(m,{...G(m),[e]:!G(m)[e]},!0)}function x(e){T(h,{...G(h),[e]:!G(h)[e]},!0)}function S(e){Re(`maturity.issue.navigated`,{surfaceId:e.surfaceId?String(e.surfaceId):void 0,actionId:e.actionId?String(e.actionId):void 0,surfacePanelTab:e.surfacePanelTab}),ln.navigateTo({surfaceId:e.surfaceId,actionId:e.actionId,surfacePanelTab:e.surfacePanelTab})}function w(e){return[...e.criticalIssues.map(e=>({...e,kind:`critical`})),...e.recommendedIssues.map(e=>({...e,kind:`recommended`}))]}function E(e){return e.passedChecks.map(e=>({...e,kind:`passed`}))}var D=pu(),O=_(D),k=_(O),M=p(_(k),2),P=_(M);F(M),F(k);var I=p(k,2),L=_(I);{let e=z(()=>d(G(c).global));Bt(L,{get percentage(){return G(c).global.percentage},get color(){return G(e)},size:`md`,get ariaLabel(){return`Global maturity ${G(c).global.percentage??``}%`}})}F(I);var ee=p(I,2),te=_(ee),R=_(te);F(te);var B=p(te,2),H=_(B);F(B);var ne=p(B,2),re=_(ne);F(ne);var ie=p(ne,2),ae=_(ie);F(ie),F(ee),F(O);var oe=p(O,2),se=e=>{var n=Kl(),r=p(_(n),2),a=_(r);i(a,17,()=>G(c).featureLevel.criticalIssues,e=>e.area,(e,n)=>{var r=Wl(),i=p(_(r));F(r),g(()=>t(i,` ${G(n).message??``}`)),A(e,r)}),i(p(a,2),17,()=>G(c).featureLevel.recommendedIssues,e=>e.area,(e,n)=>{var r=Gl(),i=p(_(r));F(r),g(()=>t(i,` ${G(n).message??``}`)),A(e,r)}),F(r),F(n),A(e,n)};j(oe,e=>{(G(c).featureLevel.criticalIssues.length>0||G(c).featureLevel.recommendedIssues.length>0)&&e(se)});var K=p(oe,2),le=p(_(K),2),ue=e=>{A(e,ql())},de=e=>{var n=fu();i(n,21,()=>G(c).perSurface,e=>e.surface.id,(e,n)=>{let a=z(()=>String(G(n).surface.id)),o=z(()=>G(f)[G(a)]??!1),s=z(()=>w(G(n).surfaceLevel));var c=du(),u=_(c),C=_(u),T=_(C,!0);F(C);var D=p(C,2),O=_(D,!0);F(D);var k=p(D,2),M=e=>{var r=Jl(),i=_(r);F(r),g(()=>t(i,`${G(n).report.criticalIssues.length??``} critical`)),A(e,r)};j(k,e=>{G(n).report.criticalIssues.length>0&&e(M)});var N=p(k,2),P=e=>{var r=Yl(),i=_(r);F(r),g(()=>t(i,`${G(n).report.recommendedIssues.length??``} suggestion${G(n).report.recommendedIssues.length===1?``:`s`}`)),A(e,r)};j(N,e=>{G(n).report.recommendedIssues.length>0&&e(P)}),F(u);var I=p(u,2),L=_(I);{let e=z(()=>d(G(n).report));Bt(L,{get percentage(){return G(n).report.percentage},get color(){return G(e)},size:`sm`,ticks:[],get ariaLabel(){return`Surface ${G(n).surface.name??``} ${G(n).report.percentage??``}%`}})}F(I);var ee=p(I,2),te=e=>{var a=uu(),o=v(a),c=e=>{var n=Zl(),a=p(_(n),2);i(a,21,()=>G(s),r,(e,n)=>{var r=Xl(),i=_(r),a=_(i,!0);F(i);var o=p(i,2),s=_(o,!0);F(o);var c=p(o,2);F(r),g(()=>{U(r,1,`flex items-start gap-2 text-[11px] ${G(n).kind===`critical`?`text-red-900`:`text-sky-900`}`),U(i,1,W(G(n).kind===`critical`?`text-red-600`:`text-sky-600`)),t(a,G(n).kind===`critical`?`●`:`ℹ`),t(s,G(n).message),U(c,1,`shrink-0 rounded-md border px-1.5 py-0 text-[10px] font-medium ${G(n).kind===`critical`?`border-red-300 bg-white text-red-700 hover:bg-red-50`:`border-sky-300 bg-white text-sky-700 hover:bg-sky-50`}`)}),l(`click`,c,()=>S(G(n))),A(e,r)}),F(a),F(n),A(e,n)};j(o,e=>{G(s).length>0&&e(c)});var u=p(o,2),f=e=>{A(e,Ql())},y=e=>{var a=lu(),o=p(_(a),2);i(o,21,()=>G(n).perAction,e=>e.action.id,(e,n)=>{let a=z(()=>String(G(n).action.id)),o=z(()=>G(m)[G(a)]??!1),s=z(()=>w(G(n).report)),c=z(()=>E(G(n).report)),u=z(()=>`cap:${G(a)}`),f=z(()=>G(h)[G(u)]??!1);var y=cu(),C=_(y),T=_(C),D=_(T,!0);F(T);var O=p(T,2),k=_(O,!0);F(O);var M=p(O,2),N=e=>{var r=$l(),i=_(r,!0);F(r),g(()=>t(i,G(n).report.criticalIssues.length)),A(e,r)};j(M,e=>{G(n).report.criticalIssues.length>0&&e(N)});var P=p(M,2),I=e=>{var r=eu(),i=_(r,!0);F(r),g(()=>t(i,G(n).report.recommendedIssues.length)),A(e,r)};j(P,e=>{G(n).report.recommendedIssues.length>0&&e(I)}),F(C);var L=p(C,2),ee=_(L);{let e=z(()=>d(G(n).report));Bt(ee,{get percentage(){return G(n).report.percentage},get color(){return G(e)},size:`xs`,ticks:[],get ariaLabel(){return`Action ${G(n).action.name??``} ${G(n).report.percentage??``}%`}})}F(L);var te=p(L,2),R=e=>{var n=su(),a=v(n),o=e=>{var n=nu();i(n,21,()=>G(s),r,(e,n)=>{var r=tu(),i=_(r),a=_(i,!0);F(i);var o=p(i,2),s=_(o,!0);F(o);var c=p(o,2);F(r),g(()=>{U(r,1,`flex items-start gap-2 px-2 py-1.5 text-[11px] ${G(n).kind===`critical`?`text-red-900`:`text-sky-900`}`),U(i,1,W(G(n).kind===`critical`?`text-red-600`:`text-sky-600`)),t(a,G(n).kind===`critical`?`●`:`ℹ`),t(s,G(n).message),U(c,1,`shrink-0 rounded-md border px-1.5 py-0 text-[10px] font-medium ${G(n).kind===`critical`?`border-red-300 bg-white text-red-700 hover:bg-red-50`:`border-sky-300 bg-white text-sky-700 hover:bg-sky-50`}`)}),l(`click`,c,()=>S(G(n))),A(e,r)}),F(n),A(e,n)},d=e=>{A(e,ru())};j(a,e=>{G(s).length>0?e(o):e(d,-1)});var m=p(a,2),h=e=>{var n=ou(),a=v(n),o=_(a),s=_(o);F(o),F(a);var d=p(a,2),m=e=>{var n=au();i(n,21,()=>G(c),r,(e,n)=>{var r=iu(),i=p(_(r),2),a=_(i,!0);F(i),F(r),g(()=>t(a,G(n).message)),A(e,r)}),F(n),A(e,n)};j(d,e=>{G(f)&&e(m)}),g(()=>t(s,`${G(f)?`Hide`:`Show`}
25
- ${G(c).length??``} passed check${G(c).length===1?``:`s`}`)),l(`click`,o,()=>x(G(u))),A(e,n)};j(m,e=>{G(c).length>0&&e(h)}),A(e,n)};j(te,e=>{G(o)&&e(R)}),F(y),g(()=>{t(D,G(o)?`▾`:`▸`),t(k,G(n).action.name)}),l(`click`,C,()=>b(G(a))),A(e,y)}),F(o),F(a),A(e,a)};j(u,e=>{G(n).perAction.length===0?e(f):e(y,-1)}),A(e,a)};j(ee,e=>{G(o)&&e(te)}),F(c),g(()=>{t(T,G(o)?`▾`:`▸`),t(O,G(n).surface.name)}),l(`click`,u,()=>y(G(a))),A(e,c)}),F(n),A(e,n)};j(le,e=>{G(c).perSurface.length===0?e(ue):e(de,-1)}),F(K),F(D),g(e=>{U(O,1,`rounded-md border p-3 ${e??``}`),t(P,`${G(c).global.percentage??``}%`),t(R,`${G(c).global.score??``} / ${G(c).global.maxScore??``} checks`),t(H,`${G(c).global.criticalIssues.length??``} critical`),t(re,`${G(c).global.recommendedIssues.length??``} recommended`),t(ae,`${G(c).global.passedChecks.length??``} passed`)},[()=>u(G(c).global)]),A(n,D),C()}c([`click`]);var hu=e=>e?`kind`in e&&(e.kind===`all`||e.kind===`any`||e.kind===`not`)?{condition:e}:{"condition.left":String(e.left),"condition.operator":e.operator,"condition.right":e.right}:{condition:null},gu=e=>({category:e.category,description:e.description,...hu(e.condition),"effect.type":e.effect.type,effect:e.effect}),_u=e=>({name:e.name,description:e.description,...hu(e.condition),message:e.message}),vu=e=>({path:String(e.path),type:e.type,defaultValue:e.defaultValue,enumValues:e.enumValues,description:e.description}),yu=e=>({namespace:e.namespace,description:e.description,fields:e.fields,resourceId:e.resourceId}),bu=e=>({name:e.name,intent:e.intent,requiredStates:e.requiredStates.map(e=>String(e)),emittedEvents:e.emittedEvents.map(e=>String(e))}),xu=e=>({target:String(e.target),label:e.label,description:e.description}),Su=e=>({name:e}),Cu=(e,t,n)=>{switch(t){case`action`:for(let t of e.surfaces){let e=t.actions.find(e=>String(e.id)===n);if(e)return bu(e)}return null;case`event`:for(let t of e.surfaces)for(let e of t.actions)if(e.emittedEvents.some(e=>String(e)===n))return Su(n);return null;case`rule`:for(let t of e.surfaces)for(let e of t.actions){let t=e.rules.find(e=>String(e.id)===n);if(t)return gu(t)}return null;case`invariant`:for(let t of e.surfaces)for(let e of t.actions){let t=e.invariants.find(e=>String(e.id)===n);if(t)return _u(t)}return null;case`transition`:for(let t of e.surfaces)for(let e of t.actions){let t=e.transitions.find(e=>String(e.id)===n);if(t)return xu(t)}return null;case`state`:for(let t of e.surfaces){let e=t.stateDefinitions.find(e=>String(e.id)===n);if(e)return vu(e)}return null;case`data`:for(let t of e.entities)if(String(t.id)===n)return yu(t);return null;case`surface_rule`:for(let t of e.surfaces){let e=t.rules.find(e=>String(e.id)===n);if(e)return gu(e)}return null;case`surface_invariant`:for(let t of e.surfaces){let e=t.invariants.find(e=>String(e.id)===n);if(e)return _u(e)}return null}},wu=(e,t)=>{if(typeof e!=`object`||!e)return;let n=e;if(t in n)return n[t];if(!t.includes(`.`))return;let r=t.split(`.`),i=n;for(let e of r){if(typeof i!=`object`||!i)return;i=i[e]}return i},Tu=(e,t)=>{if(e===t)return!0;if(e===null||t===null||e===void 0||t===void 0||typeof e!=typeof t)return!1;if(typeof e==`object`)try{return JSON.stringify(e)===JSON.stringify(t)}catch{return!1}return!1},Eu=(e,t)=>{let n=[];for(let r of Object.keys(e)){let i=e[r],a=wu(t,r),o=a===void 0;n.push({path:r,spec:i,captured:a,equal:!o&&Tu(i,a),missingFromCaptured:o})}return n},Du={action:[`name`,`intent`,`requiredStates`,`emittedEvents`],event:[],rule:[`category`,`description`,`condition.left`,`condition.operator`,`condition.right`],invariant:[`name`,`description`,`message`,`condition.left`,`condition.operator`,`condition.right`],transition:[`label`,`description`],state:[`defaultValue`,`enumValues`,`description`],data:[`namespace`,`description`,`resourceId`],surface_rule:[`category`,`description`,`condition.left`,`condition.operator`,`condition.right`],surface_invariant:[`name`,`description`,`message`,`condition.left`,`condition.operator`,`condition.right`]},Ou=(e,t)=>Du[e].includes(t),ku=e=>typeof e==`string`?e:null,Au=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`)?e:null,ju=e=>typeof e==`string`&&mi.includes(e)?e:null,Mu=e=>typeof e==`string`&&Ie.includes(e)?e:null,Nu=e=>e===void 0||oe(e)?null:e,Pu=(e,t,n)=>{switch(t){case`category`:{let t=Mu(n);return t?{...e,category:t}:null}case`description`:{let t=ku(n);return t===null?null:{...e,description:t}}case`condition.left`:{let t=Nu(e.condition),r=ku(n);return t===null||r===null?null:{...e,condition:{...t,left:r}}}case`condition.operator`:{let t=Nu(e.condition),r=ju(n);return t===null||!r?null:{...e,condition:{...t,operator:r}}}case`condition.right`:{let t=Nu(e.condition);return t===null?null:{...e,condition:{...t,right:n}}}default:return null}},Fu=(e,t,n)=>{switch(t){case`name`:case`description`:case`message`:{let r=ku(n);return r===null?null:{...e,[t]:r}}case`condition.left`:{let t=Nu(e.condition),r=ku(n);return t===null||r===null?null:{...e,condition:{...t,left:r}}}case`condition.operator`:{let t=Nu(e.condition),r=ju(n);return t===null||!r?null:{...e,condition:{...t,operator:r}}}case`condition.right`:{let t=Nu(e.condition);return t===null?null:{...e,condition:{...t,right:n}}}default:return null}},Iu=(e,t,n,r,i)=>{if(!Ou(t,r))return e;switch(t){case`action`:for(let t of e.surfaces){let a=t.actions.find(e=>String(e.id)===n);if(a){if(r===`name`||r===`intent`){let n=ku(i);return n===null?e:ct(e,t.id,a.id,{[r]:n})}if(r===`requiredStates`){let n=Au(i);return n===null?e:ct(e,t.id,a.id,{requiredStates:n})}if(r===`emittedEvents`){let n=Au(i);return n===null?e:ct(e,t.id,a.id,{emittedEvents:n})}return e}}return e;case`rule`:for(let t of e.surfaces)for(let a of t.actions){let o=a.rules.find(e=>String(e.id)===n);if(!o)continue;let s=Pu(o,r,i);return s?dt(e,t.id,a.id,s):e}return e;case`surface_rule`:for(let t of e.surfaces){let a=t.rules.find(e=>String(e.id)===n);if(!a)continue;let o=Pu(a,r,i);return o?ut(e,t.id,o):e}return e;case`invariant`:for(let t of e.surfaces)for(let a of t.actions){let o=a.invariants.find(e=>String(e.id)===n);if(!o)continue;let s=Fu(o,r,i);return s?qe(e,t.id,a.id,o.id,s):e}return e;case`surface_invariant`:for(let t of e.surfaces){let a=t.invariants.find(e=>String(e.id)===n);if(!a)continue;let o=Fu(a,r,i);return o?Ze(e,t.id,a.id,o):e}return e;case`state`:for(let t of e.surfaces){let a=t.stateDefinitions.find(e=>String(e.id)===n);if(a){if(r===`description`){let n=ku(i);return n===null?e:rt(e,t.id,a.id,{description:n})}if(r===`enumValues`){let n=Au(i);return n===null?e:rt(e,t.id,a.id,{enumValues:n})}return r===`defaultValue`?rt(e,t.id,a.id,{defaultValue:i}):e}}return e;case`data`:{let t=e.entities.find(e=>String(e.id)===n);if(!t)return e;if(r===`namespace`||r===`description`){let n=ku(i);return n===null?e:Je(e,{...t,[r]:n})}if(r===`resourceId`){let n=ku(i);return n===null?e:Je(e,{...t,resourceId:n})}return e}case`transition`:for(let t of e.surfaces)for(let a of t.actions){let o=a.transitions.find(e=>String(e.id)===n);if(!o)continue;let s=ku(i);return s===null?e:ct(e,t.id,a.id,{transitions:a.transitions.map(e=>e.id===o.id?{...e,[r]:s}:e)})}return e;case`event`:return e}},Lu=d(`<button type="button" class="group inline-flex items-center gap-1 rounded-full border border-amber-300 bg-amber-50 px-2.5 py-0.5 text-[10px] font-semibold text-amber-800 shadow-sm transition hover:bg-amber-100 focus:outline-none focus:ring-2 focus:ring-amber-300 disabled:cursor-wait"><span>↻</span> <span> </span></button>`),Ru=d(`<span class="font-bold"> </span>`),zu=d(`<span class="font-bold text-amber-700"> </span>`),Bu=d(`<span class="opacity-70"> </span>`),Vu=d(`<div class="mt-1 text-[10px] opacity-60"> </div>`),Hu=d(`<p class="mt-2 text-[10px] leading-snug opacity-80">Only fields that diverge are shown. Mismatches in red, missing captures in amber.
26
- Entities with no divergence collapse to a green check.</p>`),Uu=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-xs text-neutral-600">No <code>report_implementation_status</code> received yet. Write the behavioral index
27
- to <code>.unspa.json</code> in your repo, then call <code>report_implementation_status_batch</code>. The result lands here.</p>`),Wu=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-center text-xs text-neutral-500">No surfaces yet.</p>`),Gu=d(`<span class="rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] text-neutral-600">no tags expected</span>`),Ku=d(`<span class="rounded-md bg-white/70 px-1.5 py-0.5 text-[10px] font-mono"> </span> <span class="rounded-md bg-white/70 px-1.5 py-0.5 text-[10px] font-mono"> </span>`,1),qu=d(`<span class="rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] text-neutral-600">not audited</span>`),Ju=d(`<span class="rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] font-mono"> </span> <span class="rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] font-mono"> </span>`,1),Yu=d(`<p class="text-neutral-500">Run <code>report_implementation_status</code> with <code>surfaceId</code> to populate this section.</p>`),Xu=d(`<span> </span>`),Zu=d(`<span class="rounded bg-neutral-100 px-1.5 py-0.5 text-[10px] text-neutral-600"> </span>`),Qu=d(`<span class="rounded bg-neutral-100 px-1.5 py-0.5 font-mono text-[10px] text-neutral-600"> </span>`),$u=d(`<span class="rounded bg-emerald-50 px-1.5 py-0.5 font-mono text-[10px] text-emerald-700"> </span>`),ed=d(`<li class="text-[10px] text-amber-800"> </li>`),td=d(`<div class="w-full"><p class="text-[10px] font-semibold text-amber-700">Known gaps</p> <ul class="mt-0.5 list-disc space-y-0.5 pl-3"></ul></div>`),nd=d(`<div class="mb-2 flex flex-wrap items-start gap-1.5 rounded border border-neutral-200 bg-white px-2 py-1.5"><!> <!> <!> <!> <!></div>`),rd=d(`<span class="text-amber-700"> </span>`),id=d(`<span class="text-amber-700">- signature not found in file</span>`),ad=d(`<span class="rounded bg-amber-100 px-1 py-0 text-[9px] font-semibold text-amber-800" title="The audited signature no longer matches this line. Re-author this entry in .unspa.json">index stale</span> <!>`,1),od=d(`<pre> </pre>`),sd=d(`<li><div class="flex flex-wrap items-center gap-1 font-mono text-[10px] text-neutral-600"><span> </span> <!></div> <!></li>`),cd=d(`<ul class="mt-0.5 space-y-1"></ul>`),ld=d(`<p class="mt-1 rounded bg-red-50 px-1.5 py-0.5 text-[10px] text-red-700">entity not captured in code</p>`),ud=d(`<p class="mt-1 rounded bg-neutral-50 px-1.5 py-0.5 text-[10px] text-neutral-600">audit reported the location but did not extract field values. Re-run with <code>capturedFields</code> to enable per-field diff</p>`),dd=d(`<p class="mt-1 text-[10px] text-emerald-700">all spec fields match captured code</p>`),fd=d(`<button type="button" class="rounded border border-red-300 bg-white px-1.5 py-0 text-[10px] font-medium text-red-700 transition hover:bg-red-100 disabled:opacity-50" title="Overwrite spec value with the captured code value">Use code →</button>`),pd=d(`<tr><td class="pr-2 font-mono text-neutral-600"> </td><td class="pr-2 font-mono"> </td><td> </td><td class="pl-1 text-right"><!></td></tr>`),md=d(`<table class="mt-1 w-full text-[10px]"><thead><tr class="text-left text-neutral-500"><th class="font-medium">Field</th><th class="font-medium">Spec</th><th class="font-medium">Captured (code)</th><th></th></tr></thead><tbody></tbody></table>`),hd=d(`<li class="rounded border border-neutral-200 bg-white px-2 py-1"><div class="flex items-baseline justify-between gap-2"><span> </span> <span class="font-mono text-[10px] text-neutral-400"> </span></div> <!> <!></li>`),gd=d(`<div class="mb-2 last:mb-0"><p class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-neutral-500"> </p> <ul class="space-y-1"></ul></div>`),_d=d(`<div class="border-t border-neutral-100 bg-neutral-50/40 px-3 py-2 text-[11px]"><!> <!></div>`),vd=d(`<div class="border-t border-neutral-100 bg-white"><button type="button" class="flex w-full flex-wrap items-center gap-2 px-3 py-1.5 text-left text-[11px]"><span class="text-neutral-400"> </span> <span class="flex-1 truncate font-medium text-neutral-700">Surface-level (states, data, rules, invariants)</span> <!></button> <!></div>`),yd=d(`<p class="border-t border-neutral-100 bg-white px-3 py-2 text-[11px] italic text-neutral-500">No actions on this surface yet.</p>`),bd=d(`<span class="text-[10px] italic text-neutral-500">no tags</span>`),xd=d(`<span class="rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] text-neutral-600">not audited</span>`),Sd=d(`<span class="rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] font-mono"> </span> <span class="rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] font-mono"> </span>`,1),Cd=d(`<p class="text-neutral-500">No taggable entities on this action yet (no events, rules,
28
- invariants, or transitions).</p>`),wd=d(`<p class="mb-2 rounded border border-dashed border-neutral-300 bg-white px-2 py-1 text-[10px] text-neutral-500">Not audited yet. Write <code>.unspa.json</code> then call <code>report_implementation_status_batch</code> </p>`),Td=d(`<span> </span>`),Ed=d(`<span class="rounded bg-neutral-100 px-1.5 py-0.5 text-[10px] text-neutral-600"> </span>`),Dd=d(`<span class="rounded bg-neutral-100 px-1.5 py-0.5 font-mono text-[10px] text-neutral-600"> </span>`),Od=d(`<span class="rounded bg-emerald-50 px-1.5 py-0.5 font-mono text-[10px] text-emerald-700" title="Test file"> </span>`),kd=d(`<li class="font-mono text-[10px] text-neutral-600"> <span class="text-neutral-400"> </span></li>`),Ad=d(`<div class="w-full"><p class="text-[10px] font-semibold text-neutral-500">Related files</p> <ul class="mt-0.5 space-y-0.5"></ul></div>`),jd=d(`<li class="text-[10px] text-amber-800"> </li>`),Md=d(`<div class="w-full"><p class="text-[10px] font-semibold text-amber-700">Known gaps</p> <ul class="mt-0.5 list-disc space-y-0.5 pl-3"></ul></div>`),Nd=d(`<div class="mb-2 flex flex-wrap items-start gap-1.5 rounded border border-neutral-200 bg-white px-2 py-1.5"><!> <!> <!> <!> <!> <!></div>`),Pd=d(`<p class="mb-2 text-[10px] uppercase tracking-wide text-neutral-500"> <span class="opacity-60"> </span></p> <!>`,1),Fd=d(`<span class="text-amber-700"> </span>`),Id=d(`<span class="text-amber-700">- signature not found in file</span>`),Ld=d(`<span class="rounded bg-amber-100 px-1 py-0 text-[9px] font-semibold text-amber-800" title="The audited signature no longer matches this line. Re-author this entry in .unspa.json">index stale</span> <!>`,1),Rd=d(`<pre> </pre>`),zd=d(`<li><div class="flex flex-wrap items-center gap-1 font-mono text-[10px] text-neutral-600"><span> </span> <!></div> <!></li>`),Bd=d(`<ul class="mt-0.5 space-y-1"></ul>`),Vd=d(`<!> <p class="mt-0.5 text-[10px] text-neutral-400"> </p>`,1),Hd=d(`<p class="mt-1 rounded bg-red-50 px-1.5 py-0.5 text-[10px] text-red-700">entity not captured in code</p>`),Ud=d(`<p class="mt-1 text-[10px] text-emerald-700">all spec fields match captured code</p>`),Wd=d(`<button type="button" class="rounded border border-red-300 bg-white px-1.5 py-0 text-[10px] font-medium text-red-700 transition hover:bg-red-100 disabled:opacity-50" title="Overwrite spec value with the captured code value">Use code →</button>`),Gd=d(`<tr><td class="pr-2 font-mono text-neutral-600"> </td><td class="pr-2 font-mono"> </td><td> </td><td class="pl-1 text-right"><!></td></tr>`),Kd=d(`<table class="mt-1 w-full text-[10px]"><thead><tr class="text-left text-neutral-500"><th class="font-medium">Field</th><th class="font-medium">Spec</th><th class="font-medium">Captured (code)</th><th></th></tr></thead><tbody></tbody></table>`),qd=d(`<li class="rounded border border-neutral-200 bg-white px-2 py-1"><div class="flex items-baseline justify-between gap-2"><span> </span> <span class="font-mono text-[10px] text-neutral-400"> </span></div> <!> <!></li>`),Jd=d(`<div class="mb-2 last:mb-0"><p class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-neutral-500"> </p> <ul class="space-y-1"></ul></div>`),Yd=d(`<span class="ml-1 text-neutral-500"> </span>`),Xd=d(`<li class="font-mono text-[10px] text-amber-800"> <!></li>`),Zd=d(`<div class="mt-2"><p class="text-[10px] uppercase tracking-wide text-amber-700">Drift. Tags found that aren't declared</p> <ul class="mt-1 space-y-0.5"></ul></div>`),Qd=d(`<!> <!> <!>`,1),$d=d(`<div class="border-t border-neutral-100 bg-neutral-50/40 px-3 py-2 text-[11px]"><div class="mb-2 flex items-center justify-between"><span class="font-medium text-neutral-700"> </span> <button type="button" class="rounded-md border border-neutral-300 bg-white px-1.5 py-0 text-[10px] font-medium text-neutral-700 hover:bg-neutral-50">Open →</button></div> <!></div>`),ef=d(`<li class="border-b border-neutral-100 last:border-b-0"><button type="button" class="flex w-full flex-wrap items-center gap-2 px-3 py-1.5 text-left text-[11px]"><span class="text-neutral-400"> </span> <span class="flex-1 truncate text-neutral-800"> </span> <!></button> <div class="px-3 pb-1"><div class="h-0.5 w-full rounded-full"></div></div> <!></li>`),tf=d(`<ul class="border-t border-neutral-100 bg-white"></ul>`),nf=d(`<!> <!>`,1),rf=d(`<li><button type="button" class="flex w-full flex-wrap items-center gap-2 px-3 py-2 text-left text-xs"><span class="text-neutral-400"> </span> <span class="flex-1 truncate font-medium text-neutral-900"> </span> <!></button> <div class="px-3 pb-2"><div class="h-1 w-full rounded-full"></div></div> <!></li>`),af=d(`<ul class="space-y-1"></ul>`),of=d(`<div class="space-y-4 text-sm"><section><div class="flex items-baseline justify-between gap-2"><span class="text-xs font-semibold uppercase tracking-wide opacity-80">Implementation</span> <div class="flex items-center gap-1.5"><!> <button type="button" title="Toggle field-level diff between spec and captured code values"><span aria-hidden="true"> </span> <span>Diff</span></button> <span class="text-[10px] tracking-wide opacity-70"><!></span></div></div> <div class="mt-1.5 h-1.5 w-full rounded-full"></div> <div class="mt-2 flex flex-wrap gap-x-3 gap-y-0.5 text-[11px]"><span class="font-bold"> </span> <span class="font-bold"> </span> <!> <!> <!></div> <!> <!></section> <!> <section class="space-y-2"><h3 class="text-[10px] font-semibold uppercase tracking-wide text-neutral-500">Per surface</h3> <!></section></div>`);function sf(n,o){N(o,!0);let s=z(()=>ve(o.feature,nn.status)),c=V(e({})),d=V(e({})),f=V(e({})),m=V(!1);function h(e){T(c,{...G(c),[e]:!G(c)[e]},!0)}function b(e){T(d,{...G(d),[e]:!G(d)[e]},!0)}function x(e){T(f,{...G(f),[e]:!G(f)[e]},!0)}function S(e,t){ln.navigateTo({surfaceId:e,actionId:t})}function w(e,t){if(!t)return`hsl(220, 10%, 70%)`;let n=e/100*120;return`hsl(${Math.round(n)}, 70%, 45%)`}function E(e){return e.expectedCount===0?`bg-neutral-50 border-neutral-200 text-neutral-700`:e.percentage>=80?`bg-emerald-50 border-emerald-200 text-emerald-900`:e.percentage>=50?`bg-amber-50 border-amber-200 text-amber-900`:`bg-red-50 border-red-200 text-red-900`}function D(e){if(!e)return`never`;let t=Date.parse(e);if(Number.isNaN(t))return e;let n=Date.now()-t;if(n<6e4)return`just now`;if(n<36e5)return`${Math.round(n/6e4)} min ago`;if(n<864e5)return`${Math.round(n/36e5)} h ago`;let r=Math.round(n/864e5);return`${r} day${r===1?``:`s`} ago`}function O(e){if(!e)return`never`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(void 0,{month:`short`,day:`numeric`,year:`numeric`,hour:`2-digit`,minute:`2-digit`})}let k=z(()=>()=>{let e=nn.lastUpdateSignalAt,t=nn.lastFetchedAt;return e?t?Date.parse(e)>Date.parse(t):!0:!1});function M(e){return e.expectedCount===0?`nothing to tag yet`:e.reported?e.foundCount===e.expectedCount?`fully tagged`:`${e.foundCount}/${e.expectedCount} tagged`:`not yet audited`}function P(e){switch(e){case`action`:return`Action`;case`event`:return`Events`;case`rule`:return`Rules`;case`invariant`:return`Invariants`;case`transition`:return`Transitions`;case`state`:return`States`;case`data`:return`Entity`;case`surface_rule`:return`Surface rules`;case`surface_invariant`:return`Surface invariants`}}function I(e){let t=new Map;for(let e of ml)t.set(e,[]);for(let n of e){let e=t.get(n.entityType);e&&e.push(n)}return t}function L(e,t){let n=new Map;for(let e of t)n.set(`${e.entityType}:${e.entityId}`,e);let r=I(e);return ml.map(e=>({type:e,rows:(r.get(e)??[]).map(e=>({expected:e,found:n.get(`${e.entityType}:${e.entityId}`)??null}))})).filter(e=>e.rows.length>0)}function te(e){let t=Cu(o.feature,e.expected.entityType,e.expected.entityId);return t?Eu(t,e.found?.capturedFields??null):null}function R(e){let t=te(e);return t?t.filter(e=>!e.equal).slice().sort((e,t)=>e.missingFromCaptured===t.missingFromCaptured?e.path.localeCompare(t.path):e.missingFromCaptured?1:-1):null}async function B(e,t){await $.mutate(n=>Iu(n,e.expected.entityType,e.expected.entityId,t.path,t.captured))}function ne(e){if(e===void 0)return`-`;if(e===null)return`null`;if(typeof e==`string`)return e.length>0?e:`""`;if(typeof e==`number`||typeof e==`boolean`)return String(e);try{return JSON.stringify(e)}catch{return String(e)}}function re(e){return e?e.slice(0,7):``}let ie={"svelte-route":`bg-orange-100 text-orange-800`,"svelte-store":`bg-violet-100 text-violet-800`,"svelte-component":`bg-sky-100 text-sky-800`,"mcp-tool":`bg-teal-100 text-teal-800`,"mcp-entrypoint":`bg-teal-200 text-teal-900`,"domain-service":`bg-indigo-100 text-indigo-800`};function ae(e){return ie[e]??`bg-neutral-100 text-neutral-700`}function oe(e){return e?!!(e.kind||e.auditedAt||e.gitCommit||e.testFile||e.relatedFiles?.length||e.knownGaps?.length):!1}var se=of(),K=_(se),ce=_(K),le=p(_(ce),2),ue=_(le),de=e=>{var n=Lu(),r=_(n),i=p(r,2),a=_(i,!0);F(i),F(n),g(()=>{n.disabled=nn.refreshing||nn.loading,H(n,`title`,nn.refreshing?`Fetching the latest report…`:`A new report was detected. Click to load it`),U(r,1,`inline-block ${nn.refreshing?`animate-spin`:`animate-pulse`}`),t(a,nn.refreshing?`Refreshing`:`New report`)}),l(`click`,n,()=>nn.refresh()),A(e,n)},q=z(()=>G(k)()||nn.refreshing);j(ue,e=>{G(q)&&e(de)});var J=p(ue,2),fe=_(J),Y=_(fe,!0);F(fe),ee(2),F(J);var pe=p(J,2),me=_(pe),he=e=>{var n=a();g(e=>t(n,`v${G(s).revision??``} · ${e??``}`),[()=>D(G(s).updatedAt)]),A(e,n)},ge=e=>{A(e,a(`no report yet`))};j(me,e=>{G(s).hasReport?e(he):e(ge,-1)}),F(pe),F(le),F(ce);var X=p(ce,2),_e=p(X,2),ye=_(_e),be=_(ye);F(ye);var xe=p(ye,2),Se=_(xe);F(xe);var Z=p(xe,2),Ce=e=>{var n=Ru(),r=_(n);F(n),g(()=>t(r,`${G(s).missingCount??``} missing`)),A(e,n)};j(Z,e=>{G(s).missingCount>0&&e(Ce)});var we=p(Z,2),Te=e=>{var n=zu(),r=_(n);F(n),g(()=>t(r,`${G(s).extraCount??``} extra`)),A(e,n)};j(we,e=>{G(s).extraCount>0&&e(Te)});var Ee=p(we,2),De=e=>{var n=Bu(),r=_(n);F(n),g(()=>t(r,`${G(s).reportedCount??``}/${G(s).capabilitiesWithExpected??``} actions audited`)),A(e,n)};j(Ee,e=>{G(s).capabilitiesWithExpected>0&&e(De)}),F(_e);var Oe=p(_e,2),ke=e=>{var n=Vu(),r=_(n);F(n),g(e=>{H(n,`title`,G(s).updatedAt),t(r,`last report ${e??``}`)},[()=>O(G(s).updatedAt)]),A(e,n)};j(Oe,e=>{G(s).updatedAt&&e(ke)});var Ae=p(Oe,2),je=e=>{A(e,Hu())};j(Ae,e=>{G(m)&&e(je)}),F(K);var Me=p(K,2),Q=e=>{A(e,Uu())};j(Me,e=>{G(s).hasReport||e(Q)});var Ne=p(Me,2),Pe=p(_(Ne),2),Fe=e=>{A(e,Wu())},Ie=e=>{var n=af();i(n,21,()=>G(s).perSurface,e=>e.surface.id,(e,n)=>{let a=z(()=>String(G(n).surface.id)),o=z(()=>G(c)[G(a)]??G(m)),s=z(()=>G(f)[G(a)]??G(m));var C=rf(),T=_(C),O=_(T),k=_(O,!0);F(O);var N=p(O,2),I=_(N,!0);F(N);var ee=p(N,2),te=e=>{A(e,Gu())},V=e=>{var r=Ku(),i=v(r),a=_(i);F(i);var o=p(i,2),s=_(o);F(o),g(()=>{t(a,`${G(n).foundCount??``}/${G(n).expectedCount??``}`),t(s,`${G(n).percentage??``}%`)}),A(e,r)};j(ee,e=>{G(n).expectedCount===0?e(te):e(V,-1)}),F(T);var ie=p(T,2),se=_(ie);F(ie);var K=p(ie,2),ce=e=>{var o=nf(),c=v(o),f=e=>{let o=z(()=>G(n).surfaceLevel);var c=vd(),d=_(c),f=_(d),h=_(f,!0);F(f);var y=p(f,4),b=e=>{A(e,qu())},S=e=>{var n=Ju(),r=v(n),i=_(r);F(r);var a=p(r,2),s=_(a);F(a),g(()=>{t(i,`${G(o).foundCount??``}/${G(o).expectedCount??``}`),t(s,`${G(o).percentage??``}%`)}),A(e,n)};j(y,e=>{G(o).reported?e(S,-1):e(b)}),F(d);var C=p(d,2),w=e=>{var n=_d(),a=_(n),s=e=>{A(e,Yu())},c=e=>{let n=z(()=>G(o).status.auditMeta);var a=nd(),s=_(a),c=e=>{var r=Xu(),i=_(r,!0);F(r),g(e=>{U(r,1,`rounded px-1.5 py-0.5 font-mono text-[10px] font-medium ${e??``}`),t(i,G(n).kind)},[()=>ae(G(n).kind)]),A(e,r)};j(s,e=>{G(n).kind&&e(c)});var l=p(s,2),u=e=>{var r=Zu(),i=_(r);F(r),g(e=>{H(r,`title`,G(n).auditedAt),t(i,`audited ${e??``}`)},[()=>D(G(n).auditedAt)]),A(e,r)};j(l,e=>{G(n).auditedAt&&e(u)});var d=p(l,2),f=e=>{var r=Qu(),i=_(r,!0);F(r),g(e=>{H(r,`title`,G(n).gitCommit),t(i,e)},[()=>re(G(n).gitCommit)]),A(e,r)};j(d,e=>{G(n).gitCommit&&e(f)});var m=p(d,2),h=e=>{var r=$u(),i=_(r);F(r),g(()=>t(i,`test: ${G(n).testFile??``}`)),A(e,r)};j(m,e=>{G(n).testFile&&e(h)});var v=p(m,2),y=e=>{var a=td(),o=p(_(a),2);i(o,21,()=>G(n).knownGaps,r,(e,n)=>{var r=ed(),i=_(r,!0);F(r),g(()=>t(i,G(n))),A(e,r)}),F(o),F(a),A(e,a)};j(v,e=>{G(n).knownGaps&&G(n).knownGaps.length>0&&e(y)}),F(a),A(e,a)},d=z(()=>oe(G(o).status?.auditMeta));j(a,e=>{G(o).reported?G(d)&&e(c,1):e(s)}),i(p(a,2),17,()=>L(G(o).expected,G(o).found),e=>e.type,(e,n)=>{var a=gd(),o=_(a),s=_(o,!0);F(o);var c=p(o,2);i(c,21,()=>G(n).rows,e=>`${e.expected.entityType}:${e.expected.entityId}`,(e,n)=>{let a=z(()=>G(m)?R(G(n)):null);var o=hd(),s=_(o),c=_(s),d=_(c);F(c);var f=p(c,2),h=_(f,!0);F(f),F(s);var y=p(s,2),b=e=>{var a=cd();i(a,21,()=>G(n).found.locations,r,(e,n)=>{var r=sd(),i=_(r),a=_(i),o=_(a);F(a);var s=p(a,2),c=e=>{var r=ad(),i=p(v(r),2),a=e=>{var r=rd(),i=_(r);F(r),g(()=>t(i,`→ now at :${G(n).suggestedLine??``}`)),A(e,r)},o=e=>{A(e,id())};j(i,e=>{G(n).suggestedLine?e(a):e(o,-1)}),A(e,r)};j(s,e=>{G(n).stale&&e(c)}),F(i);var l=p(i,2),u=e=>{var r=od(),i=_(r,!0);F(r),g(()=>{U(r,1,`mt-0.5 overflow-x-auto rounded ${G(n).stale?`border-l-2 border-amber-400`:``} bg-neutral-900 px-2 py-1 text-[10px] leading-snug text-neutral-100`),t(i,G(n).snippet)}),A(e,r)};j(l,e=>{G(n).snippet&&e(u)}),F(r),g(()=>t(o,`${G(n).file??``}${G(n).line===void 0?``:`:${G(n).line}`}`)),A(e,r)}),F(a),A(e,a)};j(y,e=>{G(n).found&&G(n).found.locations.length>0&&!G(m)&&e(b)});var x=p(y,2),S=e=>{var r=u(),o=v(r),s=e=>{A(e,ld())},c=e=>{A(e,ud())},d=e=>{A(e,dd())},f=e=>{var r=md(),o=p(_(r));i(o,21,()=>G(a),e=>e.path,(e,r)=>{let i=z(()=>!G(r).missingFromCaptured&&Ou(G(n).expected.entityType,G(r).path));var a=pd(),o=_(a),s=_(o,!0);F(o);var c=p(o),u=_(c,!0);F(c);var d=p(c),f=_(d,!0);F(d);var m=p(d),h=_(m),v=e=>{var t=fd();g(()=>t.disabled=$.saving),l(`click`,t,()=>B(G(n),G(r))),A(e,t)};j(h,e=>{G(i)&&e(v)}),F(m),F(a),g((e,n)=>{U(a,1,W(G(r).missingFromCaptured?`bg-amber-50`:`bg-red-50`)),t(s,G(r).path),t(u,e),U(d,1,`font-mono ${G(r).missingFromCaptured?`text-amber-700`:`text-red-700`}`),t(f,n)},[()=>ne(G(r).spec),()=>G(r).missingFromCaptured?`not captured`:ne(G(r).captured)]),A(e,a)}),F(o),F(r),A(e,r)};j(o,e=>{G(n).found?G(n).found.capturedFields===void 0||G(n).found.capturedFields===null?e(c,1):G(a).length===0?e(d,2):e(f,-1):e(s)}),A(e,r)};j(x,e=>{G(m)&&G(a)&&e(S)}),F(o),g(()=>{U(c,1,`font-mono text-[11px] ${G(n).found?`text-emerald-700`:`text-red-700`}`),t(d,`${G(n).found?`✓`:`✗`} ${G(n).expected.entityName??G(n).expected.entityId??``}`),t(h,G(n).expected.tag)}),A(e,o)}),F(c),F(a),g(e=>t(s,e),[()=>P(G(n).type)]),A(e,a)}),F(n),A(e,n)};j(C,e=>{G(s)&&e(w)}),F(c),g(()=>t(h,G(s)?`▾`:`▸`)),l(`click`,d,()=>x(G(a))),A(e,c)};j(c,e=>{G(n).surfaceLevel.expectedCount>0&&e(f)});var h=p(c,2),C=e=>{A(e,yd())},T=e=>{var o=tf();i(o,21,()=>G(n).perAction,e=>e.action.id,(e,n)=>{let o=z(()=>String(G(n).action.id)),s=z(()=>G(d)[G(o)]??G(m));var c=ef(),f=_(c),h=_(f),x=_(h,!0);F(h);var C=p(h,2),T=_(C,!0);F(C);var E=p(C,2),O=e=>{A(e,bd())},k=e=>{A(e,xd())},N=e=>{var r=Sd(),i=v(r),a=_(i);F(i);var o=p(i,2),s=_(o);F(o),g(()=>{t(a,`${G(n).foundCount??``}/${G(n).expectedCount??``}`),t(s,`${G(n).percentage??``}%`)}),A(e,r)};j(E,e=>{G(n).expectedCount===0?e(O):G(n).reported?e(N,-1):e(k,1)}),F(f);var I=p(f,2),ee=_(I);F(I);var te=p(I,2),V=e=>{var s=$d(),c=_(s),d=_(c),f=_(d,!0);F(d);var h=p(d,2);F(c);var y=p(c,2),b=e=>{A(e,Cd())},x=e=>{var a=Qd(),o=v(a),s=e=>{var n=wd(),r=p(_(n),4);F(n),g(()=>t(r,`. ${G(m)?`In diff mode you'll still see the spec values on the left; the right column stays empty until a report runs.`:``}`)),A(e,n)},c=e=>{let a=z(()=>G(n).status);var o=Pd(),s=v(o),c=_(s),l=p(c),u=_(l);F(l),F(s);var d=p(s,2),f=e=>{let n=z(()=>G(a).auditMeta);var o=Nd(),s=_(o),c=e=>{var r=Td(),i=_(r,!0);F(r),g(e=>{U(r,1,`rounded px-1.5 py-0.5 font-mono text-[10px] font-medium ${e??``}`),t(i,G(n).kind)},[()=>ae(G(n).kind)]),A(e,r)};j(s,e=>{G(n).kind&&e(c)});var l=p(s,2),u=e=>{var r=Ed(),i=_(r);F(r),g(e=>{H(r,`title`,G(n).auditedAt),t(i,`audited ${e??``}`)},[()=>D(G(n).auditedAt)]),A(e,r)};j(l,e=>{G(n).auditedAt&&e(u)});var d=p(l,2),f=e=>{var r=Dd(),i=_(r,!0);F(r),g(e=>{H(r,`title`,G(n).gitCommit),t(i,e)},[()=>re(G(n).gitCommit)]),A(e,r)};j(d,e=>{G(n).gitCommit&&e(f)});var m=p(d,2),h=e=>{var r=Od(),i=_(r);F(r),g(()=>t(i,`test: ${G(n).testFile??``}`)),A(e,r)};j(m,e=>{G(n).testFile&&e(h)});var v=p(m,2),y=e=>{var a=Ad(),o=p(_(a),2);i(o,21,()=>G(n).relatedFiles,r,(e,n)=>{var r=kd(),i=_(r),a=p(i),o=_(a);F(a),F(r),g(()=>{t(i,`${G(n).file??``}${G(n).line?`:${G(n).line}`:``} `),t(o,`. ${G(n).role??``}`)}),A(e,r)}),F(o),F(a),A(e,a)};j(v,e=>{G(n).relatedFiles&&G(n).relatedFiles.length>0&&e(y)});var b=p(v,2),x=e=>{var a=Md(),o=p(_(a),2);i(o,21,()=>G(n).knownGaps,r,(e,n)=>{var r=jd(),i=_(r,!0);F(r),g(()=>t(i,G(n))),A(e,r)}),F(o),F(a),A(e,a)};j(b,e=>{G(n).knownGaps&&G(n).knownGaps.length>0&&e(x)}),F(o),A(e,o)},m=z(()=>oe(G(a).auditMeta));j(d,e=>{G(m)&&e(f)}),g(e=>{t(c,`Reported ${e??``} `),H(l,`title`,G(a).reportedAt),t(u,`(${G(a).reportedAt??``})`)},[()=>D(G(a).reportedAt)]),A(e,o)};j(o,e=>{G(n).reported?e(c,-1):e(s)});var d=p(o,2);i(d,17,()=>L(G(n).expected,G(n).found),e=>e.type,(e,n)=>{var a=Jd(),o=_(a),s=_(o,!0);F(o);var c=p(o,2);i(c,21,()=>G(n).rows,e=>`${e.expected.entityType}:${e.expected.entityId}`,(e,n)=>{let a=z(()=>G(m)?R(G(n)):null);var o=qd(),s=_(o),c=_(s),d=_(c);F(c);var f=p(c,2),h=_(f,!0);F(f),F(s);var y=p(s,2),b=e=>{var a=Vd(),o=v(a),s=e=>{var a=Bd();i(a,21,()=>G(n).found.locations,r,(e,n)=>{var r=zd(),i=_(r),a=_(i),o=_(a);F(a);var s=p(a,2),c=e=>{var r=Ld(),i=p(v(r),2),a=e=>{var r=Fd(),i=_(r);F(r),g(()=>t(i,`→ now at :${G(n).suggestedLine??``}`)),A(e,r)},o=e=>{A(e,Id())};j(i,e=>{G(n).suggestedLine?e(a):e(o,-1)}),A(e,r)};j(s,e=>{G(n).stale&&e(c)}),F(i);var l=p(i,2),u=e=>{var r=Rd(),i=_(r,!0);F(r),g(()=>{U(r,1,`mt-0.5 overflow-x-auto rounded ${G(n).stale?`border-l-2 border-amber-400`:``} bg-neutral-900 px-2 py-1 text-[10px] leading-snug text-neutral-100`),t(i,G(n).snippet)}),A(e,r)};j(l,e=>{G(n).snippet&&e(u)}),F(r),g(()=>t(o,`${G(n).file??``}${G(n).line===void 0?``:`:${G(n).line}`}`)),A(e,r)}),F(a),A(e,a)};j(o,e=>{G(n).found.locations.length>0&&e(s)});var c=p(o,2),l=_(c);F(c),g(e=>{H(c,`title`,G(n).found.capturedAt),t(l,`captured ${e??``}`)},[()=>D(G(n).found.capturedAt)]),A(e,a)};j(y,e=>{G(n).found&&!G(m)&&e(b)});var x=p(y,2),S=e=>{var r=u(),o=v(r),s=e=>{A(e,Hd())},c=e=>{A(e,Ud())},d=e=>{var r=Kd(),o=p(_(r));i(o,21,()=>G(a),e=>e.path,(e,r)=>{let i=z(()=>!G(r).missingFromCaptured&&Ou(G(n).expected.entityType,G(r).path));var a=Gd(),o=_(a),s=_(o,!0);F(o);var c=p(o),u=_(c,!0);F(c);var d=p(c),f=_(d,!0);F(d);var m=p(d),h=_(m),v=e=>{var t=Wd();g(()=>t.disabled=$.saving),l(`click`,t,()=>B(G(n),G(r))),A(e,t)};j(h,e=>{G(i)&&e(v)}),F(m),F(a),g((e,n)=>{U(a,1,W(G(r).missingFromCaptured?`bg-amber-50`:`bg-red-50`)),t(s,G(r).path),t(u,e),U(d,1,`font-mono ${G(r).missingFromCaptured?`text-amber-700`:`text-red-700`}`),t(f,n)},[()=>ne(G(r).spec),()=>G(r).missingFromCaptured?`not captured`:ne(G(r).captured)]),A(e,a)}),F(o),F(r),A(e,r)};j(o,e=>{G(n).found?G(a).length===0?e(c,1):e(d,-1):e(s)}),A(e,r)};j(x,e=>{G(m)&&G(a)&&e(S)}),F(o),g(()=>{U(c,1,`font-mono text-[11px] ${G(n).found?`text-emerald-700`:`text-red-700`}`),t(d,`${G(n).found?`✓`:`✗`} ${G(n).expected.entityName??G(n).expected.entityId??``}`),t(h,G(n).expected.tag)}),A(e,o)}),F(c),F(a),g(e=>t(s,e),[()=>P(G(n).type)]),A(e,a)});var f=p(d,2),h=e=>{var a=Zd(),o=p(_(a),2);i(o,21,()=>G(n).status.extraTags,r,(e,n)=>{var a=Xd(),o=_(a);i(p(o),17,()=>G(n).locations,r,(e,n)=>{var r=Yd(),i=_(r);F(r),g(()=>t(i,`${G(n).file??``}${G(n).line===void 0?``:`:${G(n).line}`}`)),A(e,r)}),F(a),g(()=>t(o,`${G(n).tag??``} `)),A(e,a)}),F(o),F(a),A(e,a)};j(f,e=>{G(n).status&&G(n).status.extraTags.length>0&&e(h)}),A(e,a)};j(y,e=>{G(n).expectedCount===0?e(b):e(x,-1)}),F(s),g(e=>t(f,e),[()=>M(G(n))]),l(`click`,h,()=>S(G(a),G(o))),A(e,s)};j(te,e=>{G(s)&&e(V)}),F(c),g(e=>{t(x,G(s)?`▾`:`▸`),t(T,G(n).action.name),y(ee,`background-color: ${e??``}`)},[()=>w(G(n).percentage,G(n).expectedCount>0)]),l(`click`,f,()=>b(G(o))),A(e,c)}),F(o),A(e,o)};j(h,e=>{G(n).perAction.length===0?e(C):e(T,-1)}),A(e,o)};j(K,e=>{G(o)&&e(ce)}),F(C),g((e,r)=>{U(C,1,`rounded-md border ${e??``}`),t(k,G(o)?`▾`:`▸`),t(I,G(n).surface.name),y(se,`background-color: ${r??``}`)},[()=>E(G(n)).split(` `).slice(1).join(` `),()=>w(G(n).percentage,G(n).expectedCount>0)]),l(`click`,T,()=>h(G(a))),A(e,C)}),F(n),A(e,n)};j(Pe,e=>{G(s).perSurface.length===0?e(Fe):e(Ie,-1)}),F(Ne),F(se),g((e,n)=>{U(K,1,`rounded-md border p-3 ${G(s).expectedCount===0?`bg-neutral-50 border-neutral-200 text-neutral-700`:G(s).percentage>=80?`bg-emerald-50 border-emerald-200 text-emerald-900`:G(s).percentage>=50?`bg-amber-50 border-amber-200 text-amber-900`:`bg-red-50 border-red-200 text-red-900`}`),U(J,1,`inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-[10px] font-semibold transition focus:outline-none focus:ring-2 focus:ring-brand-300 ${G(m)?`bg-brand-600 text-white shadow-sm hover:bg-brand-700`:`border border-neutral-300 bg-white text-neutral-700 hover:bg-neutral-50`}`),H(J,`aria-pressed`,G(m)),t(Y,G(m)?`●`:`○`),H(pe,`title`,e),y(X,`background-color: ${n??``}`),t(be,`${G(s).foundCount??``} / ${G(s).expectedCount??``} tags`),t(Se,`${G(s).percentage??``}%`)},[()=>nn.lastFetchedAt?`Last fetched ${O(nn.lastFetchedAt)}`:`Never fetched`,()=>w(G(s).percentage,G(s).expectedCount>0)]),l(`click`,J,()=>T(m,!G(m))),A(n,se),C()}c([`click`]);var cf=d(`<span class="absolute -right-0.5 -top-0.5 h-2 w-2 rounded-full border border-white"></span>`),lf=d(`<button type="button"><span> </span> <!></button>`),uf=d(`<aside class="flex flex-col items-center gap-1 rounded-lg border border-hairline bg-white p-1" aria-label="Insights rail (collapsed)"><button type="button" class="grid h-9 w-9 place-items-center rounded-md text-slate-500 hover:bg-slate-100 hover:text-slate-900" title="Expand insights rail" aria-label="Expand insights rail"><span aria-hidden="true">◀</span></button> <span class="my-1 h-px w-6 bg-slate-200"></span> <!></aside>`),df=d(`<span> </span>`),ff=d(`<button type="button"><span> </span> <!></button>`),pf=d(`<p class="text-xs text-slate-500">Select a surface to simulate.</p>`),mf=d(`<div class="motion-reduce:animate-none! motion-reduce:opacity-100!"><!></div>`),hf=d(`<section class="rounded-lg border border-hairline bg-white"><div class="sticky top-0 z-10 flex items-stretch rounded-t-lg border-b border-hairline bg-white text-xs"><!> <button type="button" class="grid w-8 place-items-center border-l border-hairline text-slate-500 hover:bg-slate-50 hover:text-slate-900" title="Collapse insights rail" aria-label="Collapse insights rail"><span aria-hidden="true">▶</span></button></div> <div class="p-3"><!></div></section>`);function gf(e,r){N(r,!0);let a=z(()=>ln.railTab),o=z(()=>ln.railCollapsed),s=z(()=>ce(r.feature).global),c=z(()=>ve(r.feature,nn.status));function d(e){let t=e/100*120;return`hsl(${Math.round(t)}, 70%, 45%)`}let m=z(()=>G(s).criticalIssues.length>0?`hsl(${Math.max(0,35-(G(s).criticalIssues.length-1)*18)}, 75%, 50%)`:d(G(s).percentage)),h=z(()=>G(c).expectedCount===0?`hsl(220, 10%, 70%)`:d(G(c).percentage)),b=z(()=>[{key:`simulator`,label:`Simulator`,short:`Sim`,badge:`▶`,badgeTone:`slate`},{key:`maturity`,label:`Maturity`,short:`Mat`,badge:`${G(s).percentage}%`,badgeTone:G(s).criticalIssues.length>0?`red`:G(s).percentage>=80?`emerald`:G(s).percentage>=50?`amber`:`red`,dot:G(m)},{key:`implementation`,label:`Implementation`,short:`Impl`,badge:G(c).expectedCount===0?`-`:`${G(c).percentage}%`,badgeTone:G(c).expectedCount===0?`slate`:G(c).percentage>=80?`emerald`:G(c).percentage>=50?`amber`:`red`,dot:G(h)}]),x={red:`bg-red-100 text-red-800`,amber:`bg-amber-100 text-amber-800`,emerald:`bg-emerald-100 text-emerald-800`,slate:`bg-slate-100 text-slate-700`};var S=u(),w=v(S),T=e=>{var n=uf(),r=_(n);i(p(r,4),17,()=>G(b),e=>e.key,(e,n)=>{var r=lf(),i=_(r),o=_(i,!0);F(i);var s=p(i,2),c=e=>{var t=cf();g(()=>y(t,`background-color: ${G(n).dot??``}`)),A(e,t)};j(s,e=>{G(n).dot&&e(c)}),F(r),g(()=>{U(r,1,`relative grid h-9 w-9 place-items-center rounded-md text-[10px] font-semibold text-slate-700 hover:bg-slate-100 ${G(a)===G(n).key?`bg-brand-50 text-brand-800 ring-1 ring-brand-200`:``}`),H(r,`title`,G(n).label),H(r,`aria-label`,G(n).label),t(o,G(n).short)}),l(`click`,r,()=>ln.openRail(G(n).key)),A(e,r)}),F(n),l(`click`,r,()=>ln.setRailCollapsed(!1)),A(e,n)},E=e=>{var o=hf(),s=_(o),c=_(s);i(c,17,()=>G(b),e=>e.key,(e,n)=>{var r=ff(),i=_(r),o=_(i,!0);F(i);var s=p(i,2),c=e=>{var r=df(),i=_(r,!0);F(r),g(()=>{U(r,1,`rounded-md px-1.5 py-0.5 font-mono text-[10px] ${x[G(n).badgeTone]??``}`),t(i,G(n).badge)}),A(e,r)};j(s,e=>{G(n).badge&&G(n).badgeTone&&e(c)}),F(r),g(()=>{U(r,1,`flex flex-1 items-center justify-center gap-1.5 px-2 py-2 transition ${G(a)===G(n).key?`border-b-2 border-brand-700 font-semibold text-brand-800`:`text-slate-600 hover:text-slate-950`}`),t(o,G(n).label)}),l(`click`,r,()=>ln.setRailTab(G(n).key)),A(e,r)});var d=p(c,2);F(s);var m=p(s,2);f(_(m),()=>G(a),e=>{var t=mf(),i=_(t),o=e=>{var t=u(),n=v(t),i=e=>{Ul(e,{get feature(){return r.feature},get surface(){return r.surface}})},a=e=>{A(e,pf())};j(n,e=>{r.surface?e(i):e(a,-1)}),A(e,t)},s=e=>{mu(e,{get feature(){return r.feature}})},c=e=>{sf(e,{get feature(){return r.feature}})};j(i,e=>{G(a)===`simulator`?e(o):G(a)===`maturity`?e(s,1):e(c,-1)}),F(t),n(1,t,()=>ie,()=>({duration:140,easing:ae})),A(e,t)}),F(m),F(o),l(`click`,d,()=>ln.setRailCollapsed(!0)),A(e,o)};j(w,e=>{G(o)?e(T):e(E,-1)}),A(e,S),C()}c([`click`]);var _f=(e,t)=>{let n=String(t),r=[];for(let t of e.entities)t.resourceId&&String(t.resourceId)===n&&r.push(t.namespace);let i=[];for(let t of e.surfaces)for(let e of t.actions)for(let r of e.parameters)r.resourceId&&String(r.resourceId)===n&&i.push({surfaceId:t.id,surfaceName:t.name,actionId:e.id,actionName:e.name,parameterId:r.id,parameterName:r.name,parameterType:r.type});return i.sort((e,t)=>e.surfaceName===t.surfaceName?e.actionName===t.actionName?e.parameterName.localeCompare(t.parameterName):e.actionName.localeCompare(t.actionName):e.surfaceName.localeCompare(t.surfaceName)),r.sort(),{resourceId:n,dataNamespaces:r,parameters:i}},vf=e=>e.dataNamespaces.length+e.parameters.length,yf=d(`<option> </option>`),bf=d(`<option> </option>`),xf=d(`<option> </option>`),Sf=d(`<button type="button"> </button>`),Cf=d(`<button type="button" class="mono rounded-md border border-brand-400 bg-brand-50 px-1.5 py-0.5 text-[10px] uppercase text-brand-800"> </button>`),wf=d(`<option> </option>`),Tf=d(`<option> </option>`),Ef=d(`<div class="space-y-4 text-xs"><section class="grid grid-cols-1 gap-2"><label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Name</span> <input type="text" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1"/></label> <label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Description</span> <textarea rows="2" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1"></textarea></label></section> <section class="grid grid-cols-2 gap-2"><label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Kind</span> <select class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1"></select></label> <label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Provider</span> <input type="text" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1" placeholder="PostgreSQL, AWS S3, Stripe…"/></label> <label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Scope</span> <select class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1"></select></label> <label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Location / region</span> <input type="text" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1" placeholder="eu-west-3 (Paris, FR)"/></label></section> <section><p class="mb-1 text-[10px] font-medium uppercase tracking-wide text-neutral-500">Structure</p> <div class="grid grid-cols-3 gap-2"><label class="block"><span class="text-[11px] text-neutral-600"> </span> <input type="text" class="mono mt-1 w-full rounded-md border border-neutral-300 px-2 py-1"/></label> <label class="block"><span class="text-[11px] text-neutral-600"> </span> <input type="text" class="mono mt-1 w-full rounded-md border border-neutral-300 px-2 py-1"/></label> <label class="block"><span class="text-[11px] text-neutral-600"> </span> <input type="text" class="mono mt-1 w-full rounded-md border border-neutral-300 px-2 py-1"/></label></div></section> <section class="grid grid-cols-2 gap-2"><label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Sensitivity</span> <select class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1"></select></label> <label class="flex items-center gap-2 pt-5 text-neutral-700"><input type="checkbox"/> Contains PII</label></section> <section><p class="mb-1 text-[10px] font-medium uppercase tracking-wide text-neutral-500">Compliance tags</p> <div class="flex flex-wrap gap-1"><!> <!></div> <div class="mt-1 flex items-center gap-1"><input type="text" class="mono flex-1 rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]" placeholder="Custom tag (e.g. ferpa)"/> <button type="button" class="rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px] hover:bg-neutral-50">Add</button></div></section> <section class="grid grid-cols-2 gap-2"><label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Access mode</span> <select class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1"></select></label> <label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Authentication</span> <select class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1"></select></label> <label class="flex items-center gap-2 text-neutral-700"><input type="checkbox"/> Encryption at rest</label> <label class="flex items-center gap-2 text-neutral-700"><input type="checkbox"/> Encryption in transit</label> <label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Retention</span> <input type="text" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1" placeholder="30 days, 7 years, indefinite"/></label> <label class="block"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Owner</span> <input type="text" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1" placeholder="team or person"/></label></section></div>`);function Df(e,n){N(n,!0);let a=z(()=>ma(n.resource.kind));function o(e){n.onChange({...n.resource,...e})}function s(e){o({complianceTags:n.resource.complianceTags.includes(e)?n.resource.complianceTags.filter(t=>t!==e):[...n.resource.complianceTags,e]})}let c=V(``);function u(){let e=G(c).trim().toLowerCase().replace(/\s+/g,`_`);e.length!==0&&(n.resource.complianceTags.includes(e)||o({complianceTags:[...n.resource.complianceTags,e]}),T(c,``))}var d=Ef(),f=_(d),h=_(f),v=p(_(h),2);M(v),F(h);var y=p(h,2),b=p(_(y),2);te(b),F(y),F(f);var x=p(f,2),S=_(x),E=p(_(S),2);i(E,21,()=>fa,r,(e,n)=>{var r=yf(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>pa(G(n))]),A(e,r)}),F(E);var k;O(E),F(S);var j=p(S,2),P=p(_(j),2);M(P),F(j);var I=p(j,2),R=p(_(I),2);i(R,21,()=>ha,r,(e,n)=>{var r=bf(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>ga(G(n))]),A(e,r)}),F(R);var B;O(R),F(I);var H=p(I,2),W=p(_(H),2);M(W),F(H),F(x);var ne=p(x,2),re=p(_(ne),2),ie=_(re),ae=_(ie),oe=_(ae,!0);F(ae);var se=p(ae,2);M(se),F(ie);var K=p(ie,2),ce=_(K),le=_(ce,!0);F(ce);var ue=p(ce,2);M(ue),F(K);var de=p(K,2),q=_(de),J=_(q,!0);F(q);var fe=p(q,2);M(fe),F(de),F(re),F(ne);var Y=p(ne,2),pe=_(Y),me=p(_(pe),2);i(me,21,()=>_a,r,(e,n)=>{var r=xf(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>va(G(n))]),A(e,r)}),F(me);var he;O(me),F(pe);var ge=p(pe,2),X=_(ge);M(X),ee(),F(ge),F(Y);var _e=p(Y,2),ve=p(_(_e),2),ye=_(ve);i(ye,17,()=>Ca,r,(e,r)=>{let i=z(()=>n.resource.complianceTags.includes(G(r)));var a=Sf(),o=_(a,!0);F(a),g(()=>{U(a,1,`mono rounded-md border px-1.5 py-0.5 text-[10px] uppercase ${G(i)?`border-brand-400 bg-brand-50 text-brand-800`:`border-neutral-300 text-neutral-500 hover:bg-neutral-50`}`),t(o,G(r))}),l(`click`,a,()=>s(G(r))),A(e,a)}),i(p(ye,2),17,()=>n.resource.complianceTags.filter(e=>!Ca.includes(e)),r,(e,n)=>{var r=Cf(),i=_(r);F(r),g(()=>t(i,`${G(n)??``} ✕`)),l(`click`,r,()=>s(G(n))),A(e,r)}),F(ve);var be=p(ve,2),xe=_(be);M(xe);var Se=p(xe,2);F(be),F(_e);var Z=p(_e,2),Ce=_(Z),we=p(_(Ce),2);i(we,21,()=>xa,r,(e,n)=>{var r=wf(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>Sa(G(n))]),A(e,r)}),F(we);var Te;O(we),F(Ce);var Ee=p(Ce,2),De=p(_(Ee),2);i(De,21,()=>ya,r,(e,n)=>{var r=Tf(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>ba(G(n))]),A(e,r)}),F(De);var Oe;O(De),F(Ee);var ke=p(Ee,2),Ae=_(ke);M(Ae),ee(),F(ke);var je=p(ke,2),Me=_(je);M(Me),ee(),F(je);var Q=p(je,2),Ne=p(_(Q),2);M(Ne),F(Q);var Pe=p(Q,2),Fe=p(_(Pe),2);M(Fe),F(Pe),F(Z),F(d),g(()=>{L(v,n.resource.name),L(b,n.resource.description??``),k!==(k=n.resource.kind)&&(E.value=(E.__value=n.resource.kind)??``,D(E,n.resource.kind)),L(P,n.resource.provider),B!==(B=n.resource.scope)&&(R.value=(R.__value=n.resource.scope)??``,D(R,n.resource.scope)),L(W,n.resource.location??``),t(oe,G(a).database),L(se,n.resource.database??``),t(le,G(a).container),L(ue,n.resource.container??``),t(J,G(a).field),L(fe,n.resource.field??``),he!==(he=n.resource.sensitivity)&&(me.value=(me.__value=n.resource.sensitivity)??``,D(me,n.resource.sensitivity)),w(X,n.resource.containsPii),L(xe,G(c)),Te!==(Te=n.resource.accessMode)&&(we.value=(we.__value=n.resource.accessMode)??``,D(we,n.resource.accessMode)),Oe!==(Oe=n.resource.authentication??`none`)&&(De.value=(De.__value=n.resource.authentication??`none`)??``,D(De,n.resource.authentication??`none`)),w(Ae,n.resource.encryptionAtRest??!1),w(Me,n.resource.encryptionInTransit??!1),L(Ne,n.resource.retention??``),L(Fe,n.resource.owner??``)}),m(`blur`,v,e=>o({name:e.target.value})),m(`blur`,b,e=>o({description:e.target.value||void 0})),l(`change`,E,e=>o({kind:e.target.value})),m(`blur`,P,e=>o({provider:e.target.value})),l(`change`,R,e=>o({scope:e.target.value})),m(`blur`,W,e=>o({location:e.target.value||void 0})),m(`blur`,se,e=>o({database:e.target.value||void 0})),m(`blur`,ue,e=>o({container:e.target.value||void 0})),m(`blur`,fe,e=>o({field:e.target.value||void 0})),l(`change`,me,e=>o({sensitivity:e.target.value})),l(`change`,X,e=>o({containsPii:e.target.checked})),l(`input`,xe,e=>T(c,e.target.value,!0)),l(`click`,Se,u),l(`change`,we,e=>o({accessMode:e.target.value})),l(`change`,De,e=>o({authentication:e.target.value})),l(`change`,Ae,e=>o({encryptionAtRest:e.target.checked})),l(`change`,Me,e=>o({encryptionInTransit:e.target.checked})),m(`blur`,Ne,e=>o({retention:e.target.value||void 0})),m(`blur`,Fe,e=>o({owner:e.target.value||void 0})),A(e,d),C()}c([`change`,`click`,`input`]);var Of=e=>{let t=new Set,n=[];for(let r of e)for(let e of r.resources){let i=String(e.id);t.has(i)||(t.add(i),n.push({value:e,sourceFeatureId:r.id,sourceFeatureName:r.name}))}return n},kf=e=>{let t=new Set,n=[];for(let r of e)for(let e of r.entities){let i=String(e.id);t.has(i)||(t.add(i),n.push({value:e,sourceFeatureId:r.id,sourceFeatureName:r.name}))}return n},Af=e=>{let t=new Set,n=[];for(let r of e)for(let e of r.events??[]){let i=String(e.name);t.has(i)||(t.add(i),n.push({value:e,sourceFeatureId:r.id,sourceFeatureName:r.name}))}return n},jf=e=>{let t=[];for(let n of e){let e=new Map;for(let t of n.surfaces)e.set(String(t.id),t.name);for(let r of n.surfaces)for(let i of r.transitions){let a=String(i.target),o=e.get(a),s={id:String(i.id),surfaceId:String(r.id),surfaceName:r.name,target:a,targetName:o??a,targetMissing:o===void 0,...i.label===void 0?{}:{label:i.label}};t.push({value:s,sourceFeatureId:n.id,sourceFeatureName:n.name})}}return t},Mf=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-center text-xs text-neutral-500">No resources yet.</p>`),Nf=d(`<span class="rounded-md bg-red-50 px-1.5 py-0.5 text-[10px] text-red-700">PII</span>`),Pf=d(`<span> </span>`),Ff=d(`<span> </span>`),If=d(`<span class="mono rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] uppercase text-neutral-600"> </span>`),Lf=d(`<div class="ml-5 mt-1 flex flex-wrap gap-1"></div>`),Rf=d(`<span class="text-violet-700"> </span>`),zf=d(`<span class="text-emerald-700"> </span>`),Bf=d(`Used by <!> <!> <!>`,1),Vf=d(`<li><button type="button" class="text-violet-800 hover:underline" title="Open the Entity tab"> </button> <span class="mono text-[10px] text-neutral-500"> </span></li>`),Hf=d(`<div class="mb-2"><p class="text-[10px] font-medium text-violet-700"> </p> <ul class="ml-3 list-disc"></ul></div>`),Uf=d(`<li><button type="button" class="text-emerald-800 hover:underline" title="Open the action"> <span class="mono"> </span></button> <span class="text-[10px] text-neutral-500"> </span></li>`),Wf=d(`<div><p class="text-[10px] font-medium text-emerald-700"> </p> <ul class="ml-3 list-disc"></ul></div>`),Gf=d(`<section class="border-t border-neutral-200 bg-neutral-50/40 p-3 text-xs"><header class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-neutral-500">Used by</header> <!> <!></section>`),Kf=d(`<!> <div class="border-t border-neutral-200 p-3"><!></div>`,1),qf=d(`<li><header class="flex items-start gap-2 px-3 py-2 text-xs"><button type="button" class="flex-1 text-left"><div class="flex items-center gap-2"><span class="text-neutral-400"> </span> <span class="font-medium text-neutral-900"> </span> <span> </span> <!></div> <div class="ml-5 flex flex-wrap gap-x-2 gap-y-0.5 text-[11px] text-neutral-500"><span> </span> <!> <span> </span> <!></div> <!> <div class="ml-5 mt-1 text-[10px] text-neutral-500"><!></div></button> <button type="button" class="text-xs text-neutral-400 hover:text-red-600" aria-label="Remove resource">✕</button></header> <!></li>`),Jf=d(`<ul class="space-y-2"></ul>`),Yf=d(`<span class="rounded-md bg-red-50 px-1.5 py-0.5 text-[10px] text-red-700">PII</span>`),Xf=d(`<span> </span>`),Zf=d(`<span> </span>`),Qf=d(`<li class="rounded-md border border-slate-200 bg-slate-50/50 px-3 py-2 text-xs"><div class="flex items-center gap-2"><span class="font-medium text-slate-800"> </span> <span> </span> <!> <span class="ml-auto rounded-md bg-violet-50 px-1.5 py-0.5 text-[10px] font-medium text-violet-700" title="Source feature"> </span></div> <div class="ml-0 mt-1 flex flex-wrap gap-x-2 gap-y-0.5 text-[11px] text-neutral-500"><span> </span> <!> <span> </span> <!></div></li>`),$f=d(`<section class="space-y-2 border-t border-dashed border-neutral-200 pt-3"><header class="flex items-baseline justify-between"><h3 class="text-[11px] font-semibold uppercase tracking-wide text-slate-500">Inherited from project</h3> <p class="text-[10px] text-slate-400">Read-only. Edit on the source feature.</p></header> <ul class="space-y-2"></ul></section>`),ep=d(`<div class="space-y-3 text-sm"><p class="text-xs text-neutral-500">Resources describe the data your feature reads from and writes to. They capture provider,
29
- location, sensitivity, retention, and compliance. So humans and AI builders share a single
30
- source of truth for every data touchpoint.</p> <button type="button" class="w-full rounded-md border border-neutral-300 px-3 py-1.5 text-xs hover:bg-neutral-50">+ New resource</button> <!> <!></div>`);function tp(e,n){N(n,!0);let o=V(null);async function s(){let e={id:J(ge()),name:`New resource`,kind:`relational_db`,provider:``,scope:`cloud`,sensitivity:`internal`,containsPii:!1,complianceTags:[],accessMode:`read_write`};await $.mutate(t=>ht(t,e)),T(o,e.id,!0)}async function c(e){await $.mutate(t=>Xe(t,e))}async function u(e){confirm(`Delete this resource? Parameters that reference it will keep the dangling id.`)&&await $.mutate(t=>xt(t,e))}function d(e){switch(e){case`public`:return`bg-emerald-50 text-emerald-700`;case`internal`:return`bg-sky-50 text-sky-700`;case`confidential`:return`bg-amber-50 text-amber-800`;case`restricted`:return`bg-red-50 text-red-700`}}function f(e){ln.navigateTo({surfaceId:e.surfaceId,actionId:e.actionId,surfacePanelTab:`actions`})}function m(){ln.setTopLevelTab(`data`)}let h=z(()=>Of(rn.siblings));var y=ep(),b=p(_(y),2),x=p(b,2),S=e=>{A(e,Mf())},w=e=>{var s=Jf();i(s,21,()=>n.feature.resources,e=>e.id,(e,s)=>{let h=z(()=>G(o)===G(s).id),y=z(()=>_f(n.feature,G(s).id)),b=z(()=>vf(G(y)));var x=qf(),S=_(x),C=_(S),w=_(C),E=_(w),D=_(E,!0);F(E);var O=p(E,2),k=_(O,!0);F(O);var M=p(O,2),N=_(M,!0);F(M);var P=p(M,2),I=e=>{A(e,Nf())};j(P,e=>{G(s).containsPii&&e(I)}),F(w);var L=p(w,2),ee=_(L),te=_(ee,!0);F(ee);var R=p(ee,2),B=e=>{var n=Pf(),r=_(n);F(n),g(()=>t(r,`· ${G(s).provider??``}`)),A(e,n)};j(R,e=>{G(s).provider&&e(B)});var V=p(R,2),H=_(V);F(V);var W=p(V,2),ne=e=>{var n=Ff(),r=_(n);F(n),g(()=>t(r,`· ${G(s).location??``}`)),A(e,n)};j(W,e=>{G(s).location&&e(ne)}),F(L);var re=p(L,2),ie=e=>{var n=Lf();i(n,21,()=>G(s).complianceTags,r,(e,n)=>{var r=If(),i=_(r,!0);F(r),g(()=>t(i,G(n))),A(e,r)}),F(n),A(e,n)};j(re,e=>{G(s).complianceTags.length>0&&e(ie)});var ae=p(re,2),oe=_(ae),se=e=>{A(e,a(`Not yet referenced anywhere.`))},K=e=>{var n=Bf(),r=p(v(n)),i=e=>{var n=Rf(),r=_(n);F(n),g(()=>t(r,`${G(y).dataNamespaces.length??``} data
31
- entit${G(y).dataNamespaces.length===1?`y`:`ies`}`)),A(e,n)};j(r,e=>{G(y).dataNamespaces.length>0&&e(i)});var o=p(r,2),s=e=>{A(e,a(`·`))};j(o,e=>{G(y).dataNamespaces.length>0&&G(y).parameters.length>0&&e(s)});var c=p(o,2),l=e=>{var n=zf(),r=_(n);F(n),g(()=>t(r,`${G(y).parameters.length??``} parameter${G(y).parameters.length===1?``:`s`}`)),A(e,n)};j(c,e=>{G(y).parameters.length>0&&e(l)}),A(e,n)};j(oe,e=>{G(b)===0?e(se):e(K,-1)}),F(ae),F(C);var ce=p(C,2);F(S);var le=p(S,2),ue=e=>{var n=Kf(),r=v(n),a=e=>{var n=Gf(),r=p(_(n),2),a=e=>{var n=Hf(),r=_(n),a=_(r);F(r);var o=p(r,2);i(o,20,()=>G(y).dataNamespaces,e=>e,(e,n)=>{var r=Vf(),i=_(r),a=_(i,!0);F(i);var o=p(i,2),s=_(o);F(o),F(r),g(e=>{t(a,e),t(s,`(${n??``})`)},[()=>De(n)]),l(`click`,i,m),A(e,r)}),F(o),F(n),g(()=>t(a,`Entity entit${G(y).dataNamespaces.length===1?`y`:`ies`}`)),A(e,n)};j(r,e=>{G(y).dataNamespaces.length>0&&e(a)});var o=p(r,2),s=e=>{var n=Wf(),r=_(n),a=_(r);F(r);var o=p(r,2);i(o,21,()=>G(y).parameters,e=>e.parameterId,(e,n)=>{var r=Uf(),i=_(r),a=_(i),o=p(a),s=_(o,!0);F(o),F(i);var c=p(i,2),u=_(c);F(c),F(r),g(()=>{t(a,`${G(n).surfaceName??``} · ${G(n).actionName??``} · `),t(s,G(n).parameterName),t(u,`(${G(n).parameterType??``})`)}),l(`click`,i,()=>f(G(n))),A(e,r)}),F(o),F(n),g(()=>t(a,`Parameter${G(y).parameters.length===1?``:`s`}`)),A(e,n)};j(o,e=>{G(y).parameters.length>0&&e(s)}),F(n),A(e,n)};j(r,e=>{G(b)>0&&e(a)});var o=p(r,2);Df(_(o),{get resource(){return G(s)},onChange:e=>c(e)}),F(o),A(e,n)};j(le,e=>{G(h)&&e(ue)}),F(x),g((e,n,r,i)=>{U(x,1,`rounded-md border bg-white ${G(h)?`border-brand-300 ring-1 ring-brand-200`:`border-neutral-200`}`),t(D,G(h)?`▾`:`▸`),t(k,G(s).name),U(M,1,`rounded-md px-1.5 py-0.5 text-[10px] font-medium ${e??``}`),t(N,n),t(te,r),t(H,`· ${i??``}`)},[()=>d(G(s).sensitivity),()=>va(G(s).sensitivity),()=>pa(G(s).kind),()=>ga(G(s).scope)]),l(`click`,C,()=>T(o,G(h)?null:G(s).id,!0)),l(`click`,ce,()=>u(G(s).id)),A(e,x)}),F(s),A(e,s)};j(x,e=>{n.feature.resources.length===0&&G(h).length===0?e(S):e(w,-1)});var E=p(x,2),D=e=>{var n=$f(),r=p(_(n),2);i(r,21,()=>G(h),e=>e.value.id,(e,n)=>{let r=z(()=>G(n).value);var i=Qf(),a=_(i),o=_(a),s=_(o,!0);F(o);var c=p(o,2),l=_(c,!0);F(c);var u=p(c,2),f=e=>{A(e,Yf())};j(u,e=>{G(r).containsPii&&e(f)});var m=p(u,2),h=_(m,!0);F(m),F(a);var v=p(a,2),y=_(v),b=_(y,!0);F(y);var x=p(y,2),S=e=>{var n=Xf(),i=_(n);F(n),g(()=>t(i,`· ${G(r).provider??``}`)),A(e,n)};j(x,e=>{G(r).provider&&e(S)});var C=p(x,2),w=_(C);F(C);var T=p(C,2),E=e=>{var n=Zf(),i=_(n);F(n),g(()=>t(i,`· ${G(r).location??``}`)),A(e,n)};j(T,e=>{G(r).location&&e(E)}),F(v),F(i),g((e,i,a,o)=>{t(s,G(r).name),U(c,1,`rounded-md px-1.5 py-0.5 text-[10px] font-medium ${e??``}`),t(l,i),t(h,G(n).sourceFeatureName),t(b,a),t(w,`· ${o??``}`)},[()=>d(G(r).sensitivity),()=>va(G(r).sensitivity),()=>pa(G(r).kind),()=>ga(G(r).scope)]),A(e,i)}),F(r),F(n),A(e,n)};j(E,e=>{G(h).length>0&&e(D)}),F(y),l(`click`,b,s),A(e,y),C()}c([`click`]);var np=[`string`,`number`,`boolean`,`enum`,`object`,`array`,`date`,`timestamp`,`null`,`json`],rp=e=>{switch(e){case`string`:return`string`;case`number`:return`number`;case`boolean`:return`boolean`;case`enum`:return`enum`;case`object`:return`object`;case`array`:return`array`;case`date`:return`date`;case`timestamp`:return`timestamp`;case`null`:return`null`;case`json`:return`json`}},ip=d(`<option> </option>`),ap=d(`<label class="flex items-center gap-1 text-neutral-600"><input type="checkbox"/> required</label>`),op=d(`<input type="text" class="mono w-44 rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]" placeholder="comma,separated,values"/>`),sp=d(`<button type="button" class="text-neutral-400 hover:text-red-600" aria-label="Remove field">✕</button>`),cp=d(`<div class="space-y-1 border-l-2 border-neutral-200 pl-3"><!> <button type="button" class="rounded-md border border-neutral-300 px-2 py-0.5 text-[11px] hover:bg-neutral-50">+ Field</button></div>`),lp=d(`<div class="space-y-1 border-l-2 border-neutral-200 pl-3"><p class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Items schema</p> <!></div>`),up=d(`<div class="space-y-1"><div class="flex flex-wrap items-center gap-1.5 rounded-md border border-neutral-200 bg-white p-2 text-xs"><input type="text" class="rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]" placeholder="name"/> <select class="rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]"></select> <!> <!> <input type="text" class="flex-1 rounded-md border border-neutral-200 px-1.5 py-0.5 text-[11px] text-neutral-600" placeholder="Description (optional)"/> <!></div> <!></div>`);function dp(e,n){N(n,!0);let a=b(n,`depth`,3,0),s=b(n,`hidePath`,3,!1),c=z(()=>a()*16);function u(e){n.onChange({...n.field,...e})}function d(e){let t={...n.field,type:e,fields:e===`object`?n.field.fields??[]:void 0,items:e===`array`?n.field.items??{id:Le(ge()),name:`item`,type:`string`}:void 0,enumValues:e===`enum`?n.field.enumValues??[]:void 0};n.onChange(t)}function f(){let e={id:Le(ge()),name:`field${(n.field.fields?.length??0)+1}`,type:`string`};u({fields:[...n.field.fields??[],e]})}function h(e,t){u({fields:(n.field.fields??[]).map(n=>n.id===e?t:n)})}function v(e){u({fields:(n.field.fields??[]).filter(t=>t.id!==e)})}function x(e){u({items:e})}let S=V(``);o(()=>{T(S,n.field.enumValues?.join(`, `)??``,!0)});function E(){u({enumValues:G(S).split(`,`).map(e=>e.trim()).filter(e=>e.length>0)})}var k=up();let P;var I=_(k),te=_(I);M(te);var R=p(te,2);i(R,21,()=>np,r,(e,n)=>{var r=ip(),i=_(r,!0);F(r);var a={};g(e=>{t(i,e),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)},[()=>rp(G(n))]),A(e,r)}),F(R);var B;O(R);var H=p(R,2),U=e=>{var t=ap(),r=_(t);M(r),ee(),F(t),g(()=>w(r,n.field.required??!1)),l(`change`,r,e=>u({required:e.target.checked||void 0})),A(e,t)};j(H,e=>{s()||e(U)});var W=p(H,2),ne=e=>{var t=op();M(t),g(()=>L(t,G(S))),l(`input`,t,e=>T(S,e.target.value,!0)),m(`blur`,t,E),A(e,t)};j(W,e=>{n.field.type===`enum`&&e(ne)});var re=p(W,2);M(re);var ie=p(re,2),ae=e=>{var t=sp();l(`click`,t,function(...e){n.onRemove?.apply(this,e)}),A(e,t)};j(ie,e=>{n.onRemove&&e(ae)}),F(I);var oe=p(I,2),se=e=>{var t=cp();let r;var a=_(t);i(a,17,()=>n.field.fields??[],e=>e.id,(e,t)=>{dp(e,{get field(){return G(t)},depth:0,hidePath:!0,onChange:e=>h(G(t).id,e),onRemove:()=>v(G(t).id)})});var o=p(a,2);F(t),g(()=>r=y(t,``,r,{"margin-left":`${G(c)+4}px`})),l(`click`,o,f),A(e,t)},K=e=>{let t=z(()=>n.field.items);var r=lp();let i;dp(p(_(r),2),{get field(){return G(t)},depth:0,hidePath:!0,onChange:e=>x(e)}),F(r),g(()=>i=y(r,``,i,{"margin-left":`${G(c)+4}px`})),A(e,r)};j(oe,e=>{n.field.type===`object`?e(se):n.field.type===`array`&&n.field.items&&e(K,1)}),F(k),g(()=>{P=y(k,``,P,{"padding-left":`${G(c)??``}px`}),L(te,n.field.name),B!==(B=n.field.type)&&(R.value=(R.__value=n.field.type)??``,D(R,n.field.type)),L(re,n.field.description??``)}),m(`blur`,te,e=>u({name:e.target.value})),l(`change`,R,e=>d(e.target.value)),m(`blur`,re,e=>u({description:e.target.value||void 0})),A(e,k),C()}c([`change`,`input`,`click`]);var fp=d(`<button type="button" class="text-[10px] text-neutral-400 hover:text-red-600">clear</button>`),pp=d(`<p class="text-[11px] text-neutral-400">No resources defined yet. Open the Resources tab to catalogue where this entity lives.</p>`),mp=d(`<option> </option>`),hp=d(`<span class="ml-1 text-red-700">· PII</span>`),gp=d(`<p class="mt-1 text-[11px] text-neutral-500"> <!></p>`),_p=d(`<select class="w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"><option>- No resource -</option><!></select> <!>`,1),vp=d(`<p class="text-[11px] text-neutral-500">No fields yet.</p>`),yp=d(`<li class="space-y-1"><div class="flex flex-wrap items-center gap-1.5 text-xs"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Path</span> <input type="text" class="mono flex-1 rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]" placeholder="namespace.field"/></div> <!></li>`),bp=d(`<ul class="space-y-2"></ul>`),xp=d(`<div class="space-y-4 text-sm"><section class="space-y-2"><label class="block text-xs font-medium text-neutral-600">Namespace <input type="text" class="mono mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-sm"/> <span class="mt-0.5 block text-[10px] text-neutral-500">Canonical identifier and first segment of every field's state path. The display name is
32
- derived automatically. Renaming re-bases existing fields.</span></label> <label class="block text-xs font-medium text-neutral-600">Description <textarea rows="2" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"></textarea></label></section> <section><header class="mb-1 flex items-center gap-2"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500">Backed by resource</span> <!></header> <!></section> <section><header class="mb-1 flex items-center justify-between"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500"> </span> <button type="button" class="rounded-md border border-neutral-300 px-2 py-0.5 text-xs hover:bg-neutral-50">+ Field</button></header> <!></section></div>`);function Sp(e,n){N(n,!0);function r(e){n.onChange({...n.data,...e})}function a(){let e=`field${n.data.fields.length+1}`,t=Y(`${n.data.namespace}.${e}`),i={id:Le(ge()),name:e,path:t,type:`string`};r({fields:[...n.data.fields,i]})}function o(e,t){r({fields:n.data.fields.map(n=>n.id===e?{...n,...t}:n)})}function s(e){let t=n.data.fields.find(t=>t.id===e);if(t){if(t.path){let e=tn(n.feature,t.path),r=Math.max(0,e.otherDataFields-1),i={...e,otherDataFields:r},a=$t(i)-e.stateDefinitions,o=e.stateDefinitions>0?`\n\nThe underlying state path "${t.path}" still exists as a state definition. Removing this field only removes its catalogue entry, not the state itself.`:``;if(a>0){let e=Zt({...i,stateDefinitions:0});if(!confirm(`Remove field "${t.name}" (${t.path})?\n\n${a} link${a===1?``:`s`} elsewhere reference this path:\n ${e}\n\nThese references won't be deleted, but they may now be undocumented.${o}`))return}else if(!confirm(`Remove field "${t.name}"?`))return}else if(!confirm(`Remove field "${t.name}"?`))return;r({fields:n.data.fields.filter(t=>t.id!==e)})}}function c(e,t){pe(t)&&o(e,{path:Y(t)})}function u(e){let t=Me(e).split(`.`)[0]??n.data.namespace;t!==n.data.namespace&&r({namespace:t,fields:n.data.fields.map(e=>{if(!e.path)return e;let n=String(e.path).split(`.`);return n[0]=t,{...e,path:Y(n.join(`.`))}})})}function d(e){if(e.length===0){r({resourceId:void 0});return}r({resourceId:J(e)})}function f(e){if(e)return n.resources.find(t=>t.id===e)}var h=xp(),y=_(h),b=_(y),x=p(_(b));M(x),ee(2),F(b);var S=p(b,2),w=p(_(S));te(w),F(S),F(y);var T=p(y,2),E=_(T),k=p(_(E),2),P=e=>{var t=fp();l(`click`,t,()=>d(``)),A(e,t)};j(k,e=>{n.data.resourceId&&e(P)}),F(E);var I=p(E,2),R=e=>{A(e,pp())},B=e=>{let r=z(()=>f(n.data.resourceId));var a=_p(),o=v(a),s=_(o);s.value=s.__value=``,i(p(s),17,()=>n.resources,e=>e.id,(e,n)=>{var r=mp(),i=_(r);F(r);var a={};g((e,o)=>{t(i,`${G(n).name??``} (${e??``} · ${o??``})`),a!==(a=G(n).id)&&(r.value=(r.__value=G(n).id)??``)},[()=>pa(G(n).kind),()=>va(G(n).sensitivity)]),A(e,r)}),F(o);var c;O(o);var u=p(o,2),m=e=>{var n=gp(),i=_(n),a=p(i),o=e=>{A(e,hp())};j(a,e=>{G(r).containsPii&&e(o)}),F(n),g(()=>t(i,`${G(r).provider??``}${G(r).location?` · ${G(r).location}`:``} `)),A(e,n)};j(u,e=>{G(r)&&e(m)}),g(()=>{c!==(c=n.data.resourceId??``)&&(o.value=(o.__value=n.data.resourceId??``)??``,D(o,n.data.resourceId??``))}),l(`change`,o,e=>d(e.target.value)),A(e,a)};j(I,e=>{n.resources.length===0?e(R):e(B,-1)}),F(T);var V=p(T,2),H=_(V),U=_(H),W=_(U);F(U);var ne=p(U,2);F(H);var re=p(H,2),ie=e=>{A(e,vp())},ae=e=>{var t=bp();i(t,21,()=>n.data.fields,e=>e.id,(e,t)=>{var n=yp(),r=_(n),i=p(_(r),2);M(i),F(r),dp(p(r,2),{get field(){return G(t)},onChange:e=>o(G(t).id,e),onRemove:()=>s(G(t).id)}),F(n),g(()=>L(i,G(t).path??``)),m(`blur`,i,e=>c(G(t).id,e.target.value)),A(e,n)}),F(t),A(e,t)};j(re,e=>{n.data.fields.length===0?e(ie):e(ae,-1)}),F(V),F(h),g(()=>{L(x,n.data.namespace),L(w,n.data.description??``),t(W,`Fields (${n.data.fields.length??``})`)}),m(`blur`,x,e=>u(e.target.value)),m(`blur`,w,e=>r({description:e.target.value||void 0})),l(`click`,ne,a),A(e,h),C()}c([`click`,`change`]);var Cp=d(`<p class="rounded-md border border-dashed border-neutral-300 p-4 text-center text-sm text-neutral-500">No data yet. Define some state on a surface. Entries will appear here automatically.</p>`),wp=d(`<span class="text-[11px] text-neutral-500"> </span>`),Tp=d(`<span class="rounded-md bg-neutral-100 px-1.5 py-0.5 text-[10px] uppercase tracking-wide text-neutral-500" title="No metadata attached yet. Expand to add a description or link a resource.">Auto</span>`),Ep=d(`<span class="rounded-md bg-violet-50 px-1.5 py-0.5 text-[10px] text-violet-800"> </span>`),Dp=d(`<button type="button" class="text-[11px] text-neutral-400 hover:text-red-600" title="Drop the stored record and revert to the auto-deduced view">Reset</button>`),Op=d(`<span class="text-violet-600">·</span> <span> </span>`,1),kp=d(`<span class="text-violet-600">·</span> <span> </span>`,1),Ap=d(`<span class="rounded-md bg-red-50 px-1.5 py-0.5 text-[10px] text-red-700">PII</span>`),jp=d(`<span class="mono rounded-md bg-violet-100/70 px-1 py-0.5 text-[10px] uppercase text-violet-800"> </span>`),Mp=d(`<button type="button" class="flex w-full flex-wrap items-center gap-x-2 gap-y-0.5 px-4 pb-1 text-left text-[11px] text-violet-900 hover:underline" title="Open the Resources tab"><span class="font-medium">Stored in:</span> <span> </span> <span class="text-violet-600">·</span> <span> </span> <!> <!> <span class="text-violet-600">·</span> <span> </span> <!> <!></button>`),Np=d(`<li class="inline-flex items-center gap-1 rounded-md border border-neutral-200 bg-neutral-50 px-2 py-0.5 text-[11px] text-neutral-700"><span> </span> <span class="rounded bg-neutral-200 px-1 text-[10px] text-neutral-600"> </span></li>`),Pp=d(`<ul class="flex flex-wrap gap-1.5 px-4 pb-3 pt-1"></ul>`),Fp=d(`<div class="border-t border-neutral-200 bg-neutral-50/40 px-4 py-3"><!></div>`),Ip=d(`<li><header class="flex flex-wrap items-baseline gap-2 px-4 py-3"><button type="button" class="flex flex-1 items-baseline gap-2 text-left"><span class="text-neutral-400"> </span> <h3 class="text-base font-semibold text-neutral-900"> </h3> <span class="mono text-[11px] text-neutral-500"> </span> <span class="text-[11px] text-neutral-500"> </span> <!> <!> <!></button> <!></header> <!> <!></li>`),Lp=d(`<ul class="divide-y divide-neutral-200 rounded-md border border-neutral-200 bg-white"></ul>`),Rp=d(`<li class="flex flex-wrap items-baseline gap-2 px-4 py-2 text-xs"><span class="font-medium text-slate-800"> </span> <span class="text-[11px] text-neutral-500"> </span> <span class="ml-auto rounded-md bg-violet-50 px-1.5 py-0.5 text-[10px] font-medium text-violet-700" title="Source feature"> </span></li>`),zp=d(`<section class="space-y-2 border-t border-dashed border-neutral-200 pt-3"><header class="flex items-baseline justify-between"><h3 class="text-[11px] font-semibold uppercase tracking-wide text-slate-500">Inherited from project</h3> <p class="text-[10px] text-slate-400">Read-only. Edit on the source feature.</p></header> <ul class="divide-y divide-slate-100 rounded-md border border-slate-200 bg-slate-50/40"></ul></section>`),Bp=d(`<div class="space-y-6"><header class="space-y-1"><h2 class="text-lg font-semibold text-neutral-900">Entity</h2> <p class="text-sm text-neutral-600">Logical entities your feature handles. User, Order, Cart, Product. Every state-path
33
- namespace appears here as a fact derived from your model. Expand an entry to attach a
34
- description or link a resource.</p></header> <!> <!></div>`);function Vp(e,n){N(n,!0);let a=V(null),o=z(()=>Vt(n.feature)),s=z(()=>kf(rn.siblings));async function c(e){return e.id?n.feature.entities.find(t=>t.id===e.id)??u(e):u(e)}async function u(e){let t={id:se(ge()),namespace:e.namespace,description:e.description,resourceId:e.resourceId,fields:Wt(e,()=>Le(ge()))};return await $.mutate(e=>kt(e,t)),t}async function d(e){await $.mutate(t=>Je(t,e))}async function f(e){e.id&&confirm(`Reset this entry to its deduced form? Description and resource link will be lost.`)&&await $.mutate(t=>Ge(t,e.id))}async function m(e){if(G(a)===e.namespace){T(a,null);return}e.id||await c(e),T(a,e.namespace,!0)}function h(e){return e?n.feature.resources.find(t=>t.id===e)??null:null}function y(){ln.setTopLevelTab(`resources`)}function b(e){return n.feature.entities.find(t=>t.namespace===e)}var x=Bp(),S=p(_(x),2),w=e=>{A(e,Cp())},E=e=>{var s=Lp();i(s,21,()=>G(o),e=>e.namespace,(e,o)=>{let s=z(()=>G(a)===G(o).namespace),c=z(()=>b(G(o).namespace)),u=z(()=>h(G(o).resourceId));var x=Ip(),S=_(x),C=_(S),w=_(C),T=_(w,!0);F(w);var E=p(w,2),D=_(E,!0);F(E);var O=p(E,2),k=_(O,!0);F(O);var M=p(O,2),N=_(M);F(M);var P=p(M,2),I=e=>{var n=wp(),r=_(n);F(n),g(e=>t(r,`· on: ${e??``}`),[()=>G(o).usedBySurfaces.join(`, `)]),A(e,n)};j(P,e=>{G(o).usedBySurfaces.length>0&&e(I)});var L=p(P,2),ee=e=>{A(e,Tp())};j(L,e=>{G(o).isMaterialized||e(ee)});var te=p(L,2),R=e=>{var n=Ep(),r=_(n,!0);F(n),g(()=>t(r,G(u).name)),A(e,n)};j(te,e=>{G(u)&&e(R)}),F(C);var B=p(C,2),V=e=>{var t=Dp();l(`click`,t,()=>f(G(o))),A(e,t)};j(B,e=>{G(o).isMaterialized&&e(V)}),F(S);var U=p(S,2),W=e=>{var n=Mp(),a=p(_(n),2),o=_(a,!0);F(a);var s=p(a,4),c=_(s,!0);F(s);var d=p(s,2),f=e=>{var n=Op(),r=p(v(n),2),i=_(r,!0);F(r),g(()=>t(i,G(u).provider)),A(e,n)};j(d,e=>{G(u).provider&&e(f)});var m=p(d,2),h=e=>{var n=kp(),r=p(v(n),2),i=_(r,!0);F(r),g(()=>t(i,G(u).location)),A(e,n)};j(m,e=>{G(u).location&&e(h)});var b=p(m,4),x=_(b,!0);F(b);var S=p(b,2),C=e=>{A(e,Ap())};j(S,e=>{G(u).containsPii&&e(C)}),i(p(S,2),17,()=>G(u).complianceTags,r,(e,n)=>{var r=jp(),i=_(r,!0);F(r),g(()=>t(i,G(n))),A(e,r)}),F(n),g((e,n)=>{t(o,G(u).name),t(c,e),t(x,n)},[()=>pa(G(u).kind),()=>va(G(u).sensitivity)]),l(`click`,n,y),A(e,n)};j(U,e=>{G(u)&&e(W)});var ne=p(U,2),re=e=>{var n=Pp();i(n,21,()=>G(o).fields,e=>e.path,(e,n)=>{var r=Np(),i=_(r),a=_(i,!0);F(i);var o=p(i,2),s=_(o,!0);F(o),F(r),g(e=>{H(r,`title`,G(n).path),t(a,e),t(s,G(n).type)},[()=>De(G(n).path)]),A(e,r)}),F(n),A(e,n)},ie=e=>{var t=Fp();Sp(_(t),{get data(){return G(c)},get feature(){return n.feature},get resources(){return n.feature.resources},onChange:e=>d(e)}),F(t),A(e,t)};j(ne,e=>{G(s)?G(c)&&e(ie,1):e(re)}),F(x),g(()=>{t(T,G(s)?`▾`:`▸`),t(D,G(o).name),t(k,G(o).namespace),t(N,`· ${G(o).fields.length??``} field${G(o).fields.length===1?``:`s`}`)}),l(`click`,C,()=>m(G(o))),A(e,x)}),F(s),A(e,s)};j(S,e=>{G(o).length===0?e(w):e(E,-1)});var D=p(S,2),O=e=>{var n=zp(),r=p(_(n),2);i(r,21,()=>G(s),e=>e.value.id,(e,n)=>{let r=z(()=>G(n).value);var i=Rp(),a=_(i),o=_(a,!0);F(a);var s=p(a,2),c=_(s);F(s);var l=p(s,2),u=_(l,!0);F(l),F(i),g(()=>{t(o,G(r).namespace),t(c,`· ${G(r).fields.length??``} field${G(r).fields.length===1?``:`s`}`),t(u,G(n).sourceFeatureName)}),A(e,i)}),F(r),F(n),A(e,n)};j(D,e=>{G(s).length>0&&e(O)}),F(x),A(e,x),C()}c([`click`]);var Hp=d(`<span class="mt-1 block text-[11px] text-red-600"> </span>`),Up=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-center text-xs text-neutral-500">No registered events yet.</p>`),Wp=d(`<p class="text-[11px] text-neutral-500">No payload fields.</p>`),Gp=d(`<option> </option>`),Kp=d(`<li class="flex flex-wrap items-center gap-1.5"><input type="text" class="mono rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]"/> <select class="rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]"></select> <label class="inline-flex items-center gap-1 text-[11px] text-neutral-600"><input type="checkbox"/> required</label> <input type="text" class="min-w-40 flex-1 rounded-md border border-neutral-300 px-1.5 py-0.5 text-[11px]" placeholder="Description"/> <button type="button" class="text-xs text-neutral-400 hover:text-red-600" aria-label="Remove payload field">x</button></li>`),qp=d(`<ul class="space-y-1"></ul>`),Jp=d(`<li class="space-y-2 rounded-md border border-neutral-200 bg-neutral-50/40 p-3"><div class="flex flex-wrap items-start gap-2"><label class="block flex-1 text-[10px] font-medium uppercase tracking-wide text-neutral-500">Name <input type="text" class="mono mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"/></label> <label class="block flex-[2] text-[10px] font-medium uppercase tracking-wide text-neutral-500">Description <input type="text" class="mt-1 w-full rounded-md border border-neutral-300 px-2 py-1 text-xs"/></label> <button type="button" class="mt-5 text-xs text-neutral-400 hover:text-red-600">Remove</button></div> <section><header class="mb-1 flex items-center justify-between"><span class="text-[10px] font-medium uppercase tracking-wide text-neutral-500"> </span> <button type="button" class="rounded-md border border-neutral-300 px-2 py-0.5 text-[11px] hover:bg-white">+ Field</button></header> <!></section></li>`),Yp=d(`<ul class="space-y-2"></ul>`),Xp=d(`<p class="rounded-md border border-dashed border-neutral-300 p-4 text-center text-sm text-neutral-500">No events emitted yet. Add an <span class="mono">emit_event</span> effect to an action or rule.</p>`),Zp=d(`<span class="text-neutral-500"> </span>`),Qp=d(`<li class="flex flex-wrap items-center gap-1.5 text-[11px] text-neutral-600"><button type="button" class="rounded-md border border-neutral-200 bg-neutral-50 px-1.5 py-0.5 hover:border-brand-300 hover:bg-brand-50 hover:text-brand-800" title="Open in feature editor"> </button> <span class="rounded bg-neutral-100 px-1 text-[10px] uppercase tracking-wide text-neutral-500"> </span> <!></li>`),$p=d(`<li class="px-3 py-2"><header class="flex flex-wrap items-baseline gap-2"><code class="mono text-sm font-medium text-neutral-900"> </code> <span class="text-[11px] text-neutral-500"> </span></header> <ul class="mt-1.5 space-y-0.5"></ul></li>`),em=d(`<section><header class="mb-1 flex items-baseline gap-2"><h3 class="text-sm font-semibold text-neutral-900"> </h3> <span class="text-[11px] text-neutral-500"> </span></header> <ul class="divide-y divide-neutral-200 rounded-md border border-neutral-200 bg-white"></ul></section>`),tm=d(`<div class="space-y-5"></div>`),nm=d(`<span class="text-[11px] text-neutral-500"> </span>`),rm=d(`<li class="flex flex-wrap items-baseline gap-2 px-4 py-2 text-xs"><span class="mono font-medium text-slate-800"> </span> <!> <span class="ml-auto rounded-md bg-violet-50 px-1.5 py-0.5 text-[10px] font-medium text-violet-700" title="Source feature"> </span></li>`),im=d(`<section class="space-y-2 border-t border-dashed border-neutral-200 pt-3"><header class="flex items-baseline justify-between"><h3 class="text-[11px] font-semibold uppercase tracking-wide text-slate-500">Inherited from project</h3> <p class="text-[10px] text-slate-400">Read-only. Edit on the source feature.</p></header> <ul class="divide-y divide-slate-100 rounded-md border border-slate-200 bg-slate-50/40"></ul></section>`),am=d(`<div class="space-y-6"><header class="space-y-1"><h2 class="text-lg font-semibold text-neutral-900">Events</h2> <p class="text-sm text-neutral-600"> </p></header> <section class="space-y-3 rounded-md border border-neutral-200 bg-white p-3"><header class="flex flex-wrap items-center justify-between gap-2"><div><h3 class="text-sm font-semibold text-neutral-900">Registry</h3> <p class="text-xs text-neutral-500">First-class events and payload schemas. Emissions below can reference these names.</p></div> <div class="flex items-start gap-2"><label class="block"><span class="sr-only">New event name</span> <input type="text" class="mono w-52 rounded-md border border-neutral-300 px-2 py-1 text-xs" placeholder="audit.started"/> <!></label> <button type="button" class="rounded-md bg-brand-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-brand-700">Add event</button></div></header> <!></section> <!> <!></div>`);function om(e,n){N(n,!0);let a=z(()=>Ht(Gt(n.feature))),o=z(()=>G(a).reduce((e,t)=>e+t.events.length,0)),s=z(()=>n.feature.events??[]),c=z(()=>Af(rn.siblings)),u=[`string`,`number`,`boolean`,`enum`,`object`,`array`],d=V(``),f=V(null);async function h(){T(f,null);let e=G(d).trim();if(!Pe(e)){T(f,`Use lowercase dot-separated form like audit.started.`);return}if(G(s).some(t=>t.name===e)){T(f,`Event "${e}" already exists.`);return}let t={id:be(ge()),name:K(e)};await $.mutate(e=>bt(e,t)),T(d,``)}async function v(e,t){await $.mutate(n=>st(n,{...e,...t}))}async function y(e){confirm(`Delete event "${e.name}"? Existing emit_event effects keep their names.`)&&await $.mutate(t=>We(t,e.id))}function b(e,t){let n=t.trim();Pe(n)&&v(e,{name:K(n)})}function x(e){let t=e.payloadSchema??[],n={name:`field${t.length+1}`,type:`string`,required:!0};v(e,{payloadSchema:[...t,n]})}function E(e,t,n){v(e,{payloadSchema:(e.payloadSchema??[]).map((e,r)=>r===t?{...e,...n}:e)})}function k(e,t){let n=(e.payloadSchema??[]).filter((e,n)=>n!==t);v(e,{payloadSchema:n.length>0?n:void 0})}function P(e){switch(e){case`action_default`:return`declared`;case`action_effect`:return`action effect`;case`action_rule_effect`:return`action rule`;case`surface_rule_effect`:return`surface rule`}}function I(e){ln.navigateTo({surfaceId:e.surfaceId,actionId:e.actionId,surfacePanelTab:`actions`})}var te=am(),R=_(te),B=p(_(R),2),H=_(B);F(B),F(R);var U=p(R,2),W=_(U),ne=p(_(W),2),re=_(ne),ie=p(_(re),2);M(ie);var ae=p(ie,2),oe=e=>{var n=Hp(),r=_(n,!0);F(n),g(()=>t(r,G(f))),A(e,n)};j(ae,e=>{G(f)&&e(oe)}),F(re);var se=p(re,2);F(ne),F(W);var ce=p(W,2),le=e=>{A(e,Up())},ue=e=>{var n=Yp();i(n,21,()=>G(s),e=>e.id,(e,n)=>{var a=Jp(),o=_(a),s=_(o),c=p(_(s));M(c),F(s);var d=p(s,2),f=p(_(d));M(f),F(d);var h=p(d,2);F(o);var S=p(o,2),C=_(S),T=_(C),N=_(T);F(T);var P=p(T,2);F(C);var I=p(C,2),te=e=>{A(e,Wp())},R=e=>{var a=qp();i(a,21,()=>G(n).payloadSchema??[],r,(e,a,o)=>{var s=Kp(),c=_(s);M(c);var d=p(c,2);i(d,21,()=>u,r,(e,n)=>{var r=Gp(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n)),a!==(a=G(n))&&(r.value=(r.__value=G(n))??``)}),A(e,r)}),F(d);var f;O(d);var h=p(d,2),v=_(h);M(v),ee(),F(h);var y=p(h,2);M(y);var b=p(y,2);F(s),g(()=>{L(c,G(a).name),f!==(f=G(a).type)&&(d.value=(d.__value=G(a).type)??``,D(d,G(a).type)),w(v,G(a).required),L(y,G(a).description??``)}),m(`blur`,c,e=>E(G(n),o,{name:e.target.value||G(a).name})),l(`change`,d,e=>E(G(n),o,{type:e.target.value})),l(`change`,v,e=>E(G(n),o,{required:e.target.checked})),m(`blur`,y,e=>E(G(n),o,{description:e.target.value||void 0})),l(`click`,b,()=>k(G(n),o)),A(e,s)}),F(a),A(e,a)};j(I,e=>{(G(n).payloadSchema?.length??0)===0?e(te):e(R,-1)}),F(S),F(a),g(()=>{L(c,G(n).name),L(f,G(n).description??``),t(N,`Payload (${G(n).payloadSchema?.length??0??``})`)}),m(`blur`,c,e=>b(G(n),e.target.value)),m(`blur`,f,e=>v(G(n),{description:e.target.value||void 0})),l(`click`,h,()=>y(G(n))),l(`click`,P,()=>x(G(n))),A(e,a)}),F(n),A(e,n)};j(ce,e=>{G(s).length===0?e(le):e(ue,-1)}),F(U);var de=p(U,2),q=e=>{A(e,Xp())},J=e=>{var n=tm();i(n,21,()=>G(a),e=>e.group,(e,n)=>{var a=em(),o=_(a),s=_(o),c=_(s,!0);F(s);var u=p(s,2),d=_(u);F(u),F(o);var f=p(o,2);i(f,21,()=>G(n).events,e=>e.name,(e,n)=>{var a=$p(),o=_(a),s=_(o),c=_(s,!0);F(s);var u=p(s,2),d=_(u);F(u),F(o);var f=p(o,2);i(f,21,()=>G(n).emissions,r,(e,n)=>{var r=Qp(),i=_(r),a=_(i);F(i);var o=p(i,2),s=_(o,!0);F(o);var c=p(o,2),u=e=>{var r=Zp(),i=_(r);F(r),g(()=>t(i,`- ${G(n).description??``}`)),A(e,r)};j(c,e=>{G(n).description&&e(u)}),F(r),g(e=>{t(a,`${G(n).surfaceName??``}${G(n).actionName?` · ${G(n).actionName}`:``}`),t(s,e)},[()=>P(G(n).origin)]),l(`click`,i,()=>I(G(n))),A(e,r)}),F(f),F(a),g(()=>{t(c,G(n).name),t(d,`${G(n).emissions.length??``} emission${G(n).emissions.length===1?``:`s`}`)}),A(e,a)}),F(f),F(a),g(()=>{t(c,G(n).group),t(d,`${G(n).events.length??``} event${G(n).events.length===1?``:`s`}`)}),A(e,a)}),F(n),A(e,n)};j(de,e=>{G(o)===0?e(q):e(J,-1)});var fe=p(de,2),Y=e=>{var n=im(),r=p(_(n),2);i(r,21,()=>G(c),e=>e.value.name,(e,n)=>{let r=z(()=>G(n).value);var i=rm(),a=_(i),o=_(a,!0);F(a);var s=p(a,2),c=e=>{var n=nm(),i=_(n);F(n),g(()=>t(i,`· ${G(r).payloadSchema.length??``} payload field${G(r).payloadSchema.length===1?``:`s`}`)),A(e,n)};j(s,e=>{G(r).payloadSchema&&G(r).payloadSchema.length>0&&e(c)});var l=p(s,2),u=_(l,!0);F(l),F(i),g(()=>{t(o,G(r).name),t(u,G(n).sourceFeatureName)}),A(e,i)}),F(r),F(n),A(e,n)};j(fe,e=>{G(c).length>0&&e(Y)}),F(te),g(()=>t(H,`Every event the feature emits. Across action declarations, default effects, and
35
- rule effects. Grouped by namespace so the product's signal vocabulary is discoverable in
36
- one place. ${G(o)??``} unique event${G(o)===1?``:`s`} in ${G(a).length??``} group${G(a).length===1?``:`s`}.`)),l(`keydown`,ie,e=>{e.key===`Enter`&&(e.preventDefault(),h())}),S(ie,()=>G(d),e=>T(d,e)),l(`click`,se,h),A(e,te),C()}c([`keydown`,`click`,`change`]);var sm=d(`<div class="rounded-lg border border-dashed border-slate-300 bg-slate-50/30 p-6 text-center"><p class="text-sm font-medium text-slate-700">No feature-level invariants yet</p> <p class="mx-auto mt-1 max-w-md text-xs text-slate-500">Most features don't need any, only add them when a property must hold across multiple
37
- surfaces (e.g. accounting equations, cross-surface referential integrity).</p></div>`),cm=d(`<div class="space-y-2"></div>`),lm=d(`<div class="space-y-3"><div class="rounded-md border border-violet-200 bg-violet-50/50 p-3 text-xs text-violet-900"><p class="font-semibold">Feature-level invariants</p> <p class="mt-0.5 text-[11px] leading-relaxed">Checked after EVERY action runs in this feature, no matter which surface it lives on. Use
38
- these for global properties: accounting equations (Σ balances = 0), referential
39
- integrity across surfaces, anything that must hold project-wide. Surface-local
40
- invariants stay on the surface; declare here only when the property is global.</p></div> <div class="flex justify-end"><button type="button" class="inline-flex items-center gap-1 rounded-md border border-slate-300 bg-white px-3 py-1.5 text-xs font-medium text-slate-700 transition hover:bg-slate-50"><span class="text-base leading-none">+</span> Add feature invariant</button></div> <!></div>`);function um(e,t){N(t,!0);let n=z(()=>t.feature.surfaces.flatMap(e=>e.stateDefinitions.map(e=>e.path))),r=z(()=>t.feature.featureInvariants??[]);async function a(){let e=Bn(ge,{name:`New feature invariant`,left:G(n)[0]??`state.path`});await $.mutate(t=>pt(t,e))}async function o(e){await $.mutate(t=>lt(t,e.id,e))}async function s(e){await $.mutate(t=>tt(t,e))}var c=lm(),u=p(_(c),2),d=_(u);F(u);var f=p(u,2),m=e=>{A(e,sm())},h=e=>{var t=cm();i(t,21,()=>G(r),e=>e.id,(e,t)=>{da(e,{get invariant(){return G(t)},get availablePaths(){return G(n)},onChange:e=>o(e),onRemove:()=>s(G(t).id)})}),F(t),A(e,t)};j(f,e=>{G(r).length===0?e(m):e(h,-1)}),F(c),l(`click`,d,a),A(e,c),C()}c([`click`]);var dm=d(`<option> </option>`),fm=d(`<option> </option>`),pm=d(`<div class="flex flex-wrap items-center gap-2"><select class="rounded-md border border-neutral-300 px-2 py-1 text-xs" aria-label="Source surface"></select> <span class="text-xs text-neutral-400">to</span> <select class="rounded-md border border-neutral-300 px-2 py-1 text-xs" aria-label="Target surface"></select> <button type="button" class="rounded-md bg-brand-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-brand-700 disabled:opacity-50">Add transition</button></div>`),mm=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-center text-xs text-neutral-500">Add at least two surfaces to declare navigation.</p>`),hm=d(`<p class="rounded-md border border-dashed border-neutral-300 p-3 text-center text-xs text-neutral-500">No declared transitions yet.</p>`),gm=d(`<option> </option>`),_m=d(`<li class="flex flex-wrap items-start gap-2 rounded-md border border-neutral-200 bg-neutral-50/40 p-2 text-xs"><span class="mt-1 font-medium text-neutral-800"> </span> <span class="mt-1 text-neutral-400">to</span> <select class="rounded-md border border-neutral-300 px-2 py-1 text-xs"></select> <input type="text" class="min-w-32 rounded-md border border-neutral-300 px-2 py-1 text-xs" placeholder="Label"/> <input type="text" class="min-w-48 flex-1 rounded-md border border-neutral-300 px-2 py-1 text-xs" placeholder="Description"/> <button type="button" class="mt-1 text-xs text-neutral-400 hover:text-red-600">Remove</button></li>`),vm=d(`<ul class="space-y-2"></ul>`),ym=d(`<p class="rounded-md border border-dashed border-neutral-300 p-4 text-center text-sm text-neutral-500">No transitions yet. Add a <span class="mono">transition_surface</span> effect to a
41
- action, or declare one in a surface's <em>transitions</em>.</p>`),bm=d(`<span class="text-neutral-500"> </span>`),xm=d(`<li class="flex flex-wrap items-center gap-1.5 text-[11px] text-neutral-600"><button type="button" class="rounded-md border border-neutral-200 bg-neutral-50 px-1.5 py-0.5 hover:border-brand-300 hover:bg-brand-50 hover:text-brand-800" title="Open in feature editor"><!></button> <span class="rounded bg-neutral-100 px-1 text-[10px] uppercase tracking-wide text-neutral-500"> </span> <!></li>`),Sm=d(`<li class="px-3 py-2"><header class="flex flex-wrap items-baseline gap-2 text-sm"><span class="text-neutral-700"> </span> <span class="text-neutral-400" aria-hidden="true">→</span> <button type="button" class="font-medium text-neutral-900 hover:text-brand-700 hover:underline" title="Open target surface"> </button> <span class="text-[11px] text-neutral-500"> </span></header> <ul class="mt-1.5 space-y-0.5"></ul></li>`),Cm=d(`<section><header class="mb-1 flex items-baseline gap-2"><button type="button" class="text-sm font-semibold text-neutral-900 hover:text-brand-700 hover:underline" title="Open this surface"> </button> <span class="text-[11px] text-neutral-500"> </span></header> <ul class="divide-y divide-neutral-200 rounded-md border border-neutral-200 bg-white"></ul></section>`),wm=d(`<div class="space-y-5"></div>`),Tm=d(`<span class="rounded bg-amber-50 px-1.5 py-0.5 text-[10px] font-medium text-amber-800" title="No surface with this id in the source feature, broken reference">! unresolved</span> <span class="mono text-[10px] text-slate-400" title="Target surface id"> </span>`,1),Em=d(`<span> </span>`),Dm=d(`<span class="text-[11px] text-slate-500"> </span>`),Om=d(`<li class="flex flex-wrap items-baseline gap-2 px-4 py-2 text-xs"><span class="flex flex-wrap items-baseline gap-1.5 font-medium text-slate-800"><span> </span> <span class="text-slate-400" aria-hidden="true">→</span> <!></span> <!> <span class="ml-auto rounded-md bg-violet-50 px-1.5 py-0.5 text-[10px] font-medium text-violet-700" title="Source feature"> </span></li>`),km=d(`<section class="space-y-2 border-t border-dashed border-neutral-200 pt-3"><header class="flex items-baseline justify-between"><h3 class="text-[11px] font-semibold uppercase tracking-wide text-slate-500">Inherited from project</h3> <p class="text-[10px] text-slate-400">Read-only. Edit on the source feature.</p></header> <ul class="divide-y divide-slate-100 rounded-md border border-slate-200 bg-slate-50/40"></ul></section>`),Am=d(`<div class="space-y-6"><header class="space-y-1"><h2 class="text-lg font-semibold text-neutral-900">Transitions</h2> <p class="text-sm text-neutral-600">Every authored navigation between surfaces. Declared transitions, default <span class="mono">transition_surface</span> </p></header> <section class="space-y-3 rounded-md border border-neutral-200 bg-white p-3"><header class="flex flex-wrap items-center justify-between gap-2"><div><h3 class="text-sm font-semibold text-neutral-900">Declared transitions</h3> <p class="text-xs text-neutral-500">Surface-level navigation edges, separate from transition effects on rules and actions.</p></div> <!></header> <!></section> <!> <!></div>`);function jm(e,n){N(n,!0);let s=z(()=>qt(n.feature)),c=z(()=>Ut(G(s))),d=z(()=>G(s).length),f=z(()=>jf(rn.siblings)),h=V(``),y=V(``);o(()=>{let e=n.feature.surfaces[0],t=n.feature.surfaces[1]??e;!G(h)&&e&&T(h,e.id,!0),!G(y)&&t&&T(y,t.id,!0)});async function b(){if(!G(h)||!G(y))return;let e={id:Ce(ge()),target:Se(G(y))};await $.mutate(t=>wt(t,Se(G(h)),e))}async function x(e,t,n){await $.mutate(r=>Be(r,e,t.id,n))}async function S(e,t){confirm(`Delete this declared transition?`)&&await $.mutate(n=>Qe(n,e,t.id))}function w(e){switch(e){case`declared`:return`declared`;case`action_effect`:return`action effect`;case`action_rule_effect`:return`action rule`;case`surface_rule_effect`:return`surface rule`}}function E(e){ln.navigateTo({surfaceId:e.surfaceId,actionId:e.actionId,surfacePanelTab:`actions`})}function k(e){ln.navigateTo({surfaceId:e})}var I=Am(),ee=_(I),te=p(_(ee),2),R=p(_(te),2);F(te),F(ee);var B=p(ee,2),H=_(B),U=p(_(H),2),W=e=>{var r=pm(),a=_(r);i(a,21,()=>n.feature.surfaces,e=>e.id,(e,n)=>{var r=dm(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n).name),a!==(a=G(n).id)&&(r.value=(r.__value=G(n).id)??``)}),A(e,r)}),F(a);var o=p(a,4);i(o,21,()=>n.feature.surfaces,e=>e.id,(e,n)=>{var r=fm(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n).name),a!==(a=G(n).id)&&(r.value=(r.__value=G(n).id)??``)}),A(e,r)}),F(o);var s=p(o,2);F(r),g(()=>s.disabled=G(h).length===0||G(y).length===0),P(a,()=>G(h),e=>T(h,e)),P(o,()=>G(y),e=>T(y,e)),l(`click`,s,b),A(e,r)};j(U,e=>{n.feature.surfaces.length>=2&&e(W)}),F(H);var ne=p(H,2),re=e=>{A(e,mm())},ie=e=>{A(e,hm())},ae=z(()=>n.feature.surfaces.every(e=>e.transitions.length===0)),oe=e=>{var r=vm();i(r,21,()=>n.feature.surfaces,e=>e.id,(e,r)=>{var a=u();i(v(a),17,()=>G(r).transitions,e=>e.id,(e,a)=>{var o=_m(),s=_(o),c=_(s,!0);F(s);var u=p(s,4);i(u,21,()=>n.feature.surfaces,e=>e.id,(e,n)=>{var r=gm(),i=_(r,!0);F(r);var a={};g(()=>{t(i,G(n).name),a!==(a=G(n).id)&&(r.value=(r.__value=G(n).id)??``)}),A(e,r)}),F(u);var d;O(u);var f=p(u,2);M(f);var h=p(f,2);M(h);var v=p(h,2);F(o),g(()=>{t(c,G(r).name),d!==(d=G(a).target)&&(u.value=(u.__value=G(a).target)??``,D(u,G(a).target)),L(f,G(a).label??``),L(h,G(a).description??``)}),l(`change`,u,e=>x(G(r).id,G(a),{target:Se(e.target.value)})),m(`blur`,f,e=>x(G(r).id,G(a),{label:e.target.value||void 0})),m(`blur`,h,e=>x(G(r).id,G(a),{description:e.target.value||void 0})),l(`click`,v,()=>S(G(r).id,G(a))),A(e,o)}),A(e,a)}),F(r),A(e,r)};j(ne,e=>{n.feature.surfaces.length<2?e(re):G(ae)?e(ie,1):e(oe,-1)}),F(B);var se=p(B,2),K=e=>{A(e,ym())},ce=e=>{var n=wm();i(n,21,()=>G(c),e=>e.fromSurfaceId,(e,n)=>{var o=Cm(),s=_(o),c=_(s),u=_(c,!0);F(c);var d=p(c,2),f=_(d);F(d),F(s);var m=p(s,2);i(m,21,()=>G(n).transitions,e=>e.toSurfaceId,(e,n)=>{var o=Sm(),s=_(o),c=_(s),u=_(c,!0);F(c);var d=p(c,4),f=_(d,!0);F(d);var m=p(d,2),h=_(m);F(m),F(s);var v=p(s,2);i(v,21,()=>G(n).sources,r,(e,n)=>{var r=xm(),i=_(r),o=_(i),s=e=>{var r=a();g(()=>t(r,G(n).actionName)),A(e,r)},c=e=>{var r=a();g(()=>t(r,`${G(n).surfaceName??``} (surface)`)),A(e,r)};j(o,e=>{G(n).actionName?e(s):e(c,-1)}),F(i);var u=p(i,2),d=_(u,!0);F(u);var f=p(u,2),m=e=>{var r=bm(),i=_(r);F(r),g(()=>t(i,`- ${G(n).description??``}`)),A(e,r)};j(f,e=>{G(n).description&&e(m)}),F(r),g(e=>t(d,e),[()=>w(G(n).origin)]),l(`click`,i,()=>E(G(n))),A(e,r)}),F(v),F(o),g(()=>{t(u,G(n).fromSurfaceName),t(f,G(n).toSurfaceName),t(h,`${G(n).sources.length??``} source${G(n).sources.length===1?``:`s`}`)}),l(`click`,d,()=>k(G(n).toSurfaceId)),A(e,o)}),F(m),F(o),g(()=>{t(u,G(n).fromSurfaceName),t(f,`${G(n).transitions.length??``} outgoing edge${G(n).transitions.length===1?``:`s`}`)}),l(`click`,c,()=>k(G(n).fromSurfaceId)),A(e,o)}),F(n),A(e,n)};j(se,e=>{G(d)===0?e(K):e(ce,-1)});var le=p(se,2),ue=e=>{var n=km(),r=p(_(n),2);i(r,21,()=>G(f),e=>e.value.id,(e,n)=>{let r=z(()=>G(n).value);var i=Om(),a=_(i),o=_(a),s=_(o,!0);F(o);var c=p(o,4),l=e=>{var n=Tm(),i=p(v(n),2),a=_(i,!0);F(i),g(()=>t(a,G(r).target)),A(e,n)},u=e=>{var n=Em(),i=_(n,!0);F(n),g(()=>t(i,G(r).targetName)),A(e,n)};j(c,e=>{G(r).targetMissing?e(l):e(u,-1)}),F(a);var d=p(a,2),f=e=>{var n=Dm(),i=_(n);F(n),g(()=>t(i,`· ${G(r).label??``}`)),A(e,n)};j(d,e=>{G(r).label&&e(f)});var m=p(d,2),h=_(m,!0);F(m),F(i),g(()=>{t(s,G(r).surfaceName),t(h,G(n).sourceFeatureName)}),A(e,i)}),F(r),F(n),A(e,n)};j(le,e=>{G(f).length>0&&e(ue)}),F(I),g(()=>t(R,` effects, and rule-driven transitions.
42
- ${G(d)??``} edge${G(d)===1?``:`s`} across ${G(c).length??``} source surface${G(c).length===1?``:`s`}.`)),A(e,I),C()}c([`click`,`change`]);var Mm=d(`<button type="button"> </button>`),Nm=d(`<div class="rounded-lg border border-dashed border-hairline bg-white p-8 text-center text-sm text-slate-500">Add a surface to get started.</div>`),Pm=d(`<div class="flex flex-col gap-4 lg:flex-row lg:items-start"><aside class="w-full shrink-0 lg:sticky lg:top-32 lg:max-h-[calc(100vh-8rem)] lg:w-[16rem] lg:overflow-y-auto xl:w-[18rem]"><!></aside> <section class="min-w-0 flex-1"><!></section> <aside><!></aside></div>`),Fm=d(`<section class="rounded-lg border border-hairline bg-white p-4"><!></section>`),Im=d(`<section class="rounded-lg border border-hairline bg-white p-4"><!></section>`),Lm=d(`<section class="rounded-lg border border-hairline bg-white p-4"><!></section>`),Rm=d(`<section class="rounded-lg border border-hairline bg-white p-4"><!></section>`),zm=d(`<section class="rounded-lg border border-hairline bg-white p-4"><!></section>`),Bm=d(`<div class="motion-reduce:animate-none! motion-reduce:opacity-100!"><!></div>`),Vm=d(`<div class="sticky top-0 z-30 h-screen self-start"><!></div>`),Hm=d(`<div class="relative flex"><div class="mx-auto flex max-w-400 flex-1 flex-col gap-4 px-4 py-6 sm:px-6"><!> <!> <div aria-hidden="true" class="h-px"></div> <nav></nav> <!></div> <!></div>`);function Um(e,r){N(r,!0);let a=new Set([`build`,`resources`,`data`,`events`,`transitions`,`invariants`]),c=new Set([`actions`,`state`,`rules`,`invariants`,`data`,`resources`,`personas`]),u=z(()=>ln.topLevelTab),d=z(()=>r.feature.surfaces.find(e=>e.id===ln.selectedSurfaceId)??null),m=z(()=>G(d)?dn(r.feature,G(d)):null);R(()=>{if(!ln.selectedSurfaceId&&r.feature.surfaces.length>0){let e=r.feature.surfaces[0];e&&ln.selectSurface(e.id)}nn.load(r.feature.id)}),o(()=>{if(ln.selectedSurfaceId&&!r.feature.surfaces.some(e=>e.id===ln.selectedSurfaceId)){let e=r.feature.surfaces[0];ln.selectSurface(e?e.id:null)}}),o(()=>{ln.focusToken;let e=ln.focusTarget;if(!e)return;let t=!1,n=[],r=(i=0)=>{if(t)return;let a=document.querySelector(`[data-focus-target="${CSS.escape(e)}"]`);if(a){a.scrollIntoView({behavior:`smooth`,block:`center`}),a.classList.add(`focus-flash`),n.push(setTimeout(()=>a.classList.remove(`focus-flash`),1700));return}i<5&&n.push(setTimeout(()=>r(i+1),80))};return n.push(setTimeout(()=>r(),60)),()=>{t=!0;for(let e of n)clearTimeout(e)}}),o(()=>{let e=re.url,t=e.searchParams.get(`tab`),n=e.searchParams.get(`surface`),r=e.searchParams.get(`panel`);s(()=>{let e=t&&a.has(t)?t:`build`;ln.topLevelTab!==e&&ln.setTopLevelTab(e);let i=n?Se(n):null;ln.selectedSurfaceId!==i&&ln.selectSurface(i);let o=r&&c.has(r)?r:`actions`;ln.surfacePanelTab!==o&&ln.setSurfacePanelTab(o)})}),o(()=>{let e=ln.topLevelTab,t=ln.selectedSurfaceId,n=ln.surfacePanelTab;s(()=>{let r=new URLSearchParams;e!==`build`&&r.set(`tab`,e),t&&r.set(`surface`,t),n!==`actions`&&r.set(`panel`,n);let i=r.toString(),a=i?`?${i}`:``;a!==re.url.search&&ne(`${re.url.pathname}${a}`,{keepFocus:!0,noScroll:!0,replaceState:!1})})});let h=z(()=>Vt(r.feature).length),v=z(()=>Gt(r.feature).length),y=z(()=>qt(r.feature).length),b=z(()=>[{key:`build`,label:`Build`,count:r.feature.surfaces.length},{key:`resources`,label:`Resources`,count:r.feature.resources.length},{key:`data`,label:`Entity`,count:G(h)},{key:`events`,label:`Events`,count:G(v)},{key:`transitions`,label:`Transitions`,count:G(y)},{key:`invariants`,label:`Invariants`,count:r.feature.featureInvariants?.length??0}]);o(()=>{let e=e=>{if(!(e instanceof HTMLElement))return!1;let t=e.tagName;return t===`INPUT`||t===`TEXTAREA`||t===`SELECT`?!0:e.isContentEditable},t=t=>{if(!(t.ctrlKey||t.metaKey))return;let n=t.key.toLowerCase(),r=n===`z`&&!t.shiftKey,i=n===`z`&&t.shiftKey||n===`y`;!r&&!i||e(t.target)||(t.preventDefault(),r?$.undo():$.redo())};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)});let x=V(!1),S=V(null),w=V(!1);o(()=>{let e=G(S);if(!e)return;let t=new IntersectionObserver(e=>{let t=e[0];t&&T(x,!t.isIntersecting)},{threshold:0});return t.observe(e),()=>t.disconnect()});var E=Hm(),D=_(E),O=_(D);_n(O,{get feature(){return r.feature},get saving(){return $.saving},get historyOpen(){return G(w)},onToggleHistory:()=>T(w,!G(w))});var k=p(O,2);Tn(k,{get feature(){return r.feature}});var M=p(k,2);B(M,e=>T(S,e),()=>G(S));var P=p(M,2);i(P,21,()=>G(b),e=>e.key,(e,n)=>{var r=Mm(),i=_(r);F(r),g(()=>{U(r,1,`-mb-px border-b-2 px-4 py-2 text-sm font-medium transition ${G(u)===G(n).key?`border-brand-700 text-brand-800`:`border-transparent text-slate-600 hover:text-slate-900`}`),t(i,`${G(n).label??``}${G(n).count===void 0?``:` (${G(n).count})`}`)}),l(`click`,r,()=>ln.setTopLevelTab(G(n).key)),A(e,r)}),F(P),f(p(P,2),()=>G(u),e=>{var t=Bm(),i=_(t),a=e=>{var t=Pm(),n=_(t);Zr(_(n),{get feature(){return r.feature},get selectedId(){return ln.selectedSurfaceId},onSelect:e=>ln.selectSurface(e)}),F(n);var i=p(n,2),a=_(i),o=e=>{dc(e,{get feature(){return r.feature},get surface(){return G(d)},get resources(){return r.feature.resources},get personas(){return r.feature.personas}})},s=e=>{A(e,Nm())};j(a,e=>{G(d)?e(o):e(s,-1)}),F(i);var c=p(i,2);gf(_(c),{get feature(){return r.feature},get surface(){return G(m)}}),F(c),F(t),g(()=>U(c,1,`w-full shrink-0 lg:sticky lg:top-32 lg:max-h-[calc(100vh-8rem)] lg:overflow-y-auto ${ln.railCollapsed?`lg:w-12`:`lg:w-88 xl:w-104`}`)),A(e,t)},o=e=>{var t=Fm();tp(_(t),{get feature(){return r.feature}}),F(t),A(e,t)},s=e=>{var t=Im();Vp(_(t),{get feature(){return r.feature}}),F(t),A(e,t)},c=e=>{var t=Lm();om(_(t),{get feature(){return r.feature}}),F(t),A(e,t)},l=e=>{var t=Rm();um(_(t),{get feature(){return r.feature}}),F(t),A(e,t)},f=e=>{var t=zm();jm(_(t),{get feature(){return r.feature}}),F(t),A(e,t)};j(i,e=>{G(u)===`build`?e(a):G(u)===`resources`?e(o,1):G(u)===`data`?e(s,2):G(u)===`events`?e(c,3):G(u)===`invariants`?e(l,4):e(f,-1)}),F(t),n(1,t,()=>ie,()=>({duration:140,easing:ae})),A(e,t)}),F(D);var I=p(D,2),L=e=>{var t=Vm();Mn(_(t),{get open(){return G(w)},set open(e){T(w,e,!0)}}),F(t),A(e,t)};j(I,e=>{G(w)&&e(L)}),F(E),g(()=>U(P,1,`sticky top-16 z-20 -mx-4 flex flex-wrap gap-1 border-b border-hairline bg-canvas/95 px-4 backdrop-blur transition-shadow ${G(x)?`shadow-[0_4px_8px_-2px_rgba(15,23,42,0.08)]`:``}`)),A(e,E),C()}c([`click`]);var Wm=d(`<div class="mx-auto max-w-7xl px-4 py-10 text-sm text-neutral-500">Loading…</div>`),Gm=d(`<div class="mx-auto max-w-7xl px-4 py-10 text-sm text-red-600"> </div>`),Km=d(`<div class="mx-auto max-w-7xl px-4 py-10 text-sm text-neutral-500">Feature not found. <a href="/features" class="text-brand-700 underline">Back to list</a>.</div>`),qm=d(`<div class="mx-auto flex max-w-400 items-center justify-between gap-2 px-4 pt-4"><p class="text-sm text-red-600"> </p> <button type="button" class="text-xs text-neutral-400 hover:text-neutral-700" aria-label="Dismiss">✕</button></div>`),Jm=d(`<!> <!>`,1);function Ym(e,n){N(n,!1);let r=()=>x(Kt,`$page`,i),[i,a]=k();R(()=>{let e=de(r().params.id??``);return $.load(e),rn.load(e),()=>{$.reset(),nn.reset(),rn.reset()}}),I();var o=u(),s=v(o),c=e=>{A(e,Wm())},d=e=>{var n=Gm(),r=_(n,!0);F(n),g(()=>t(r,$.error)),A(e,n)},f=e=>{A(e,Km())},m=e=>{var n=Jm(),r=v(n),i=e=>{var n=qm(),r=_(n),i=_(r,!0);F(r);var a=p(r,2);F(n),g(()=>t(i,$.saveError)),l(`click`,a,()=>$.dismissSaveError()),A(e,n)};j(r,e=>{$.saveError&&e(i)}),Um(p(r,2),{get feature(){return $.feature}}),A(e,n)};j(s,e=>{$.loading?e(c):$.error?e(d,1):$.feature?e(m,-1):e(f,2)}),A(e,o),C(),a()}c([`click`]);export{Ym as component};