ankka-console 0.13.0 → 0.14.1

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.
@@ -105,9 +105,32 @@ export declare const installationModelsSchema: z.ZodObject<{
105
105
  }, z.core.$strip>>;
106
106
  }, z.core.$strip>;
107
107
  export type InstallationModels = z.infer<typeof installationModelsSchema>;
108
+ /**
109
+ * The installation's broker (spec 057): how many nodes, absent when the control plane was not told,
110
+ * and the copies a topic is given by default, with how many must hold a message.
111
+ */
112
+ export declare const installationBrokerSchema: z.ZodObject<{
113
+ nodes: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodNumber>>, z.ZodTransform<number | undefined, number | null | undefined>>;
114
+ defaultCopies: z.ZodNumber;
115
+ minInSync: z.ZodNumber;
116
+ }, z.core.$strip>;
117
+ export type InstallationBroker = z.infer<typeof installationBrokerSchema>;
118
+ /** The longest retention a topic may be given (spec 057): a duration, or unbounded. */
119
+ export declare const installationRetentionSchema: z.ZodObject<{
120
+ longest: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string | undefined, string | null | undefined>>;
121
+ unbounded: z.ZodDefault<z.ZodBoolean>;
122
+ }, z.core.$strip>;
123
+ export type InstallationRetention = z.infer<typeof installationRetentionSchema>;
124
+ /** Erasure and its keyring (spec 057, built by spec 042); absent until the platform has erasure. */
125
+ export declare const installationErasureSchema: z.ZodObject<{
126
+ enabled: z.ZodBoolean;
127
+ keyringInstances: z.ZodNumber;
128
+ }, z.core.$strip>;
129
+ export type InstallationErasure = z.infer<typeof installationErasureSchema>;
108
130
  /**
109
131
  * `GET /installation`: the platform's version, and its cloud when it names a provider; and its
110
- * backups (feature 041); where it keeps its secrets (feature 038); and its model server (feature 053).
132
+ * backups (feature 041); where it keeps its secrets (feature 038); its model server (feature 053);
133
+ * and its broker, longest retention and erasure (spec 057), each absent when not stated.
111
134
  */
112
135
  export declare const installationSchema: z.ZodObject<{
113
136
  platformVersion: z.ZodString;
@@ -288,6 +311,39 @@ export declare const installationSchema: z.ZodObject<{
288
311
  detail: string | undefined;
289
312
  }[];
290
313
  } | null | undefined>>;
314
+ broker: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodObject<{
315
+ nodes: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodNumber>>, z.ZodTransform<number | undefined, number | null | undefined>>;
316
+ defaultCopies: z.ZodNumber;
317
+ minInSync: z.ZodNumber;
318
+ }, z.core.$strip>>>, z.ZodTransform<{
319
+ nodes: number | undefined;
320
+ defaultCopies: number;
321
+ minInSync: number;
322
+ } | undefined, {
323
+ nodes: number | undefined;
324
+ defaultCopies: number;
325
+ minInSync: number;
326
+ } | null | undefined>>;
327
+ retention: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodObject<{
328
+ longest: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string | undefined, string | null | undefined>>;
329
+ unbounded: z.ZodDefault<z.ZodBoolean>;
330
+ }, z.core.$strip>>>, z.ZodTransform<{
331
+ longest: string | undefined;
332
+ unbounded: boolean;
333
+ } | undefined, {
334
+ longest: string | undefined;
335
+ unbounded: boolean;
336
+ } | null | undefined>>;
337
+ erasure: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodObject<{
338
+ enabled: z.ZodBoolean;
339
+ keyringInstances: z.ZodNumber;
340
+ }, z.core.$strip>>>, z.ZodTransform<{
341
+ enabled: boolean;
342
+ keyringInstances: number;
343
+ } | undefined, {
344
+ enabled: boolean;
345
+ keyringInstances: number;
346
+ } | null | undefined>>;
291
347
  }, z.core.$strip>;
292
348
  export type Installation = z.infer<typeof installationSchema>;
293
349
  export declare const quotaSchema: z.ZodObject<{
@@ -75,9 +75,29 @@ export const clusterModelsSchema = z.object({
75
75
  export const installationModelsSchema = z.object({
76
76
  clusters: z.array(clusterModelsSchema),
77
77
  });
78
+ /**
79
+ * The installation's broker (spec 057): how many nodes, absent when the control plane was not told,
80
+ * and the copies a topic is given by default, with how many must hold a message.
81
+ */
82
+ export const installationBrokerSchema = z.object({
83
+ nodes: optional(z.number().int()),
84
+ defaultCopies: z.number().int(),
85
+ minInSync: z.number().int(),
86
+ });
87
+ /** The longest retention a topic may be given (spec 057): a duration, or unbounded. */
88
+ export const installationRetentionSchema = z.object({
89
+ longest: optional(z.string()),
90
+ unbounded: z.boolean().default(false),
91
+ });
92
+ /** Erasure and its keyring (spec 057, built by spec 042); absent until the platform has erasure. */
93
+ export const installationErasureSchema = z.object({
94
+ enabled: z.boolean(),
95
+ keyringInstances: z.number().int(),
96
+ });
78
97
  /**
79
98
  * `GET /installation`: the platform's version, and its cloud when it names a provider; and its
80
- * backups (feature 041); where it keeps its secrets (feature 038); and its model server (feature 053).
99
+ * backups (feature 041); where it keeps its secrets (feature 038); its model server (feature 053);
100
+ * and its broker, longest retention and erasure (spec 057), each absent when not stated.
81
101
  */
82
102
  export const installationSchema = z.object({
83
103
  platformVersion: z.string(),
@@ -86,6 +106,9 @@ export const installationSchema = z.object({
86
106
  backups: optional(z.lazy(() => installationStatusSchema)),
87
107
  secrets: optional(installationSecretsSchema),
88
108
  models: optional(installationModelsSchema),
109
+ broker: optional(installationBrokerSchema),
110
+ retention: optional(installationRetentionSchema),
111
+ erasure: optional(installationErasureSchema),
89
112
  });
90
113
  export const quotaSchema = z.object({
91
114
  projects: optional(z.number().int()),
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * The front page: who you are, as the control plane sees you, and the organizations you can see —
3
3
  * yours with your role in each, or every one of them for a platform administrator — and what the
4
- * installation is: its version, and its cloud when it names one (feature 044).
4
+ * installation is: its version, and its cloud when it names one (feature 044), and its broker and
5
+ * longest topic retention (spec 057).
5
6
  */
6
7
  import { type ActionFunctionArgs, type LoaderFunctionArgs, type MetaFunction } from "react-router";
7
8
  import { ConsoleErrorBoundary } from "../ui/errors.tsx";
@@ -90,6 +91,19 @@ export declare function loader({ context }: LoaderFunctionArgs): Promise<{
90
91
  detail: string | undefined;
91
92
  }[];
92
93
  } | undefined;
94
+ broker: {
95
+ nodes: number | undefined;
96
+ defaultCopies: number;
97
+ minInSync: number;
98
+ } | undefined;
99
+ retention: {
100
+ longest: string | undefined;
101
+ unbounded: boolean;
102
+ } | undefined;
103
+ erasure: {
104
+ enabled: boolean;
105
+ keyringInstances: number;
106
+ } | undefined;
93
107
  };
94
108
  hold: {
95
109
  held: boolean;
@@ -2,7 +2,8 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
2
2
  /**
3
3
  * The front page: who you are, as the control plane sees you, and the organizations you can see —
4
4
  * yours with your role in each, or every one of them for a platform administrator — and what the
5
- * installation is: its version, and its cloud when it names one (feature 044).
5
+ * installation is: its version, and its cloud when it names one (feature 044), and its broker and
6
+ * longest topic retention (spec 057).
6
7
  */
7
8
  import { redirect, useLoaderData } from "react-router";
8
9
  import { act, guard, pageData, text, useConsoleContext, withShell } from "../context.js";
@@ -50,7 +51,18 @@ export default function Front() {
50
51
  const hostActions = useHostActions("organization.create");
51
52
  const { shows } = useConsole();
52
53
  return (_jsxs(Page, { inspector: hostActions ? (_jsx("div", { className: "ac-ops", children: _jsx(HostActions, { operation: "organization.create" }) })) : null, children: [_jsx("h1", { children: "Organizations" }), _jsxs("p", { className: "ac-lede", children: ["Signed in as ", _jsx("strong", { children: whoami.name ?? whoami.email ?? whoami.subject }), whoami.email && whoami.name ? ` (${whoami.email})` : null, whoami.platformAdmin ? ", a platform administrator: you see every organization in this installation." : "."] }), hold?.held ? (_jsxs("section", { className: "ac-card", "aria-labelledby": "hold-title", "data-held": "yes", children: [_jsx("h2", { id: "hold-title", children: "The control plane is held" }), _jsxs("p", { children: ["Its database was restored to ", hold.targetTime ? when(hold.targetTime) : "an earlier moment", ", and it changes nothing in the cluster until a platform administrator releases it."] }), hold.services.length > 0 ? (_jsx("ul", { className: "ac-topics", "aria-label": "Services that differ", children: hold.services.map((d) => (_jsxs("li", { "data-differs": `${d.project}/${d.service}`, children: [d.project, "/", d.service, ": recorded ", d.recordedImage ?? "nothing", ", the cluster runs ", d.clusterImage ?? "nothing"] }, `${d.project}/${d.service}`))) })) : null, hold.unknownProjects.length > 0 ? _jsxs("p", { children: ["Projects the database does not know: ", hold.unknownProjects.join(", "), "."] }) : null, whoami.platformAdmin && shows("installation.release") ? (_jsx(ConsoleForm, { intent: "release", children: _jsx(Submit, { intent: "release", children: "Release the control plane" }) })) : null, _jsx(Refused, { intent: "release" })] })) : hold?.releasedAt ? (_jsxs("p", { "data-held": "released", children: ["The control plane was released after its database's restore, ", when(hold.releasedAt), hold.releasedBy ? ` by ${hold.releasedBy}` : "", "."] })) : null, backups ? (_jsx("p", { className: "ac-hint", "data-backups": backups.backupTarget, children: backups.notBackedUp ??
53
- `Backups are kept at least ${backups.retentionDays} days${backups.sharesFailureDomain ? ", in the cluster they back up" : ", with a copy outside the cluster"}.` })) : null, organizations.length === 0 ? (_jsxs("p", { className: "ac-empty", children: ["You are not a member of any organization yet. Create one, or ask an owner to invite ", whoami.email ?? "you", "."] })) : (_jsx("div", { className: "ac-card ac-table-wrap", children: _jsxs("table", { className: "ac-table", children: [_jsx("caption", { className: "ac-visually-hidden", children: "Organizations you can see" }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: "Name" }), _jsx("th", { scope: "col", children: "Id" }), _jsx("th", { scope: "col", children: "Your role" }), _jsx("th", { scope: "col", className: "ac-num", children: "Projects" }), _jsx("th", { scope: "col", children: "State" })] }) }), _jsx("tbody", { children: organizations.map((o) => (_jsxs("tr", { children: [_jsx("td", { children: _jsx(ConsoleLink, { to: `organizations/${encodeURIComponent(o.id)}`, children: o.name }) }), _jsx("td", { children: o.id }), _jsx("td", { children: o.role ? roleWords[o.role] : "Administrator (not a member)" }), _jsx("td", { className: "ac-num", children: o.projects }), _jsx("td", { children: o.disabled ? "Disabled" : "Active" })] }, o.id))) })] }) })), _jsxs("section", { className: "ac-card", "aria-labelledby": "installation", children: [_jsx("h2", { id: "installation", children: "This installation" }), _jsxs("dl", { className: "ac-facts", children: [_jsx("dt", { children: "Platform version" }), _jsx("dd", { children: installation.platformVersion }), _jsx("dt", { children: "Cloud" }), _jsx("dd", { children: cloud ? `${cloud.provider}, account ${cloud.account}` : "None: everything is served by the installation itself" }), cloud ? (_jsxs(_Fragment, { children: [_jsx("dt", { children: "Location" }), _jsx("dd", { children: cloud.location })] })) : null, cloud?.kmsKey ? (_jsxs(_Fragment, { children: [_jsx("dt", { children: "Wrapping key" }), _jsx("dd", { children: cloud.kmsKey })] })) : null, installation.secrets ? (_jsxs(_Fragment, { children: [_jsx("dt", { children: "Secrets kept in" }), _jsx("dd", { children: secretBackendWords[installation.secrets.backend] ?? installation.secrets.backend }), _jsx("dt", { children: "Record of reads kept for" }), _jsx("dd", { children: installation.secrets.recordRetention }), _jsx("dt", { children: "Access log" }), _jsx("dd", { children: installation.secrets.auditLog })] })) : null] })] })] }));
54
+ `Backups are kept at least ${backups.retentionDays} days${backups.sharesFailureDomain ? ", in the cluster they back up" : ", with a copy outside the cluster"}.` })) : null, organizations.length === 0 ? (_jsxs("p", { className: "ac-empty", children: ["You are not a member of any organization yet. Create one, or ask an owner to invite ", whoami.email ?? "you", "."] })) : (_jsx("div", { className: "ac-card ac-table-wrap", children: _jsxs("table", { className: "ac-table", children: [_jsx("caption", { className: "ac-visually-hidden", children: "Organizations you can see" }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: "Name" }), _jsx("th", { scope: "col", children: "Id" }), _jsx("th", { scope: "col", children: "Your role" }), _jsx("th", { scope: "col", className: "ac-num", children: "Projects" }), _jsx("th", { scope: "col", children: "State" })] }) }), _jsx("tbody", { children: organizations.map((o) => (_jsxs("tr", { children: [_jsx("td", { children: _jsx(ConsoleLink, { to: `organizations/${encodeURIComponent(o.id)}`, children: o.name }) }), _jsx("td", { children: o.id }), _jsx("td", { children: o.role ? roleWords[o.role] : "Administrator (not a member)" }), _jsx("td", { className: "ac-num", children: o.projects }), _jsx("td", { children: o.disabled ? "Disabled" : "Active" })] }, o.id))) })] }) })), _jsxs("section", { className: "ac-card", "aria-labelledby": "installation", children: [_jsx("h2", { id: "installation", children: "This installation" }), _jsxs("dl", { className: "ac-facts", children: [_jsx("dt", { children: "Platform version" }), _jsx("dd", { children: installation.platformVersion }), _jsx("dt", { children: "Cloud" }), _jsx("dd", { children: cloud ? `${cloud.provider}, account ${cloud.account}` : "None: everything is served by the installation itself" }), cloud ? (_jsxs(_Fragment, { children: [_jsx("dt", { children: "Location" }), _jsx("dd", { children: cloud.location })] })) : null, cloud?.kmsKey ? (_jsxs(_Fragment, { children: [_jsx("dt", { children: "Wrapping key" }), _jsx("dd", { children: cloud.kmsKey })] })) : null, installation.secrets ? (_jsxs(_Fragment, { children: [_jsx("dt", { children: "Secrets kept in" }), _jsx("dd", { children: secretBackendWords[installation.secrets.backend] ?? installation.secrets.backend }), _jsx("dt", { children: "Record of reads kept for" }), _jsx("dd", { children: installation.secrets.recordRetention }), _jsx("dt", { children: "Access log" }), _jsx("dd", { children: installation.secrets.auditLog })] })) : null, installation.broker ? (_jsxs(_Fragment, { children: [_jsx("dt", { children: "Broker" }), _jsx("dd", { children: brokerWords(installation.broker) })] })) : null, installation.retention ? (_jsxs(_Fragment, { children: [_jsx("dt", { children: "Longest topic retention" }), _jsx("dd", { children: retentionWords(installation.retention) })] })) : null] })] })] }));
55
+ }
56
+ /** The installation's broker (spec 057), in words; a node count the control plane was not told is said so. */
57
+ function brokerWords(broker) {
58
+ const nodes = broker.nodes === undefined ? "nodes not stated" : `${broker.nodes} ${broker.nodes === 1 ? "node" : "nodes"}`;
59
+ return `${nodes}; a topic gets ${broker.defaultCopies} ${broker.defaultCopies === 1 ? "copy" : "copies"}, ${broker.minInSync} in sync, by default`;
60
+ }
61
+ /** The longest retention a topic may be given (spec 057), in words. */
62
+ function retentionWords(retention) {
63
+ if (retention.longest !== undefined)
64
+ return retention.longest;
65
+ return retention.unbounded ? "Unbounded" : "Not stated";
54
66
  }
55
67
  /** The installation's secret store (feature 038), in words; an unknown backend is shown as it is named. */
56
68
  const secretBackendWords = {
@@ -77,6 +77,6 @@ const words = {
77
77
  export default function ServiceHistory() {
78
78
  const { name, projectId, history } = useLoaderData();
79
79
  const offered = rollbackTargets(history);
80
- return (_jsxs(Page, { children: [_jsxs("div", { className: "ac-head", children: [_jsxs("h1", { children: ["History of ", name] }), _jsx(ServiceSections, { projectId: projectId, name: name, current: "history" })] }), _jsxs("section", { className: "ac-card", "aria-labelledby": "history", children: [_jsx("h2", { id: "history", children: "History" }), history.length === 0 ? (_jsx("p", { className: "ac-empty", children: "Nothing recorded yet." })) : (_jsx("div", { className: "ac-table-wrap", children: _jsxs("table", { className: "ac-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: "What" }), _jsx("th", { scope: "col", className: "ac-num", children: "Generation" }), _jsx("th", { scope: "col", children: "Image" }), _jsx("th", { scope: "col", children: "Digest" }), _jsx("th", { scope: "col", children: "Who" }), _jsx("th", { scope: "col", children: "When" }), _jsx("th", { scope: "col", "aria-label": "Roll back" })] }) }), _jsx("tbody", { children: history.map((h, i) => (_jsxs("tr", { children: [_jsx("td", { children: h.rolledBackTo !== undefined ? `Rolled back to generation ${h.rolledBackTo}` : (words[h.kind] ?? h.kind) }), _jsx("td", { className: "ac-num", children: h.generation }), _jsx("td", { children: h.image ?? "—" }), _jsx("td", { children: h.digest ? (_jsx(ConsoleLink, { to: `projects/${encodeURIComponent(projectId)}/services/apply?name=${encodeURIComponent(name)}&generation=${h.generation}`, "aria-label": `Generation ${h.generation}'s descriptor`, children: _jsx("code", { title: h.digest, children: h.digest.slice(0, 12) }) })) : ("—") }), _jsxs("td", { children: [h.actor ? (h.actor.display ?? h.actor.subject) : "—", h.actor?.administrative ? " (as administrator)" : ""] }), _jsx("td", { children: when(h.at) }), _jsx("td", { children: offered.has(h.generation) ? _jsx(RollBack, { generation: h.generation, image: h.image, entity: { name, projectId, entry: h } }) : null })] }, i))) })] }) })), _jsx(Refused, { intent: "rollback" })] })] }));
80
+ return (_jsxs(Page, { children: [_jsxs("div", { className: "ac-head", children: [_jsxs("h1", { children: ["History of ", name] }), _jsx(ServiceSections, { projectId: projectId, name: name, current: "history" })] }), _jsxs("section", { className: "ac-card", "aria-labelledby": "history", children: [_jsx("h2", { id: "history", children: "History" }), history.length === 0 ? (_jsx("p", { className: "ac-empty", children: "Nothing recorded yet." })) : (_jsx("div", { className: "ac-table-wrap", children: _jsxs("table", { className: "ac-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: "What" }), _jsx("th", { scope: "col", className: "ac-num", children: "Generation" }), _jsx("th", { scope: "col", children: "Image" }), _jsx("th", { scope: "col", children: "Digest" }), _jsx("th", { scope: "col", children: "Who" }), _jsx("th", { scope: "col", children: "When" }), _jsx("th", { scope: "col", "aria-label": "Roll back" })] }) }), _jsx("tbody", { children: history.map((h, i) => (_jsxs("tr", { children: [_jsx("td", { children: h.rolledBackTo !== undefined ? `Rolled back to generation ${h.rolledBackTo}` : (words[h.kind] ?? h.kind) }), _jsx("td", { className: "ac-num", children: h.generation }), _jsx("td", { children: h.image ?? "—" }), _jsx("td", { children: h.digest ? (_jsx(ConsoleLink, { to: `projects/${encodeURIComponent(projectId)}/services/apply?name=${encodeURIComponent(name)}&generation=${h.generation}`, "aria-label": `${h.digest.slice(0, 12)}, generation ${h.generation}'s descriptor`, children: _jsx("code", { title: h.digest, children: h.digest.slice(0, 12) }) })) : ("—") }), _jsxs("td", { children: [h.actor ? (h.actor.display ?? h.actor.subject) : "—", h.actor?.administrative ? " (as administrator)" : ""] }), _jsx("td", { children: when(h.at) }), _jsx("td", { children: offered.has(h.generation) ? _jsx(RollBack, { generation: h.generation, image: h.image, entity: { name, projectId, entry: h } }) : null })] }, i))) })] }) })), _jsx(Refused, { intent: "rollback" })] })] }));
81
81
  }
82
82
  export const ErrorBoundary = ConsoleErrorBoundary;
@@ -383,6 +383,10 @@ export async function fakeControlPlane(options = {}) {
383
383
  ...(cloud ? { cloud: { ...where, ...(kmsKey && owns ? { kmsKey } : {}) } } : {}),
384
384
  // Feature 038: where secrets are kept, as an installation that has said nothing answers.
385
385
  secrets: { backend: "postgres", recordRetention: "365d", auditLog: "unknown" },
386
+ // Spec 057: a one-node broker and no bound on retention, as the shipped settings say; no
387
+ // erasure, which the platform does not have yet.
388
+ broker: { nodes: 1, defaultCopies: 1, minInSync: 1 },
389
+ retention: { unbounded: true },
386
390
  // Feature 041: where the backups go, as an installation with Garage and no copy says it.
387
391
  backups: {
388
392
  backupTarget: "object-store",
@@ -38,10 +38,10 @@ export function Graph({ shown, differs, selected, onSelect, }) {
38
38
  .filter(Boolean)
39
39
  .join(" ");
40
40
  const kind = kindInWords(n.kind) + (n.platform ? ", platform" : "") + (differs.has(n.id) ? ", not on every instance" : "");
41
- return (_jsxs("g", { className: classes, transform: `translate(${x} ${y})`, tabIndex: 0, role: "button", "aria-label": `${n.label}: ${kind}`, onClick: () => onSelect(n.id), onKeyDown: (e) => {
41
+ return (_jsxs("g", { className: classes, transform: `translate(${x} ${y})`, tabIndex: 0, role: "button", onClick: () => onSelect(n.id), onKeyDown: (e) => {
42
42
  if (e.key === "Enter" || e.key === " ")
43
43
  onSelect(n.id);
44
- }, children: [_jsx("rect", { width: GRID.width, height: GRID.height, rx: 12, filter: "url(#ac-topology-shadow)" }), _jsx("text", { x: 10, y: 16, className: "ac-topology-name", children: clip(n.label, 22) }), _jsx("text", { x: 10, y: 30, className: "ac-topology-kind", children: clip(kind, 28) })] }, n.id));
44
+ }, children: [_jsx("title", { children: `${n.label}: ${kind}` }), _jsx("rect", { width: GRID.width, height: GRID.height, rx: 12, filter: "url(#ac-topology-shadow)" }), _jsx("text", { x: 10, y: 16, className: "ac-topology-name", "aria-hidden": "true", children: clip(n.label, 22) }), _jsx("text", { x: 10, y: 30, className: "ac-topology-kind", "aria-hidden": "true", children: clip(kind, 28) })] }, n.id));
45
45
  };
46
46
  return (_jsxs("svg", { className: "ac-topology-graph", viewBox: `0 0 ${width} ${height}`, width: width, height: height, role: "group", "aria-label": describe(shown), children: [_jsx("defs", { children: _jsx("filter", { id: "ac-topology-shadow", x: "-20%", y: "-30%", width: "140%", height: "180%", children: _jsx("feDropShadow", { dx: "0", dy: "6", stdDeviation: "8", floodColor: "#05090b", floodOpacity: "0.28" }) }) }), shown.declared.map((e) => {
47
47
  const p = path(e.from, e.to, 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ankka-console",
3
- "version": "0.13.0",
3
+ "version": "0.14.1",
4
4
  "description": "The ankka console as a package: the control plane client, sign-in and sessions, and the pages as routes a React Router host mounts.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -52,13 +52,13 @@
52
52
  "dependencies": {
53
53
  "class-variance-authority": "^0.7.1",
54
54
  "clsx": "^2.1.1",
55
- "jose": "^6.2.12",
56
- "lucide-react": "^1.52.0",
55
+ "jose": "^6.2.13",
56
+ "lucide-react": "^1.61.0",
57
57
  "openid-client": "^6.8.8",
58
- "zod": "^4.6.5"
58
+ "zod": "^4.6.7"
59
59
  },
60
60
  "peerDependencies": {
61
- "@react-router/dev": "^8.4.0",
61
+ "@react-router/dev": "^8.5.0",
62
62
  "@react-router/node": "^8.4.0",
63
63
  "react": "^19.2.7",
64
64
  "react-dom": "^19.2.7",
@@ -71,17 +71,17 @@
71
71
  },
72
72
  "devDependencies": {
73
73
  "@fontsource-variable/inter": "^5.3.0",
74
- "@react-router/dev": "^8.4.0",
74
+ "@react-router/dev": "^8.5.0",
75
75
  "@react-router/node": "^8.4.0",
76
76
  "@tailwindcss/cli": "^4.3.3",
77
- "@types/node": "^26.6.3",
77
+ "@types/node": "^26.6.5",
78
78
  "@types/react": "^19.3.0",
79
79
  "@types/react-dom": "^19.3.0",
80
- "react": "^19.3.0",
81
- "react-dom": "^19.3.0",
80
+ "react": "^19.3.1",
81
+ "react-dom": "^19.3.1",
82
82
  "react-router": "^8.4.0",
83
83
  "tailwindcss": "^4.3.3",
84
84
  "typescript": "^7.0.2",
85
- "vite": "^8.3.1"
85
+ "vite": "^8.3.5"
86
86
  }
87
87
  }