@fallen-8/studio 0.0.33 → 0.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist-lib/{cssMode-Czf2vRA3.js → cssMode-C_3o84wD.js} +1 -1
  2. package/dist-lib/f8-studio.css +1 -1
  3. package/dist-lib/f8-studio.js +1 -1
  4. package/dist-lib/{freemarker2-BtInkOsd.js → freemarker2-2fqgZiA6.js} +1 -1
  5. package/dist-lib/{handlebars-UwZ7mBGA.js → handlebars-CpHr0qpx.js} +1 -1
  6. package/dist-lib/{html-BXX93YIe.js → html-Bug9RG5l.js} +1 -1
  7. package/dist-lib/{htmlMode-BCqQu1PO.js → htmlMode-Ml4537rc.js} +1 -1
  8. package/dist-lib/{index-DFm6T7Un.js → index-B9b5xEwe.js} +22290 -21633
  9. package/dist-lib/{javascript-CK1z7Ynl.js → javascript-DvuxCyB4.js} +1 -1
  10. package/dist-lib/{jsonMode-C4Q3fVvV.js → jsonMode-BU3w8kmM.js} +1 -1
  11. package/dist-lib/{liquid-BnCUERBj.js → liquid-r_J0hX64.js} +1 -1
  12. package/dist-lib/{mdx-D2enmFMs.js → mdx-5vg3Qy8b.js} +1 -1
  13. package/dist-lib/{python-DJvSF53q.js → python-DlLCDuTf.js} +1 -1
  14. package/dist-lib/{razor-RerkagjP.js → razor-D-OmEXY0.js} +1 -1
  15. package/dist-lib/{tsMode-C-6d-f_-.js → tsMode-Dophy2cR.js} +1 -1
  16. package/dist-lib/types/api/types.d.ts +26 -2
  17. package/dist-lib/types/components/ConfigurationSurface.d.ts +42 -0
  18. package/dist-lib/types/components/FileDropzone.d.ts +23 -0
  19. package/dist-lib/types/components/InstanceHealth.d.ts +23 -0
  20. package/dist-lib/types/components/ObservabilitySection.d.ts +11 -0
  21. package/dist-lib/types/components/SettingRow.d.ts +0 -5
  22. package/dist-lib/types/lib/configCatalog.d.ts +95 -0
  23. package/dist-lib/types/lib/namespaceTotals.d.ts +47 -0
  24. package/dist-lib/{typescript-aCo3H3H0.js → typescript-oqqsXxrY.js} +1 -1
  25. package/dist-lib/{xml-CSt-F-dl.js → xml-pmqwhaBA.js} +1 -1
  26. package/dist-lib/{yaml-kSsc3ru_.js → yaml-DN1I59zm.js} +1 -1
  27. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { conf as t, language as e } from "./typescript-aCo3H3H0.js";
1
+ import { conf as t, language as e } from "./typescript-oqqsXxrY.js";
2
2
  var i = t, o = {
3
3
  // Set defaultToken to invalid to see what you do not tokenize yet
4
4
  defaultToken: "invalid",
@@ -1,4 +1,4 @@
1
- import { m as Et } from "./index-DFm6T7Un.js";
1
+ import { m as Et } from "./index-B9b5xEwe.js";
2
2
  var Lt = Object.defineProperty, Ot = Object.getOwnPropertyDescriptor, Nt = Object.getOwnPropertyNames, Rt = Object.prototype.hasOwnProperty, Mt = (e, r, i, n) => {
3
3
  if (r && typeof r == "object" || typeof r == "function")
4
4
  for (let t of Nt(r))
@@ -1,4 +1,4 @@
1
- import { m as l } from "./index-DFm6T7Un.js";
1
+ import { m as l } from "./index-B9b5xEwe.js";
2
2
  var d = Object.defineProperty, s = Object.getOwnPropertyDescriptor, c = Object.getOwnPropertyNames, u = Object.prototype.hasOwnProperty, m = (t, e, r, n) => {
3
3
  if (e && typeof e == "object" || typeof e == "function")
4
4
  for (let i of c(e))
@@ -1,4 +1,4 @@
1
- import { m as s } from "./index-DFm6T7Un.js";
1
+ import { m as s } from "./index-B9b5xEwe.js";
2
2
  var d = Object.defineProperty, c = Object.getOwnPropertyDescriptor, p = Object.getOwnPropertyNames, a = Object.prototype.hasOwnProperty, k = (n, e, i, r) => {
3
3
  if (e && typeof e == "object" || typeof e == "function")
4
4
  for (let o of p(e))
@@ -1,4 +1,4 @@
1
- import { m as o } from "./index-DFm6T7Un.js";
1
+ import { m as o } from "./index-B9b5xEwe.js";
2
2
  var a = Object.defineProperty, l = Object.getOwnPropertyDescriptor, p = Object.getOwnPropertyNames, c = Object.prototype.hasOwnProperty, g = (t, e, n, s) => {
3
3
  if (e && typeof e == "object" || typeof e == "function")
4
4
  for (let r of p(e))
@@ -1,4 +1,4 @@
1
- import { m } from "./index-DFm6T7Un.js";
1
+ import { m } from "./index-B9b5xEwe.js";
2
2
  var s = Object.defineProperty, c = Object.getOwnPropertyDescriptor, l = Object.getOwnPropertyNames, d = Object.prototype.hasOwnProperty, p = (t, e, o, n) => {
3
3
  if (e && typeof e == "object" || typeof e == "function")
4
4
  for (let r of l(e))
@@ -1,4 +1,4 @@
1
- import { t as O, m as I } from "./index-DFm6T7Un.js";
1
+ import { t as O, m as I } from "./index-B9b5xEwe.js";
2
2
  var N = Object.defineProperty, M = Object.getOwnPropertyDescriptor, R = Object.getOwnPropertyNames, K = Object.prototype.hasOwnProperty, E = (e, t, i, o) => {
3
3
  if (t && typeof t == "object" || typeof t == "function")
4
4
  for (let n of R(t))
@@ -126,6 +126,12 @@ export interface BulkImportResultREST {
126
126
  verticesCreated: number;
127
127
  edgesCreated: number;
128
128
  linesRead: number;
129
+ /**
130
+ * Whether every committed batch reached the write-ahead log (platform-integrity-audit W5).
131
+ * `false` means the counts above are real but a restart would lose part of the import, so the
132
+ * graph needs a checkpoint. Optional because an older server does not send it.
133
+ */
134
+ durable?: boolean;
129
135
  }
130
136
  /**
131
137
  * GET /ns/{ns}/generate - what a benchmark-graph generation created. Generation is ADDITIVE, so
@@ -965,7 +971,7 @@ export interface DelegateValidationResult {
965
971
  diagnostics: DelegateDiagnostic[];
966
972
  }
967
973
  /** What kind of value a provider setting takes, which is all a form needs to render it. */
968
- export type SettingKind = "Text" | "Number" | "Boolean" | "Url" | "Credential";
974
+ export type SettingKind = "Text" | "Number" | "Boolean" | "Url" | "Credential" | "File";
969
975
  /** One setting, as data. `help` says where to find the value in the source system. */
970
976
  export interface IntegrationSetting {
971
977
  key: string;
@@ -974,6 +980,11 @@ export interface IntegrationSetting {
974
980
  required: boolean;
975
981
  help: string;
976
982
  defaultValue?: string | null;
983
+ /**
984
+ * `File` settings only: the extensions the picker offers, as the HTML attribute spells them.
985
+ * A hint, not a rule - a browser ignores it for a dropped file and the runtime never checks it.
986
+ */
987
+ accept?: string | null;
977
988
  }
978
989
  /**
979
990
  * What an integration IS, as data that is true before any run exists. A form is rendered from
@@ -998,9 +1009,17 @@ export interface IntegrationDiagnostic {
998
1009
  message: string;
999
1010
  subject?: string | null;
1000
1011
  }
1012
+ /** One file a job carries: its own name, and its bytes base64. */
1013
+ export interface IntegrationJobFile {
1014
+ /** The file's own name, used verbatim in the run's messages. Never a path. */
1015
+ name: string;
1016
+ /** The file's BYTES, base64 - not its text, so a UTF-16 extract survives the trip. */
1017
+ contentBase64: string;
1018
+ }
1001
1019
  /**
1002
1020
  * The whole configuration of one run. A credential setting's value arrives in `credentialValues` and
1003
- * never in `settings`: the runtime leases and redacts the first and treats the second as ordinary data.
1021
+ * a file setting's file in `files`, never in `settings`: the runtime leases and redacts the first,
1022
+ * holds the second for the run and drops it, and treats `settings` as ordinary data.
1004
1023
  */
1005
1024
  export interface IntegrationJobRequest {
1006
1025
  providerId: string;
@@ -1009,6 +1028,11 @@ export interface IntegrationJobRequest {
1009
1028
  settings: Record<string, string>;
1010
1029
  /** Secrets. Held for the run and dropped; never persisted here, never echoed back. */
1011
1030
  credentialValues: Record<string, string>;
1031
+ /**
1032
+ * Files, by the file setting each was supplied for. Held for the run and dropped: the runtime
1033
+ * mounts no directory, so this is the only way a file reaches a provider.
1034
+ */
1035
+ files?: Record<string, IntegrationJobFile>;
1012
1036
  embedSummaries?: boolean;
1013
1037
  }
1014
1038
  /** The only account of a job, because the runtime keeps none. */
@@ -0,0 +1,42 @@
1
+ import type { ApiError } from "../api/client";
2
+ import type { ObservabilityConfigREST, PendingRestartREST, SettingREST } from "../api/types";
3
+ /**
4
+ * The configuration surface (feature configuration-surface): one dialog holding everything this
5
+ * instance binds, reached from the single Configure button on the Connect screen's configuration card.
6
+ *
7
+ * It exists because the card used to render all hundred-odd catalogued settings as ONE flat list,
8
+ * inline, in a twelve-row window. Here they are sectioned, searchable and filterable, and one section
9
+ * shows at a time.
10
+ *
11
+ * It deliberately owns NO server state: the draft, the mutation, the poll suspension and the lock
12
+ * gating all stay on the card, which outlives this dialog. Two observers on the config query would let
13
+ * react-query take the shortest refetch interval, and the card polling every ten seconds would replace
14
+ * a value under a half-typed field here, which is exactly what the poll suspension exists to prevent.
15
+ * What this component does own is where you are looking: the section, the query and the filter. Those
16
+ * live under Dialog.Content, which Radix unmounts on close, so they reset without an effect.
17
+ */
18
+ export interface ConfigurationSurfaceProps {
19
+ open: boolean;
20
+ onClose: () => void;
21
+ /** Named in the header, because the settings behind it belong to one instance and not the next. */
22
+ instanceName: string;
23
+ settings: readonly SettingREST[];
24
+ pendingRestart: readonly PendingRestartREST[];
25
+ observability: ObservabilityConfigREST;
26
+ draft: Record<string, string | null>;
27
+ dirtyCount: number;
28
+ onChange: (key: string, value: string) => void;
29
+ onClear: (key: string) => void;
30
+ onSave: () => void;
31
+ saving: boolean;
32
+ writeError: ApiError | Error | null;
33
+ /** Whether the server accepts PATCH /config at all (both operator acts are in place). */
34
+ writesAllowed: boolean;
35
+ /** False when an embed host locked the instance, which gates the whole editable region. */
36
+ editable: boolean;
37
+ /** Per key, because the namespace lock narrows to one prefix rather than the whole surface. */
38
+ isRowDisabled: (key: string) => boolean;
39
+ /** A blanked numeric field the server would refuse the whole batch over, if there is one. */
40
+ blankNumericKey?: string;
41
+ }
42
+ export declare function ConfigurationSurface(props: ConfigurationSurfaceProps): import("react").JSX.Element;
@@ -0,0 +1,23 @@
1
+ import { type ReactNode } from "react";
2
+ /**
3
+ * The drop half of taking a file from the user: the dashed target, the drag highlight, and the one
4
+ * rule that is easy to get wrong (`preventDefault` on drag-over, or the browser navigates to the
5
+ * file instead). Shared by the Knowledge screen's document ingest and the Integrations screen's
6
+ * file settings, because a second copy of the drag handlers is a second thing to get wrong.
7
+ *
8
+ * What each screen keeps is what differs: Knowledge INGESTS on drop, Integrations STAGES for a run
9
+ * that also needs an identity, and each owns its own file picker so the button next to it can mean
10
+ * what that screen needs it to mean.
11
+ */
12
+ export declare function FileDropzone(props: {
13
+ /** Called with the dropped file. */
14
+ onFile: (file: File) => void;
15
+ /** Greys the target out and refuses drops, for a screen that is not ready to take one. */
16
+ disabled?: boolean;
17
+ /** What the target says when nothing is being dragged over it. */
18
+ children: ReactNode;
19
+ /** Defaults to `dropzone`. */
20
+ testId?: string;
21
+ /** Extra classes, for a screen whose layout needs its own margins. */
22
+ className?: string;
23
+ }): import("react").JSX.Element;
@@ -0,0 +1,23 @@
1
+ import type { InstanceConfig } from "../instances/types";
2
+ /**
3
+ * The health cell of an Instances row (feature instance-level-health). An instance is a COLLECTION
4
+ * of namespaces, so this cell reports the collection; the per-namespace view is the Namespaces
5
+ * panel one section below.
6
+ *
7
+ * Two requests, each answering the question only it can:
8
+ *
9
+ * - `/status` is the PROBE. It is the one `[AllowAnonymous]` route, so it is the only thing that can
10
+ * tell "unreachable" from "unauthorized" on a key-secured instance. Its counts, though, are
11
+ * namespace-scoped, and this row addresses instances it has not activated, so unbound means they
12
+ * are the reserved `default` alone: reporting them as the instance is the defect this component
13
+ * was rewritten to remove.
14
+ * - `/ns` is the SIZE: the only route that reports every namespace. It is not anonymous, so it is
15
+ * fetched only once the probe says the credential is good, and the row never fires a request it
16
+ * knows will 401.
17
+ *
18
+ * The probe's counts survive as the two degraded readings only, both labelled for what they are
19
+ * (see `describeWholeGraph` / `describeDefaultOnly`).
20
+ */
21
+ export declare function InstanceHealth({ instance }: {
22
+ instance: InstanceConfig;
23
+ }): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import type { ObservabilityConfigREST, SettingREST } from "../api/types";
2
+ export interface ObservabilitySectionProps {
3
+ observability: ObservabilityConfigREST;
4
+ /** The section's descriptors. Empty on an instance that publishes no settings inventory. */
5
+ settings: readonly SettingREST[];
6
+ draft: Record<string, string | null>;
7
+ onChange: (key: string, value: string) => void;
8
+ onClear: (key: string) => void;
9
+ isRowDisabled: (key: string) => boolean;
10
+ }
11
+ export declare function ObservabilitySection({ observability, settings, draft, onChange, onClear, isRowDisabled, }: ObservabilitySectionProps): import("react").JSX.Element;
@@ -1,9 +1,4 @@
1
1
  import type { SettingREST } from "../api/types";
2
- /** The environment-variable spelling an operator has to remove to manage a key here instead. */
3
- export declare function environmentSpelling(key: string): string;
4
- export declare function isEnvironmentLocked(setting: SettingREST): boolean;
5
- /** A stable, key-derived handle: Fallen8:Plugins:MaxCount -> config-setting-fallen8-plugins-maxcount. */
6
- export declare function settingTestId(key: string): string;
7
2
  export declare const SettingRow: import("react").NamedExoticComponent<{
8
3
  setting: SettingREST;
9
4
  /** The unsaved value, or undefined when this row is untouched. */
@@ -0,0 +1,95 @@
1
+ import type { SettingREST } from "../api/types";
2
+ /**
3
+ * The client's view of the server's setting catalog (feature configuration-surface): how the
4
+ * instance's settings are grouped for a reader, how a query and a filter select among them, and the
5
+ * two per-key rules Studio derives from a descriptor.
6
+ *
7
+ * It exists because GET /config publishes a FLAT list of about a hundred descriptors in the server's
8
+ * own declaration order, and one flat list is what made the old inline panel unreadable. Everything
9
+ * here is pure: no React, no API call, so the grouping is testable on its own, which matters because
10
+ * a key this module silently dropped would be editable nowhere and invisible in a screenshot.
11
+ *
12
+ * It deliberately carries NO description of what an individual key means. That lives on the server's
13
+ * own catalog reason and on each feature's docs page; a second copy here would drift. The one thing
14
+ * this module does explain is what a SECTION governs, in one line, because no server field says that.
15
+ */
16
+ /** A nav heading over a run of sections. */
17
+ export type ConfigGroupId = "graph" | "workloads" | "semantic" | "operations" | "reference" | "ungrouped";
18
+ export declare const CONFIG_GROUPS: readonly {
19
+ id: ConfigGroupId;
20
+ label: string;
21
+ }[];
22
+ export interface ConfigSection {
23
+ id: string;
24
+ group: ConfigGroupId;
25
+ label: string;
26
+ /** One line on what the section governs. Never what a single key does. */
27
+ blurb: string;
28
+ /**
29
+ * The raw config sections (a key's SECOND segment) this entry collects, in render order. The first
30
+ * is the primary: its own keys render without a sub-group header.
31
+ */
32
+ raw: readonly string[];
33
+ /** True when the pane renders its rows without sub-group headers at all. */
34
+ flat?: boolean;
35
+ }
36
+ /** Where an unmapped raw section lands, so a section this version does not know is still readable. */
37
+ export declare const OTHER_SECTION_ID = "other";
38
+ /**
39
+ * The ordered sections. Not alphabetical and not the server's order: the read/write sections come
40
+ * first in rough tuning order and the two entirely read-only ones last, because the reason to open
41
+ * this surface is almost always to change something.
42
+ *
43
+ * `raw` is a section NAME, never a key list: the server encodes the grouping in the key itself, and a
44
+ * key list would silently miss the next key added under a section.
45
+ */
46
+ export declare const CONFIG_SECTIONS: readonly ConfigSection[];
47
+ /**
48
+ * The section a key belongs to, from its SECOND segment, which is the same rule the server states for
49
+ * itself. Exact-case on purpose: a mis-cased key is not the key the server publishes, and normalising
50
+ * it here would hide that rather than showing it under "Other".
51
+ */
52
+ export declare function sectionOf(key: string): ConfigSection;
53
+ /** A run of rows under one header inside a section pane. `label` is "" for the section's own keys. */
54
+ export interface SettingGroup {
55
+ label: string;
56
+ settings: SettingREST[];
57
+ }
58
+ export interface SectionGroup {
59
+ section: ConfigSection;
60
+ /** Every setting in the section, in render order. */
61
+ settings: SettingREST[];
62
+ /** The sub-groups, direct keys first; a single unlabelled group when the section renders flat. */
63
+ groups: SettingGroup[];
64
+ }
65
+ /**
66
+ * Buckets the published settings into the ordered sections, preserving the server's order within a
67
+ * raw section: the catalog authors related keys adjacently (an index switch is followed by the index
68
+ * id it governs) and an alphabetical re-sort would split those pairs.
69
+ *
70
+ * Every input setting comes out in exactly one section. Nothing is filtered here, so a key this
71
+ * version does not recognise lands in "Other" rather than disappearing.
72
+ */
73
+ export declare function groupSettings(settings: readonly SettingREST[] | undefined): SectionGroup[];
74
+ /**
75
+ * Whether a setting matches a search. Covers the key, the exclusion rule and the reason, and
76
+ * deliberately NOT the value: a value here can be an endpoint or a filesystem path, and a value
77
+ * search would turn the box into a way to fish for one.
78
+ */
79
+ export declare function matchesQuery(setting: SettingREST, query: string): boolean;
80
+ /** The environment-variable spelling an operator has to remove to manage a key here instead. */
81
+ export declare function environmentSpelling(key: string): string;
82
+ export declare function isEnvironmentLocked(setting: SettingREST): boolean;
83
+ /** A stable, key-derived handle: Fallen8:Plugins:MaxCount -> config-setting-fallen8-plugins-maxcount. */
84
+ export declare function settingTestId(key: string): string;
85
+ export type ConfigFilterId = "all" | "writable" | "restartPending" | "notWritable" | "setHere" | "environment";
86
+ /**
87
+ * The filter strip. Each one answers a question an operator actually arrives with, and none of them
88
+ * hides a row silently: the pane always states how many of how many it is showing.
89
+ */
90
+ export declare const CONFIG_FILTERS: readonly {
91
+ id: ConfigFilterId;
92
+ label: string;
93
+ title: string;
94
+ }[];
95
+ export declare function matchesFilter(setting: SettingREST, filter: ConfigFilterId): boolean;
@@ -0,0 +1,47 @@
1
+ import type { NamespaceEntry } from "../api/types";
2
+ /**
3
+ * Instance-level size, summed over the namespace inventory (feature instance-level-health): an
4
+ * INSTANCE is a collection of namespaces, so a number that describes one must cover all of them.
5
+ * The rules that make this honest live here rather than in the component that renders them.
6
+ */
7
+ export interface NamespaceTotals {
8
+ /** Inventory size. Exact: `GET /ns` lists the catalog, not the residency filter. */
9
+ namespaces: number;
10
+ /**
11
+ * Summed over the entries that report counts, or null when NONE does. Never a stand-in zero:
12
+ * a namespace this server did not load reports null (feature namespace-startup-load), and
13
+ * folding that into the sum as 0 would claim an empty graph over data still on disk.
14
+ */
15
+ vertices: number | null;
16
+ /** Summed like {@link vertices}. */
17
+ edges: number | null;
18
+ /** How many entries reported no counts, i.e. how much the sums are missing. */
19
+ unreported: number;
20
+ }
21
+ /** A rendered total: the cell's text, plus the tooltip that states which namespaces it covers. */
22
+ export interface TotalsDisplay {
23
+ label: string;
24
+ title: string;
25
+ }
26
+ /**
27
+ * Sums an inventory. An entry counts as reporting only when BOTH counts are numbers - the server
28
+ * moves them together (both null for a namespace it did not load), and a half-reported entry is
29
+ * unknown either way, so it belongs in `unreported` rather than in a sum of one dimension.
30
+ */
31
+ export declare function summarizeInventory(entries: NamespaceEntry[]): NamespaceTotals;
32
+ /**
33
+ * The instance total: `N ns · V v · E e`. The tooltip always names the scope, because the bug this
34
+ * replaced was a count whose scope was unstated (it silently meant the reserved `default`).
35
+ */
36
+ export declare function describeTotals(totals: NamespaceTotals): TotalsDisplay;
37
+ /**
38
+ * A server that predates namespaces (`GET /ns` 404s): its bare routes ARE the whole graph, so the
39
+ * probe's counts are already instance-level and carry no `ns` segment.
40
+ */
41
+ export declare function describeWholeGraph(vertices: number | null, edges: number | null): TotalsDisplay;
42
+ /**
43
+ * The degraded reading: the inventory could not be read, so all we have is the probe, which is
44
+ * namespace-scoped and aliases `default`. The label SAYS `default:` rather than passing one
45
+ * namespace off as the instance - that substitution is the defect this feature exists to remove.
46
+ */
47
+ export declare function describeDefaultOnly(vertices: number | null, edges: number | null, reason: string): TotalsDisplay;
@@ -1,4 +1,4 @@
1
- import { m as s } from "./index-DFm6T7Un.js";
1
+ import { m as s } from "./index-B9b5xEwe.js";
2
2
  var c = Object.defineProperty, a = Object.getOwnPropertyDescriptor, p = Object.getOwnPropertyNames, g = Object.prototype.hasOwnProperty, l = (t, e, o, i) => {
3
3
  if (e && typeof e == "object" || typeof e == "function")
4
4
  for (let n of p(e))
@@ -1,4 +1,4 @@
1
- import { m as r } from "./index-DFm6T7Un.js";
1
+ import { m as r } from "./index-B9b5xEwe.js";
2
2
  var m = Object.defineProperty, c = Object.getOwnPropertyDescriptor, l = Object.getOwnPropertyNames, d = Object.prototype.hasOwnProperty, p = (t, e, o, i) => {
3
3
  if (e && typeof e == "object" || typeof e == "function")
4
4
  for (let n of l(e))
@@ -1,4 +1,4 @@
1
- import { m as l } from "./index-DFm6T7Un.js";
1
+ import { m as l } from "./index-B9b5xEwe.js";
2
2
  var i = Object.defineProperty, c = Object.getOwnPropertyDescriptor, u = Object.getOwnPropertyNames, s = Object.prototype.hasOwnProperty, d = (n, e, r, o) => {
3
3
  if (e && typeof e == "object" || typeof e == "function")
4
4
  for (let t of u(e))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fallen-8/studio",
3
- "version": "0.0.33",
3
+ "version": "0.0.35",
4
4
  "description": "F8 Studio - browser frontend for Fallen-8 instances, and its graph canvas as a standalone component",
5
5
  "license": "MIT",
6
6
  "author": "Henning Rauch",