@fallen-8/studio 0.0.37 → 0.0.39
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/dist-lib/{Canvas3D-CmDAo5BT.js → Canvas3D-CafFy8T8.js} +1 -1
- package/dist-lib/{F8GraphCanvas-COQKIUas.js → F8GraphCanvas-CMXizZ4K.js} +904 -865
- package/dist-lib/canvas.js +1 -1
- package/dist-lib/{cssMode-Cm-p9yGb.js → cssMode-Dd6oqVGH.js} +1 -1
- package/dist-lib/f8-studio.css +1 -1
- package/dist-lib/f8-studio.js +2 -2
- package/dist-lib/{freemarker2-DU-Ctapi.js → freemarker2-_7Qea7qU.js} +1 -1
- package/dist-lib/{handlebars-BsqZtC5a.js → handlebars-BrjKnoRC.js} +1 -1
- package/dist-lib/{html-CUyknR5b.js → html-CZOSsAmT.js} +1 -1
- package/dist-lib/{htmlMode-DjyPljE2.js → htmlMode-DmeNRJyP.js} +1 -1
- package/dist-lib/{index-BQbFjItv.js → index-CGOXemLg.js} +27547 -26386
- package/dist-lib/{javascript-CVQBymBa.js → javascript-E9zK2eIG.js} +1 -1
- package/dist-lib/{jsonMode-B3hcJ0l3.js → jsonMode-BmT8sixk.js} +1 -1
- package/dist-lib/{liquid-DLrt4Cls.js → liquid-mEomZ5zY.js} +1 -1
- package/dist-lib/{mdx-DePkemui.js → mdx-poAEdYDh.js} +1 -1
- package/dist-lib/{python-CUe0bWsE.js → python-BkeUbXrt.js} +1 -1
- package/dist-lib/{razor-DD_zUh3z.js → razor-CSXbiZmb.js} +1 -1
- package/dist-lib/{tsMode-Ae3UtOmp.js → tsMode-jcKLVReC.js} +1 -1
- package/dist-lib/types/api/client.d.ts +49 -0
- package/dist-lib/types/api/endpoints.d.ts +56 -10
- package/dist-lib/types/api/types.d.ts +72 -3
- package/dist-lib/types/canvas/InteractPanel.d.ts +19 -0
- package/dist-lib/types/components/ConfigurationSurface.d.ts +23 -2
- package/dist-lib/types/components/ErrorBox.d.ts +6 -0
- package/dist-lib/types/components/SemanticBlockEditor.d.ts +4 -1
- package/dist-lib/types/components/SemanticQueryEditor.d.ts +8 -1
- package/dist-lib/types/components/SettingRow.d.ts +14 -0
- package/dist-lib/types/delegate/nl/NlDraftStats.d.ts +13 -0
- package/dist-lib/types/delegate/nl/config.d.ts +5 -4
- package/dist-lib/types/delegate/nl/generate.d.ts +6 -0
- package/dist-lib/types/lib/canvasCap.d.ts +10 -0
- package/dist-lib/types/lib/canvasInteract.d.ts +174 -0
- package/dist-lib/types/lib/fieldHelp.d.ts +10 -1
- package/dist-lib/types/lib/fileLimits.d.ts +69 -0
- package/dist-lib/types/lib/format.d.ts +8 -0
- package/dist-lib/types/lib/listCaps.d.ts +16 -2
- package/dist-lib/types/lib/modelProvenance.d.ts +26 -0
- package/dist-lib/types/lib/neighborhood.d.ts +1 -0
- package/dist-lib/types/lib/vectorIndexCreate.d.ts +49 -0
- package/dist-lib/types/lib/vectorSearch.d.ts +19 -0
- package/dist-lib/types/state/instanceStore.d.ts +59 -4
- package/dist-lib/types/state/integrations.d.ts +21 -1
- package/dist-lib/{typescript-LNGesWYR.js → typescript-BqWn12P7.js} +1 -1
- package/dist-lib/{xml-BuD_-6ib.js → xml-BkH9m6gQ.js} +1 -1
- package/dist-lib/{yaml-DCzPbyTS.js → yaml-DURIwCnM.js} +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import type { EdgeREST, VectorSearchResultREST, VertexREST } from "../api/types";
|
|
2
|
+
import type { InstanceConfig } from "../instances/types";
|
|
3
|
+
import type { CanvasEdge, CanvasNode } from "../state/instanceStore";
|
|
4
|
+
/**
|
|
5
|
+
* Pure logic for the Canvas "Interact" tab (feature canvas-interact): filters build a MATCH SET
|
|
6
|
+
* over the canvas vertices, and two view-only verbs (expand, remove) apply to it. Kept DOM-free
|
|
7
|
+
* so every decision below is unit-tested without a render.
|
|
8
|
+
*
|
|
9
|
+
* The verbs are also the single home for expand-on-demand: the Detail panel's "Expand neighbors"
|
|
10
|
+
* runs `expandVertices` over one id, the tab runs it over the match set. See
|
|
11
|
+
* features/open/canvas-interact/spec.md.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* The most candidates a DATABASE-degree evaluation will sweep. Two requests per candidate, so the
|
|
15
|
+
* cap is about bounding a click, not about correctness; above it the run is refused rather than
|
|
16
|
+
* partially evaluated, and the cheap filters are the narrowing tool. One tuning home.
|
|
17
|
+
*/
|
|
18
|
+
export declare const DEGREE_SWEEP_CAP = 1000;
|
|
19
|
+
/**
|
|
20
|
+
* The most matched vertices one Expand may sweep. A single vertex's expand is already several
|
|
21
|
+
* requests (both adjacency listings, then every edge and endpoint), so this is the difference
|
|
22
|
+
* between a click and a thousand-request storm.
|
|
23
|
+
*/
|
|
24
|
+
export declare const EXPAND_SWEEP_CAP = 100;
|
|
25
|
+
/** How many vertices are expanded (or degree-probed) concurrently in one batched round. */
|
|
26
|
+
export declare const INTERACT_BATCH_SIZE = 8;
|
|
27
|
+
/** Which edges a degree comparison counts. */
|
|
28
|
+
export type DegreeSource = "database" | "canvas";
|
|
29
|
+
export type DegreeDirection = "in" | "out" | "total";
|
|
30
|
+
export type DegreeOp = "over" | "under";
|
|
31
|
+
export type SemanticDirection = "closer" | "farther";
|
|
32
|
+
/**
|
|
33
|
+
* The filters that need no server round trip, so they evaluate live on every render: label and
|
|
34
|
+
* property read the canvas snapshot, and on-canvas degree counts the edges actually loaded.
|
|
35
|
+
* A field is INACTIVE when empty, which is why the degree value is a string - "" has to mean
|
|
36
|
+
* "not filtering", and 0 is a legitimate threshold.
|
|
37
|
+
*/
|
|
38
|
+
export interface CheapFilters {
|
|
39
|
+
label: string;
|
|
40
|
+
propKey: string;
|
|
41
|
+
propTerm: string;
|
|
42
|
+
degreeSource: DegreeSource;
|
|
43
|
+
degreeDirection: DegreeDirection;
|
|
44
|
+
degreeOp: DegreeOp;
|
|
45
|
+
/** The comparison value as typed; "" (or unparseable) leaves the degree filter inactive. */
|
|
46
|
+
degreeValue: string;
|
|
47
|
+
}
|
|
48
|
+
/** A degree filter that is actually on: parsed, and known to be the canvas-counted source. */
|
|
49
|
+
export interface ActiveDegree {
|
|
50
|
+
direction: DegreeDirection;
|
|
51
|
+
op: DegreeOp;
|
|
52
|
+
value: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The degree filter as a number, or null when it is not filtering at all. A blank or
|
|
56
|
+
* unparseable value is inactive rather than 0: typing "over 0" is a real filter and must not be
|
|
57
|
+
* what an empty box means.
|
|
58
|
+
*/
|
|
59
|
+
export declare function activeDegree(filters: CheapFilters): ActiveDegree | null;
|
|
60
|
+
/** Whether any cheap filter is on, which is what makes an empty match set meaningful. */
|
|
61
|
+
export declare function anyCheapActive(filters: CheapFilters): boolean;
|
|
62
|
+
/** `over` and `under` are strict, so "over 50" excludes a vertex of exactly 50. */
|
|
63
|
+
export declare function compareDegree(degree: number, op: DegreeOp, value: number): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* The canvas vertices surviving every ACTIVE cheap filter, AND-composed.
|
|
66
|
+
*
|
|
67
|
+
* A stub vertex (merged as an edge's unloaded endpoint: no `props`, null label) matches no label
|
|
68
|
+
* and no property filter, because nothing was ever read about it - but an on-canvas degree filter
|
|
69
|
+
* counts its loaded edges like any other vertex's, since that is a fact about the view rather
|
|
70
|
+
* than about the element.
|
|
71
|
+
*
|
|
72
|
+
* On-canvas degree delegates to the style engine's `visibleDegrees`, which is what degree-based
|
|
73
|
+
* node sizing already reads: one home for counting the view's edges.
|
|
74
|
+
*/
|
|
75
|
+
export declare function matchCheap(nodes: CanvasNode[], edges: CanvasEdge[], filters: CheapFilters): CanvasNode[];
|
|
76
|
+
/** The ids whose fetched degree satisfies the comparison; an id with no score is not matched. */
|
|
77
|
+
export declare function applyDegree(degrees: ReadonlyMap<number, number>, op: DegreeOp, value: number): Set<number>;
|
|
78
|
+
/** What a semantic threshold decided, including how much of the input it could not judge. */
|
|
79
|
+
export interface SemanticVerdict {
|
|
80
|
+
matched: Set<number>;
|
|
81
|
+
/** Candidates the search returned no score for. They match NOTHING, in either direction. */
|
|
82
|
+
unscored: number;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The candidates a semantic threshold keeps, oriented by the search's own metric.
|
|
86
|
+
*
|
|
87
|
+
* `higherIsBetter` comes from the server (Cosine/DotProduct: higher is closer; L2: lower is), and
|
|
88
|
+
* the threshold is in that metric's RAW units - the client never re-derives a similarity.
|
|
89
|
+
*
|
|
90
|
+
* A candidate the result carries no score for is UNSCORED and matches neither direction. It has
|
|
91
|
+
* no embedding, or it fell outside the search window, and either way nothing measured it: "I
|
|
92
|
+
* could not look" must never become "it is far", least of all in front of a bulk remove.
|
|
93
|
+
*/
|
|
94
|
+
export declare function applySemantic(candidateIds: number[], result: VectorSearchResultREST | null, direction: SemanticDirection, threshold: number): SemanticVerdict;
|
|
95
|
+
/** How far a batched sweep has got, for the panel's progress line. */
|
|
96
|
+
export interface SweepProgress {
|
|
97
|
+
done: number;
|
|
98
|
+
total: number;
|
|
99
|
+
}
|
|
100
|
+
/** A degree sweep's answer: what it read, and what it could NOT read. */
|
|
101
|
+
export interface DegreeSweepResult {
|
|
102
|
+
degrees: Map<number, number>;
|
|
103
|
+
/**
|
|
104
|
+
* Candidates whose degree the server would not answer. They are absent from `degrees`, so they
|
|
105
|
+
* match nothing - and the caller must SAY so, because "0 of 500 match" is otherwise
|
|
106
|
+
* indistinguishable from "500 vertices measured and none qualified".
|
|
107
|
+
*/
|
|
108
|
+
unreadable: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Every candidate's DATABASE degree in one direction, batched and abortable.
|
|
112
|
+
*
|
|
113
|
+
* `total` costs both requests per vertex; a direction costs one. A vertex whose degree cannot be
|
|
114
|
+
* read is left OUT of the map rather than recorded as 0, so it fails the comparison instead of
|
|
115
|
+
* being swept up by "under x" by a bulk remove - and it is COUNTED, which is the half that makes
|
|
116
|
+
* the rule honest rather than merely safe (the semantic filter's unscored count is the precedent).
|
|
117
|
+
*/
|
|
118
|
+
export declare function degreeSweep(instance: InstanceConfig, ids: number[], options: {
|
|
119
|
+
direction: DegreeDirection;
|
|
120
|
+
signal?: AbortSignal;
|
|
121
|
+
onProgress?: (progress: SweepProgress) => void;
|
|
122
|
+
}): Promise<DegreeSweepResult>;
|
|
123
|
+
/** What an expand sweep actually did, which is never assumed to be "all of it". */
|
|
124
|
+
export interface ExpandOutcome {
|
|
125
|
+
/** Vertices the sweep ATTEMPTED (its progress position), failures included. */
|
|
126
|
+
attempted: number;
|
|
127
|
+
/** Vertices whose neighborhood came back and was merged. `expanded + failed === attempted`. */
|
|
128
|
+
expanded: number;
|
|
129
|
+
total: number;
|
|
130
|
+
/** True when the canvas element ceiling stopped the sweep before the last vertex. */
|
|
131
|
+
stoppedAtCeiling: boolean;
|
|
132
|
+
cancelled: boolean;
|
|
133
|
+
/**
|
|
134
|
+
* Vertices whose neighborhood fetch threw. NOTE the honest limitation: the neighborhood
|
|
135
|
+
* primitive swallows per-request HTTP failures and returns empty arrays, so a vertex whose
|
|
136
|
+
* adjacency the server refused looks exactly like a vertex with no neighbors. This counts only
|
|
137
|
+
* what reaches us as an exception (a malformed answer), which is why the panel never presents
|
|
138
|
+
* it as "everything that went wrong" - and why an ABORT is handled by discarding its batch
|
|
139
|
+
* rather than by counting it here, since an aborted fetch does not throw out of the primitive
|
|
140
|
+
* either.
|
|
141
|
+
*/
|
|
142
|
+
failed: number;
|
|
143
|
+
/**
|
|
144
|
+
* Vertices where the per-vertex edge cap cut the neighborhood short, so the canvas holds only
|
|
145
|
+
* part of what they touch. Reported, because the alternative is a hub that looks fully expanded.
|
|
146
|
+
*/
|
|
147
|
+
truncated: number;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Expand a set of vertices: one hop each, merged as every batch lands.
|
|
151
|
+
*
|
|
152
|
+
* The one home for expand-on-demand. `onMerge` is called per batch rather than once at the end,
|
|
153
|
+
* so a long sweep grows the canvas visibly and a cancel keeps what already landed. `skip` is
|
|
154
|
+
* re-read per batch through `liveElementCount`/`skipIds` callbacks rather than captured once,
|
|
155
|
+
* because each merge changes what the next batch would re-fetch.
|
|
156
|
+
*
|
|
157
|
+
* The sweep stops when the canvas reaches `elementCeiling` and SAYS so (`stoppedAtCeiling`), the
|
|
158
|
+
* same honesty as the whole-graph truncation notice - silently expanding half a match set would
|
|
159
|
+
* look identical to a graph that simply has fewer neighbors. The signal reaches the fetches
|
|
160
|
+
* themselves, so a cancel stops issuing requests rather than only stopping the next batch.
|
|
161
|
+
*/
|
|
162
|
+
export declare function expandVertices(instance: InstanceConfig, ids: number[], options: {
|
|
163
|
+
/** Ids not to re-hydrate, re-read before each batch (the live canvas). */
|
|
164
|
+
skipIds: () => ReadonlySet<number>;
|
|
165
|
+
/** Current canvas element count, re-read before each batch. */
|
|
166
|
+
liveElementCount?: () => number;
|
|
167
|
+
/** Stop once the canvas holds this many elements. Omitted = no ceiling. */
|
|
168
|
+
elementCeiling?: number;
|
|
169
|
+
onMerge: (vertices: VertexREST[], edges: EdgeREST[]) => void;
|
|
170
|
+
onProgress?: (progress: SweepProgress) => void;
|
|
171
|
+
signal?: AbortSignal;
|
|
172
|
+
/** Per-vertex edge cap; defaults to the standing expand cap. */
|
|
173
|
+
cap?: number;
|
|
174
|
+
}): Promise<ExpandOutcome>;
|
|
@@ -20,7 +20,7 @@ export declare const FIELD_HELP: {
|
|
|
20
20
|
readonly lookupKind: "What the id refers to: vertex, edge, or graphelement (either — the server figures out which).";
|
|
21
21
|
readonly maxElements: "Upper bound on how many elements the bulk view loads from GET /graph. Keep it modest on big graphs — this is a browser, not an export (use JSONL export for that).";
|
|
22
22
|
readonly bulkFilter: "Client-side filter over the loaded elements: matches an exact id or a substring of the label.";
|
|
23
|
-
readonly scanKind: "Property scan walks all elements (no index needed); 'ask an index' picks a registered index and offers the query forms its type answers.";
|
|
23
|
+
readonly scanKind: "Property scan walks all elements (no index needed); 'ask an index' picks a registered index and offers the query forms its type answers; 'semantic search' types words instead, and the embedding provider turns them into the query vector.";
|
|
24
24
|
readonly propertyScope: "Specific key: scan one named property with an operator and typed literal. Any property: a case-insensitive substring search across EVERY property value (numbers and dates included, compared as text) - a cold, un-indexed full-graph discovery scan.";
|
|
25
25
|
readonly searchTerm: "The substring to look for across every property value, case-insensitively. An element matches when any of its values contains it.";
|
|
26
26
|
readonly searchLabel: "Optional: restrict the search to elements with exactly this label. Leave empty to search every label.";
|
|
@@ -50,6 +50,8 @@ export declare const FIELD_HELP: {
|
|
|
50
50
|
readonly vectorBindEmbeddingName: "Optional: bind this vector index to a named element embedding. A bound index maintains itself as a projection of that embedding — you write embeddings on the elements and the index follows; explicit vector-adds are rejected. Leave empty for a raw (bring-your-own-vector) index.";
|
|
51
51
|
readonly vectorModel: "Optional model-identity string this index expects its vectors to come from (e.g. 'bge-micro-v2#384#Cosine'). The embedding provider refuses to write mismatched vectors; a search whose provider identity differs answers 409. Diagnostic only for a raw index.";
|
|
52
52
|
readonly embeddingSearchText: "Search text. The embedding provider embeds it once (server-side), then runs kNN — you never handle the vector. Needs the provider enabled on this instance.";
|
|
53
|
+
readonly semanticIndexId: "The vector index the search ranks against. The list is narrowed to the indices that report the vector family, since only they hold vectors to rank; one bound to an embedding name projects that embedding off your elements and maintains itself.";
|
|
54
|
+
readonly semanticBindEmbedding: "Required here, unlike on the Indexes screen: this index exists so a typed query can rank the embeddings ALREADY on your elements, and only a bound index projects them. Name the embedding they carry ('default' unless you chose otherwise). An unbound index would hold nothing until you pasted vectors into it by hand.";
|
|
53
55
|
readonly embeddingName: "Name of the embedding to read/write on this element, e.g. 'default'. Letters, digits, underscore, dash; max 64 chars. Different names hold independent vectors (and may differ in dimension).";
|
|
54
56
|
readonly embeddingVectorPaste: "The embedding vector, pasted as a JSON array or comma-separated floats. The element is the source of truth; any vector index bound to this name updates automatically on save.";
|
|
55
57
|
readonly embeddingText: "Text to embed onto this element via the server's embedding provider (stored with a model-identity stamp). Needs the provider enabled; otherwise paste a vector.";
|
|
@@ -108,6 +110,13 @@ export declare const FIELD_HELP: {
|
|
|
108
110
|
readonly canvasEdgeLabels: "Show edge-container names on edges (2D: always visible, 3D: on hover). Subject to the same 5,000-element degrade threshold as node labels.";
|
|
109
111
|
readonly canvasEdgeArrows: "Draw arrowheads pointing at each edge's target vertex, making direction visible in both 2D and 3D.";
|
|
110
112
|
readonly saveGameDeleteFiles: "Also delete the checkpoint's files on the server's disk, not just its registry entry. The data is then unrecoverable.";
|
|
113
|
+
readonly interactLabel: "Match only vertices carrying exactly this label. A vertex the canvas holds only as an edge's endpoint has no label read yet, so it never matches a label filter.";
|
|
114
|
+
readonly interactProperty: "Match vertices carrying this property key; add a term to require the value to contain it (case-insensitive). This reads the canvas snapshot, which holds scalars only and caps strings at 200 characters, so a term that occurs only past that cap will not match. The Find tab is the server-side search.";
|
|
115
|
+
readonly interactDegreeSource: "Which edges the degree counts. 'the database' asks the server for the vertex's true degree, one small request per candidate, so it needs Preview. 'edges on canvas' counts only the edges currently loaded: instant, and the number you see, but a vertex you never expanded reads 0 there whatever the database knows.";
|
|
116
|
+
readonly interactDegree: "Keep vertices whose degree is strictly over (or under) this number, counted in the chosen direction. Leave the number empty to switch the filter off; 0 is a real bound, not 'off'.";
|
|
117
|
+
readonly interactSemantic: "Keep vertices whose stored embedding is closer (or farther) than a threshold from this text. The provider embeds the text once, then the bound vector index ranks your elements. The threshold is in the index metric's RAW units, exactly as the search reports them: with Cosine/DotProduct a higher score is closer, with L2 a lower one is.";
|
|
118
|
+
readonly interactDegreeUnreadable: "Vertices whose degree the server would not answer (deleted since they landed on the canvas, or an instance that stopped answering). They are left OUT of the match set rather than counted as 0, so 'under x' cannot sweep up a vertex nobody measured, and they are counted here so a shrunken match set is never mistaken for a measurement.";
|
|
119
|
+
readonly interactSemanticUnscored: "A canvas vertex the search returned no score for (no embedding stored, or outside the search window) matches NEITHER direction, and the preview counts it. Nothing measured it, so calling it 'far' would remove vertices on no evidence.";
|
|
111
120
|
readonly feedKinds: "Event kinds to show and count. Dimensions combine like the REST filter grammar: AND across dimensions, OR within one. Resync events are exempt and always shown, because they mean continuity was lost.";
|
|
112
121
|
readonly feedElements: "Restrict to vertex or edge events: the elements dimension of the REST filter grammar.";
|
|
113
122
|
readonly feedLabels: "Exact, case-sensitive labels to match (Enter or comma adds one). An element without a label never matches a labels filter, the same rule the server applies.";
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { FileLimits } from "../api/types";
|
|
2
|
+
/**
|
|
3
|
+
* Whether a job's files fit what THIS instance accepts, checked at pick time (feature
|
|
4
|
+
* integration-file-transport).
|
|
5
|
+
*
|
|
6
|
+
* This module is the only place in Studio allowed to reason about file ceilings, and it holds no
|
|
7
|
+
* numbers of its own. Every ceiling arrives from `GET /integrations/limits` already reconciled with
|
|
8
|
+
* the proxy's transport bound, so there is one number per question and nothing to combine. That
|
|
9
|
+
* matters because the version this replaced had a ceiling of its own, about 384 MiB, which sat
|
|
10
|
+
* BELOW the instance's: jobs the instance would have accepted were refused in the browser, and no
|
|
11
|
+
* amount of configuration could fix it.
|
|
12
|
+
*
|
|
13
|
+
* The corollary is the rule for the unknown case. An instance too old to serve the route, or one
|
|
14
|
+
* whose integrations capability is off, leaves the limits undefined, and then NOTHING is checked
|
|
15
|
+
* and nothing is guessed: the send goes ahead and the instance refuses it if it must. A default
|
|
16
|
+
* substituted here would be the same bug again.
|
|
17
|
+
*/
|
|
18
|
+
/** Enough of a file to check it, whichever transport carries it later. */
|
|
19
|
+
export interface SizedFile {
|
|
20
|
+
name: string;
|
|
21
|
+
size: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The ceilings, or their absence. Absence has three spellings and they all mean the same thing
|
|
25
|
+
* here: the query has not answered yet, it failed, or the instance answered with no body.
|
|
26
|
+
*/
|
|
27
|
+
export type MaybeLimits = FileLimits | null | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* What one file setting is being asked to hold, and what the rest of the job already holds.
|
|
30
|
+
*
|
|
31
|
+
* Generic over the incoming type, so a caller passing real `File` handles gets `File`s back with no
|
|
32
|
+
* cast. That is not cosmetic: it is what makes "this only ever filters, it never constructs" a fact
|
|
33
|
+
* the compiler holds rather than a comment somebody has to keep true.
|
|
34
|
+
*/
|
|
35
|
+
export interface StagingRequest<T extends SizedFile = SizedFile> {
|
|
36
|
+
/** The ceilings this instance published, or absent when they could not be read. */
|
|
37
|
+
limits: MaybeLimits;
|
|
38
|
+
/** The files being added to ONE file setting, in the order they were picked. */
|
|
39
|
+
incoming: T[];
|
|
40
|
+
/** What that setting already holds. Kept whatever this verdict says. */
|
|
41
|
+
staged?: SizedFile[];
|
|
42
|
+
/** What every OTHER file setting of the same job holds: the total and the count are job-wide. */
|
|
43
|
+
elsewhere?: SizedFile[];
|
|
44
|
+
/** True when the setting declares `multiple`, so its files are read as ONE claimed set. */
|
|
45
|
+
claimedSet?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface StagingVerdict<T extends SizedFile = SizedFile> {
|
|
48
|
+
/** The incoming files that may be staged, in pick order. */
|
|
49
|
+
accepted: T[];
|
|
50
|
+
/** One message for the setting's problem channel, or null when there is nothing to say. */
|
|
51
|
+
problem: string | null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The refusal that keeps a set out of the tab before it is ever sent.
|
|
55
|
+
*
|
|
56
|
+
* Granularity differs between the three ceilings on purpose. A file over the per-file ceiling is
|
|
57
|
+
* individually too big, so it is refused individually and its siblings still stage. A broken TOTAL
|
|
58
|
+
* or COUNT is a property of the whole job, so no single file is at fault and none of the incoming
|
|
59
|
+
* batch is accepted: picking some arbitrary prefix that fits would drop the tail on a decision the
|
|
60
|
+
* person picking never made, and for a claimed set it would silently split the set.
|
|
61
|
+
*/
|
|
62
|
+
export declare function checkStaging<T extends SizedFile>(request: StagingRequest<T>): StagingVerdict<T>;
|
|
63
|
+
/**
|
|
64
|
+
* What the form says when it could not read the ceilings. Its job is to stop someone reading the
|
|
65
|
+
* absence of refusals as approval, without naming a number Studio does not know.
|
|
66
|
+
*/
|
|
67
|
+
export declare const LIMITS_UNKNOWN_NOTE: string;
|
|
68
|
+
/** The ceilings in one line, for the form to state up front rather than only when refusing. */
|
|
69
|
+
export declare function describeLimits(limits: MaybeLimits): string;
|
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
export declare function formatCompact(value: number): string;
|
|
3
3
|
/** Full number with grouping, for exact values ("10,001,000"). */
|
|
4
4
|
export declare function formatExact(value: number): string;
|
|
5
|
+
/**
|
|
6
|
+
* A size in bytes, in binary units up to GiB ("0 B", "512 B", "1.5 KiB", "5.8 GiB").
|
|
7
|
+
*
|
|
8
|
+
* GiB and not MiB because two callers need it: a save-game registry, and the refusal that tells
|
|
9
|
+
* someone their several gibibytes of files are over the ceiling. Reporting that in mebibytes is arithmetic
|
|
10
|
+
* the reader should not have to do while being told no.
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatBytes(bytes: number): string;
|
|
5
13
|
/**
|
|
6
14
|
* The one glyph this UI renders for a value the server does not have, so a row cannot mix two
|
|
7
15
|
* spellings of "absent" in one table and read as two different states.
|
|
@@ -41,8 +41,22 @@ export declare function capList<T>(items: readonly T[], max?: number): {
|
|
|
41
41
|
shown: T[];
|
|
42
42
|
total: number;
|
|
43
43
|
};
|
|
44
|
+
/**
|
|
45
|
+
* How tall ONE row is, in rem, for a list whose rows are not a single line. The cap is a row
|
|
46
|
+
* COUNT, so it needs a height per row to work with; the CSS default (2.5rem, see index.css) is a
|
|
47
|
+
* one-line table row, and a list of wrapped prose hits that ceiling several rows early and scrolls
|
|
48
|
+
* a list far shorter than its threshold. Add an entry only for a list that reads that way.
|
|
49
|
+
*/
|
|
50
|
+
export declare const SCROLL_ROW_REM: {
|
|
51
|
+
/**
|
|
52
|
+
* Available integrations (IntegrationsScreen): each row is a sentence describing what the
|
|
53
|
+
* integration reads, and it wraps to three or four lines on a narrow window.
|
|
54
|
+
*/
|
|
55
|
+
readonly integrations: 5;
|
|
56
|
+
};
|
|
44
57
|
/**
|
|
45
58
|
* Inline style that tells a `.scroll-list` wrapper how many rows to show before it caps its
|
|
46
|
-
* height and scrolls
|
|
59
|
+
* height and scrolls, and optionally how tall to assume one row is (see {@link SCROLL_ROW_REM};
|
|
60
|
+
* omitted, the CSS default applies). Custom CSS properties need the cast; this keeps it in one place.
|
|
47
61
|
*/
|
|
48
|
-
export declare function scrollRows(rows: number): CSSProperties;
|
|
62
|
+
export declare function scrollRows(rows: number, rowRem?: number): CSSProperties;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ChatProviderStatsREST, EmbeddingProviderStatsREST } from "../api/types";
|
|
2
|
+
/**
|
|
3
|
+
* How Studio names the model backend that serves a request (feature model-providers).
|
|
4
|
+
*
|
|
5
|
+
* Two kinds of label, and the distinction is the feature:
|
|
6
|
+
* - AMBIENT ("requests will go to X") reads the polled /status block, which describes the
|
|
7
|
+
* CURRENT configuration. {@link chatAmbientLabel} is named so a call site cannot use it by
|
|
8
|
+
* accident where a per-call answer belongs.
|
|
9
|
+
* - PER-CALL reads the `backend` field carried on that call's own response. A draft produced
|
|
10
|
+
* under one backend must keep saying so after the operator switches, so nothing per-call may
|
|
11
|
+
* be derived from here.
|
|
12
|
+
*
|
|
13
|
+
* Neither function invents a name it cannot know: an absent field yields a sentence saying the
|
|
14
|
+
* value is absent, never a plausible default.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* The ambient chat destination: `"{backend} · {model}"`, or the reason there is no pair to show.
|
|
18
|
+
* `undefined` means /status has not answered yet, which is a different thing from chat being off.
|
|
19
|
+
*/
|
|
20
|
+
export declare function chatAmbientLabel(chat: ChatProviderStatsREST | null | undefined): string;
|
|
21
|
+
/**
|
|
22
|
+
* The embedding function's identity as a reader recognises it: `modelName[@modelVersion]`.
|
|
23
|
+
* A provider that reports no model name is described by its dimension instead, because that is
|
|
24
|
+
* the one property of the vector space still known to be true.
|
|
25
|
+
*/
|
|
26
|
+
export declare function embeddingStamp(provider: EmbeddingProviderStatsREST): string;
|
|
@@ -25,6 +25,7 @@ export interface Neighborhood {
|
|
|
25
25
|
export declare function fetchVertexNeighborhood(instance: InstanceConfig, vertexId: number, options: {
|
|
26
26
|
cap: number;
|
|
27
27
|
skipNeighborIds?: ReadonlySet<number>;
|
|
28
|
+
signal?: AbortSignal;
|
|
28
29
|
}): Promise<Neighborhood>;
|
|
29
30
|
/**
|
|
30
31
|
* An edge's endpoint vertices plus EVERY edge between them, both directions — found by
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { EmbeddingProviderStatsREST, PropertySpecification } from "../api/types";
|
|
2
|
+
/**
|
|
3
|
+
* What a NEW vector index is created with, in one place: two screens create one (the Indexes
|
|
4
|
+
* screen's create panel and the Query screen's semantic on-ramp, feature
|
|
5
|
+
* semantic-search-onramp) and the numbers are not a preference. A bound index whose dimension
|
|
6
|
+
* or metric disagrees with the model writing into it is refused on every later embed and every
|
|
7
|
+
* later search, so the provider is the authority and guessing it twice is how the two copies
|
|
8
|
+
* would drift.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Fallbacks for a server that reports no usable provider. Not a recommendation: a shape the
|
|
12
|
+
* engine accepts, so the form has something to submit while saying (at the call site) that
|
|
13
|
+
* these are defaults rather than the instance's own numbers.
|
|
14
|
+
*/
|
|
15
|
+
export declare const VECTOR_INDEX_FALLBACK: {
|
|
16
|
+
readonly dimension: "384";
|
|
17
|
+
readonly metric: "Cosine";
|
|
18
|
+
};
|
|
19
|
+
export interface VectorIndexDefaults {
|
|
20
|
+
/** The provider is on AND names a dimension, so its numbers are the authoritative ones. */
|
|
21
|
+
providerReady: boolean;
|
|
22
|
+
dimension: string;
|
|
23
|
+
metric: string;
|
|
24
|
+
}
|
|
25
|
+
/** The dimension + metric a new vector index should default to on this instance. */
|
|
26
|
+
export declare function vectorIndexDefaults(provider: EmbeddingProviderStatsREST | null | undefined): VectorIndexDefaults;
|
|
27
|
+
/** The engine's own bounds on a vector index's dimension (VectorIndex.Initialize). */
|
|
28
|
+
export declare const VECTOR_DIMENSION_RANGE: {
|
|
29
|
+
readonly min: 1;
|
|
30
|
+
readonly max: 4096;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Whether this dimension is one the engine will take. The number input's `min`/`max` are not
|
|
34
|
+
* enough on their own: neither attribute blocks an EMPTY field, and neither is consulted at all
|
|
35
|
+
* unless the button is a submit. An empty value travels as `propertyValue: ""` against
|
|
36
|
+
* `System.Int32`, which the server cannot convert, so the round trip is spent to be told so.
|
|
37
|
+
*/
|
|
38
|
+
export declare function isValidVectorDimension(dimension: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* The `pluginOptions` of POST /index for a vector index. Options travel as typed literals
|
|
41
|
+
* (vector-index README §creation), and embeddingName/model are emitted only when set, so a raw
|
|
42
|
+
* index keeps exactly the two-option shape (pinned by index-management.test.tsx).
|
|
43
|
+
*/
|
|
44
|
+
export declare function vectorIndexPluginOptions(options: {
|
|
45
|
+
dimension: string;
|
|
46
|
+
metric: string;
|
|
47
|
+
embeddingName?: string;
|
|
48
|
+
model?: string;
|
|
49
|
+
}): Record<string, PropertySpecification>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The engine's own ceiling on a kNN `k`, mirrored client-side.
|
|
3
|
+
*
|
|
4
|
+
* ONE home, because every caller of `/scan/index/vector` and `/embedding/search` has to agree with
|
|
5
|
+
* the server or the request is refused outright: `VectorIndex.MaxK` is 1024 and
|
|
6
|
+
* `VectorIndex.TryNearestNeighbors` rejects anything above it, which the embedding controller
|
|
7
|
+
* turns into a 400 AFTER the provider has already embedded the query text. So a k picked from some
|
|
8
|
+
* other quantity does not degrade, it fails, and it fails having spent a model call.
|
|
9
|
+
*
|
|
10
|
+
* That is not hypothetical: the canvas Interact tab first shipped this asking for the canvas
|
|
11
|
+
* element cap (20,000) worth of neighbours, which made its semantic filter unusable on every real
|
|
12
|
+
* instance while every mocked test passed.
|
|
13
|
+
*/
|
|
14
|
+
export declare const MAX_K = 1024;
|
|
15
|
+
/**
|
|
16
|
+
* A kNN window that cannot exceed the engine's ceiling, for a caller who wants "as many as I might
|
|
17
|
+
* need" rather than a number a person typed. `wanted` is what the caller would ideally ask for.
|
|
18
|
+
*/
|
|
19
|
+
export declare function boundedK(wanted: number): number;
|
|
@@ -98,13 +98,23 @@ export interface PathDraft {
|
|
|
98
98
|
semantic: SemanticDraft;
|
|
99
99
|
}
|
|
100
100
|
export declare const DEFAULT_PATH_DRAFT: PathDraft;
|
|
101
|
+
/** The Query screen's three ways of asking (feature index-workspace / semantic-search-onramp). */
|
|
102
|
+
export declare const QUERY_MODES: readonly ["property", "index", "semantic"];
|
|
103
|
+
export type QueryMode = (typeof QUERY_MODES)[number];
|
|
101
104
|
/**
|
|
102
105
|
* The Query screen's whole input form (feature index-workspace). Persisted per instance
|
|
103
106
|
* so leaving for the Canvas and coming back restores it exactly — results are re-run on
|
|
104
107
|
* demand (kept out of the lean persisted store). Reset via the screen's Clear button.
|
|
105
108
|
*/
|
|
106
109
|
export interface QueryDraft {
|
|
107
|
-
|
|
110
|
+
/**
|
|
111
|
+
* "semantic" is text-in kNN (feature semantic-search-onramp): its own mode rather than a
|
|
112
|
+
* source toggle inside the index mode's vector form, because a capability reachable only
|
|
113
|
+
* after picking the right index is one nobody finds. It shares the kNN parameters below
|
|
114
|
+
* with that form - same question, different query source - but NOT the index, which is
|
|
115
|
+
* drawn from a different set (see semanticIndexId).
|
|
116
|
+
*/
|
|
117
|
+
mode: QueryMode;
|
|
108
118
|
/** Property-scan scope: one named "key" (typed operator) or "any" property (contains search). */
|
|
109
119
|
propertyScope: "key" | "any";
|
|
110
120
|
propertyId: string;
|
|
@@ -113,6 +123,13 @@ export interface QueryDraft {
|
|
|
113
123
|
/** All-property search label restrictor (propertyScope === "any"); empty scans every label. */
|
|
114
124
|
searchLabel: string;
|
|
115
125
|
indexId: string;
|
|
126
|
+
/**
|
|
127
|
+
* The semantic mode's index, kept apart from `indexId` because the two modes choose from
|
|
128
|
+
* different sets: every registered index there, only the ones that can rank a vector here.
|
|
129
|
+
* Sharing one field meant picking a vector index for a semantic search silently replaced the
|
|
130
|
+
* operator's index-mode selection AND the query form that went with it.
|
|
131
|
+
*/
|
|
132
|
+
semanticIndexId: string;
|
|
116
133
|
form: IndexCapability;
|
|
117
134
|
operator: BinaryOperatorName;
|
|
118
135
|
resultType: "Vertices" | "Edges" | "Both";
|
|
@@ -124,14 +141,23 @@ export interface QueryDraft {
|
|
|
124
141
|
fulltextQuery: string;
|
|
125
142
|
spatialElementId: string;
|
|
126
143
|
spatialDistance: string;
|
|
144
|
+
/** The pasted query vector (index mode, vector form); the semantic mode never uses it. */
|
|
127
145
|
vectorText: string;
|
|
128
146
|
vectorK: string;
|
|
129
147
|
vectorKind: "any" | "vertex" | "edge";
|
|
130
148
|
vectorLabel: string;
|
|
131
|
-
|
|
149
|
+
/** The query text of the semantic mode, embedded once server-side. */
|
|
132
150
|
vectorSearchText: string;
|
|
133
151
|
}
|
|
134
152
|
export declare const DEFAULT_QUERY_DRAFT: QueryDraft;
|
|
153
|
+
/**
|
|
154
|
+
* Rehydrates a persisted Query draft. Text-in kNN used to be a `vectorSource` toggle INSIDE the
|
|
155
|
+
* index mode's vector form; feature semantic-search-onramp made it its own mode, so a draft
|
|
156
|
+
* written by an older build is LIFTED rather than dropped: the text, k, kind and label are the
|
|
157
|
+
* same question asked the same way, and only the route to the form changed. The stale key is
|
|
158
|
+
* stripped instead of spread through, so nothing carries a field this build has no meaning for.
|
|
159
|
+
*/
|
|
160
|
+
export declare function migrateQueryDraft(persisted: Partial<QueryDraft> | undefined): QueryDraft;
|
|
135
161
|
/**
|
|
136
162
|
* One pattern row of the subgraph builder: a pattern spec plus a stable list key and the
|
|
137
163
|
* step's vertex-slot state (feature subgraph-semantic-thresholds) — the slot MODE and the
|
|
@@ -194,9 +220,17 @@ export declare const DEFAULT_ANALYTICS_DRAFT: AnalyticsDraft;
|
|
|
194
220
|
* state (re-run on demand), exactly like every other result in the studio - only the inputs here
|
|
195
221
|
* persist.
|
|
196
222
|
*/
|
|
223
|
+
/**
|
|
224
|
+
* The tabs of the canvas tool strip, in strip order. ONE home for the ids: the strip renders them
|
|
225
|
+
* and the persisted `canvasToolsDraft.tab` is validated against them on rehydration.
|
|
226
|
+
*/
|
|
227
|
+
export declare const CANVAS_TABS: readonly ["style", "find", "connect", "interact"];
|
|
228
|
+
export type CanvasTab = (typeof CANVAS_TABS)[number];
|
|
229
|
+
/** Guard for the untrusted source of a canvas tab id: persisted storage. */
|
|
230
|
+
export declare const isCanvasTab: (value: unknown) => value is CanvasTab;
|
|
197
231
|
export interface CanvasToolsDraft {
|
|
198
|
-
/** Which right-panel tab is active: styling, element search,
|
|
199
|
-
tab:
|
|
232
|
+
/** Which right-panel tab is active: styling, element search, path connecting, or interacting. */
|
|
233
|
+
tab: CanvasTab;
|
|
200
234
|
/** Find: the all-property contains term (fed to POST /scan/graph/properties). */
|
|
201
235
|
findTerm: string;
|
|
202
236
|
/** Find: optional exact-match label restrictor; empty searches every label. */
|
|
@@ -207,6 +241,25 @@ export interface CanvasToolsDraft {
|
|
|
207
241
|
connectMaxDepth: number;
|
|
208
242
|
/** Connect: use every canvas vertex, or only a picked subset, as the pair endpoints. */
|
|
209
243
|
connectScope: "all" | "pick";
|
|
244
|
+
/**
|
|
245
|
+
* Interact (feature canvas-interact): the filter rows that build the match set the tab's two
|
|
246
|
+
* verbs act on. Every one is INACTIVE when blank - which is why the two numeric thresholds are
|
|
247
|
+
* strings, since 0 is a legitimate degree bound and "" has to mean "not filtering" - and with
|
|
248
|
+
* none of them active the match set is every canvas vertex, i.e. "expand all".
|
|
249
|
+
*/
|
|
250
|
+
interactLabel: string;
|
|
251
|
+
interactPropKey: string;
|
|
252
|
+
interactPropTerm: string;
|
|
253
|
+
/** Which edges the degree comparison counts: the database's answer, or the loaded ones. */
|
|
254
|
+
interactDegreeSource: "database" | "canvas";
|
|
255
|
+
interactDegreeDirection: "in" | "out" | "total";
|
|
256
|
+
interactDegreeOp: "over" | "under";
|
|
257
|
+
interactDegreeValue: string;
|
|
258
|
+
interactSemanticText: string;
|
|
259
|
+
interactSemanticIndexId: string;
|
|
260
|
+
interactSemanticDirection: "closer" | "farther";
|
|
261
|
+
/** The threshold in the metric's RAW units, as typed (blank = the filter is off). */
|
|
262
|
+
interactSemanticThreshold: string;
|
|
210
263
|
}
|
|
211
264
|
export declare const DEFAULT_CANVAS_TOOLS_DRAFT: CanvasToolsDraft;
|
|
212
265
|
/** One-shot navigation intent: "open Query with this index preselected" (cleared on consume). */
|
|
@@ -269,6 +322,8 @@ export interface WorkspaceState {
|
|
|
269
322
|
scanPrefill: ScanPrefill | null;
|
|
270
323
|
mergeIntoCanvas: (vertices: VertexREST[], edges: EdgeREST[]) => void;
|
|
271
324
|
removeFromCanvas: (kind: "node" | "edge", id: number) => void;
|
|
325
|
+
/** Removes a SET of vertices (and their incident edges) in one write - see the implementation. */
|
|
326
|
+
removeManyFromCanvas: (ids: readonly number[]) => void;
|
|
272
327
|
clearCanvas: () => void;
|
|
273
328
|
setWholeGraphTruncation: (truncation: WholeGraphTruncation | null) => void;
|
|
274
329
|
setStyleConfig: (patch: Partial<StyleConfig>) => void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { InstanceConfig } from "../instances/types";
|
|
2
|
-
import type { IntegrationProvider } from "../api/types";
|
|
2
|
+
import type { FileLimits, IntegrationProvider } from "../api/types";
|
|
3
3
|
/**
|
|
4
4
|
* The integrations capability of one instance (feature integrations), read from the one route that
|
|
5
5
|
* answers it: the provider catalog.
|
|
@@ -15,8 +15,28 @@ import type { IntegrationProvider } from "../api/types";
|
|
|
15
15
|
*/
|
|
16
16
|
export type IntegrationsCapability = "checking" | "available" | "absent" | "unreachable";
|
|
17
17
|
export declare function useIntegrationProviders(instance: InstanceConfig | null): import("@tanstack/react-query").UseQueryResult<NoInfer<IntegrationProvider[] | null>, unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* What a job may carry on this instance (feature integration-file-transport). Read once per
|
|
20
|
+
* instance and held for the session: the ceilings come from configuration, so they change when the
|
|
21
|
+
* instance is redeployed and never while a screen is open.
|
|
22
|
+
*
|
|
23
|
+
* It fails softly on purpose. An instance too old to serve the route answers 404, and a form that
|
|
24
|
+
* cannot read the ceilings must check NOTHING rather than fall back to a number of its own - see
|
|
25
|
+
* `lib/fileLimits.ts`, which is the only place allowed to interpret the absence.
|
|
26
|
+
*/
|
|
27
|
+
export declare function useIntegrationLimits(instance: InstanceConfig | null): import("@tanstack/react-query").UseQueryResult<NoInfer<FileLimits | null>, unknown>;
|
|
18
28
|
/** Whether a failure is the capability being off rather than the instance being unwell. */
|
|
19
29
|
export declare function isCapabilityRefusal(error: unknown): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* The href for a provider's documentation link, or null when there is nothing safe to link.
|
|
32
|
+
*
|
|
33
|
+
* The runtime refuses anything but an absolute http(s) URL when it builds its catalog, so this is
|
|
34
|
+
* the second half of that check rather than the only one: the descriptor arrives over the network
|
|
35
|
+
* from a deployable Studio does not ship with, and a `javascript:` href here would run in the
|
|
36
|
+
* operator's browser. Anything else is dropped silently - the row simply carries no link, which is
|
|
37
|
+
* the same state as a provider that declares no documentation.
|
|
38
|
+
*/
|
|
39
|
+
export declare function docsHref(provider: Pick<IntegrationProvider, "docsUrl">): string | null;
|
|
20
40
|
/** The capability verdict of a providers query, for the rail and for a deep link. */
|
|
21
41
|
export declare function capabilityOf(query: {
|
|
22
42
|
isError: boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { m as s } from "./index-
|
|
1
|
+
import { m as s } from "./index-CGOXemLg.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-
|
|
1
|
+
import { m as r } from "./index-CGOXemLg.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-
|
|
1
|
+
import { m as l } from "./index-CGOXemLg.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