okengine 0.15.2 → 0.17.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 (256) hide show
  1. package/manifest.v1.schema.json +21 -2
  2. package/package.json +1 -1
  3. package/site/content/docs/elements/clock.mdx +7 -0
  4. package/site/content/docs/elements/flow.mdx +20 -12
  5. package/site/content/docs/elements/gate.mdx +108 -3
  6. package/site/content/docs/elements/signal.mdx +46 -17
  7. package/site/content/docs/elements/store.mdx +36 -32
  8. package/site/content/docs/elements/vault.mdx +26 -0
  9. package/site/content/docs/get-started/project-structure.mdx +4 -4
  10. package/site/content/docs/reference/cli.md +1 -1
  11. package/site/content/docs/reference/client.mdx +75 -17
  12. package/site/content/docs/reference/configuration.mdx +7 -4
  13. package/site/content/docs/reference/errors.mdx +24 -17
  14. package/site/content/docs/reference/fx.mdx +39 -22
  15. package/site/content/docs/reference/security.md +1 -1
  16. package/src/auth/api-key-sql.test.ts +47 -0
  17. package/src/auth/api-key-sql.ts +261 -0
  18. package/src/auth/api-keys.ts +276 -14
  19. package/src/auth/auth.test.ts +56 -0
  20. package/src/auth/config.ts +24 -5
  21. package/src/auth/index.ts +62 -1
  22. package/src/auth/plugin.ts +6 -1
  23. package/src/auth/schema.ts +8 -0
  24. package/src/auth/sessions.ts +18 -0
  25. package/src/auth/tables.ts +32 -0
  26. package/src/auth/tenant-config.ts +74 -0
  27. package/src/auth/tenant-tables.ts +11 -0
  28. package/src/auth/tenants.test.ts +63 -0
  29. package/src/auth/tenants.ts +360 -0
  30. package/src/cli/attach-host-console.test.ts +37 -0
  31. package/src/cli/attach-host-console.ts +6 -0
  32. package/src/cli/build.ts +2 -2
  33. package/src/client/budget.test.ts +1 -1
  34. package/src/client/create.ts +75 -5
  35. package/src/client/index.ts +13 -0
  36. package/src/client/live.test.ts +422 -0
  37. package/src/client/live.ts +389 -0
  38. package/src/client/notes-contract.test.ts +41 -0
  39. package/src/client/types.ts +85 -6
  40. package/src/client-react/index.ts +85 -1
  41. package/src/client-react/use-live.test.ts +129 -0
  42. package/src/compiler/effects-infer.ts +37 -2
  43. package/src/compiler/extract.test.ts +143 -11
  44. package/src/compiler/extract.ts +210 -30
  45. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +1 -2
  46. package/src/compiler/fixtures/skyport.expected.json +2 -3
  47. package/src/compiler/response.ts +41 -11
  48. package/src/console/server/access.test.ts +116 -8
  49. package/src/console/server/access.ts +70 -23
  50. package/src/console/server/app.ts +45 -11
  51. package/src/console/server/console.test.ts +6 -8
  52. package/src/console/server/dev-identities.test.ts +127 -0
  53. package/src/console/server/dev-identities.ts +229 -0
  54. package/src/console/server/flows-invoke.test.ts +21 -4
  55. package/src/console/server/flows.ts +113 -58
  56. package/src/console/server/gates.test.ts +24 -0
  57. package/src/console/server/gates.ts +10 -30
  58. package/src/console/server/index.ts +1 -0
  59. package/src/console/server/live.test.ts +26 -1
  60. package/src/console/server/live.ts +4 -2
  61. package/src/console/server/operator-db.ts +2 -0
  62. package/src/console/server/state.ts +29 -55
  63. package/src/console/server/store.test.ts +17 -0
  64. package/src/console/server/store.ts +43 -1
  65. package/src/console/ui-next/dist/assets/access-page-CXVWWMmD.js +4 -0
  66. package/src/console/ui-next/dist/assets/{agent-disclosure-C0X1fbWF.js → agent-disclosure-BP0Y0Sux.js} +1 -1
  67. package/src/console/ui-next/dist/assets/cache-glyph-B5X-NM0-.js +1 -0
  68. package/src/console/ui-next/dist/assets/call-pii-button-ChAUiLo9.js +1 -0
  69. package/src/console/ui-next/dist/assets/collapsible-DGnOM2ph.js +1 -0
  70. package/src/console/ui-next/dist/assets/copy-inline-button-DBHhgHKP.js +1 -0
  71. package/src/console/ui-next/dist/assets/detail-header-DhHM1iaZ.js +1 -0
  72. package/src/console/ui-next/dist/assets/dropdown-menu-_NjTEo5_.js +1 -0
  73. package/src/console/ui-next/dist/assets/element-icons-BVXtRyd3.js +1 -0
  74. package/src/console/ui-next/dist/assets/explorer-empty-2uIhBu0_.js +1 -0
  75. package/src/console/ui-next/dist/assets/flows-page-XDpAJO8f.js +1 -0
  76. package/src/console/ui-next/dist/assets/{highlighted-json-CS_O8L-r.js → highlighted-json-Awq7gYdu.js} +1 -1
  77. package/src/console/ui-next/dist/assets/http-method-_UHM2ODJ.js +1 -0
  78. package/src/console/ui-next/dist/assets/index-BBj2QJCu.js +66 -0
  79. package/src/console/ui-next/dist/assets/index-Ck88Jmv8.css +2 -0
  80. package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +1 -0
  81. package/src/console/ui-next/dist/assets/observability-page-BFaay44m.js +4 -0
  82. package/src/console/ui-next/dist/assets/replica-lag-DKRrbvdo.js +18 -0
  83. package/src/console/ui-next/dist/assets/request-meta-DV0ywz7t.js +1 -0
  84. package/src/console/ui-next/dist/assets/shortcut-JQIZlWfm.js +1 -0
  85. package/src/console/ui-next/dist/assets/shortcut-keys-DKxNTe_m.js +1 -0
  86. package/src/console/ui-next/dist/assets/skeleton-D-czQJT6.js +1 -0
  87. package/src/console/ui-next/dist/assets/store-page-CS5-aETQ.js +41 -0
  88. package/src/console/ui-next/dist/assets/trace-detail-sheet-B09O8rA6.js +2 -0
  89. package/src/console/ui-next/dist/assets/tree-expand-toggle-BtyhmWb4.js +55 -0
  90. package/src/console/ui-next/dist/assets/units-page-Ca2Z-E52.js +1 -0
  91. package/src/console/ui-next/dist/assets/{use-vault-list-BLbZhzyF.js → use-vault-list-uk4WVboC.js} +1 -1
  92. package/src/console/ui-next/dist/assets/useMutation-B8EO02Ej.js +1 -0
  93. package/src/console/ui-next/dist/assets/useRender-BE2A9BWC.js +1 -0
  94. package/src/console/ui-next/dist/assets/vault-page-BmOeAFwg.js +2 -0
  95. package/src/console/ui-next/dist/index.html +11 -9
  96. package/src/console/ui-next/index.html +3 -3
  97. package/src/console/ui-next/src/client.ts +167 -0
  98. package/src/console/ui-next/src/components/shell/app-sidebar.tsx +2 -0
  99. package/src/console/ui-next/src/components/shell/command-items.test.ts +1 -0
  100. package/src/console/ui-next/src/components/shell/command-items.ts +8 -0
  101. package/src/console/ui-next/src/components/shell/shell-layout.tsx +2 -1
  102. package/src/console/ui-next/src/components/ui/sheet-form.tsx +8 -3
  103. package/src/console/ui-next/src/features/access/access-page.tsx +347 -0
  104. package/src/console/ui-next/src/features/access/data/use-access.ts +23 -0
  105. package/src/console/ui-next/src/features/access/detail/access-detail.tsx +552 -0
  106. package/src/console/ui-next/src/features/access/explorer/access-list.tsx +125 -0
  107. package/src/console/ui-next/src/features/access/lib/format-when.test.ts +139 -0
  108. package/src/console/ui-next/src/features/access/lib/format-when.ts +296 -0
  109. package/src/console/ui-next/src/features/access/lib/scope-groups.test.ts +34 -0
  110. package/src/console/ui-next/src/features/access/lib/scope-groups.ts +40 -0
  111. package/src/console/ui-next/src/features/access/sheets/access-allow-fields.tsx +236 -0
  112. package/src/console/ui-next/src/features/access/sheets/access-create-sheet.tsx +316 -0
  113. package/src/console/ui-next/src/features/access/sheets/access-edit-sheet.tsx +240 -0
  114. package/src/console/ui-next/src/features/access/sheets/access-expiry-fields.tsx +66 -0
  115. package/src/console/ui-next/src/features/access/sheets/access-refresh-sheet.tsx +104 -0
  116. package/src/console/ui-next/src/features/access/sheets/access-scope-field.tsx +115 -0
  117. package/src/console/ui-next/src/features/access/sheets/access-secret-sheet.tsx +89 -0
  118. package/src/console/ui-next/src/features/access/sheets/access-sheet-search.tsx +49 -0
  119. package/src/console/ui-next/src/features/access/state/access-selection.ts +84 -0
  120. package/src/console/ui-next/src/features/auth/auth-redirect.test.ts +5 -0
  121. package/src/console/ui-next/src/features/auth/auth-redirect.ts +18 -2
  122. package/src/console/ui-next/src/features/flows/fixture.ts +0 -1
  123. package/src/console/ui-next/src/features/not-found/not-found-page.tsx +1 -1
  124. package/src/console/ui-next/src/features/units/detail/flow-contract-panel.tsx +5 -1
  125. package/src/console/ui-next/src/features/units/lib/unit-tree.test.ts +15 -4
  126. package/src/console/ui-next/src/lib/document-meta.test.ts +1 -0
  127. package/src/console/ui-next/src/lib/document-meta.ts +2 -1
  128. package/src/console/ui-next/src/lib/last-module-search.test.ts +1 -0
  129. package/src/console/ui-next/src/lib/last-module-search.ts +2 -1
  130. package/src/console/ui-next/src/lib/shortcut.test.ts +2 -0
  131. package/src/console/ui-next/src/lib/shortcut.ts +3 -0
  132. package/src/console/ui-next/src/router.tsx +10 -1
  133. package/src/console/ui-next/ui-next-seed-app-schema.ts +88 -37
  134. package/src/console/ui-next/ui-next-seed-manifest-surface.ts +2 -9
  135. package/src/console/ui-next/ui-next-seed-manifest.ts +0 -1
  136. package/src/console/ui-next/ui-next-seed-store.ts +43 -15
  137. package/src/console/xss.gate.test.ts +1 -0
  138. package/src/drivers/index.ts +2 -0
  139. package/src/drivers/journal-postgres.ts +12 -3
  140. package/src/drivers/pg-rls.ts +26 -2
  141. package/src/drivers/pg-vault-rls.ts +68 -0
  142. package/src/drivers/signal-engine.ts +69 -15
  143. package/src/drivers/signal-live-iter.ts +65 -0
  144. package/src/drivers/signal-nats.ts +2 -1
  145. package/src/drivers/signal-postgres.ts +95 -12
  146. package/src/drivers/signal-redis.ts +2 -1
  147. package/src/drivers/signal-retention.ts +64 -0
  148. package/src/drivers/signal-types.ts +35 -5
  149. package/src/elements/clock/declare.ts +64 -2
  150. package/src/elements/clock/reconcile.ts +98 -25
  151. package/src/elements/clock/runtime.ts +13 -2
  152. package/src/elements/clock.test.ts +28 -0
  153. package/src/elements/clock.ts +9 -1
  154. package/src/elements/gate/declare.ts +2 -0
  155. package/src/elements/gate/permissions.ts +12 -0
  156. package/src/elements/gate.ts +6 -1
  157. package/src/elements/signal/declare.ts +44 -10
  158. package/src/elements/signal/delivery-modes.test.ts +90 -4
  159. package/src/elements/signal/order-lifecycle.test.ts +20 -4
  160. package/src/elements/signal/runtime.ts +42 -0
  161. package/src/elements/signal.test.ts +21 -8
  162. package/src/elements/signal.ts +1 -1
  163. package/src/elements/store/cache.ts +1 -1
  164. package/src/elements/store/declare.ts +7 -0
  165. package/src/elements/store/rls-identity.test.ts +29 -0
  166. package/src/elements/store/rls-identity.ts +3 -0
  167. package/src/elements/store/runtime.ts +14 -0
  168. package/src/elements/store/schema-decl.ts +162 -44
  169. package/src/elements/store/schema-tenant.ts +41 -0
  170. package/src/elements/store/sql-rls-isolation.test.ts +39 -0
  171. package/src/elements/store/sql-select.types.test.ts +71 -0
  172. package/src/elements/store/sql-session.ts +54 -32
  173. package/src/elements/store.ts +5 -0
  174. package/src/elements/vault/builtin-adapter.ts +15 -2
  175. package/src/elements/vault/declare.ts +8 -0
  176. package/src/elements/vault/runtime.ts +7 -0
  177. package/src/elements/vault/sql-rls-isolation.test.ts +145 -0
  178. package/src/elements/vault/storage.ts +9 -0
  179. package/src/elements/vault/test-helpers.ts +2 -1
  180. package/src/i18n/catalogs/ar.ts +19 -0
  181. package/src/i18n/catalogs/en.ts +19 -0
  182. package/src/index.ts +2 -0
  183. package/src/kernel/adopt-routes.ts +56 -8
  184. package/src/kernel/api-key-host-persist.test.ts +143 -0
  185. package/src/kernel/app-tenant.ts +122 -0
  186. package/src/kernel/app.ts +196 -57
  187. package/src/kernel/auth-resolve.ts +13 -5
  188. package/src/kernel/boot-bind/clock.ts +9 -3
  189. package/src/kernel/boot.test.ts +4 -4
  190. package/src/kernel/boot.ts +2 -0
  191. package/src/kernel/budget.test.ts +1 -1
  192. package/src/kernel/clock-durable.ts +8 -0
  193. package/src/kernel/clock-per-tenant-name.ts +5 -0
  194. package/src/kernel/clock-reconcile.ts +8 -0
  195. package/src/kernel/errors-live-resume.ts +15 -0
  196. package/src/kernel/errors-tenant.ts +29 -0
  197. package/src/kernel/errors.registry.test.ts +31 -3
  198. package/src/kernel/errors.ts +43 -3
  199. package/src/kernel/flow.ts +26 -5
  200. package/src/kernel/fx-auth-keys.test.ts +88 -0
  201. package/src/kernel/fx-auth-keys.ts +203 -0
  202. package/src/kernel/fx-auth-tenants.test.ts +87 -0
  203. package/src/kernel/fx-auth-tenants.ts +286 -0
  204. package/src/kernel/fx-live-stream.ts +149 -0
  205. package/src/kernel/fx-live.test.ts +157 -0
  206. package/src/kernel/fx-runtime.ts +15 -0
  207. package/src/kernel/fx-tenant-store.ts +213 -0
  208. package/src/kernel/fx.test.ts +108 -1
  209. package/src/kernel/fx.ts +206 -28
  210. package/src/kernel/hooks.ts +2 -2
  211. package/src/kernel/http-resource.ts +9 -18
  212. package/src/kernel/index.ts +2 -0
  213. package/src/kernel/journal.ts +12 -0
  214. package/src/kernel/live-http.test.ts +78 -0
  215. package/src/kernel/live-http.ts +114 -0
  216. package/src/kernel/live-resume.test.ts +125 -0
  217. package/src/kernel/on.ts +51 -0
  218. package/src/kernel/pipeline-api-key.test.ts +192 -7
  219. package/src/kernel/pipeline-tenant.ts +49 -0
  220. package/src/kernel/pipeline.test.ts +1 -1
  221. package/src/kernel/pipeline.ts +41 -4
  222. package/src/kernel/resource-mount.test.ts +10 -27
  223. package/src/kernel/tenant-resolve.test.ts +101 -0
  224. package/src/kernel/tenant-resolve.ts +124 -0
  225. package/src/kernel/tenant-roles.test.ts +87 -0
  226. package/src/kernel/triggers.ts +59 -21
  227. package/src/manifest/diff.test.ts +11 -2
  228. package/src/manifest/diff.ts +53 -11
  229. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  230. package/src/manifest/fixtures/skyport.manifest.json +0 -1
  231. package/src/manifest/types.ts +58 -6
  232. package/src/release/build-lib.ts +14 -1
  233. package/src/release/limits.ts +2 -2
  234. package/src/release/measure.ts +55 -1
  235. package/src/client/live-gap.test.ts +0 -35
  236. package/src/console/ui-next/dist/assets/cache-glyph-F1FI122b.js +0 -1
  237. package/src/console/ui-next/dist/assets/call-pii-button-DEDCl_j3.js +0 -1
  238. package/src/console/ui-next/dist/assets/collapsible-LPqGvfoz.js +0 -1
  239. package/src/console/ui-next/dist/assets/confirm-sheet-3ptDzXbz.js +0 -1
  240. package/src/console/ui-next/dist/assets/explorer-empty-BvYrygyO.js +0 -1
  241. package/src/console/ui-next/dist/assets/flows-page-Dluo1Bd7.js +0 -1
  242. package/src/console/ui-next/dist/assets/http-method--sWDdXSB.js +0 -1
  243. package/src/console/ui-next/dist/assets/index-Ca3HZMVq.js +0 -66
  244. package/src/console/ui-next/dist/assets/index-UtTDRQpS.css +0 -2
  245. package/src/console/ui-next/dist/assets/link-COeyggt-.js +0 -1
  246. package/src/console/ui-next/dist/assets/observability-page-HK9-BO8z.js +0 -4
  247. package/src/console/ui-next/dist/assets/replica-lag-DBIFFf7d.js +0 -18
  248. package/src/console/ui-next/dist/assets/sheet-form-Dnwa5oOR.js +0 -1
  249. package/src/console/ui-next/dist/assets/shortcut-Cgzuv4k1.js +0 -1
  250. package/src/console/ui-next/dist/assets/shortcut-keys-CoqwEIi0.js +0 -1
  251. package/src/console/ui-next/dist/assets/skeleton-BHcfDYcb.js +0 -1
  252. package/src/console/ui-next/dist/assets/store-page-BSohH3wM.js +0 -41
  253. package/src/console/ui-next/dist/assets/trace-detail-sheet-CFIGRnnA.js +0 -2
  254. package/src/console/ui-next/dist/assets/tree-expand-toggle-BgLl34w7.js +0 -54
  255. package/src/console/ui-next/dist/assets/units-page-B0cFE76A.js +0 -1
  256. package/src/console/ui-next/dist/assets/vault-page-B1SbYe10.js +0 -2
@@ -139,6 +139,15 @@ describe("diffManifest — fixture pairs", () => {
139
139
  expect(hasCategory(result.changes, "contract-breaking", "delivery")).toBe(true);
140
140
  });
141
141
 
142
+ test("10b · live retention change is contract-breaking", async () => {
143
+ const before = await loadBase();
144
+ before.signals!["order-placed"]!.delivery = "live";
145
+ const after = clone(before);
146
+ after.signals!["order-placed"]!.retention = { maxCount: 10 };
147
+ const result = diffManifest(before, after);
148
+ expect(hasCategory(result.changes, "contract-breaking", "retention")).toBe(true);
149
+ });
150
+
142
151
  test("11 · rate limit expression widened is permission-widening", async () => {
143
152
  const before = await loadBase();
144
153
  const after = clone(before);
@@ -257,7 +266,7 @@ describe("diffManifest — additional branches", () => {
257
266
  properties: { id: { type: "number" } },
258
267
  };
259
268
  flow.durable = true;
260
- flow.live = true;
269
+ flow.live = "order-status";
261
270
  flow.plane = "operator";
262
271
  flow.cost = { estimatePerCall: 1, budget: 2 };
263
272
  flow.pii = "allow";
@@ -598,7 +607,7 @@ describe("diffManifest — line coverage sweep", () => {
598
607
  after.flows!["orders.create"]!.steps = ["a"];
599
608
  after.flows!["orders.create"]!.nondeterministic = false;
600
609
  after.flows!["orders.create"]!.cost = { budget: 1 };
601
- after.flows!["orders.create"]!.live = false;
610
+ delete after.flows!["orders.create"]!.live;
602
611
  after.flows!["orders.create"]!.durable = false;
603
612
  after.flows!["orders.create"]!.in = "CreateOrderV2";
604
613
  after.flows!["orders.create"]!.out = {
@@ -218,7 +218,7 @@ function diffFlow(before: Flow, after: Flow, path: string, out: ManifestChange[]
218
218
  out.push(
219
219
  change(
220
220
  `${path}/live`,
221
- after.live === true ? "effect-widening" : "no-impact",
221
+ after.live !== undefined && after.live !== before.live ? "effect-widening" : "no-impact",
222
222
  kindOf(before.live, after.live),
223
223
  before.live,
224
224
  after.live,
@@ -760,6 +760,18 @@ function diffSignal(before: Signal, after: Signal, path: string, out: ManifestCh
760
760
  ),
761
761
  );
762
762
  }
763
+ if (!deepEqual(before.retention, after.retention)) {
764
+ out.push(
765
+ change(
766
+ `${path}/retention`,
767
+ "contract-breaking",
768
+ kindOf(before.retention, after.retention),
769
+ before.retention,
770
+ after.retention,
771
+ "live retention changed",
772
+ ),
773
+ );
774
+ }
763
775
  }
764
776
 
765
777
  function diffStore(before: Store, after: Store, path: string, out: ManifestChange[]): void {
@@ -1233,18 +1245,48 @@ function diffTenancy(
1233
1245
  );
1234
1246
  return;
1235
1247
  }
1248
+ if (before?.enabled === true && after?.enabled !== true) {
1249
+ out.push(
1250
+ change(
1251
+ "/tenancy/enabled",
1252
+ "permission-widening",
1253
+ "changed",
1254
+ true,
1255
+ after?.enabled,
1256
+ "tenancy disabled",
1257
+ ),
1258
+ );
1259
+ } else if (before?.enabled !== true && after?.enabled === true) {
1260
+ out.push(
1261
+ change("/tenancy/enabled", "no-impact", "changed", before?.enabled, true, "tenancy enabled"),
1262
+ );
1263
+ }
1264
+ if (before?.membershipRequired === true && after?.membershipRequired !== true) {
1265
+ out.push(
1266
+ change(
1267
+ "/tenancy/membershipRequired",
1268
+ "permission-widening",
1269
+ "changed",
1270
+ true,
1271
+ after?.membershipRequired,
1272
+ "tenant membership no longer required",
1273
+ ),
1274
+ );
1275
+ }
1236
1276
  const b = before?.isolation ? ISOLATION_RANK[before.isolation] : undefined;
1237
1277
  const a = after?.isolation ? ISOLATION_RANK[after.isolation] : undefined;
1238
- out.push(
1239
- change(
1240
- "/tenancy/isolation",
1241
- b !== undefined && a !== undefined && a < b ? "permission-widening" : "no-impact",
1242
- "changed",
1243
- before?.isolation,
1244
- after?.isolation,
1245
- `tenancy isolation ${before?.isolation} → ${after?.isolation}`,
1246
- ),
1247
- );
1278
+ if (before?.isolation !== after?.isolation) {
1279
+ out.push(
1280
+ change(
1281
+ "/tenancy/isolation",
1282
+ b !== undefined && a !== undefined && a < b ? "permission-widening" : "no-impact",
1283
+ "changed",
1284
+ before?.isolation,
1285
+ after?.isolation,
1286
+ `tenancy isolation ${before?.isolation} → ${after?.isolation}`,
1287
+ ),
1288
+ );
1289
+ }
1248
1290
  }
1249
1291
 
1250
1292
  function diffI18n(before: I18n | undefined, after: I18n | undefined, out: ManifestChange[]): void {
@@ -17,7 +17,7 @@
17
17
  "slo": { "availability": "99.9%", "latency": { "p99": "200ms" } },
18
18
  "source": "src/flows/bookings/index.ts:18"
19
19
  },
20
- "bookings.mine": { "live": true, "cacheKeys": "computed:sql:bookings/userId" },
20
+ "bookings.mine": { "cacheKeys": "computed:sql:bookings/userId" },
21
21
  "payments.chargeBooking": {
22
22
  "durable": true,
23
23
  "steps": ["create-intent", "confirm"],
@@ -34,7 +34,6 @@
34
34
  "bookings.mine": {
35
35
  "trigger": { "http": { "method": "GET", "path": "/bookings" } },
36
36
  "gates": ["member"],
37
- "live": true,
38
37
  "cacheKeys": "computed:sql:bookings/userId",
39
38
  "effects": {
40
39
  "reads": ["sql:bookings"]
@@ -47,7 +47,19 @@ export type ResourceRef = `${StoreFacet}:${string}`;
47
47
  export type RunsResourceRef = "runs";
48
48
 
49
49
  /**
50
- * Dead-letter read capability for `fx.deadLetters` — not a store facet.
50
+ * Auth key-management capability for `fx.auth` list/create/revoke/rotate/update.
51
+ * Not a store facet — do not declare `sql:oke_api_keys`.
52
+ */
53
+ export type AuthApiKeysResourceRef = "auth:api-keys";
54
+
55
+ /**
56
+ * Auth tenant-management capability for `fx.auth` list/switch/create/….
57
+ * Not a store facet — do not declare `sql:oke_tenants`.
58
+ */
59
+ export type AuthTenantsResourceRef = "auth:tenants";
60
+
61
+ /**
62
+ * Dead-letter / live-stream read capability — not a store facet.
51
63
  * Declare on `effects.reads` (never `writes`).
52
64
  */
53
65
  export type SignalResourceRef = `signal:${string}`;
@@ -80,10 +92,16 @@ export type JsonSchema = string | Record<string, unknown>;
80
92
  * `sends` / `asks` are irreversible (asks also nondeterministic + cost).
81
93
  */
82
94
  export interface Effects {
83
- /** Store reads, plus `"runs"` for `fx.runs` and `signal:name` for `fx.deadLetters`. */
84
- reads?: Array<ResourceRef | RunsResourceRef | SignalResourceRef>;
85
- /** Store writes. */
86
- writes?: ResourceRef[];
95
+ /** Store reads, plus `"runs"` for `fx.runs` and `signal:name` for `fx.deadLetters` / `fx.live`. */
96
+ reads?: Array<
97
+ | ResourceRef
98
+ | RunsResourceRef
99
+ | SignalResourceRef
100
+ | AuthApiKeysResourceRef
101
+ | AuthTenantsResourceRef
102
+ >;
103
+ /** Store writes, plus `"auth:api-keys"` / `"auth:tenants"` for `fx.auth` mutations. */
104
+ writes?: Array<ResourceRef | AuthApiKeysResourceRef | AuthTenantsResourceRef>;
87
105
  /** Emitted signals. */
88
106
  emits?: SignalRef[];
89
107
  /** Channel template sends (irreversible). */
@@ -156,7 +174,8 @@ export interface Flow {
156
174
  source?: string;
157
175
  plane?: FlowPlane;
158
176
  durable?: boolean;
159
- live?: boolean;
177
+ /** Live signal name when this flow streams `delivery: "live"` SSE. */
178
+ live?: string;
160
179
  cache?: boolean | string;
161
180
  cacheKeys?: string;
162
181
  slo?: Slo;
@@ -172,6 +191,19 @@ export interface Flow {
172
191
  allowPii?: boolean;
173
192
  /** Author acknowledges an intentional contract break. */
174
193
  breaking?: boolean;
194
+ /**
195
+ * When `false`, skip tenant-role scope union.
196
+ * Default `true` when `gate.auth.tenant` is on.
197
+ */
198
+ tenantScoped?: boolean;
199
+ }
200
+
201
+ /** Live-tape cap. Omit both fields (or omit `retention`) for an unbounded tape. */
202
+ export interface SignalRetention {
203
+ /** Drop events older than this duration (`"7d"`, `"1h"`, `"30s"`, …). */
204
+ maxAge?: string;
205
+ /** Keep only the newest N live events. */
206
+ maxCount?: number;
175
207
  }
176
208
 
177
209
  /** One Signal declaration. */
@@ -183,6 +215,8 @@ export interface Signal {
183
215
  deadLetter?: boolean;
184
216
  schema?: JsonSchema;
185
217
  optional?: boolean;
218
+ /** Live-tape cap (`delivery: "live"` only). Omitted = unbounded. */
219
+ retention?: SignalRetention;
186
220
  }
187
221
 
188
222
  /** Column / field classification for privacy and retention. */
@@ -241,6 +275,8 @@ export interface Table {
241
275
  rls?: boolean;
242
276
  /** Policy name → Drizzle-shaped spec. */
243
277
  policies?: Record<string, TablePolicy>;
278
+ /** When `false`, skip fail-loud tenant-policy requirement. */
279
+ tenantScoped?: boolean;
244
280
  }
245
281
 
246
282
  /** One Store declaration. */
@@ -258,6 +294,11 @@ export interface Store {
258
294
  * Distinct from Flow `durable` (journaled steps).
259
295
  */
260
296
  durable?: boolean;
297
+ /**
298
+ * KV only — prefix keys with `{tenantId}:` when tenancy is on.
299
+ * Default `true` then; `false` is the global-namespace opt-out.
300
+ */
301
+ tenantScoped?: boolean;
261
302
  }
262
303
 
263
304
  /** Named clock / schedule. */
@@ -268,6 +309,8 @@ export interface Clock {
268
309
  overridable?: boolean;
269
310
  /** Optional human description (falls back to the clock map key). */
270
311
  description?: string;
312
+ /** Expand one `oke_crons` row per tenant. */
313
+ perTenant?: boolean;
271
314
  }
272
315
 
273
316
  /** Named gate — policy, rate, or a flattened `gate.all` handle. */
@@ -299,6 +342,11 @@ export interface SecretContract {
299
342
  * in the clear. Defaults to `true` (secret).
300
343
  */
301
344
  sensitive?: boolean;
345
+ /**
346
+ * Resolve per `fx.tenant.id` at request time (not boot).
347
+ * Default `true` when `gate.auth.tenant` is on.
348
+ */
349
+ perTenant?: boolean;
302
350
  }
303
351
 
304
352
  /** Channel template. */
@@ -394,7 +442,11 @@ export interface Plugin {
394
442
 
395
443
  /** Tenancy configuration (resolver is code; isolation is data). */
396
444
  export interface Tenancy {
445
+ /** `gate.auth.tenant` is on. */
446
+ enabled?: boolean;
397
447
  isolation?: TenancyIsolation;
448
+ /** Pure B2B — every user-plane request needs a tenant. */
449
+ membershipRequired?: boolean;
398
450
  }
399
451
 
400
452
  /** i18n configuration. */
@@ -24,8 +24,21 @@ const ENTRIES: readonly { readonly src: string; readonly out: string }[] = [
24
24
  { src: "src/journal-entry.ts", out: "dist/journal-entry.js" },
25
25
  // Lazy sync chunks — loaded via requirePackageModule / computed require
26
26
  // when the feature actually runs (auth, list page, auto-cache).
27
- { src: "src/kernel/app-auth.ts", out: "dist/app-auth.js" },
27
+ { src: "src/kernel/fx-runtime.ts", out: "dist/fx-runtime.js" },
28
28
  { src: "src/auth/config.ts", out: "dist/auth-config.js" },
29
+ { src: "src/kernel/fx-auth-keys.ts", out: "dist/fx-auth-keys.js" },
30
+ { src: "src/kernel/fx-auth-tenants.ts", out: "dist/fx-auth-tenants.js" },
31
+ { src: "src/kernel/fx-tenant-store.ts", out: "dist/fx-tenant-store.js" },
32
+ { src: "src/drivers/pg-vault-rls.ts", out: "dist/pg-vault-rls.js" },
33
+ { src: "src/kernel/app-tenant.ts", out: "dist/app-tenant.js" },
34
+ { src: "src/kernel/pipeline-tenant.ts", out: "dist/pipeline-tenant.js" },
35
+ { src: "src/kernel/fx-live-stream.ts", out: "dist/fx-live-stream.js" },
36
+ { src: "src/kernel/errors-live-resume.ts", out: "dist/errors-live-resume.js" },
37
+ { src: "src/kernel/errors-tenant.ts", out: "dist/errors-tenant.js" },
38
+ { src: "src/kernel/clock-durable.ts", out: "dist/clock-durable.js" },
39
+ { src: "src/kernel/clock-reconcile.ts", out: "dist/clock-reconcile.js" },
40
+ { src: "src/kernel/clock-per-tenant-name.ts", out: "dist/clock-per-tenant-name.js" },
41
+ { src: "src/elements/store/schema-tenant.ts", out: "dist/schema-tenant.js" },
29
42
  { src: "src/kernel/list-page.ts", out: "dist/list-page.js" },
30
43
  { src: "src/kernel/http-resource.ts", out: "dist/http-resource.js" },
31
44
  { src: "src/elements/store/cache.ts", out: "dist/store-cache.js" },
@@ -5,10 +5,10 @@
5
5
  */
6
6
 
7
7
  /** Kernel (edge profile) — gzipped minified bundle. */
8
- export const KERNEL_EDGE_BUDGET_BYTES = 15 * 1024;
8
+ export const KERNEL_EDGE_BUDGET_BYTES = 16 * 1024;
9
9
 
10
10
  /** Client runtime — gzipped minified bundle. */
11
- export const CLIENT_BUDGET_BYTES = 3 * 1024;
11
+ export const CLIENT_BUDGET_BYTES = 4 * 1024;
12
12
 
13
13
  /** Console initial load — gzipped html + entry js/css (ui-next SPA, no panel-* split). */
14
14
  export const CONSOLE_BUDGET_BYTES = 700 * 1024;
@@ -5,7 +5,7 @@
5
5
  import { mkdtemp, readdir, rm } from "node:fs/promises";
6
6
  import { tmpdir } from "node:os";
7
7
  import { join, resolve } from "node:path";
8
- import { createRouter } from "../kernel/router.ts";
8
+ import { lazyRequire } from "../kernel/lazy-require.ts";
9
9
  import {
10
10
  type BudgetGroup,
11
11
  OFFICIAL_PLUGIN_BUDGETS,
@@ -228,6 +228,16 @@ export async function measureHttpPingAppBytes(): Promise<HttpPingBudgetSample> {
228
228
  * Gzip size of the kernel edge profile bundle.
229
229
  */
230
230
  export async function measureKernelEdgeGzipBytes(): Promise<number> {
231
+ try {
232
+ return await gzipKernelEdgeInProcess();
233
+ } catch {
234
+ // bun test's in-process Bun.build cannot always resolve the kernel graph.
235
+ return gzipKernelEdgeSpawn();
236
+ }
237
+ }
238
+
239
+ /** In-process edge gzip — used outside `bun test`. */
240
+ async function gzipKernelEdgeInProcess(): Promise<number> {
231
241
  const entry = `${import.meta.dir}/../kernel/budget-entry.ts`;
232
242
  // Browser target matches the historical edge-profile gate.
233
243
  const result = await Bun.build({
@@ -246,6 +256,46 @@ export async function measureKernelEdgeGzipBytes(): Promise<number> {
246
256
  return Bun.gzipSync(new Uint8Array(raw)).byteLength;
247
257
  }
248
258
 
259
+ /** Subprocess edge gzip — bun test cannot always resolve this graph in-process. */
260
+ async function gzipKernelEdgeSpawn(): Promise<number> {
261
+ const entry = resolve(ROOT, "src/kernel/budget-entry.ts");
262
+ const probe = `
263
+ const result = await Bun.build({
264
+ entrypoints: ${JSON.stringify([entry])},
265
+ minify: true,
266
+ target: "browser",
267
+ format: "esm",
268
+ external: ${JSON.stringify([...BUILD_EXTERNALS])},
269
+ });
270
+ if (!result.success) {
271
+ console.error(result.logs.map(String).join("\\n"));
272
+ process.exit(1);
273
+ }
274
+ const artifact = result.outputs[0];
275
+ if (!artifact) { console.error("no output"); process.exit(1); }
276
+ const raw = await artifact.arrayBuffer();
277
+ process.stdout.write(String(Bun.gzipSync(new Uint8Array(raw)).byteLength));
278
+ `;
279
+ const proc = Bun.spawn(["bun", "-e", probe], {
280
+ cwd: ROOT,
281
+ stdout: "pipe",
282
+ stderr: "pipe",
283
+ });
284
+ const [stdout, stderr, exitCode] = await Promise.all([
285
+ new Response(proc.stdout).text(),
286
+ new Response(proc.stderr).text(),
287
+ proc.exited,
288
+ ]);
289
+ if (exitCode !== 0) {
290
+ throw new Error(`kernel edge build failed:\n${stderr || stdout}`);
291
+ }
292
+ const n = Number(stdout.trim());
293
+ if (!Number.isFinite(n) || n <= 0) {
294
+ throw new Error(`kernel edge measure produced ${stdout}`);
295
+ }
296
+ return n;
297
+ }
298
+
249
299
  /**
250
300
  * Gzip size of the client runtime bundle.
251
301
  */
@@ -418,6 +468,10 @@ export async function measureColdStartMedianMs(): Promise<number> {
418
468
  */
419
469
  export function measureRoutingP99Ms(): number {
420
470
  const N = 200;
471
+ const { createRouter } = lazyRequire<typeof import("../kernel/router.ts")>(
472
+ `${import.meta.dir}/../kernel`,
473
+ "router",
474
+ );
421
475
  const router = createRouter<number>("default");
422
476
  for (let i = 0; i < N; i++) {
423
477
  router.add("GET", `/r${i}/:id/leaf`, i);
@@ -1,35 +0,0 @@
1
- /**
2
- * Evidence: createClient has no live-signal subscription today.
3
- *
4
- * `delivery: "live"` is consumed server-side via `bus.live()` (and
5
- * `on(signal, flow)` for flow subscribers). `okengine/client` exposes only
6
- * HTTP REST / RPC — no SSE, WebSocket, or `api.live(…)`.
7
- *
8
- * Design for `client.live(signalName)` is tracked with the Signal docs page;
9
- * do not treat this file as a stub to fill — ship the real surface when ready.
10
- */
11
-
12
- import { describe, expect, test } from "bun:test";
13
-
14
- import * as client from "./index.ts";
15
- import { createClient } from "./create.ts";
16
-
17
- describe("createClient — live signal gap", () => {
18
- test("public client module exports no live / subscribe helpers", () => {
19
- const keys = Object.keys(client).sort();
20
- expect(keys).not.toContain("live");
21
- expect(keys).not.toContain("subscribe");
22
- expect(keys).toContain("createClient");
23
- expect(keys).toContain("createTransport");
24
- });
25
-
26
- test("createClient builds an HTTP call proxy only (no live method on the root)", async () => {
27
- const api = createClient("http://app.test", {
28
- fetch: async () => Response.json({ data: null, error: { code: "NotFound", data: {} } }),
29
- });
30
- // Root is a callable proxy for unit.flow — live is not a first-class API.
31
- expect(typeof api).toBe("function");
32
- expect(Object.prototype.hasOwnProperty.call(api, "live")).toBe(false);
33
- expect("live" in (api as object)).toBe(false);
34
- });
35
- });
@@ -1 +0,0 @@
1
- import{F as e,I as t,R as n,Tr as r,wr as i}from"./shortcut-keys-CoqwEIi0.js";import{A as a,f as o}from"./xyflow-D7n4g6go.js";import{t as s}from"./dagre.esm-ZwcdTuZZ.js";import{D as c,E as l,O as u,T as d,b as f,s as p,x as m}from"./http-method--sWDdXSB.js";function h(e){let t=e.indexOf(`.`);return t===-1?e:e.slice(0,t)}function g(e){let t=e.indexOf(`.`);return t===-1?e:e.slice(t+1)}function _(e){let t=e?.flows??{},n=new Map;for(let e of Object.keys(t)){let r=t[e]?.effects?.calls??[];for(let t of r){let r=n.get(t)??[];r.push(e),n.set(t,r)}}for(let[e,t]of n)t.sort((e,t)=>e.localeCompare(t)),n.set(e,t);return n}function v(e,t){return _(e).get(t)??[]}function y(e){return e.startsWith(`sql:`)?{id:e,kind:`store`,label:e.slice(4),facet:`sql`}:e.startsWith(`kv:`)?{id:e,kind:`store`,label:e.slice(3),facet:`kv`}:e.startsWith(`files:`)?{id:e,kind:`store`,label:e.slice(6),facet:`files`}:e.startsWith(`index:`)?{id:e,kind:`store`,label:e.slice(6),facet:`index`}:e.startsWith(`signal:`)?{id:e,kind:`signal`,label:e.slice(7)}:e.startsWith(`ai:`)?{id:e,kind:`ai`,label:e.slice(3)}:e.startsWith(`vault:`)?{id:e,kind:`vault`,label:e.slice(6)}:e.startsWith(`channel:`)?{id:e,kind:`channel`,label:e.slice(8)}:e.startsWith(`gate:`)?{id:e,kind:`gate`,label:e.slice(5)}:e.startsWith(`clock:`)?{id:e,kind:`clock`,label:e.slice(6)}:null}function b(e,t,n,r,i=!1){let a=f[r];return{id:e,source:t,target:n,type:`smoothstep`,animated:i,data:{kind:r},style:{stroke:a,strokeWidth:r===`calls`?2.5:2.25},pathOptions:{borderRadius:28},zIndex:m.edge,markerEnd:{type:o.ArrowClosed,width:14,height:14,color:a}}}function x(e){let t=e?.flows??{},n=new Set(Object.keys(t)),r=[],i=new Map;for(let e of[...n].sort()){let t=h(e),n=i.get(t)??[];n.push(e),i.set(t,n)}let a=new Map,o=new Map;for(let e of n){let n=t[e];if(!n)continue;if(n.trigger?.signal){let t=`signal:${n.trigger.signal}`,i=y(t);i&&a.set(t,i),r.push(b(`e:${t}->flow:${e}`,t,`flow:${e}`,`trigger`))}if(n.trigger?.cron||n.trigger?.every){let t=`clock:${e}`,i=n.trigger.cron??n.trigger.every??e;a.set(t,{id:t,kind:`clock`,label:i,facet:n.trigger.cron?`cron`:`every`}),r.push(b(`e:${t}->flow:${e}`,t,`flow:${e}`,`trigger`))}for(let t of n.gates??[]){let n=`gate:${t}`;a.set(n,{id:n,kind:`gate`,label:t}),o.set(n,(o.get(n)??0)+1),r.push(b(`e:flow:${e}-gates->${n}`,`flow:${e}`,n,`gates`))}let i=n.effects;if(i){for(let t of i.reads??[]){let n=y(t);n&&(a.set(t,n),o.set(t,(o.get(t)??0)+1),r.push(b(`e:flow:${e}-reads->${t}`,`flow:${e}`,t,`reads`)))}for(let t of i.writes??[]){let n=y(t);n&&(a.set(t,n),o.set(t,(o.get(t)??0)+1),r.push(b(`e:flow:${e}-writes->${t}`,`flow:${e}`,t,`writes`)))}for(let t of i.emits??[]){let n=`signal:${t}`,i=y(n);i&&(a.set(n,i),o.set(n,(o.get(n)??0)+1),r.push(b(`e:flow:${e}->${n}`,`flow:${e}`,n,`emits`)))}for(let t of i.asks??[]){let n=`ai:${t}`,i=y(n);i&&(a.set(n,i),o.set(n,(o.get(n)??0)+1),r.push(b(`e:flow:${e}->${n}`,`flow:${e}`,n,`asks`)))}for(let t of i.sends??[]){let n=`channel:${t}`,i=y(n);i&&(a.set(n,i),o.set(n,(o.get(n)??0)+1),r.push(b(`e:flow:${e}->${n}`,`flow:${e}`,n,`sends`)))}for(let t of i.secrets??[]){let n=`vault:${t}`,i=y(n);i&&(a.set(n,i),o.set(n,(o.get(n)??0)+1),r.push(b(`e:flow:${e}->${n}`,`flow:${e}`,n,`secrets`)))}for(let t of i.calls??[]){let n=u(t);if(n){let t=c(n.server);a.set(t,{id:t,kind:`ai`,label:n.server}),o.set(t,(o.get(t)??0)+1),r.push(b(`e:flow:${e}->${t}`,`flow:${e}`,t,`calls`,!0));continue}r.push(b(`e:flow:${e}->flow:${t}`,`flow:${e}`,`flow:${t}`,`calls`,!0))}}}return{nodes:S(i,t,a,o),edges:r,flowIds:n}}function S(e,t,n,r){let i=new s.graphlib.Graph({compound:!0});i.setGraph({rankdir:`LR`,align:`UL`,nodesep:16,ranksep:88,edgesep:12,marginx:8,marginy:8}),i.setDefaultEdgeLabel(()=>({}));for(let[t,n]of[...e.entries()].sort()){i.setNode(`unit:${t}`,{});for(let e of n)i.setNode(`flow:${e}`,{...d.flow}),i.setParent(`flow:${e}`,`unit:${t}`)}for(let e of n.values())i.setNode(e.id,{...d[e.kind]});let a=new Set;for(let n of e.values())for(let e of n){let n=t[e];if(!n)continue;let r=(e,t)=>{let n=`${e}->${t}`;a.has(n)||!i.hasNode(e)||!i.hasNode(t)||(a.add(n),i.setEdge(e,t))};n.trigger?.signal&&r(`signal:${n.trigger.signal}`,`flow:${e}`),(n.trigger?.cron||n.trigger?.every)&&r(`clock:${e}`,`flow:${e}`);for(let t of n.gates??[])r(`flow:${e}`,`gate:${t}`);let o=n.effects;if(o){for(let t of o.reads??[])r(`flow:${e}`,t);for(let t of o.writes??[])r(`flow:${e}`,t);for(let t of o.emits??[])r(`flow:${e}`,`signal:${t}`);for(let t of o.asks??[])r(`flow:${e}`,`ai:${t}`);for(let t of o.sends??[])r(`flow:${e}`,`channel:${t}`);for(let t of o.secrets??[])r(`flow:${e}`,`vault:${t}`);for(let t of o.calls??[]){let n=u(t);n?r(`flow:${e}`,c(n.server)):r(`flow:${e}`,`flow:${t}`)}}}s.layout(i);let o=[],{headerH:f,padX:p,padBottom:h}=l;for(let[n,r]of[...e.entries()].sort()){let e=`unit:${n}`,a=i.node(e);if(!a)continue;let s=a.x??0,c=a.y??0,l=r.length*d.flow.height+Math.max(0,r.length-1)*10,u=d.flow.width+p*2,_=f+l+h,v=s-u/2,y=c-_/2;o.push({id:e,type:`unit`,position:{x:v,y},data:{kind:`unit`,label:n,refId:e,badge:String(r.length)},selectable:!1,draggable:!1,zIndex:m.unit,width:u,height:_,style:{width:u,height:_}}),r.forEach((r,i)=>{let a=t[r];a&&o.push({id:`flow:${r}`,type:`flow`,position:{x:p,y:f+i*(d.flow.height+10)},parentId:e,extent:`parent`,zIndex:m.leaf,data:{kind:`flow`,label:g(r),refId:r,unit:n,plane:a.plane??`user`,badge:a.plane??`user`},draggable:!1,width:d.flow.width,height:d.flow.height,style:{width:d.flow.width,height:d.flow.height}})})}let _=[...n.values()].sort((e,t)=>e.kind.localeCompare(t.kind)||e.label.localeCompare(t.label));for(let e of _){let t=i.node(e.id),n=d[e.kind],a=r.get(e.id)??0;o.push({id:e.id,type:e.kind,position:{x:(t?.x??0)-n.width/2,y:(t?.y??0)-n.height/2},data:{kind:e.kind,label:e.label,refId:e.id,...e.facet===void 0?{}:{facet:e.facet},badge:e.facet??(a>0?String(a):e.kind)},draggable:!1,zIndex:m.leaf,width:n.width,height:n.height,style:{width:n.width,height:n.height}})}return o}function C(e,t,n,r={}){let i=t.size>0||n.size>0;return e.map(e=>{if(e.data.kind===`unit`||e.data.kind===`law`)return e;let a=e.data.kind===`flow`?t.has(e.data.refId):n.has(e.id);return{...e,data:{...e.data,highlighted:a,dimmed:i&&!a,active:r.activeNodeId!=null&&e.id===r.activeNodeId,focused:r.focusedNodeId!=null&&e.id===r.focusedNodeId}}})}function w(e,t){let n=new Map(t.map(e=>[e.id,e]));return t.some(e=>e.data.highlighted===!0)?e.map(e=>{let t=n.get(e.source),r=n.get(e.target),i=t?.data.highlighted===!0&&r?.data.highlighted===!0,a=f[e.data?.kind??`reads`];return{...e,animated:i?!0:e.animated,style:{...e.style,stroke:a,opacity:i?1:.32,strokeWidth:i?2.75:1.75},markerEnd:e.markerEnd&&typeof e.markerEnd==`object`?{...e.markerEnd,color:a}:e.markerEnd}}):e.map(e=>({...e,style:{...e.style,opacity:1}}))}var T=100;function E(e,t){return e.filter(e=>t.has(e.flow)).sort((e,t)=>t.startedAt-e.startedAt).slice(0,T)}var D=a();function O({cache:a,dataSlot:o}){let s=p(a);return(0,D.jsxs)(e,{children:[(0,D.jsx)(n,{render:e=>(0,D.jsx)(`span`,{...e,className:i(`flex w-4 shrink-0 items-center justify-center`,s.className),"data-slot":o,"data-cache":a,"aria-label":s.label,children:(0,D.jsx)(r,{icon:s.icon,className:`size-3`,"aria-hidden":!0})})}),(0,D.jsx)(t,{side:`top`,children:s.label})]})}export{w as a,h as c,C as i,E as n,x as o,g as r,v as s,O as t};
@@ -1 +0,0 @@
1
- import{S as e,Tr as t,Ur as n,bi as r,la as i,ti as a,ua as o,wi as s,wr as c}from"./shortcut-keys-CoqwEIi0.js";import{A as l}from"./xyflow-D7n4g6go.js";import{_ as u}from"./collapsible-LPqGvfoz.js";var d=l();function f({kind:e,className:i,hex:o,inferred:l}){return e===`pk`?(0,d.jsx)(t,{icon:r,className:c(`size-3 shrink-0 text-amber-500`,i),"aria-label":`Primary key`}):e===`unique`?(0,d.jsx)(t,{icon:a,className:c(`size-3 shrink-0 text-violet-500`,i),"aria-label":`Unique`}):e===`none`?(0,d.jsx)(t,{icon:n,className:c(`size-3 shrink-0 text-muted-foreground/35`,i),"aria-label":`No key`}):(0,d.jsx)(t,{icon:s,className:c(`size-3 shrink-0`,!o&&`text-sky-500`,i),style:o?{color:o}:void 0,"aria-label":l?`Inferred foreign key`:`Foreign key`})}function p({primaryKey:e,foreignKey:t,unique:n,inferred:r,hex:i,empty:a=`spacer`}){let o=n===!0&&e!==!0;return!e&&!t&&!o?a===`none`?(0,d.jsx)(`span`,{className:`inline-flex shrink-0 items-center`,title:`None`,children:(0,d.jsx)(f,{kind:`none`})}):(0,d.jsx)(`span`,{className:`inline-flex w-3 shrink-0`,"aria-hidden":!0}):(0,d.jsxs)(`span`,{className:`inline-flex shrink-0 items-center gap-px`,children:[e?(0,d.jsx)(f,{kind:`pk`}):null,t?(0,d.jsx)(f,{kind:`fk`,hex:i,inferred:r}):null,o?(0,d.jsx)(f,{kind:`unique`}):null]})}var m=`[redacted]`;function h(e){let t=[e],n=y(e),r=b(e);return n!==e&&t.push(n),r!==e&&t.push(r),t}function g(e,t){for(let n of h(t))e.add(n)}function _(e){let t=new Set;for(let n of e)g(t,n);return t}function v(e){let t=new Set;for(let n of e)t.add(y(n));return t.size}function y(e){return e.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).replace(/([A-Z])([A-Z][a-z])/g,`$1_$2`).toLowerCase()}function b(e){return e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase())}function x({piiMasked:n,disabled:r,onToggle:a}){return(0,d.jsx)(u,{label:n?`PII hidden. Click to include cleartext (audited).`:`PII included. Click to remask.`,className:`flex self-stretch`,children:(0,d.jsxs)(e,{type:`button`,variant:`ghost`,size:`sm`,disabled:r,className:c(`h-full rounded-none px-2 text-[11px]`,!n&&`text-amber-800 dark:text-amber-300`),"aria-pressed":!n,"aria-label":n?`Include PII: disabled`:`Include PII: enabled`,onClick:a,"data-slot":`call-api-pii`,children:[(0,d.jsx)(t,{icon:n?o:i,"data-icon":`inline-start`,className:`size-3.5`}),`PII`]})})}export{v as a,_ as i,m as n,p as o,g as r,f as s,x as t};
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{C as t,D as n,E as r,F as i,Hn as a,I as o,Mt as s,Nt as c,Pt as l,Qr as u,Qt as d,R as f,Si as p,Tr as m,Ui as h,Un as g,W as _,Wr as v,X as y,Y as b,_i as x,bi as S,dn as C,en as w,gn as T,ht as E,in as ee,k as D,ki as O,kn as k,kr as A,mr as j,mt as te,nn as ne,or as re,pi as ie,pt as ae,rn as oe,t as M,tn as se,wr as N,x as ce,xi as le,yi as ue}from"./shortcut-keys-CoqwEIi0.js";import{r as de}from"./react-dom-Bph1y7z7.js";import{A as fe}from"./xyflow-D7n4g6go.js";var P=fe();function pe({label:e,keys:t,className:n,children:r}){return(0,P.jsxs)(i,{children:[(0,P.jsx)(f,{render:e=>(0,P.jsx)(`span`,{...e,className:N(`inline-flex items-center`,n),tabIndex:-1,children:r})}),(0,P.jsxs)(o,{side:`bottom`,className:`text-[11px]`,children:[e,t&&t.length>0?(0,P.jsx)(M,{keys:t}):null]})]})}function me({open:e,onToggle:t,noun:n,controlsId:r,dataSlot:i}){let a=e?`Collapse ${n}`:`Expand ${n}`;return(0,P.jsx)(pe,{label:a,className:`flex self-stretch`,children:(0,P.jsx)(`button`,{type:`button`,"aria-expanded":e,"aria-controls":r,"aria-label":a,"data-slot":i,onClick:t,className:re,children:(0,P.jsx)(m,{icon:e?le:p,className:`size-3.5`})})})}var F=e(de(),1);function he(e,t){let n=getComputedStyle(e);return t*parseFloat(n.fontSize)}function ge(e,t){let n=getComputedStyle(e.ownerDocument.documentElement);return t*parseFloat(n.fontSize)}function _e(e){return e/100*window.innerHeight}function ve(e){return e/100*window.innerWidth}function ye(e){switch(typeof e){case`number`:return[e,`px`];case`string`:{let t=parseFloat(e);return e.endsWith(`%`)?[t,`%`]:e.endsWith(`px`)?[t,`px`]:e.endsWith(`rem`)?[t,`rem`]:e.endsWith(`em`)?[t,`em`]:e.endsWith(`vh`)?[t,`vh`]:e.endsWith(`vw`)?[t,`vw`]:[t,`%`]}}}function be({groupSize:e,panelElement:t,styleProp:n}){let r,[i,a]=ye(n);switch(a){case`%`:r=i/100*e;break;case`px`:r=i;break;case`rem`:r=ge(t,i);break;case`em`:r=he(t,i);break;case`vh`:r=_e(i);break;case`vw`:r=ve(i)}return r}function I(e){return parseFloat(e.toFixed(3))}function L({group:e}){let{orientation:t,panels:n}=e;return n.reduce((e,n)=>(e+=t===`horizontal`?n.element.offsetWidth:n.element.offsetHeight,e),0)}function xe(e){let{panels:t}=e,n=L({group:e});return n===0?t.map(e=>({groupResizeBehavior:e.panelConstraints.groupResizeBehavior,collapsedSize:0,collapsible:e.panelConstraints.collapsible===!0,defaultSize:void 0,disabled:e.panelConstraints.disabled,minSize:0,maxSize:100,panelId:e.id})):t.map(e=>{let{element:t,panelConstraints:r}=e,i=0;r.collapsedSize!==void 0&&(i=I(be({groupSize:n,panelElement:t,styleProp:r.collapsedSize})/n*100));let a;r.defaultSize!==void 0&&(a=I(be({groupSize:n,panelElement:t,styleProp:r.defaultSize})/n*100));let o=0;r.minSize!==void 0&&(o=I(be({groupSize:n,panelElement:t,styleProp:r.minSize})/n*100));let s=100;return r.maxSize!==void 0&&(s=I(be({groupSize:n,panelElement:t,styleProp:r.maxSize})/n*100)),{groupResizeBehavior:r.groupResizeBehavior,collapsedSize:i,collapsible:r.collapsible===!0,defaultSize:a,disabled:r.disabled,minSize:o,maxSize:s,panelId:e.id}})}function R(e,t=`Assertion error`){if(!e)throw Error(t)}function Se(e,t){return Array.from(t).sort(e===`horizontal`?Ce:we)}function Ce(e,t){let n=e.element.offsetLeft-t.element.offsetLeft;return n===0?e.element.offsetWidth-t.element.offsetWidth:n}function we(e,t){let n=e.element.offsetTop-t.element.offsetTop;return n===0?e.element.offsetHeight-t.element.offsetHeight:n}function Te(e){return typeof e==`object`&&!!e&&`nodeType`in e&&e.nodeType===Node.ELEMENT_NODE}function Ee(e,t){return{x:e.x>=t.left&&e.x<=t.right?0:Math.min(Math.abs(e.x-t.left),Math.abs(e.x-t.right)),y:e.y>=t.top&&e.y<=t.bottom?0:Math.min(Math.abs(e.y-t.top),Math.abs(e.y-t.bottom))}}function De({orientation:e,rects:t,targetRect:n}){let r={x:n.x+n.width/2,y:n.y+n.height/2},i,a=Number.MAX_VALUE;for(let n of t){let{x:t,y:o}=Ee(r,n),s=e===`horizontal`?t:o;s<a&&(a=s,i=n)}return R(i,`No rect found`),i}var Oe;function ke(){return Oe===void 0&&(Oe=typeof matchMedia==`function`&&!!matchMedia(`(pointer:coarse)`).matches),Oe}function Ae(e){let{element:t,orientation:n,panels:r,separators:i}=e,a=Se(n,Array.from(t.children).filter(Te).map(e=>({element:e}))).map(({element:e})=>e),o=[],s=!1,c=!1,l=-1,u=-1,d=0,f,p=[];{let e=-1;for(let t of a)t.hasAttribute(`data-panel`)&&(e++,t.hasAttribute(`data-disabled`)||(d++,l===-1&&(l=e),u=e))}if(d>1){let t=-1;for(let d of a)if(d.hasAttribute(`data-panel`)){t++;let i=r.find(e=>e.element===d);if(i){if(f){let r=f.element.getBoundingClientRect(),a=d.getBoundingClientRect(),m;if(c){let e=n===`horizontal`?new DOMRect(r.right,r.top,0,r.height):new DOMRect(r.left,r.bottom,r.width,0),t=n===`horizontal`?new DOMRect(a.left,a.top,0,a.height):new DOMRect(a.left,a.top,a.width,0);switch(p.length){case 0:m=[e,t];break;case 1:{let i=p[0];m=[i,De({orientation:n,rects:[r,a],targetRect:i.element.getBoundingClientRect()})===r?t:e];break}default:m=p}}else m=p.length?p:[n===`horizontal`?new DOMRect(r.right,a.top,a.left-r.right,a.height):new DOMRect(a.left,r.bottom,a.width,a.top-r.bottom)];for(let n of m){let r=`width`in n?n:n.element.getBoundingClientRect(),a=ke()?e.resizeTargetMinimumSize.coarse:e.resizeTargetMinimumSize.fine;if(r.width<a){let e=a-r.width;r=new DOMRect(r.x-e/2,r.y,r.width+e,r.height)}if(r.height<a){let e=a-r.height;r=new DOMRect(r.x,r.y-e/2,r.width,r.height+e)}!s&&!(t<=l||t>u)&&o.push({group:e,groupSize:L({group:e}),panels:[f,i],separator:`width`in n?void 0:n,rect:r}),s=!1}}c=!1,f=i,p=[]}}else if(d.hasAttribute(`data-separator`)){d.ariaDisabled!==null&&(s=!0);let e=i.find(e=>e.element===d);e?p.push(e):(f=void 0,p=[])}else c=!0}return o}var je=class{#e={};addListener(e,t){let n=this.#e[e];return n===void 0?this.#e[e]=[t]:n.includes(t)||n.push(t),()=>{this.removeListener(e,t)}}emit(e,t){let n=this.#e[e];if(n!==void 0)if(n.length===1)n[0].call(null,t);else{let e=!1,r=null,i=Array.from(n);for(let n=0;n<i.length;n++){let a=i[n];try{a.call(null,t)}catch(t){r===null&&(e=!0,r=t)}}if(e)throw r}}removeAllListeners(){this.#e={}}removeListener(e,t){let n=this.#e[e];if(n!==void 0){let e=n.indexOf(t);e>=0&&n.splice(e,1)}}},z={cursorFlags:0,state:`inactive`},Me=new je;function B(){return z}function Ne(e){return Me.addListener(`change`,e)}function Pe(e){let t=z,n={...z};n.cursorFlags=e,z=n,Me.emit(`change`,{prev:t,next:n})}function V(e){let t=z;z=e,Me.emit(`change`,{prev:t,next:e})}var Fe=e=>e,Ie=()=>{},Le=1,Re=2,ze=4,Be=8,Ve=3,He=12,Ue;function We(){return Ue===void 0&&(Ue=!1,typeof window<`u`&&(window.navigator.userAgent.includes(`Chrome`)||window.navigator.userAgent.includes(`Firefox`))&&(Ue=!0)),Ue}function Ge({cursorFlags:e,groups:t,state:n}){let r=0,i=0;switch(n){case`active`:case`hover`:t.forEach(e=>{if(!e.mutableState.disableCursor)switch(e.orientation){case`horizontal`:r++;break;case`vertical`:i++;break}})}if(r!==0||i!==0){if(n===`active`&&e&&We()){let t=(e&Le)!==0,n=(e&Re)!==0,r=(e&ze)!==0,i=(e&Be)!==0;if(t)return r?`se-resize`:i?`ne-resize`:`e-resize`;if(n)return r?`sw-resize`:i?`nw-resize`:`w-resize`;if(r)return`s-resize`;if(i)return`n-resize`}return We()?r>0&&i>0?`move`:r>0?`ew-resize`:`ns-resize`:r>0&&i>0?`grab`:r>0?`col-resize`:`row-resize`}}var Ke=new WeakMap;function qe(e){if(e.defaultView===null||e.defaultView===void 0)return;let{prevStyle:t,styleSheet:n}=Ke.get(e)??{};n===void 0&&(n=new e.defaultView.CSSStyleSheet,e.adoptedStyleSheets&&(Object.isExtensible(e.adoptedStyleSheets)?e.adoptedStyleSheets.push(n):e.adoptedStyleSheets=[...e.adoptedStyleSheets,n]));let r=B();switch(r.state){case`active`:case`hover`:{let e=Ge({cursorFlags:r.cursorFlags,groups:r.hitRegions.map(e=>e.group),state:r.state}),i=`*, *:hover {cursor: ${e} !important; }`;if(t===i)return;t=i,e?n.cssRules.length===0?n.insertRule(i):n.replaceSync(i):n.cssRules.length===1&&n.deleteRule(0);break}case`inactive`:t=void 0,n.cssRules.length===1&&n.deleteRule(0)}Ke.set(e,{prevStyle:t,styleSheet:n})}var H=new Map,Je=new je;function Ye(e){H=new Map(H),H.delete(e)}function Xe(e,t){for(let[t]of H)if(t.id===e)return t}function U(e,t){for(let[t,n]of H)if(t.id===e)return n;if(t)throw Error(`Could not find data for Group with id ${e}`)}function W(){return H}function Ze(e,t){return Je.addListener(`groupChange`,n=>{n.group.id===e&&t(n)})}function G(e,t,n){let r=H.get(e);H=new Map(H),H.set(e,t),Je.emit(`groupChange`,{group:e,isUserInteraction:n?.isUserInteraction===!0,prev:r,next:t})}function Qe(e){let t=B(),n=!1;return t.state===`active`&&(V({cursorFlags:0,state:`inactive`}),t.hitRegions.length>0&&(qe(e),n=!0,t.hitRegions.forEach(e=>{let t=U(e.group.id,!0);G(e.group,t,{isUserInteraction:!0})}))),n}function $e(e){e.defaultPrevented||Qe(e.currentTarget)}function et(e,t,n){let r,i={x:1/0,y:1/0};for(let a of t){let t=Ee(n,a.rect);switch(e){case`horizontal`:t.x<=i.x&&(r=a,i=t);break;case`vertical`:t.y<=i.y&&(r=a,i=t)}}return r?{distance:i,hitRegion:r}:void 0}function tt(e){return typeof e==`object`&&!!e&&`nodeType`in e&&e.nodeType===Node.DOCUMENT_FRAGMENT_NODE}function nt(e,t){if(e===t)throw Error(`Cannot compare node with itself`);let n={a:ct(e),b:ct(t)},r;for(;n.a.at(-1)===n.b.at(-1);)r=n.a.pop(),n.b.pop();R(r,`Stacking order can only be calculated for elements with a common ancestor`);let i={a:st(ot(n.a)),b:st(ot(n.b))};if(i.a===i.b){let e=r.childNodes,t={a:n.a.at(-1),b:n.b.at(-1)},i=e.length;for(;i--;){let n=e[i];if(n===t.a)return 1;if(n===t.b)return-1}}return Math.sign(i.a-i.b)}var rt=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function it(e){let t=getComputedStyle(lt(e)??e).display;return t===`flex`||t===`inline-flex`}function at(e){let t=getComputedStyle(e);return!!(t.position===`fixed`||t.zIndex!==`auto`&&(t.position!==`static`||it(e))||+t.opacity<1||`transform`in t&&t.transform!==`none`||`webkitTransform`in t&&t.webkitTransform!==`none`||`mixBlendMode`in t&&t.mixBlendMode!==`normal`||`filter`in t&&t.filter!==`none`||`webkitFilter`in t&&t.webkitFilter!==`none`||`isolation`in t&&t.isolation===`isolate`||rt.test(t.willChange)||t.webkitOverflowScrolling===`touch`)}function ot(e){let t=e.length;for(;t--;){let n=e[t];if(R(n,`Missing node`),at(n))return n}return null}function st(e){return e&&Number(getComputedStyle(e).zIndex)||0}function ct(e){let t=[];for(;e;)t.push(e),e=lt(e);return t}function lt(e){let{parentNode:t}=e;return tt(t)?t.host:t}function ut(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function dt({groupElement:e,hitRegion:t,pointerEventTarget:n}){if(!Te(n)||n.contains(e)||e.contains(n))return!0;if(nt(n,e)>0){let r=n;for(;r;){if(r.contains(e))return!0;if(ut(r.getBoundingClientRect(),t))return!1;r=r.parentElement}}return!0}function ft(e,t){let n=[];return t.forEach((t,r)=>{if(r.disabled)return;let i=Ae(r),a=et(r.orientation,i,{x:e.clientX,y:e.clientY});a&&a.distance.x<=0&&a.distance.y<=0&&dt({groupElement:r.element,hitRegion:a.hitRegion.rect,pointerEventTarget:e.target})&&n.push(a.hitRegion)}),n}function pt(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!=t[n])return!1;return!0}function K(e,t,n=0){return Math.abs(I(e)-I(t))<=n}function q(e,t){return K(e,t)?0:e>t?1:-1}function J({overrideDisabledPanels:e,panelConstraints:t,prevSize:n,size:r}){let{collapsedSize:i=0,collapsible:a,disabled:o,maxSize:s=100,minSize:c=0}=t;if(o&&!e)return n;if(q(r,c)<0)if(a){let e=(i+c)/2;r=q(r,e)<0?i:c}else r=c;return r=Math.min(s,r),r=I(r),r}function mt({delta:e,initialLayout:t,panelConstraints:n,pivotIndices:r,prevLayout:i,trigger:a}){if(K(e,0))return t;let o=a===`imperative-api`,s=Object.values(t),c=Object.values(i),l=[...s],[u,d]=r;R(u!=null,`Invalid first pivot index`),R(d!=null,`Invalid second pivot index`);let f=0;switch(a){case`keyboard`:{let t=e<0?d:u,r=n[t];R(r,`Panel constraints not found for index ${t}`);let{collapsedSize:i=0,collapsible:a,minSize:o=0}=r;if(a){let n=s[t];if(R(n!=null,`Previous layout not found for panel index ${t}`),K(n,i)){let t=o-n;q(t,Math.abs(e))>0&&(e=e<0?0-t:t)}}}{let t=e<0?u:d,r=n[t];R(r,`No panel constraints found for index ${t}`);let{collapsedSize:i=0,collapsible:a,minSize:o=0}=r;if(a){let n=s[t];if(R(n!=null,`Previous layout not found for panel index ${t}`),K(n,o)){let t=n-i;q(t,Math.abs(e))>0&&(e=e<0?0-t:t)}}}break;default:{let t=e<0?d:u,r=n[t];R(r,`Panel constraints not found for index ${t}`);let i=s[t],{collapsible:a,collapsedSize:o,minSize:c}=r;if(a&&q(i,c)<0)if(e>0){let t=c-o,n=t/2;q(i+e,c)<0&&(e=q(e,n)<=0?0:t)}else{let t=c-o,n=100-t/2;q(i-e,c)<0&&(e=q(100+e,n)>0?0:-t)}break}}{let t=e<0?1:-1,r=e<0?d:u,i=0;for(;;){let e=s[r];R(e!=null,`Previous layout not found for panel index ${r}`);let a=J({overrideDisabledPanels:o,panelConstraints:n[r],prevSize:e,size:100})-e;if(i+=a,r+=t,r<0||r>=n.length)break}let a=Math.min(Math.abs(e),Math.abs(i));e=e<0?0-a:a}{let t=e<0?u:d;for(;t>=0&&t<n.length;){let r=Math.abs(e)-Math.abs(f),i=s[t];R(i!=null,`Previous layout not found for panel index ${t}`);let a=i-r,c=J({overrideDisabledPanels:o,panelConstraints:n[t],prevSize:i,size:a});if(!K(i,c)&&(f+=i-c,l[t]=c,f.toFixed(3).localeCompare(Math.abs(e).toFixed(3),void 0,{numeric:!0})>=0))break;e<0?t--:t++}}if(pt(c,l))return i;{let t=e<0?d:u,r=s[t];R(r!=null,`Previous layout not found for panel index ${t}`);let i=r+f,a=J({overrideDisabledPanels:o,panelConstraints:n[t],prevSize:r,size:i});if(l[t]=a,!K(a,i)){let t=i-a,r=e<0?d:u;for(;r>=0&&r<n.length;){let i=l[r];R(i!=null,`Previous layout not found for panel index ${r}`);let a=i+t,s=J({overrideDisabledPanels:o,panelConstraints:n[r],prevSize:i,size:a});if(K(i,s)||(t-=s-i,l[r]=s),K(t,0))break;e>0?r--:r++}}}if(!K(Object.values(l).reduce((e,t)=>t+e,0),100,.1))return i;let p=Object.keys(i);return l.reduce((e,t,n)=>(e[p[n]]=t,e),{})}function Y(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(t[n]===void 0||q(e[n],t[n])!==0)return!1;return!0}function X({layout:e,panelConstraints:t}){let n=Object.values(e),r=[...n],i=r.reduce((e,t)=>e+t,0);if(r.length!==t.length)throw Error(`Invalid ${t.length} panel layout: ${r.map(e=>`${e}%`).join(`, `)}`);if(!K(i,100)&&r.length>0)for(let e=0;e<t.length;e++){let t=r[e];R(t!=null,`No layout data found for index ${e}`);let n=100/i*t;r[e]=n}let a=0;for(let e=0;e<t.length;e++){let i=n[e];R(i!=null,`No layout data found for index ${e}`);let o=r[e];R(o!=null,`No layout data found for index ${e}`);let s=J({overrideDisabledPanels:!0,panelConstraints:t[e],prevSize:i,size:o});o!=s&&(a+=o-s,r[e]=s)}if(!K(a,0))for(let e=0;e<t.length;e++){let n=r[e];R(n!=null,`No layout data found for index ${e}`);let i=n+a,o=J({overrideDisabledPanels:!0,panelConstraints:t[e],prevSize:n,size:i});if(n!==o&&(a-=o-n,r[e]=o,K(a,0)))break}let o=Object.keys(e);return r.reduce((e,t,n)=>(e[o[n]]=t,e),{})}function ht({groupId:e,panelId:t}){let n=()=>{let t=W();for(let[n,{defaultLayoutDeferred:r,derivedPanelConstraints:i,layout:a,groupSize:o,separatorToPanels:s}]of t)if(n.id===e)return{defaultLayoutDeferred:r,derivedPanelConstraints:i,group:n,groupSize:o,layout:a,separatorToPanels:s};throw Error(`Group ${e} not found`)},r=()=>{let e=n().derivedPanelConstraints.find(e=>e.panelId===t);if(e!==void 0)return e;throw Error(`Panel constraints not found for Panel ${t}`)},i=()=>{let e=n().group.panels.find(e=>e.id===t);if(e!==void 0)return e;throw Error(`Layout not found for Panel ${t}`)},a=()=>{let e=n().layout[t];if(e!==void 0)return e;throw Error(`Layout not found for Panel ${t}`)},o=({nextSize:e,panels:n,prevLayout:r,derivedPanelConstraints:i})=>{let o=a(),s=n.findIndex(e=>e.id===t),c=s===0,l=s===n.length-1;if(l&&e<o&&(c||n.slice(0,s).every((e,t)=>{let n=i[t];return n?.collapsible&&K(n.collapsedSize,r[n.panelId])}))){let e=n.slice(0,s).reduce((e,t)=>e+r[t.id],0);return{...r,[t]:I(100-e)}}return mt({delta:l?o-e:e-o,initialLayout:r,panelConstraints:i,pivotIndices:l?[s-1,s]:[s,s+1],prevLayout:r,trigger:`imperative-api`})},s=e=>{if(e===a())return;let{defaultLayoutDeferred:t,derivedPanelConstraints:r,group:i,groupSize:s,layout:c,separatorToPanels:l}=n(),u=X({layout:o({nextSize:e,panels:i.panels,prevLayout:c,derivedPanelConstraints:r}),panelConstraints:r});Y(c,u)||G(i,{defaultLayoutDeferred:t,derivedPanelConstraints:r,groupSize:s,layout:u,separatorToPanels:l})};return{collapse:()=>{let{collapsible:e,collapsedSize:t}=r(),{mutableValues:n}=i(),o=a();e&&o!==t&&(n.expandToSize=o,s(t))},expand:()=>{let{collapsible:e,collapsedSize:t,minSize:n}=r(),{mutableValues:o}=i(),c=a();if(e&&c===t){let e=o.expandToSize??n;e===0&&(e=1),s(e)}},getSize:()=>{let{group:e}=n(),t=a(),{element:r}=i();return{asPercentage:t,inPixels:e.orientation===`horizontal`?r.offsetWidth:r.offsetHeight}},isCollapsed:()=>{let{collapsible:e,collapsedSize:t}=r(),n=a();return e&&K(t,n)},resize:e=>{let{group:t}=n(),{element:r}=i(),a=L({group:t}),o=I(be({groupSize:a,panelElement:r,styleProp:e})/a*100);s(o)}}}function gt(e){e.defaultPrevented||ft(e,W()).forEach(t=>{if(t.separator&&!t.separator.disableDoubleClick){let n=t.panels.find(e=>e.panelConstraints.defaultSize!==void 0);if(n){let r=n.panelConstraints.defaultSize,i=ht({groupId:t.group.id,panelId:n.id});i&&r!==void 0&&(i.resize(r),e.preventDefault())}}})}function _t(e){let t=W();for(let[n]of t)if(n.separators.some(t=>t.element===e))return n;throw Error(`Could not find parent Group for separator element`)}function vt({groupId:e}){let t=()=>{let t=W();for(let[n,r]of t)if(n.id===e)return{group:n,...r};throw Error(`Could not find Group with id "${e}"`)};return{getLayout(){let{defaultLayoutDeferred:e,layout:n}=t();return e?{}:n},setLayout(e){let{defaultLayoutDeferred:n,derivedPanelConstraints:r,group:i,groupSize:a,layout:o,separatorToPanels:s}=t(),c=X({layout:e,panelConstraints:r});return n?o:(Y(o,c)||G(i,{defaultLayoutDeferred:n,derivedPanelConstraints:r,groupSize:a,layout:c,separatorToPanels:s}),c)}}}function Z(e,t){let n=_t(e),r=U(n.id,!0),i=n.separators.find(t=>t.element===e);R(i,`Matching separator not found`);let a=r.separatorToPanels.get(i);R(a,`Matching panels not found`);let o=a.map(e=>n.panels.indexOf(e)),s=vt({groupId:n.id}).getLayout(),c=X({layout:mt({delta:t,initialLayout:s,panelConstraints:r.derivedPanelConstraints,pivotIndices:o,prevLayout:s,trigger:`keyboard`}),panelConstraints:r.derivedPanelConstraints});Y(s,c)||G(n,{defaultLayoutDeferred:r.defaultLayoutDeferred,derivedPanelConstraints:r.derivedPanelConstraints,groupSize:r.groupSize,layout:c,separatorToPanels:r.separatorToPanels},{isUserInteraction:!0})}function yt(e){if(e.defaultPrevented)return;let t=e.currentTarget,n=_t(t);if(!n.disabled)switch(e.key){case`ArrowDown`:e.preventDefault(),n.orientation===`vertical`&&Z(t,5);break;case`ArrowLeft`:e.preventDefault(),n.orientation===`horizontal`&&Z(t,-5);break;case`ArrowRight`:e.preventDefault(),n.orientation===`horizontal`&&Z(t,5);break;case`ArrowUp`:e.preventDefault(),n.orientation===`vertical`&&Z(t,-5);break;case`End`:e.preventDefault(),Z(t,100);break;case`Enter`:{e.preventDefault();let n=_t(t),{derivedPanelConstraints:r,layout:i,separatorToPanels:a}=U(n.id,!0),o=n.separators.find(e=>e.element===t);R(o,`Matching separator not found`);let s=a.get(o);R(s,`Matching panels not found`);let c=s[0],l=r.find(e=>e.panelId===c.id);if(R(l,`Panel metadata not found`),l.collapsible){let e=i[c.id];Z(t,(l.collapsedSize===e?n.mutableState.expandedPanelSizes[c.id]??l.minSize:l.collapsedSize)-e)}break}case`F6`:{e.preventDefault();let n=_t(t).separators.map(e=>e.element),r=Array.from(n).findIndex(t=>t===e.currentTarget);R(r!==null,`Index not found`),n[e.shiftKey?r>0?r-1:n.length-1:r+1<n.length?r+1:0].focus({preventScroll:!0});break}case`Home`:e.preventDefault(),Z(t,-100);break}}function bt(e){if(e.defaultPrevented||e.pointerType===`mouse`&&e.button>0)return;let t=W(),n=ft(e,t),r=new Map,i=!1;n.forEach(e=>{e.separator&&(i||(i=!0,e.separator.element.focus({focusVisible:!1,preventScroll:!0})));let n=t.get(e.group);n&&r.set(e.group,n.layout)}),V({cursorFlags:0,hitRegions:n,initialLayoutMap:r,pointerDownAtPoint:{x:e.clientX,y:e.clientY},state:`active`}),n.length&&e.preventDefault()}function xt({document:e,event:t,hitRegions:n,initialLayoutMap:r,mountedGroups:i,pointerDownAtPoint:a,prevCursorFlags:o}){let s=0;n.forEach(e=>{let{group:n,groupSize:o}=e,{orientation:c,panels:l}=n,{disableCursor:u}=n.mutableState,d=0;d=a?c===`horizontal`?(t.clientX-a.x)/o*100:(t.clientY-a.y)/o*100:c===`horizontal`?t.clientX<0?-100:100:t.clientY<0?-100:100;let f=r.get(n),p=i.get(n);if(!f||!p)return;let{defaultLayoutDeferred:m,derivedPanelConstraints:h,groupSize:g,layout:_,separatorToPanels:v}=p;if(h&&_&&v){let t=mt({delta:d,initialLayout:f,panelConstraints:h,pivotIndices:e.panels.map(e=>l.indexOf(e)),prevLayout:_,trigger:`mouse-or-touch`});if(Y(t,_)){if(d!==0&&!u)switch(c){case`horizontal`:s|=d<0?Le:Re;break;case`vertical`:s|=d<0?ze:Be;break}}else G(e.group,{defaultLayoutDeferred:m,derivedPanelConstraints:h,groupSize:g,layout:t,separatorToPanels:v})}});let c=0;t.movementX===0?c|=o&Ve:c|=s&Ve,t.movementY===0?c|=o&He:c|=s&He,Pe(c),qe(e)}function St(e){let t=W(),n=B();n.state===`active`&&xt({document:e.currentTarget,event:e,hitRegions:n.hitRegions,initialLayoutMap:n.initialLayoutMap,mountedGroups:t,prevCursorFlags:n.cursorFlags})}function Ct(e){if(e.defaultPrevented)return;let t=B(),n=W();switch(t.state){case`active`:if(e.buttons===0){V({cursorFlags:0,state:`inactive`}),t.hitRegions.forEach(e=>{let t=U(e.group.id,!0);G(e.group,t,{isUserInteraction:!0})});return}for(let n of t.hitRegions)if(n.separator){let{element:t}=n.separator;t.hasPointerCapture?.(e.pointerId)||t.setPointerCapture?.(e.pointerId)}xt({document:e.currentTarget,event:e,hitRegions:t.hitRegions,initialLayoutMap:t.initialLayoutMap,mountedGroups:n,pointerDownAtPoint:t.pointerDownAtPoint,prevCursorFlags:t.cursorFlags});break;default:{let r=ft(e,n);r.length===0?t.state!==`inactive`&&V({cursorFlags:0,state:`inactive`}):V({cursorFlags:0,hitRegions:r,state:`hover`}),qe(e.currentTarget);break}}}function wt(e){if(e.relatedTarget instanceof HTMLIFrameElement)switch(B().state){case`hover`:V({cursorFlags:0,state:`inactive`})}}function Tt(e){e.defaultPrevented||e.pointerType===`mouse`&&e.button>0||Qe(e.currentTarget)&&e.preventDefault()}function Et(e){let t=0,n=0,r={};for(let i of e)if(i.defaultSize!==void 0){t++;let e=I(i.defaultSize);n+=e,r[i.panelId]=e}else r[i.panelId]=void 0;let i=e.length-t;if(i!==0){let t=I((100-n)/i);for(let n of e)n.defaultSize===void 0&&(r[n.panelId]=t)}return r}function Dt(e,t,n){if(!n[0])return;let r=e.panels.find(e=>e.element===t);if(!r||!r.onResize)return;let i=L({group:e}),a=e.orientation===`horizontal`?r.element.offsetWidth:r.element.offsetHeight,o=r.mutableValues.prevSize,s={asPercentage:I(a/i*100),inPixels:a};r.mutableValues.prevSize=s,r.onResize(s,r.id,o)}function Ot(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(e[n]!==t[n])return!1;return!0}function kt({group:e,nextGroupSize:t,prevGroupSize:n,prevLayout:r}){if(n<=0||t<=0||n===t)return r;let i=0,a=0,o=!1,s=new Map,c=[];for(let l of e.panels){let e=r[l.id]??0;switch(l.panelConstraints.groupResizeBehavior){case`preserve-pixel-size`:{o=!0;let r=I(e/100*n/t*100);s.set(l.id,r),i+=r;break}default:c.push(l.id),a+=e}}if(!o||c.length===0)return r;let l=100-i,u={...r};if(s.forEach((e,t)=>{u[t]=e}),a>0)for(let e of c)u[e]=I((r[e]??0)/a*l);else{let e=I(l/c.length);for(let t of c)u[t]=e}return u}function At(e,t){let n=e.map(e=>e.id),r=Object.keys(t);if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}var Q=new Map;function jt(e){let t=!0;R(e.element.ownerDocument.defaultView,`Cannot register an unmounted Group`);let n=e.element.ownerDocument.defaultView.ResizeObserver,r=new Set,i=new Set,a=new n(n=>{for(let r of n){let{borderBoxSize:n,target:i}=r;if(i===e.element){if(t){let t=L({group:e});if(t===0)return;let n=U(e.id);if(!n)return;let r=xe(e),i=n.defaultLayoutDeferred?Et(r):n.layout,a=X({layout:kt({group:e,nextGroupSize:t,prevGroupSize:n.groupSize,prevLayout:i}),panelConstraints:r});if(!n.defaultLayoutDeferred&&Y(n.layout,a)&&Ot(n.derivedPanelConstraints,r)&&n.groupSize===t)return;G(e,{defaultLayoutDeferred:!1,derivedPanelConstraints:r,groupSize:t,layout:a,separatorToPanels:n.separatorToPanels})}}else Dt(e,i,n)}});a.observe(e.element),e.panels.forEach(e=>{R(!r.has(e.id),`Panel ids must be unique; id "${e.id}" was used more than once`),r.add(e.id),e.onResize&&a.observe(e.element)});let o=L({group:e}),s=xe(e),c=e.panels.map(({id:e})=>e).join(`,`),l=e.mutableState.defaultLayout;l&&(At(e.panels,l)||(l=void 0));let u=X({layout:e.mutableState.layouts[c]??l??Et(s),panelConstraints:s}),d=e.element.ownerDocument;Q.set(d,(Q.get(d)??0)+1);let f=new Map;return Ae(e).forEach(e=>{e.separator&&f.set(e.separator,e.panels)}),G(e,{defaultLayoutDeferred:o===0,derivedPanelConstraints:s,groupSize:o,layout:u,separatorToPanels:f}),e.separators.forEach(e=>{R(!i.has(e.id),`Separator ids must be unique; id "${e.id}" was used more than once`),i.add(e.id),e.element.addEventListener(`keydown`,yt)}),Q.get(d)===1&&(d.addEventListener(`contextmenu`,$e,!0),d.addEventListener(`dblclick`,gt,!0),d.addEventListener(`pointerdown`,bt,!0),d.addEventListener(`pointerleave`,St),d.addEventListener(`pointermove`,Ct),d.addEventListener(`pointerout`,wt),d.addEventListener(`pointerup`,Tt,!0)),function(){t=!1,Q.set(d,Math.max(0,(Q.get(d)??0)-1)),Ye(e),e.separators.forEach(e=>{e.element.removeEventListener(`keydown`,yt)}),Q.get(d)||(d.removeEventListener(`contextmenu`,$e,!0),d.removeEventListener(`dblclick`,gt,!0),d.removeEventListener(`pointerdown`,bt,!0),d.removeEventListener(`pointerleave`,St),d.removeEventListener(`pointermove`,Ct),d.removeEventListener(`pointerout`,wt),d.removeEventListener(`pointerup`,Tt,!0)),a.disconnect()}}function Mt(){let[e,t]=(0,F.useState)({});return[e,(0,F.useCallback)(()=>t({}),[])]}function Nt(e){let t=(0,F.useId)();return`${e??t}`}var $=typeof window<`u`?F.useLayoutEffect:F.useEffect;function Pt(e){let t=(0,F.useRef)(e);return $(()=>{t.current=e},[e]),(0,F.useCallback)((...e)=>t.current?.(...e),[t])}function Ft(...e){return Pt(t=>{e.forEach(e=>{if(e)switch(typeof e){case`function`:e(t);break;case`object`:e.current=t;break}})})}function It(e){let t=(0,F.useRef)({...e});return $(()=>{for(let n in e)t.current[n]=e[n]},[e]),t.current}var Lt=(0,F.createContext)(null);function Rt(e,t){let n=(0,F.useRef)({getLayout:()=>({}),setLayout:Fe});(0,F.useImperativeHandle)(t,()=>n.current,[]),$(()=>{Object.assign(n.current,vt({groupId:e}))})}function zt({children:e,className:t,defaultLayout:n,disableCursor:r,disabled:i,elementRef:a,groupRef:o,id:s,onLayoutChange:c,onLayoutChanged:l,orientation:u=`horizontal`,resizeTargetMinimumSize:d={coarse:20,fine:10},style:f,...p}){let m=(0,F.useRef)({onLayoutChange:{},onLayoutChanged:{}}),h=Pt(e=>{Y(m.current.onLayoutChange,e)||(m.current.onLayoutChange=e,c?.(e))}),g=Pt((e,t)=>{Y(m.current.onLayoutChanged,e)||(m.current.onLayoutChanged=e,l?.(e,{isUserInteraction:t}))}),_=Nt(s),v=(0,F.useRef)(null),[y,b]=Mt(),x=(0,F.useRef)({lastExpandedPanelSizes:{},layouts:{},panels:[],resizeTargetMinimumSize:d,separators:[]}),S=Ft(v,a);Rt(_,o);let C=Pt((e,t)=>{let r=B(),i=Xe(e),a=U(e);if(a){let e=!1;return r.state===`active`&&(e=r.hitRegions.some(e=>e.group===i)),{flexGrow:a.layout[t]??1,pointerEvents:e?`none`:void 0}}if(n?.[t])return{flexGrow:n?.[t]}}),w=It({defaultLayout:n,disableCursor:r}),T=(0,F.useMemo)(()=>({get disableCursor(){return!!w.disableCursor},getPanelStyles:C,id:_,orientation:u,registerPanel:e=>{let t=x.current;return t.panels=Se(u,[...t.panels,e]),b(),()=>{t.panels=t.panels.filter(t=>t!==e),b()}},registerSeparator:e=>{let t=x.current;return t.separators=Se(u,[...t.separators,e]),b(),()=>{t.separators=t.separators.filter(t=>t!==e),b()}},updatePanelProps:(e,{disabled:t})=>{let n=x.current.panels.find(t=>t.id===e);n&&(n.panelConstraints.disabled=t);let r=Xe(_),i=U(_);r&&i&&G(r,{...i,derivedPanelConstraints:xe(r)})},updateSeparatorProps:(e,{disabled:t,disableDoubleClick:n})=>{let r=x.current.separators.find(t=>t.id===e);r&&(r.disabled=t,r.disableDoubleClick=n)}}),[C,_,b,u,w]),E=(0,F.useRef)(null);return $(()=>{let e=v.current;if(e===null)return;let t=x.current,n;if(w.defaultLayout!==void 0&&Object.keys(w.defaultLayout).length===t.panels.length){n={};for(let e of t.panels){let t=w.defaultLayout[e.id];t!==void 0&&(n[e.id]=t)}}let r={disabled:!!i,element:e,id:_,mutableState:{defaultLayout:n,disableCursor:!!w.disableCursor,expandedPanelSizes:x.current.lastExpandedPanelSizes,layouts:x.current.layouts},orientation:u,panels:t.panels,resizeTargetMinimumSize:t.resizeTargetMinimumSize,separators:t.separators};E.current=r;let a=jt(r),{defaultLayoutDeferred:o,derivedPanelConstraints:s,layout:c}=U(r.id,!0);!o&&s.length>0&&(h(c),g(c,!1));let l=Ze(_,e=>{let{defaultLayoutDeferred:t,derivedPanelConstraints:n,layout:i}=e.next;if(t||n.length===0)return;let a=r.panels.map(({id:e})=>e).join(`,`);r.mutableState.layouts[a]=i,n.forEach(t=>{if(t.collapsible){let{layout:n}=e.prev??{};if(n){let e=K(t.collapsedSize,i[t.panelId]),a=K(t.collapsedSize,n[t.panelId]);e&&!a&&(r.mutableState.expandedPanelSizes[t.panelId]=n[t.panelId])}}});let o=B().state!==`active`;h(i),o&&g(i,e.isUserInteraction)});return()=>{E.current=null,a(),l()}},[i,_,g,h,u,y,w]),(0,F.useEffect)(()=>{let e=E.current;e&&(e.mutableState.defaultLayout=n,e.mutableState.disableCursor=!!r)}),(0,P.jsx)(Lt.Provider,{value:T,children:(0,P.jsx)(`div`,{...p,className:t,"data-group":!0,"data-testid":_,id:_,ref:S,style:{height:`100%`,width:`100%`,overflow:`hidden`,...f,display:`flex`,flexDirection:u===`horizontal`?`row`:`column`,flexWrap:`nowrap`,touchAction:u===`horizontal`?`pan-y`:`pan-x`},children:e})})}zt.displayName=`Group`;function Bt(){let e=(0,F.useContext)(Lt);return R(e,`Group Context not found; did you render a Panel or Separator outside of a Group?`),e}function Vt(e,t){let{id:n}=Bt(),r=(0,F.useRef)({collapse:Ie,expand:Ie,getSize:()=>({asPercentage:0,inPixels:0}),isCollapsed:()=>!1,resize:Ie});(0,F.useImperativeHandle)(t,()=>r.current,[]),$(()=>{Object.assign(r.current,ht({groupId:n,panelId:e}))})}function Ht({children:e,className:t,collapsedSize:n=`0%`,collapsible:r=!1,defaultSize:i,disabled:a,elementRef:o,groupResizeBehavior:s=`preserve-relative-size`,id:c,maxSize:l=`100%`,minSize:u=`0%`,onResize:d,panelRef:f,style:p,...m}){let h=!!c,g=Nt(c),_=It({disabled:a}),v=(0,F.useRef)(null),y=Ft(v,o),{getPanelStyles:b,id:x,orientation:S,registerPanel:C,updatePanelProps:w}=Bt(),T=d!==null,E=Pt((e,t,n)=>{d?.(e,c,n)});$(()=>{let e=v.current;if(e!==null){let t={element:e,id:g,idIsStable:h,mutableValues:{expandToSize:void 0,prevSize:void 0},onResize:T?E:void 0,panelConstraints:{groupResizeBehavior:s,collapsedSize:n,collapsible:r,defaultSize:i,disabled:_.disabled,maxSize:l,minSize:u}};return C(t)}},[s,n,r,i,T,g,h,l,u,E,C,_]),(0,F.useEffect)(()=>{w(g,{disabled:a})},[a,g,w]),Vt(g,f);let ee=()=>{let e=b(x,g);if(e)return JSON.stringify(e)},D=(0,F.useSyncExternalStore)(e=>Ze(x,e),ee,ee),O;return O=D?JSON.parse(D):i===void 0?{flexGrow:1}:{flexGrow:void 0,flexShrink:void 0,flexBasis:i},(0,P.jsx)(`div`,{...m,"data-disabled":a||void 0,"data-panel":!0,"data-testid":g,id:g,ref:y,style:{...Ut,display:`flex`,flexBasis:0,flexShrink:1,overflow:`visible`,...O},children:(0,P.jsx)(`div`,{className:t,style:{maxHeight:`100%`,maxWidth:`100%`,flexGrow:1,overflow:`auto`,...p,touchAction:S===`horizontal`?`pan-y`:`pan-x`},children:e})})}Ht.displayName=`Panel`;var Ut={minHeight:0,maxHeight:`100%`,height:`auto`,minWidth:0,maxWidth:`100%`,width:`auto`,border:`none`,borderWidth:0,padding:0,margin:0};function Wt(){return(0,F.useRef)(null)}function Gt({layout:e,panelConstraints:t,panelId:n,panelIndex:r}){let i,a,o=e[n],s=t.find(e=>e.panelId===n);if(s){let c=s.maxSize,l=s.collapsible?s.collapsedSize:s.minSize,u=[r,r+1];a=X({layout:mt({delta:l-o,initialLayout:e,panelConstraints:t,pivotIndices:u,prevLayout:e}),panelConstraints:t})[n],i=X({layout:mt({delta:c-o,initialLayout:e,panelConstraints:t,pivotIndices:u,prevLayout:e}),panelConstraints:t})[n]}return{valueControls:n,valueMax:i,valueMin:a,valueNow:o}}function Kt({children:e,className:t,disabled:n,disableDoubleClick:r,elementRef:i,id:a,style:o,...s}){let c=Nt(a),l=It({disabled:n,disableDoubleClick:r}),[u,d]=(0,F.useState)({}),[f,p]=(0,F.useState)(`inactive`),[m,h]=(0,F.useState)(!1),g=(0,F.useRef)(null),_=Ft(g,i),{disableCursor:v,id:y,orientation:b,registerSeparator:x,updateSeparatorProps:S}=Bt(),C=b===`horizontal`?`vertical`:`horizontal`;$(()=>{let e=g.current;if(e!==null){let t={disabled:l.disabled,disableDoubleClick:l.disableDoubleClick,element:e,id:c},n=x(t),r=Ne(e=>{p(e.next.state!==`inactive`&&e.next.hitRegions.some(e=>e.separator===t)?e.next.state:`inactive`)}),i=Ze(y,e=>{let{derivedPanelConstraints:n,layout:r,separatorToPanels:i}=e.next,a=i.get(t);if(a){let e=a[0],t=a.indexOf(e);d(Gt({layout:r,panelConstraints:n,panelId:e.id,panelIndex:t}))}});return()=>{r(),i(),n()}}},[y,c,x,l]),(0,F.useEffect)(()=>{S(c,{disabled:n,disableDoubleClick:r})},[n,r,c,S]);let w;n&&!v&&(w=`not-allowed`);let T;if(n)T=`disabled`;else switch(f){case`active`:T=`active`;break;default:T=m?`focus`:f}return(0,P.jsx)(`div`,{...s,"aria-controls":u.valueControls,"aria-disabled":n||void 0,"aria-orientation":C,"aria-valuemax":u.valueMax,"aria-valuemin":u.valueMin,"aria-valuenow":u.valueNow,children:e,className:t,"data-separator":T,"data-testid":c,id:c,onBlur:()=>h(!1),onFocus:()=>h(!0),ref:_,role:`separator`,style:{flexBasis:`auto`,cursor:w,...o,flexGrow:0,flexShrink:0,touchAction:`none`},tabIndex:n?void 0:0})}Kt.displayName=`Separator`;function qt({className:e,...t}){return(0,P.jsx)(zt,{className:N(`flex h-full w-full data-[orientation=vertical]:flex-col`,e),...t})}var Jt=Ht;function Yt({withHandle:e,className:t,...n}){return(0,P.jsx)(Kt,{className:N(`relative flex items-center justify-center bg-border`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1`,`aria-[orientation=vertical]:w-px`,`aria-[orientation=vertical]:after:absolute aria-[orientation=vertical]:after:inset-y-0 aria-[orientation=vertical]:after:left-1/2 aria-[orientation=vertical]:after:w-1 aria-[orientation=vertical]:after:-translate-x-1/2`,`aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full`,`aria-[orientation=horizontal]:after:absolute aria-[orientation=horizontal]:after:inset-x-0 aria-[orientation=horizontal]:after:top-1/2 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:-translate-y-1/2`,`aria-[orientation=horizontal]:[&>div]:rotate-90`,t),...n,children:e?(0,P.jsx)(`div`,{className:`z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border`,children:(0,P.jsx)(m,{icon:x,className:`size-2.5`})}):null})}function Xt(){let e=Wt(),[t,n]=(0,F.useState)(!0);return{panelRef:e,open:t,toggle:()=>{let t=e.current;t&&(t.isCollapsed()?(t.expand(),n(!0)):(t.collapse(),n(!1)))},onResize:()=>{n(!(e.current?.isCollapsed()??!1))}}}var Zt={flow:{icon:ie,label:`Flow`,symbol:`Fl`},signal:{icon:ue,label:`Signal`,symbol:`Sg`},store:{icon:u,label:`Store`,symbol:`St`},clock:{icon:v,label:`Clock`,symbol:`Ck`},gate:{icon:h,label:`Gate`,symbol:`Gt`},vault:{icon:S,label:`Vault`,symbol:`Vt`},channel:{icon:O,label:`Channel`,symbol:`Ch`},ai:{icon:A,label:`AI`,symbol:`Ai`}};function Qt({className:e,...t}){return(0,P.jsx)(n,{flat:!0,className:N(j,e),...t})}function $t({className:e,...t}){return(0,P.jsx)(`div`,{"data-slot":`empty`,className:N(`flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance`,e),...t})}function en({className:e,...t}){return(0,P.jsx)(`div`,{"data-slot":`empty-header`,className:N(`flex max-w-sm flex-col items-center gap-2`,e),...t})}var tn=r(`mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0`,{variants:{variant:{default:`bg-transparent`,icon:`flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4`}},defaultVariants:{variant:`default`}});function nn({className:e,variant:t=`default`,...n}){return(0,P.jsx)(`div`,{"data-slot":`empty-icon`,"data-variant":t,className:N(tn({variant:t,className:e})),...n})}function rn({className:e,...t}){return(0,P.jsx)(`div`,{"data-slot":`empty-title`,className:N(`cn-font-heading text-sm font-medium tracking-tight`,e),...t})}function an({className:e,...t}){return(0,P.jsx)(`div`,{"data-slot":`empty-description`,className:N(`text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary`,e),...t})}var on=r(`group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!`,{variants:{variant:{default:`bg-primary text-primary-foreground [a]:hover:bg-primary/80`,secondary:`bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80`,destructive:`bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20`,outline:`border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground`,ghost:`hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50`,link:`text-primary underline-offset-4 hover:underline`}},defaultVariants:{variant:`default`}});function sn({className:e,variant:t=`default`,render:n,...r}){return ce({defaultTagName:`span`,props:c({className:N(on({variant:t}),e)},r),render:n,state:{slot:`badge`,variant:t}})}function cn(e){let{open:t,defaultOpen:n,onOpenChange:r,disabled:i}=e,[a,o]=D({controlled:t,default:n,name:`Collapsible`,state:`open`}),{mounted:s,setMounted:c,transitionStatus:l}=E(a,!0,!0),u=_(),[d,f]=F.useState(),p=d===null?void 0:d??u,m=w(e=>{let t=!a,n=ee(T,e.nativeEvent);r(t,n),!n.isCanceled&&o(t)});return F.useMemo(()=>({defaultPanelId:u,disabled:i,handleTrigger:m,mounted:s,open:a,panelId:p,setMounted:c,setOpen:o,setPanelIdState:f,transitionStatus:l}),[u,i,m,s,a,p,c,o,f,l])}var ln=F.createContext(void 0);function un(){let e=F.useContext(ln);if(e===void 0)throw Error(a(15));return e}var dn=function(e){return e.open=`data-open`,e.closed=`data-closed`,e[e.startingStyle=b.startingStyle]=`startingStyle`,e[e.endingStyle=b.endingStyle]=`endingStyle`,e}({}),fn=function(e){return e.panelOpen=`data-panel-open`,e}({}),pn={[dn.open]:``},mn={[dn.closed]:``},hn={open(e){return e?{[fn.panelOpen]:``}:null}},gn={open(e){return e?pn:mn},...y},_n=F.forwardRef(function(e,t){let{render:n,className:r,defaultOpen:i=!1,disabled:a=!1,onOpenChange:o,open:c,style:l,...u}=e,d=w(o),f=cn({open:c,defaultOpen:i,onOpenChange:d,disabled:a}),p=F.useMemo(()=>({open:f.open,disabled:f.disabled,transitionStatus:f.transitionStatus}),[f.open,f.disabled,f.transitionStatus]),m=F.useMemo(()=>({...f,onOpenChange:d,state:p}),[f,d,p]),h=s(`div`,e,{state:p,ref:t,props:u,stateAttributesMapping:gn});return(0,P.jsx)(ln.Provider,{value:m,children:h})}),vn={...hn,...y},yn=F.forwardRef(function(e,n){let{panelId:r,open:i,handleTrigger:a,state:o,disabled:c}=un(),{className:l,disabled:u=c,render:d,nativeButton:f=!0,style:p,...m}=e,{getButtonProps:h,buttonRef:g}=t({disabled:u,focusableWhenDisabled:!0,native:f});return s(`button`,e,{state:o,ref:[n,g],props:[{"aria-controls":i?r:void 0,"aria-expanded":i,onClick:a},m,h],stateAttributesMapping:vn})}),bn={height:void 0,width:void 0};function xn(e){let{externalRef:t,hiddenUntilFound:n,id:r,keepMounted:i,mounted:a,onOpenChange:o,open:s,setMounted:c,setOpen:l,transitionStatus:u}=e,f=F.useRef(null),p=F.useRef(null),[m,h]=F.useState(bn),_=F.useRef(bn),v=F.useRef(!1),y=F.useRef(s),b=F.useRef(!1),[x,S]=F.useState(!1),T=F.useRef(null),E=ne(t,f),D=se(s),O=te(f),k=!s&&!a,A=x?`idle`:u,j=s&&(y.current||b.current),re=!s&&a&&p.current===`css-animation`&&m.height===void 0&&m.width===void 0?_.current:m,ie=n&&k&&p.current!==`css-animation`,M=w((e,t=!0)=>{t&&(_.current=e),h(e)}),N=w(()=>{T.current?.(),T.current=null}),ce=w(e=>{N(),T.current=()=>{T.current=null,e()}}),le=w(()=>{s&&a&&p.current===`css-animation`&&(b.current=!0)});g(()=>{!x||u===`starting`||S(!1)},[x,u]),F.useEffect(()=>()=>{le(),N()},[le,N]),g(()=>{let e=f.current;if(!e)return;!s&&T.current&&N();let t=Cn(e,j);if(p.current=t,s&&u===`idle`&&y.current&&t===`css-animation`){_.current=Sn(e);return}if(s&&u===`starting`){let n=v.current;if(v.current=!1,t===`none`){M(Sn(e)),S(!0);return}if(t===`css-transition`){let t=En(e);if(M(Sn(e)),!n)return t;let r=Tn(e,`transition-duration`,`0s`);return ce(r),S(!0),t}M(Sn(e));let r=Tn(e,`animation-name`,`none`);if(!n){r();return}let i=Tn(e,`animation-duration`,`0s`);r(),ce(i),S(!0);return}if(!s&&a&&(u===`idle`||u===`starting`)){if(y.current=!1,b.current=!1,t===`none`){M(bn,!1),c(!1);return}M(Sn(e));return}if(u!==`ending`)return;if(t===`none`){c(!1);return}let n=Sn(e);if(!(n.height>0||n.width>0)){c(!1);return}M(n),t===`css-animation`&&Tn(e,`animation-name`,`none`)()},[a,s,N,M,c,ce,j,u]),ae({enabled:s&&a&&A===`idle`,open:!0,ref:f,onComplete(){s&&M(bn,!1)}}),F.useEffect(()=>{if(s||!a||A!==`ending`||!f.current)return;let e=new AbortController,t=-1;function n(){D.current||(c(!1),M(bn,!1))}return t=d.request(()=>{O(n,e.signal)}),()=>{d.cancel(t),e.abort()}},[D,a,s,A,O,M,c]),g(()=>{let e=f.current;!e||!n||!k||e.setAttribute(`hidden`,`until-found`)},[k,n]),F.useEffect(function(){let e=f.current;if(!e)return;function t(e){let t=ee(C,e);o(!0,t),!t.isCanceled&&(v.current=!0,l(!0))}return oe(e,`beforematch`,t)},[o,l]);let ue=i||n||a||s;return{height:re.height,props:{...ie?{[dn.startingStyle]:``}:void 0,hidden:k,id:r},ref:E,shouldPreventOpenAnimation:j,shouldRender:ue,transitionStatus:A,width:re.width}}function Sn(e){return{height:e.scrollHeight,width:e.scrollWidth}}function Cn(e,t){let n=k(e).getComputedStyle(e),r=(n.animationName.split(`,`).map(e=>e.trim()).some(e=>e!==``&&e!==`none`)||t)&&wn(n.animationDuration),i=wn(n.transitionDuration);return r&&i||i?`css-transition`:r?`css-animation`:`none`}function wn(e){return e.split(`,`).map(e=>e.trim()).some(e=>e!==``&&Number.parseFloat(e)>0)}function Tn(e,t,n){let r=e.style.getPropertyValue(t),i=e.style.getPropertyPriority(t);return e.style.setProperty(t,n),()=>{if(r===``){e.style.removeProperty(t);return}e.style.setProperty(t,r,i)}}function En(e){let t={"justify-content":e.style.justifyContent,"align-items":e.style.alignItems,"align-content":e.style.alignContent,"justify-items":e.style.justifyItems};Object.keys(t).forEach(t=>{e.style.setProperty(t,`initial`,`important`)});function n(){Object.entries(t).forEach(([t,n])=>{if(n===``){e.style.removeProperty(t);return}e.style.setProperty(t,n)})}let r=d.request(n);return()=>{d.cancel(r),n()}}var Dn=function(e){return e.collapsiblePanelHeight=`--collapsible-panel-height`,e.collapsiblePanelWidth=`--collapsible-panel-width`,e}({}),On=F.forwardRef(function(e,t){let{className:n,hiddenUntilFound:r,keepMounted:i,render:a,id:o,style:c,...u}=e,{defaultPanelId:d,mounted:f,onOpenChange:p,open:m,setMounted:h,setPanelIdState:_,setOpen:v,state:y,transitionStatus:b}=un(),x=r??!1,S=i??!1,C=o||void 0,w=C??d;g(()=>(_(e=>C??(e===null?void 0:e)),()=>{_(e=>e===C?null:e)}),[C,_]);let{height:T,props:E,ref:ee,shouldPreventOpenAnimation:D,shouldRender:O,transitionStatus:k,width:A}=xn({externalRef:t,hiddenUntilFound:x,id:w,keepMounted:S,mounted:f,onOpenChange:p,open:m,setMounted:h,setOpen:v,transitionStatus:b}),j={...y,transitionStatus:k},te=l(c,j),ne=s(`div`,{...e,style:void 0},{state:j,ref:ee,props:[E,{style:{[Dn.collapsiblePanelHeight]:T===void 0?`auto`:`${T}px`,[Dn.collapsiblePanelWidth]:A===void 0?`auto`:`${A}px`}},u,te?{style:te}:void 0,D?{style:{animationName:`none`}}:void 0],stateAttributesMapping:gn});return O?ne:null});function kn({...e}){return(0,P.jsx)(_n,{"data-slot":`collapsible`,...e})}function An({...e}){return(0,P.jsx)(yn,{"data-slot":`collapsible-trigger`,...e})}function jn({...e}){return(0,P.jsx)(On,{"data-slot":`collapsible-content`,...e})}export{pe as _,$t as a,nn as c,Zt as d,Xt as f,me as g,qt as h,sn as i,rn as l,Jt as m,jn as n,an as o,Yt as p,An as r,en as s,kn as t,Qt as u};
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{D as t,Jr as n,Tr as r,ar as i,c as a,i as o,l as s,o as c,s as l,ta as u,u as d,wr as f}from"./shortcut-keys-CoqwEIi0.js";import{r as p}from"./react-dom-Bph1y7z7.js";import{A as m}from"./xyflow-D7n4g6go.js";import{c as h,o as g,s as _,t as v}from"./sheet-form-Dnwa5oOR.js";import{_ as y}from"./collapsible-LPqGvfoz.js";var b=e(p(),1),x=m();function S({value:e,label:t}){let[a,o]=(0,b.useState)(!1),s=(0,b.useRef)(null);return(0,b.useEffect)(()=>()=>{s.current&&clearTimeout(s.current)},[]),(0,x.jsx)(y,{label:a?`Copied`:t,children:(0,x.jsx)(`button`,{type:`button`,"aria-label":t,className:f(i,`size-4`),onClick:()=>{navigator.clipboard&&navigator.clipboard.writeText(e).then(()=>{o(!0),s.current&&clearTimeout(s.current),s.current=setTimeout(()=>o(!1),1200)})},children:(0,x.jsx)(r,{icon:a?u:n,className:a?`size-3 text-emerald-600 dark:text-emerald-400`:`size-3`,"aria-hidden":!0})})})}function C(e){let t={};return e.typed.trim()!==e.phrase&&(t.typed=`Type ${e.phrase} to confirm`),e.reason.trim().length<3&&(t.reason=`Reason is required (min 3 characters)`),Object.keys(t).length>0?t:null}function w({open:e,onOpenChange:n,phrase:r,title:i,description:u,children:p,pending:m=!1,error:y,confirmLabel:S,confirmVariant:w=`destructive`,slot:T=`confirm-sheet`,onConfirm:E}){let[D,O]=(0,b.useState)(``),[k,A]=(0,b.useState)(``),[j,M]=(0,b.useState)(!1);(0,b.useEffect)(()=>{e||(O(``),A(``),M(!1))},[e]);let N=j?C({typed:D,reason:k,phrase:r}):null,P=C({typed:D,reason:k,phrase:r})===null;return(0,x.jsx)(o,{open:e,onOpenChange:n,children:(0,x.jsxs)(c,{side:`right`,showOverlay:!1,className:`sm:max-w-md`,"data-slot":T,children:[(0,x.jsxs)(s,{children:[(0,x.jsx)(d,{children:i}),(0,x.jsx)(l,{children:u})]}),(0,x.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-y-auto`,children:[p,(0,x.jsxs)(_,{label:`Type ${r} to confirm`,children:[(0,x.jsx)(t,{value:D,onChange:e=>O(e.target.value),onBlur:()=>M(!0),placeholder:r,"aria-label":`Type ${r} to confirm`,"aria-invalid":N?.typed?!0:void 0,flat:!0,className:f(v,`font-mono`),autoComplete:`off`}),N?.typed?(0,x.jsx)(`span`,{className:`block px-4 pb-2 text-[10px] text-destructive`,role:`alert`,children:N.typed}):null]}),(0,x.jsxs)(_,{label:`Reason`,children:[(0,x.jsx)(t,{value:k,onChange:e=>A(e.target.value),onBlur:()=>M(!0),placeholder:`Why is this change needed?`,"aria-label":`Reason`,"aria-invalid":N?.reason?!0:void 0,flat:!0,className:v}),N?.reason?(0,x.jsx)(`span`,{className:`block px-4 pb-2 text-[10px] text-destructive`,role:`alert`,children:N.reason}):null]}),y?(0,x.jsx)(g,{children:y}):null]}),(0,x.jsxs)(a,{children:[(0,x.jsx)(h,{split:!0,onClick:()=>n(!1),disabled:m,children:`Cancel`}),(0,x.jsx)(h,{variant:w,disabled:!P||m,onClick:()=>{M(!0),P&&E({confirmation:D.trim(),reason:k.trim()})},"data-slot":`confirm-action`,children:m?`Working…`:S??`Confirm ${r.toLowerCase()}`})]})]})})}export{S as n,w as t};
@@ -1 +0,0 @@
1
- import{Tr as e,Xn as t}from"./shortcut-keys-CoqwEIi0.js";import{A as n}from"./xyflow-D7n4g6go.js";import{a as r,c as i,l as a,o,s}from"./collapsible-LPqGvfoz.js";var c=n();function l({icon:n,iconClassName:l,title:u,description:d,children:f,leading:p}){return(0,c.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[p?(0,c.jsx)(`header`,{className:t,children:(0,c.jsxs)(`div`,{className:`-ml-2 flex h-full shrink-0 items-stretch`,children:[p,(0,c.jsx)(`span`,{className:`w-px shrink-0 self-stretch bg-border/60`,"aria-hidden":!0})]})}):null,(0,c.jsx)(`div`,{className:`flex min-h-0 flex-1 items-center justify-center p-6`,children:(0,c.jsxs)(r,{className:`border-0`,children:[(0,c.jsxs)(s,{children:[n?(0,c.jsx)(i,{variant:`icon`,className:l,children:(0,c.jsx)(e,{icon:n})}):null,(0,c.jsx)(a,{children:u}),d?(0,c.jsx)(o,{children:d}):null]}),f]})})]})}export{l as t};