okengine 0.15.2 → 0.16.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.
- package/package.json +1 -1
- package/site/content/docs/elements/flow.mdx +6 -0
- package/site/content/docs/elements/gate.mdx +55 -0
- package/site/content/docs/elements/store.mdx +13 -15
- package/site/content/docs/elements/vault.mdx +3 -0
- package/site/content/docs/reference/client.mdx +3 -0
- package/site/content/docs/reference/fx.mdx +29 -18
- package/site/content/docs/reference/security.md +1 -1
- package/src/auth/api-key-sql.test.ts +47 -0
- package/src/auth/api-key-sql.ts +254 -0
- package/src/auth/api-keys.ts +273 -14
- package/src/auth/auth.test.ts +56 -0
- package/src/auth/config.ts +5 -5
- package/src/auth/index.ts +25 -1
- package/src/auth/schema.ts +8 -0
- package/src/cli/attach-host-console.test.ts +37 -0
- package/src/cli/attach-host-console.ts +6 -0
- package/src/compiler/effects-infer.ts +17 -2
- package/src/console/server/access.test.ts +116 -8
- package/src/console/server/access.ts +70 -23
- package/src/console/server/app.ts +1 -0
- package/src/console/server/dev-identities.test.ts +127 -0
- package/src/console/server/dev-identities.ts +229 -0
- package/src/console/server/flows-invoke.test.ts +21 -4
- package/src/console/server/flows.ts +113 -58
- package/src/console/server/gates.test.ts +24 -0
- package/src/console/server/gates.ts +8 -21
- package/src/console/server/index.ts +1 -0
- package/src/console/server/live.test.ts +26 -1
- package/src/console/server/live.ts +4 -2
- package/src/console/server/operator-db.ts +2 -0
- package/src/console/server/state.ts +29 -55
- package/src/console/ui-next/dist/assets/access-page-CAGHrA9H.js +4 -0
- package/src/console/ui-next/dist/assets/{agent-disclosure-C0X1fbWF.js → agent-disclosure-BP0Y0Sux.js} +1 -1
- package/src/console/ui-next/dist/assets/cache-glyph-B5X-NM0-.js +1 -0
- package/src/console/ui-next/dist/assets/call-pii-button-ChAUiLo9.js +1 -0
- package/src/console/ui-next/dist/assets/collapsible-DGnOM2ph.js +1 -0
- package/src/console/ui-next/dist/assets/copy-inline-button-DBHhgHKP.js +1 -0
- package/src/console/ui-next/dist/assets/detail-header-DhHM1iaZ.js +1 -0
- package/src/console/ui-next/dist/assets/dropdown-menu-_NjTEo5_.js +1 -0
- package/src/console/ui-next/dist/assets/element-icons-BVXtRyd3.js +1 -0
- package/src/console/ui-next/dist/assets/explorer-empty-2uIhBu0_.js +1 -0
- package/src/console/ui-next/dist/assets/flows-page-B-OUtiAu.js +1 -0
- package/src/console/ui-next/dist/assets/{highlighted-json-CS_O8L-r.js → highlighted-json-Awq7gYdu.js} +1 -1
- package/src/console/ui-next/dist/assets/http-method-_UHM2ODJ.js +1 -0
- package/src/console/ui-next/dist/assets/index-CGoZkILK.js +66 -0
- package/src/console/ui-next/dist/assets/index-Ck88Jmv8.css +2 -0
- package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +1 -0
- package/src/console/ui-next/dist/assets/observability-page-BDyXalNR.js +4 -0
- package/src/console/ui-next/dist/assets/replica-lag-DKRrbvdo.js +18 -0
- package/src/console/ui-next/dist/assets/request-meta-DV0ywz7t.js +1 -0
- package/src/console/ui-next/dist/assets/shortcut-JQIZlWfm.js +1 -0
- package/src/console/ui-next/dist/assets/shortcut-keys-DKxNTe_m.js +1 -0
- package/src/console/ui-next/dist/assets/skeleton-D-czQJT6.js +1 -0
- package/src/console/ui-next/dist/assets/store-page-Xh8Kn3rx.js +41 -0
- package/src/console/ui-next/dist/assets/trace-detail-sheet-B09O8rA6.js +2 -0
- package/src/console/ui-next/dist/assets/tree-expand-toggle-DkOXA12R.js +54 -0
- package/src/console/ui-next/dist/assets/units-page-Dpk40kOQ.js +1 -0
- package/src/console/ui-next/dist/assets/{use-vault-list-BLbZhzyF.js → use-vault-list-uk4WVboC.js} +1 -1
- package/src/console/ui-next/dist/assets/useMutation-B8EO02Ej.js +1 -0
- package/src/console/ui-next/dist/assets/useRender-BE2A9BWC.js +1 -0
- package/src/console/ui-next/dist/assets/vault-page-B1dB9Ft0.js +2 -0
- package/src/console/ui-next/dist/index.html +11 -9
- package/src/console/ui-next/index.html +3 -3
- package/src/console/ui-next/src/client.ts +167 -0
- package/src/console/ui-next/src/components/shell/app-sidebar.tsx +2 -0
- package/src/console/ui-next/src/components/shell/command-items.test.ts +1 -0
- package/src/console/ui-next/src/components/shell/command-items.ts +8 -0
- package/src/console/ui-next/src/components/shell/shell-layout.tsx +2 -1
- package/src/console/ui-next/src/components/ui/sheet-form.tsx +8 -3
- package/src/console/ui-next/src/features/access/access-page.tsx +347 -0
- package/src/console/ui-next/src/features/access/data/use-access.ts +23 -0
- package/src/console/ui-next/src/features/access/detail/access-detail.tsx +552 -0
- package/src/console/ui-next/src/features/access/explorer/access-list.tsx +125 -0
- package/src/console/ui-next/src/features/access/lib/format-when.test.ts +139 -0
- package/src/console/ui-next/src/features/access/lib/format-when.ts +296 -0
- package/src/console/ui-next/src/features/access/lib/scope-groups.test.ts +34 -0
- package/src/console/ui-next/src/features/access/lib/scope-groups.ts +40 -0
- package/src/console/ui-next/src/features/access/sheets/access-allow-fields.tsx +236 -0
- package/src/console/ui-next/src/features/access/sheets/access-create-sheet.tsx +316 -0
- package/src/console/ui-next/src/features/access/sheets/access-edit-sheet.tsx +240 -0
- package/src/console/ui-next/src/features/access/sheets/access-expiry-fields.tsx +66 -0
- package/src/console/ui-next/src/features/access/sheets/access-refresh-sheet.tsx +104 -0
- package/src/console/ui-next/src/features/access/sheets/access-scope-field.tsx +115 -0
- package/src/console/ui-next/src/features/access/sheets/access-secret-sheet.tsx +89 -0
- package/src/console/ui-next/src/features/access/sheets/access-sheet-search.tsx +49 -0
- package/src/console/ui-next/src/features/access/state/access-selection.ts +84 -0
- package/src/console/ui-next/src/features/auth/auth-redirect.test.ts +5 -0
- package/src/console/ui-next/src/features/auth/auth-redirect.ts +18 -2
- package/src/console/ui-next/src/features/not-found/not-found-page.tsx +1 -1
- package/src/console/ui-next/src/lib/document-meta.test.ts +1 -0
- package/src/console/ui-next/src/lib/document-meta.ts +2 -1
- package/src/console/ui-next/src/lib/last-module-search.test.ts +1 -0
- package/src/console/ui-next/src/lib/last-module-search.ts +2 -1
- package/src/console/ui-next/src/lib/shortcut.test.ts +2 -0
- package/src/console/ui-next/src/lib/shortcut.ts +3 -0
- package/src/console/ui-next/src/router.tsx +10 -1
- package/src/console/ui-next/ui-next-seed-app-schema.ts +88 -37
- package/src/console/ui-next/ui-next-seed-store.ts +43 -15
- package/src/console/xss.gate.test.ts +1 -0
- package/src/elements/gate/declare.ts +2 -0
- package/src/elements/store/cache.ts +1 -1
- package/src/elements/store/runtime.ts +14 -0
- package/src/elements/store/schema-decl.ts +99 -41
- package/src/elements/store/sql-select.types.test.ts +71 -0
- package/src/elements/store/sql-session.ts +54 -32
- package/src/elements/store.ts +3 -0
- package/src/index.ts +1 -0
- package/src/kernel/api-key-host-persist.test.ts +143 -0
- package/src/kernel/app.ts +14 -2
- package/src/kernel/auth-resolve.ts +10 -5
- package/src/kernel/boot.test.ts +4 -4
- package/src/kernel/fx-auth-keys.test.ts +88 -0
- package/src/kernel/fx-auth-keys.ts +198 -0
- package/src/kernel/fx.test.ts +17 -1
- package/src/kernel/fx.ts +36 -18
- package/src/kernel/pipeline-api-key.test.ts +192 -7
- package/src/kernel/pipeline.ts +4 -2
- package/src/manifest/types.ts +9 -3
- package/src/release/build-lib.ts +1 -0
- package/src/console/ui-next/dist/assets/cache-glyph-F1FI122b.js +0 -1
- package/src/console/ui-next/dist/assets/call-pii-button-DEDCl_j3.js +0 -1
- package/src/console/ui-next/dist/assets/collapsible-LPqGvfoz.js +0 -1
- package/src/console/ui-next/dist/assets/confirm-sheet-3ptDzXbz.js +0 -1
- package/src/console/ui-next/dist/assets/explorer-empty-BvYrygyO.js +0 -1
- package/src/console/ui-next/dist/assets/flows-page-Dluo1Bd7.js +0 -1
- package/src/console/ui-next/dist/assets/http-method--sWDdXSB.js +0 -1
- package/src/console/ui-next/dist/assets/index-Ca3HZMVq.js +0 -66
- package/src/console/ui-next/dist/assets/index-UtTDRQpS.css +0 -2
- package/src/console/ui-next/dist/assets/link-COeyggt-.js +0 -1
- package/src/console/ui-next/dist/assets/observability-page-HK9-BO8z.js +0 -4
- package/src/console/ui-next/dist/assets/replica-lag-DBIFFf7d.js +0 -18
- package/src/console/ui-next/dist/assets/sheet-form-Dnwa5oOR.js +0 -1
- package/src/console/ui-next/dist/assets/shortcut-Cgzuv4k1.js +0 -1
- package/src/console/ui-next/dist/assets/shortcut-keys-CoqwEIi0.js +0 -1
- package/src/console/ui-next/dist/assets/skeleton-BHcfDYcb.js +0 -1
- package/src/console/ui-next/dist/assets/store-page-BSohH3wM.js +0 -41
- package/src/console/ui-next/dist/assets/trace-detail-sheet-CFIGRnnA.js +0 -2
- package/src/console/ui-next/dist/assets/tree-expand-toggle-BgLl34w7.js +0 -54
- package/src/console/ui-next/dist/assets/units-page-B0cFE76A.js +0 -1
- package/src/console/ui-next/dist/assets/vault-page-B1SbYe10.js +0 -2
package/src/kernel/fx.ts
CHANGED
|
@@ -20,6 +20,7 @@ import type {
|
|
|
20
20
|
IndexStoreFxHandle,
|
|
21
21
|
KvStoreDecl,
|
|
22
22
|
KvStoreFxHandle,
|
|
23
|
+
SelectFromBuilder,
|
|
23
24
|
SelectOrderBuilder,
|
|
24
25
|
SqlStoreDecl,
|
|
25
26
|
StoreDecl,
|
|
@@ -36,6 +37,8 @@ import type { VaultActor, VaultAdapter, VaultRuntime } from "../elements/vault.t
|
|
|
36
37
|
import type { ChannelRuntime } from "../elements/channel.ts";
|
|
37
38
|
import type { AiRuntime } from "../elements/ai.ts";
|
|
38
39
|
import { parseDurationMs } from "../elements/clock/duration.ts";
|
|
40
|
+
import type { ApiKeyStore } from "../auth/api-keys.ts";
|
|
41
|
+
import type { FxAuthIdentity, FxAuthKeyMethods } from "./fx-auth-keys.ts";
|
|
39
42
|
import { createCapabilityToken, type CapabilityToken } from "./capability.ts";
|
|
40
43
|
import { createEffectLedger, recordEffect, reversibilityOf, type EffectLedger } from "./effects.ts";
|
|
41
44
|
import { resolveDurationMs } from "./elapsed.ts";
|
|
@@ -76,6 +79,13 @@ async function loadRunsWindow(): Promise<typeof import("../runs/window.ts")> {
|
|
|
76
79
|
/** Resource ref Flows declare to read the Runs store via {@link Fx.runs}. */
|
|
77
80
|
export const RUNS_RESOURCE = "runs";
|
|
78
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Resource ref Flows declare for {@link Fx.auth} key management.
|
|
84
|
+
* Same string as `src/auth/api-keys.ts` — defined here so the HMAC / key-store
|
|
85
|
+
* module stays off the edge and Store-only graphs.
|
|
86
|
+
*/
|
|
87
|
+
export const AUTH_API_KEYS_RESOURCE = "auth:api-keys";
|
|
88
|
+
|
|
79
89
|
/**
|
|
80
90
|
* Capability ref for {@link Fx.deadLetters} — `signal:<name>`, never a store facet.
|
|
81
91
|
*
|
|
@@ -103,13 +113,10 @@ export function resolveStoreRef(ref: NamedRef | { readonly ref: ResourceRef }):
|
|
|
103
113
|
return ref.name as ResourceRef;
|
|
104
114
|
}
|
|
105
115
|
|
|
116
|
+
export type { FxAuthIdentity } from "./fx-auth-keys.ts";
|
|
117
|
+
|
|
106
118
|
/** Auth principal on the user plane. */
|
|
107
|
-
export interface FxAuth {
|
|
108
|
-
readonly userId: string | null;
|
|
109
|
-
readonly scopes: ReadonlySet<string>;
|
|
110
|
-
/** Whether the identity has completed verification (email / MFA). */
|
|
111
|
-
readonly verified?: boolean;
|
|
112
|
-
}
|
|
119
|
+
export interface FxAuth extends FxAuthIdentity, FxAuthKeyMethods {}
|
|
113
120
|
|
|
114
121
|
/** Operator principal on the Console plane. */
|
|
115
122
|
export interface FxOperator {
|
|
@@ -837,8 +844,10 @@ export interface CreateFxOptions {
|
|
|
837
844
|
readonly capability?: CapabilityToken;
|
|
838
845
|
/** Injectable clock for timestamps / `fx.clock.now`. */
|
|
839
846
|
readonly now?: () => number;
|
|
840
|
-
/** Auth principal. */
|
|
841
|
-
readonly auth?:
|
|
847
|
+
/** Auth principal bag (key methods attach at create time). */
|
|
848
|
+
readonly auth?: FxAuthIdentity;
|
|
849
|
+
/** Shared API key store for {@link Fx.auth} key methods. */
|
|
850
|
+
readonly apiKeyStore?: ApiKeyStore;
|
|
842
851
|
/** Operator principal. */
|
|
843
852
|
readonly operator?: FxOperator;
|
|
844
853
|
/**
|
|
@@ -1001,10 +1010,16 @@ export function createFxContext(options: CreateFxOptions): FxContext {
|
|
|
1001
1010
|
}
|
|
1002
1011
|
const cacheStore = new Map<string, unknown>();
|
|
1003
1012
|
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1013
|
+
// Computed stem — a static import would pin HMAC / api-keys on every createFx.
|
|
1014
|
+
const auth: FxAuth = lazyRequire<typeof import("./fx-auth-keys.ts")>(
|
|
1015
|
+
import.meta.dir,
|
|
1016
|
+
["fx", "auth", "keys"].join("-"),
|
|
1017
|
+
).attach({
|
|
1018
|
+
auth: options.auth ?? { userId: null, scopes: new Set() },
|
|
1019
|
+
store: options.apiKeyStore,
|
|
1020
|
+
now,
|
|
1021
|
+
gated,
|
|
1022
|
+
});
|
|
1008
1023
|
const operator: FxOperator = options.operator ?? { id: null };
|
|
1009
1024
|
const tenant: FxTenant = options.tenant ?? { id: null };
|
|
1010
1025
|
const defaultLocale = options.i18n?.defaultLocale ?? "en";
|
|
@@ -1171,9 +1186,9 @@ export function createFxContext(options: CreateFxOptions): FxContext {
|
|
|
1171
1186
|
get driverId() {
|
|
1172
1187
|
return cached?.driverId ?? "memory";
|
|
1173
1188
|
},
|
|
1174
|
-
select(columns
|
|
1189
|
+
select: ((columns?: unknown) => {
|
|
1175
1190
|
return {
|
|
1176
|
-
from(table) {
|
|
1191
|
+
from(table: unknown) {
|
|
1177
1192
|
const run = (plan: {
|
|
1178
1193
|
where?: unknown;
|
|
1179
1194
|
orders?: readonly unknown[];
|
|
@@ -1182,7 +1197,7 @@ export function createFxContext(options: CreateFxOptions): FxContext {
|
|
|
1182
1197
|
}): Promise<SqlRow[]> =>
|
|
1183
1198
|
gatedTable("read", table, async () => {
|
|
1184
1199
|
const h = await ensure();
|
|
1185
|
-
const from = h.select(columns).from(table);
|
|
1200
|
+
const from = h.select(columns).from(table) as SelectFromBuilder;
|
|
1186
1201
|
const filtered = plan.where === undefined ? from : from.where(plan.where);
|
|
1187
1202
|
const ordered =
|
|
1188
1203
|
plan.orders === undefined ? filtered : filtered.orderBy(...plan.orders);
|
|
@@ -1206,7 +1221,7 @@ export function createFxContext(options: CreateFxOptions): FxContext {
|
|
|
1206
1221
|
});
|
|
1207
1222
|
|
|
1208
1223
|
return {
|
|
1209
|
-
where(where) {
|
|
1224
|
+
where(where: unknown) {
|
|
1210
1225
|
return {
|
|
1211
1226
|
...tail({ where }),
|
|
1212
1227
|
orderBy: (...orders: readonly unknown[]) => tail({ where, orders }),
|
|
@@ -1219,13 +1234,16 @@ export function createFxContext(options: CreateFxOptions): FxContext {
|
|
|
1219
1234
|
offset(n: number) {
|
|
1220
1235
|
return run({ offset: n });
|
|
1221
1236
|
},
|
|
1222
|
-
then(
|
|
1237
|
+
then(
|
|
1238
|
+
onfulfilled: (value: SqlRow[]) => unknown,
|
|
1239
|
+
onrejected?: (reason: unknown) => unknown,
|
|
1240
|
+
) {
|
|
1223
1241
|
return run({}).then(onfulfilled, onrejected);
|
|
1224
1242
|
},
|
|
1225
1243
|
};
|
|
1226
1244
|
},
|
|
1227
1245
|
};
|
|
1228
|
-
},
|
|
1246
|
+
}) as SqlStoreHandle["select"],
|
|
1229
1247
|
insert(table) {
|
|
1230
1248
|
return {
|
|
1231
1249
|
values(row) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Boot-level: API-key Bearer stamps WideEvent.principal with the
|
|
2
|
+
* Boot-level: API-key Bearer stamps WideEvent.principal with the issuer
|
|
3
|
+
* (`creatorId`) and `dimensions.api_key` with the key id.
|
|
3
4
|
* Session JWT stamps the session subject — never a key id.
|
|
4
5
|
*/
|
|
5
6
|
|
|
@@ -22,7 +23,7 @@ async function lastEvent(runs: ReturnType<typeof createRunsRuntime>) {
|
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
describe("pipeline — API key Bearer identity", () => {
|
|
25
|
-
test("API key Bearer stamps WideEvent.principal with the
|
|
26
|
+
test("API key Bearer stamps WideEvent.principal with the issuer", async () => {
|
|
26
27
|
resetBindings();
|
|
27
28
|
resetFlowSeq();
|
|
28
29
|
|
|
@@ -70,9 +71,193 @@ describe("pipeline — API key Bearer identity", () => {
|
|
|
70
71
|
expect(res.status).toBe(200);
|
|
71
72
|
|
|
72
73
|
const event = await lastEvent(runs);
|
|
73
|
-
expect(event?.principal).toBe("
|
|
74
|
+
expect(event?.principal).toBe("u1");
|
|
74
75
|
expect(event?.dimensions.api_key).toBe("key_demo");
|
|
75
|
-
expect(event?.dimensions.principal).toBe("
|
|
76
|
+
expect(event?.dimensions.principal).toBe("u1");
|
|
77
|
+
|
|
78
|
+
await app.stop();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test("key-authenticated request stamps fx.auth.userId as issuer and apiKeyId as the key", async () => {
|
|
82
|
+
resetBindings();
|
|
83
|
+
resetFlowSeq();
|
|
84
|
+
|
|
85
|
+
on(
|
|
86
|
+
http.get("/who").gate(member),
|
|
87
|
+
flow("secure.who", {
|
|
88
|
+
do: (_input, fx) => ({
|
|
89
|
+
userId: fx.auth.userId,
|
|
90
|
+
apiKeyId: fx.auth.apiKeyId ?? null,
|
|
91
|
+
}),
|
|
92
|
+
}),
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const apiKeys = createApiKeyStore();
|
|
96
|
+
const created = await createApiKey(apiKeys, {
|
|
97
|
+
plane: "user",
|
|
98
|
+
name: "who",
|
|
99
|
+
scopes: ["member"],
|
|
100
|
+
creatorId: "u1",
|
|
101
|
+
creatorScopes: ["member"],
|
|
102
|
+
id: "key_who",
|
|
103
|
+
});
|
|
104
|
+
const app = oke({
|
|
105
|
+
name: "api-key-who",
|
|
106
|
+
gate: {
|
|
107
|
+
auth: {
|
|
108
|
+
secret: "hmac-secret-for-tests",
|
|
109
|
+
sessions: createSessionStore(),
|
|
110
|
+
apiKeyStore: apiKeys,
|
|
111
|
+
http: false,
|
|
112
|
+
},
|
|
113
|
+
policies: [member],
|
|
114
|
+
},
|
|
115
|
+
env: "test",
|
|
116
|
+
startScheduler: false,
|
|
117
|
+
});
|
|
118
|
+
await app.boot({ env: "test", gates: [member], startScheduler: false });
|
|
119
|
+
|
|
120
|
+
const res = await app.fetch(
|
|
121
|
+
new Request("http://localhost/who", {
|
|
122
|
+
method: "GET",
|
|
123
|
+
headers: { authorization: `Bearer ${created.secret}` },
|
|
124
|
+
}),
|
|
125
|
+
);
|
|
126
|
+
expect(res.status).toBe(200);
|
|
127
|
+
const body = (await res.json()) as { data: { userId: string; apiKeyId: string } };
|
|
128
|
+
expect(body.data.userId).toBe("u1");
|
|
129
|
+
expect(body.data.apiKeyId).toBe("key_who");
|
|
130
|
+
|
|
131
|
+
await app.stop();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("scope A is Forbidden on gate.scope(B) and 200 on gate.scope(A)", async () => {
|
|
135
|
+
resetBindings();
|
|
136
|
+
resetFlowSeq();
|
|
137
|
+
|
|
138
|
+
const scopeA = gate.scope("scope:a");
|
|
139
|
+
const scopeB = gate.scope("scope:b");
|
|
140
|
+
on(http.get("/a").gate(scopeA), flow("secure.a", { do: () => ({ ok: true }) }));
|
|
141
|
+
on(http.get("/b").gate(scopeB), flow("secure.b", { do: () => ({ ok: true }) }));
|
|
142
|
+
|
|
143
|
+
const apiKeys = createApiKeyStore();
|
|
144
|
+
const created = await createApiKey(apiKeys, {
|
|
145
|
+
plane: "user",
|
|
146
|
+
name: "scoped",
|
|
147
|
+
scopes: ["scope:a"],
|
|
148
|
+
creatorId: "u1",
|
|
149
|
+
creatorScopes: ["scope:a", "scope:b"],
|
|
150
|
+
});
|
|
151
|
+
const app = oke({
|
|
152
|
+
name: "api-key-scopes",
|
|
153
|
+
gate: {
|
|
154
|
+
auth: {
|
|
155
|
+
secret: "hmac-secret-for-tests",
|
|
156
|
+
sessions: createSessionStore(),
|
|
157
|
+
apiKeyStore: apiKeys,
|
|
158
|
+
http: false,
|
|
159
|
+
},
|
|
160
|
+
policies: [scopeA, scopeB],
|
|
161
|
+
},
|
|
162
|
+
env: "test",
|
|
163
|
+
startScheduler: false,
|
|
164
|
+
});
|
|
165
|
+
await app.boot({ env: "test", gates: [scopeA, scopeB], startScheduler: false });
|
|
166
|
+
|
|
167
|
+
const a = await app.fetch(
|
|
168
|
+
new Request("http://localhost/a", {
|
|
169
|
+
method: "GET",
|
|
170
|
+
headers: { authorization: `Bearer ${created.secret}` },
|
|
171
|
+
}),
|
|
172
|
+
);
|
|
173
|
+
const b = await app.fetch(
|
|
174
|
+
new Request("http://localhost/b", {
|
|
175
|
+
method: "GET",
|
|
176
|
+
headers: { authorization: `Bearer ${created.secret}` },
|
|
177
|
+
}),
|
|
178
|
+
);
|
|
179
|
+
expect(a.status).toBe(200);
|
|
180
|
+
expect(b.status).toBe(403);
|
|
181
|
+
|
|
182
|
+
await app.stop();
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("allowlist miss and over-rate → 401, no api_key dimension", async () => {
|
|
186
|
+
resetBindings();
|
|
187
|
+
resetFlowSeq();
|
|
188
|
+
|
|
189
|
+
on(http.get("/secure").gate(member), flow("secure.limit", { do: () => ({ ok: true }) }));
|
|
190
|
+
|
|
191
|
+
const apiKeys = createApiKeyStore();
|
|
192
|
+
const allowlisted = await createApiKey(apiKeys, {
|
|
193
|
+
plane: "user",
|
|
194
|
+
name: "allow",
|
|
195
|
+
scopes: ["member"],
|
|
196
|
+
creatorId: "u1",
|
|
197
|
+
creatorScopes: ["member"],
|
|
198
|
+
id: "key_allow",
|
|
199
|
+
ipAllowlist: ["203.0.113.10"],
|
|
200
|
+
});
|
|
201
|
+
const rated = await createApiKey(apiKeys, {
|
|
202
|
+
plane: "user",
|
|
203
|
+
name: "rated",
|
|
204
|
+
scopes: ["member"],
|
|
205
|
+
creatorId: "u1",
|
|
206
|
+
creatorScopes: ["member"],
|
|
207
|
+
id: "key_rate",
|
|
208
|
+
rateLimit: { max: 1, per: "1m" },
|
|
209
|
+
});
|
|
210
|
+
const runs = createRunsRuntime({ driver: memoryRunsDriver });
|
|
211
|
+
await runs.open();
|
|
212
|
+
const app = oke({
|
|
213
|
+
name: "api-key-limits",
|
|
214
|
+
gate: {
|
|
215
|
+
auth: {
|
|
216
|
+
secret: "hmac-secret-for-tests",
|
|
217
|
+
sessions: createSessionStore(),
|
|
218
|
+
apiKeyStore: apiKeys,
|
|
219
|
+
http: false,
|
|
220
|
+
},
|
|
221
|
+
policies: [member],
|
|
222
|
+
},
|
|
223
|
+
runs,
|
|
224
|
+
env: "test",
|
|
225
|
+
startScheduler: false,
|
|
226
|
+
});
|
|
227
|
+
await app.boot({ env: "test", gates: [member], runs, startScheduler: false });
|
|
228
|
+
|
|
229
|
+
const miss = await app.fetch(
|
|
230
|
+
new Request("http://localhost/secure", {
|
|
231
|
+
method: "GET",
|
|
232
|
+
headers: {
|
|
233
|
+
authorization: `Bearer ${allowlisted.secret}`,
|
|
234
|
+
"x-forwarded-for": "198.51.100.7",
|
|
235
|
+
},
|
|
236
|
+
}),
|
|
237
|
+
);
|
|
238
|
+
expect(miss.status).toBe(401);
|
|
239
|
+
|
|
240
|
+
const first = await app.fetch(
|
|
241
|
+
new Request("http://localhost/secure", {
|
|
242
|
+
method: "GET",
|
|
243
|
+
headers: { authorization: `Bearer ${rated.secret}` },
|
|
244
|
+
}),
|
|
245
|
+
);
|
|
246
|
+
const second = await app.fetch(
|
|
247
|
+
new Request("http://localhost/secure", {
|
|
248
|
+
method: "GET",
|
|
249
|
+
headers: { authorization: `Bearer ${rated.secret}` },
|
|
250
|
+
}),
|
|
251
|
+
);
|
|
252
|
+
expect(first.status).toBe(200);
|
|
253
|
+
expect(second.status).toBe(401);
|
|
254
|
+
|
|
255
|
+
const events = await runs.all();
|
|
256
|
+
for (const event of events) {
|
|
257
|
+
if (event.dimensions.error_code) {
|
|
258
|
+
expect(event.dimensions.api_key).toBeUndefined();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
76
261
|
|
|
77
262
|
await app.stop();
|
|
78
263
|
});
|
|
@@ -206,7 +391,7 @@ describe("pipeline — API key Bearer identity", () => {
|
|
|
206
391
|
await app.stop();
|
|
207
392
|
});
|
|
208
393
|
|
|
209
|
-
test("operator-plane key stamps fx.operator.id as the
|
|
394
|
+
test("operator-plane key stamps fx.operator.id as the issuer", async () => {
|
|
210
395
|
resetBindings();
|
|
211
396
|
resetFlowSeq();
|
|
212
397
|
|
|
@@ -254,10 +439,10 @@ describe("pipeline — API key Bearer identity", () => {
|
|
|
254
439
|
);
|
|
255
440
|
expect(res.status).toBe(200);
|
|
256
441
|
const body = (await res.json()) as { data: { operatorId: string } };
|
|
257
|
-
expect(body.data.operatorId).toBe("
|
|
442
|
+
expect(body.data.operatorId).toBe("op1");
|
|
258
443
|
|
|
259
444
|
const event = await lastEvent(runs);
|
|
260
|
-
expect(event?.principal).toBe("
|
|
445
|
+
expect(event?.principal).toBe("op1");
|
|
261
446
|
expect(event?.plane).toBe("operator");
|
|
262
447
|
expect(event?.dimensions.api_key).toBe("key_ops");
|
|
263
448
|
|
package/src/kernel/pipeline.ts
CHANGED
|
@@ -24,6 +24,7 @@ export interface PrincipalBag {
|
|
|
24
24
|
userId: string | null;
|
|
25
25
|
scopes: Set<string>;
|
|
26
26
|
verified?: boolean;
|
|
27
|
+
apiKeyId?: string | null;
|
|
27
28
|
};
|
|
28
29
|
readonly operator: {
|
|
29
30
|
id: string | null;
|
|
@@ -53,7 +54,7 @@ export interface PipelineDeps {
|
|
|
53
54
|
* @returns Principal on success
|
|
54
55
|
* @throws On forge / expiry / revoke — pipeline maps to `Unauthorized`
|
|
55
56
|
*/
|
|
56
|
-
readonly verifyBearer?: (token: string) => Promise<ResolvedPrincipal>;
|
|
57
|
+
readonly verifyBearer?: (token: string, request?: Request) => Promise<ResolvedPrincipal>;
|
|
57
58
|
/**
|
|
58
59
|
* Optional token extraction (e.g. cookie → Bearer when cookies enabled).
|
|
59
60
|
* When omitted, only `Authorization: Bearer` is read.
|
|
@@ -155,6 +156,7 @@ export function applyPrincipal(bag: PrincipalBag, resolved: ResolvedPrincipal |
|
|
|
155
156
|
for (const s of resolved.scopes) bag.auth.scopes.add(s);
|
|
156
157
|
}
|
|
157
158
|
if (resolved.verified !== undefined) bag.auth.verified = resolved.verified;
|
|
159
|
+
bag.auth.apiKeyId = resolved.apiKeyId ?? null;
|
|
158
160
|
}
|
|
159
161
|
}
|
|
160
162
|
|
|
@@ -192,7 +194,7 @@ export function createElementPipelineHooks(deps: PipelineDeps): {
|
|
|
192
194
|
return fail("Unauthorized", {});
|
|
193
195
|
}
|
|
194
196
|
try {
|
|
195
|
-
const principal = await deps.verifyBearer(token);
|
|
197
|
+
const principal = await deps.verifyBearer(token, ctx.request);
|
|
196
198
|
applyPrincipal(deps.principals, principal);
|
|
197
199
|
if (principal.apiKeyId) {
|
|
198
200
|
deps.telemetry.dimensions.api_key = principal.apiKeyId;
|
package/src/manifest/types.ts
CHANGED
|
@@ -46,6 +46,12 @@ export type ResourceRef = `${StoreFacet}:${string}`;
|
|
|
46
46
|
*/
|
|
47
47
|
export type RunsResourceRef = "runs";
|
|
48
48
|
|
|
49
|
+
/**
|
|
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
|
+
|
|
49
55
|
/**
|
|
50
56
|
* Dead-letter read capability for `fx.deadLetters` — not a store facet.
|
|
51
57
|
* Declare on `effects.reads` (never `writes`).
|
|
@@ -81,9 +87,9 @@ export type JsonSchema = string | Record<string, unknown>;
|
|
|
81
87
|
*/
|
|
82
88
|
export interface Effects {
|
|
83
89
|
/** 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
|
|
90
|
+
reads?: Array<ResourceRef | RunsResourceRef | SignalResourceRef | AuthApiKeysResourceRef>;
|
|
91
|
+
/** Store writes, plus `"auth:api-keys"` for `fx.auth` mutations. */
|
|
92
|
+
writes?: Array<ResourceRef | AuthApiKeysResourceRef>;
|
|
87
93
|
/** Emitted signals. */
|
|
88
94
|
emits?: SignalRef[];
|
|
89
95
|
/** Channel template sends (irreversible). */
|
package/src/release/build-lib.ts
CHANGED
|
@@ -26,6 +26,7 @@ const ENTRIES: readonly { readonly src: string; readonly out: string }[] = [
|
|
|
26
26
|
// when the feature actually runs (auth, list page, auto-cache).
|
|
27
27
|
{ src: "src/kernel/app-auth.ts", out: "dist/app-auth.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" },
|
|
29
30
|
{ src: "src/kernel/list-page.ts", out: "dist/list-page.js" },
|
|
30
31
|
{ src: "src/kernel/http-resource.ts", out: "dist/http-resource.js" },
|
|
31
32
|
{ src: "src/elements/store/cache.ts", out: "dist/store-cache.js" },
|
|
@@ -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};
|