@memberjunction/react-runtime 6.2.0-edge.8 → 6.2.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @memberjunction/react-runtime@6.2.0-edge.8 build /home/runner/work/MJ/MJ/packages/React/runtime
2
+ > @memberjunction/react-runtime@6.2.1 build /home/runner/work/MJ/MJ/packages/React/runtime
3
3
  > npm run build:node && npm run build:umd
4
4
 
5
5
  npm warn Unknown env config "enable-pre-post-scripts". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
@@ -8,7 +8,7 @@ npm warn Unknown env config "npm-globalconfig". This will stop working in the ne
8
8
  npm warn Unknown env config "link-workspace-packages". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
9
9
  npm warn Unknown env config "_jsr-registry". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
10
10
 
11
- > @memberjunction/react-runtime@6.2.0-edge.8 build:node
11
+ > @memberjunction/react-runtime@6.2.1 build:node
12
12
  > tsc && tsc-alias -f
13
13
 
14
14
  npm warn Unknown env config "enable-pre-post-scripts". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
@@ -17,7 +17,7 @@ npm warn Unknown env config "npm-globalconfig". This will stop working in the ne
17
17
  npm warn Unknown env config "link-workspace-packages". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
18
18
  npm warn Unknown env config "_jsr-registry". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
19
19
 
20
- > @memberjunction/react-runtime@6.2.0-edge.8 build:umd
20
+ > @memberjunction/react-runtime@6.2.1 build:umd
21
21
  > webpack --config webpack.umd.config.cjs
22
22
 
23
23
  Browserslist: browsers data (caniuse-lite) is 10 months old. Please run:
@@ -39,4 +39,4 @@ cacheable modules 14.8 MiB
39
39
  ../../MJCore/dist/index.js + 127 modules 3.56 MiB [built] [code generated]
40
40
  ../../MJGlobal/dist/index.js + 33 modules 751 KiB [built] [code generated]
41
41
  ../../GraphQLDataProvider/dist/index.mjs + 172 modules 1.92 MiB [built] [code generated]
42
- webpack 5.105.0 compiled successfully in 79521 ms
42
+ webpack 5.105.0 compiled successfully in 82961 ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,537 @@
1
1
  # @memberjunction/react-runtime
2
2
 
3
+ ## 6.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [41142bd]
8
+ - @memberjunction/core@6.2.1
9
+ - @memberjunction/ai-vectors-memory@6.2.1
10
+ - @memberjunction/graphql-dataprovider@6.2.1
11
+ - @memberjunction/interactive-component-types@6.2.1
12
+ - @memberjunction/core-entities@6.2.1
13
+ - @memberjunction/global@6.2.1
14
+
15
+ ## 6.2.0
16
+
17
+ ### Minor Changes
18
+
19
+ - 4c0eaec: Local embeddings move to `@huggingface/transformers` 4.3.1 and can switch models safely; EmbeddingGemma 2 is available as an opt-in model.
20
+ - `MJ_DEFAULT_LOCAL_EMBEDDING_MODEL` names the local model every process embeds with (default: the highest-PowerRank active local model). Agent note, example, tag and query indexes leave out vectors from other models, a save re-embeds such a row, and the new "Re-embed Local Vectors" action moves them all.
21
+ - Embedding calls take an optional `inputType` (`'query' | 'document'`); Cohere and Bedrock map it natively, and catalog prefixes come from `ModelConfiguration.Embedding`. `LocalEmbedding` batches, honors `dimensions`, truncates to the catalog's `MaxInputTokens`, and sizes ONNX Runtime's thread pool to the CPUs the process may use (in a 2-CPU container, queries were about 10× faster).
22
+ - A failed embed now returns `null` from `AIEngine.EmbedText` instead of an empty vector.
23
+
24
+ **Upgrade notes:**
25
+ - After upgrading, run `mj ai actions run -n "Re-embed Local Vectors" --param "Force=true"`, then restart the MJ server processes. The new runtime changes all-mpnet-base-v2's vectors (about 0.95 cosine on Linux x64) under the same model ID, and long texts are now truncated at `MaxInputTokens` (256 tokens for all-MiniLM-L6-v2, matching sentence-transformers).
26
+ - A `MJ_DEFAULT_LOCAL_EMBEDDING_MODEL` that names no active local model turns local embedding off, with an error. An inactive model is no longer picked as the default.
27
+ - TagEngine embeds with the default local model whenever one exists, even if the "Tag Semantic Matching" prompt names a hosted model.
28
+ - `LocalEmbedding` honors a vector index's `Dimensions`: a value above the model's size now fails instead of being ignored.
29
+ - The GraphQL `EmbedText` mutation's `modelSize: 'medium'` now means the default local model.
30
+ - `LocalEmbedding` no longer reads the `useQuantized` / `localURL` settings or `TRANSFORMERS_LOCAL_URL`; it always loads the 8-bit weights.
31
+
32
+ ### Patch Changes
33
+
34
+ - 9160fd9: Interactive components get their declared libraries **and their child components** on mobile, the same way the Angular react bridge supplies them.
35
+
36
+ **The gap.** An agent-authored component declares its libraries in the spec, and the compiler turns
37
+ each declaration into a binding — `const _ = libraries['_']`. The mobile runtime context carried no
38
+ libraries at all, so every component that used one (which is most of them) was refused up front with
39
+ "this component uses external libraries that only run on desktop". A component asking for `lodash`
40
+ was being sent to the desktop over a dependency that could have been sitting in the bundle.
41
+
42
+ **The seam is the one the web already uses.** `RuntimeContext.libraries`, keyed by
43
+ `globalVariable` — the same field `AngularReactAdapterService` fills from `LibraryLoader`'s CDN
44
+ loads, merged by the compiler as `{ ...context.libraries }`. Mobile fills it from ordinary npm
45
+ dependencies, pinned to the exact versions `__mj.ComponentLibrary` declares. Imports are lazy, so a
46
+ component that declares nothing evaluates nothing.
47
+
48
+ **Filling the map is not sufficient, and the reason is a scoping detail.** The compiler emits the
49
+ `const _ = …` bindings _inside_ `DestructureWrapperUserComponent` but splices the component's source
50
+ one scope out, so a component body referencing `_` reads a free variable. On the web that resolves
51
+ because the UMD `<script>` already defined `window._` — the component is reading the global, not the
52
+ runtime's map. Mobile therefore also publishes each library onto `globalThis` under its declared
53
+ global name, which is the same act a UMD bundle performs, in the module system Hermes has. Existing
54
+ globals are never overwritten, mirroring `LibraryLoader`'s own guard.
55
+
56
+ **react-runtime: the browser check now tests for a DOM.** `loadRequiredLibraries` gated CDN loading
57
+ on `typeof window === 'undefined'`. React Native defines `window` but has no `document`, so Hermes
58
+ went down the script-loading path and threw
59
+ `Failed to resolve dependencies: Library 'lodash' not found` for every component that declared one.
60
+ It now tests for `document.createElement`, which is the capability it actually needs; browsers are
61
+ unaffected, and DOM-less hosts fall through to the runtime context as intended.
62
+
63
+ **Thirteen libraries, and honesty about the rest.** Provided: lodash, dayjs, moment, luxon, mathjs,
64
+ simple-statistics, chroma-js, uuid, axios, marked, d3, topojson-client, xlsx. Declined: everything
65
+ DOM- or canvas-bound (Chart.js, ApexCharts, AG Grid, Ant Design, Leaflet, Mapbox GL, GSAP,
66
+ SortableJS, Popper, Emotion, DOMPurify, html2canvas, jsPDF, geo-maps) — shimming those renders
67
+ nothing and reports no error, which is worse than declining. The fallback card now names the library
68
+ and why, instead of the blanket "uses external libraries", and a spec is refused only for the
69
+ libraries it actually cannot get rather than for having any.
70
+
71
+ ***
72
+
73
+ ## Child components
74
+
75
+ **Mobile called `loadComponent`; the Angular bridge calls `loadHierarchy`.** That one-word
76
+ difference was the whole gap. `loadComponent` compiles a single spec, so a component built out of
77
+ sub-components — the shape `metadata/components/CLAUDE.md` prescribes for anything non-trivial — had
78
+ nothing to render its children with, and `AssessSpec` refused any spec declaring `dependencies`
79
+ rather than producing a component with holes in it.
80
+
81
+ Mobile now makes the same call `MJReactComponent.loadComponentWithManager()` makes, with the same
82
+ options (`defaultNamespace: 'Global'`, `defaultVersion`, `returnType: 'both'`), and passes
83
+ `result.components` — the flat, unwrapped map of every loaded descendant — as the `components` prop,
84
+ which is where the compiler's generated child bindings read them from. The `libraries` map is passed
85
+ as a prop alongside it, as the bridge does, for components that read `libraries.d3` rather than the
86
+ bare global.
87
+
88
+ **Libraries are resolved for the whole tree, not the root.** `loadHierarchy` compiles each component
89
+ against _its own_ `spec.libraries`, so a parent using lodash whose child uses d3 needs both loaded
90
+ before any of it compiles. `CollectHierarchyLibraries` walks the tree once up front.
91
+
92
+ **`generateComponentHierarchyHash` moved into the runtime.** It derives the registry version key for
93
+ a spec with no explicit `version`, and it lived as a private method on the Angular component — so a
94
+ second host had to reimplement it, and two implementations of a registry key is how two surfaces
95
+ silently compile two copies of the same component. `MJReactComponent` now delegates to the runtime's
96
+ copy.
97
+
98
+ **What mobile still declines, and why it is not "dependencies".** A child whose code the spec does
99
+ not carry: `location: 'registry'` without inline `code` needs a component-registry fetch this app
100
+ cannot perform, and a child with no code at all cannot compile. The fallback names the missing part.
101
+
102
+ ***
103
+
104
+ ## The rest of the prop contract
105
+
106
+ `MJReactComponent` hands a component eight things. Mobile was supplying three. The remaining gaps
107
+ closed here, each by moving the implementation rather than writing a second one:
108
+
109
+ **`utilities` — was `{}`.** `RuntimeUtilities` (452 lines, zero `@angular/*` imports) moves from
110
+ `@memberjunction/ng-react` to `@memberjunction/react-runtime`. It builds `md`, `rv`, `rq`, `ai`,
111
+ `geoDataEngine` and `ml` over MJ core — the data surface the component contract promises, and not an
112
+ Angular concept. A native host previously had to reimplement it or pass `{}`, which meant any
113
+ component with data requirements could not read a row. The `@RegisterClass` registration moves with it
114
+ unchanged and ng-react now imports the factory instead of owning it.
115
+
116
+ **And the override now works where it never did.** `createRuntimeUtilities` consulted
117
+ `ClassFactory` only when `typeof window === 'undefined'`, returning `new RuntimeUtilities()`
118
+ directly otherwise — so the `@RegisterClass` registration was inert on every browser and React
119
+ Native host. The base class still built working utilities, which is exactly why this went
120
+ unnoticed: nothing broke, a documented extension point simply did nothing. The guard is removed.
121
+ For an app that registers no subclass this changes nothing — with a null key `CreateInstance`
122
+ matches the base's own registration and constructs the same class the fallback would have — and for
123
+ one that does, substitution finally happens. A jsdom test pins it: it fails against the old guard.
124
+
125
+ **`styles` — was `undefined`**, which `buildComponentProps` turns into the runtime's frozen default
126
+ palette, and silently discarded the spec's `styleOverrides` (the mechanism that keeps "make the
127
+ charts blue" out of generated code as a hardcoded literal). `BuildStylesFromTheme` now accepts a
128
+ `ThemeTokenReader` as well as an element, so React Native — which holds the same `--mj-*` token
129
+ values but has no stylesheet to read them from — feeds them through the _identical_ mapping instead
130
+ of a copy. Mobile then applies `ApplyStyleOverrides` on top, as the bridge does.
131
+
132
+ **`savedUserSettings` / `onSaveUserSettings` — were absent**, so every sort order, selected tab and
133
+ collapsed panel reset on each open while the same component remembered them on the web. Mobile now
134
+ uses the same four `react-runtime` helpers and the same `UserInfoEngine` (`MJ: User Settings`)
135
+ storage, which means the same key: settings saved on a desktop open on a phone. A mobile-only key
136
+ format would have quietly given each user two profiles.
137
+
138
+ **`callbacks.OpenEntityRecord` — was `key.GetValueByIndex(0)`.** Components routinely identify a
139
+ record by something that is _not_ its primary key, because that is what their query returned. The
140
+ Angular component did the full resolution inline; `resolveEntityRecordKey` now lives in the runtime
141
+ and does it for both — coercing the three shapes a component may pass, then running a view to
142
+ translate a non-primary-key field. `NotifyEvent` was missing entirely and is now accepted.
143
+
144
+ **`CreateSimpleNotification` — was `console.log`.** It now renders above the component that raised
145
+ it, dismissed by tap rather than a timer so a failed-save message cannot vanish unread.
146
+
147
+ **Error boundary** now matches the bridge's options (`logErrors`, `recovery: 'retry'`).
148
+
149
+ ## Manifest scoping
150
+
151
+ `@memberjunction/react-runtime` is excluded from all four class-registration manifests
152
+ (`ng-bootstrap`, `ng-bootstrap-lite`, `server-bootstrap`, `server-bootstrap-lite`). Moving a
153
+ `@RegisterClass` into it made the package eagerly reachable from every bootstrap's dependency walk,
154
+ which would have pulled `@babel/standalone` (~3 MB) out of Explorer's lazy ng-react chunk and into
155
+ its initial bundle, and into the server bundle besides. `RuntimeUtilities` stays where it was
156
+ behaviourally: registered lazily through `ng-react` via the existing `lazy-feature-config` entry.
157
+
158
+ ## Still not at parity
159
+
160
+ `utilities` is not wrapped for data capture (the bridge's fallback-snapshot support), and component
161
+ methods (`print` / `refresh` / `invokeMethod`) are not exposed to the host.
162
+
163
+ ***
164
+
165
+ ## Registry-backed child components, and Hermes's async limit
166
+
167
+ Two things were still stopping real agent-authored components from rendering, both found by
168
+ running the deployment's actual component registry rather than hand-written samples.
169
+
170
+ **Children named instead of inlined.** A spec routinely references `DataGrid`, `OpenRecordButton`,
171
+ `SingleRecordView` by name with no code — that is what `metadata/components/CLAUDE.md` prescribes
172
+ for anything non-trivial. `loadHierarchy` fetches those itself, but it _compiles each child as it
173
+ fetches it_, and a component's library bindings are emitted at the top of its factory — so a
174
+ registry child's libraries are unknowable until it is too late to load them. `hierarchy-resolver.ts`
175
+ walks the tree first through the same `ComponentMetadataEngine.FindComponent` the runtime will use,
176
+ purely to learn the library set; the specs it reads come back from `ComponentManager`'s own fetch
177
+ cache, so the second read is free. `AssessSpec` no longer refuses children — it cannot judge them
178
+ synchronously, and refusing them declined the majority of real components over a lookup the app can
179
+ perform.
180
+
181
+ **`async` in runtime-compiled code.** Hermes compiles the app's own modules ahead of time, where
182
+ async is fully supported. Components take the other path — compiled at runtime, executed through
183
+ `new Function` — and Hermes's runtime compiler rejects async outright: `async functions are
184
+ unsupported`. A component doing `const rows = await utilities.rv.RunView(…)` therefore failed to
185
+ compile, with an error naming neither cause nor remedy. Mobile now compiles with
186
+ `transform-async-to-generator`. Hermes accepts the generators that produces; it is only `async`
187
+ syntax it refuses.
188
+
189
+ `transform-regenerator` was tried and rejected on evidence: it would also remove the generators, but
190
+ in this Babel version it miscompiles real component code (`Property name expected type of string but
191
+ got undefined`) — measured across the registry, it broke 12 components that otherwise transpile
192
+ cleanly. The narrower transform is both sufficient and safe. A test asserts it stays out.
193
+
194
+ Measured against this deployment's 118 registered components: 73 have a fully resolvable hierarchy
195
+ and declare only libraries the native runtime can provide. The other 45 declare Chart.js, ApexCharts
196
+ or ECharts — which the DOM host below now serves.
197
+
198
+ ***
199
+
200
+ ## Canvas and DOM components: a second renderer rather than a refusal
201
+
202
+ Chart.js and ApexCharts are the two most-declared libraries in the component registry, and both draw
203
+ into an `HTMLCanvasElement`. AG Grid, antd and Leaflet mount DOM nodes. None of that fails natively
204
+ for want of effort — React Native has no canvas and no DOM. Reimplementing each library's
205
+ configuration surface against `react-native-svg` would mean being subtly wrong forever against a
206
+ moving target.
207
+
208
+ A WebView is a browser, so a component that needs one gets one. `dom-host/` renders the component in
209
+ a real document using the **same** react-runtime UMD bundle the Playwright test harness loads, the
210
+ **same** CDN URLs recorded in `MJ: Component Libraries`, and the same compile path. That is parity by
211
+ construction rather than parity by imitation.
212
+
213
+ `AssessSpec` is no longer a yes/no gate: it returns a `RenderMode`. Components that can run natively
214
+ still do — faster, native scrolling, the app's typography — and only the ones that genuinely need a
215
+ browser take the other path. Which renderer is used is not a difference in what a component
216
+ _receives_: both get the same `utilities`, `styles`, `savedUserSettings` and callbacks.
217
+
218
+ **The page holds no credential.** It cannot call `RunView` — it has no provider and no token, and
219
+ giving it one would put the app's session inside a document that just executed third-party library
220
+ code. `utilities` and callbacks are proxied over a closed, named-method bridge to the native side,
221
+ which owns the one authenticated provider. A component can ask for what the signed-in user could
222
+ already read, and nothing else.
223
+
224
+ **The UMD bundle is now minified, and 55% smaller.** It was 11 MB with minification disabled — for
225
+ a real reason, not indifference: `MJGlobal.ClassFactory` keys every registration on `class.name`,
226
+ and terser's default mangling renames classes, so distinct classes collapse onto one identifier and
227
+ their registrations collide. `keep_classnames` / `keep_fnames` remove the cause rather than the
228
+ symptom; everything else still minifies, taking it to 5.1 MB. That size is now a first-render wait
229
+ on a phone rather than a number on disk, which is why it was worth fixing properly.
230
+
231
+ A test evaluates the built bundle in a `vm` sandbox and asserts both that it initialises and that
232
+ its class names survived — verified to fail when plain mangling is restored, so re-enabling it
233
+ cannot pass silently here and break wherever a component is actually rendered.
234
+
235
+ The first DOM-hosted render still needs a connection; the WebView caches the bundle afterwards.
236
+
237
+ **Routing happens after resolution, not before.** `AssessSpec` is synchronous, so it can only see
238
+ the spec it is handed — and a dashboard whose parent uses lodash while a registry-backed child draws
239
+ a Chart.js canvas looks native-renderable right up until the child fails. The component that most
240
+ needs the DOM host is exactly the one whose canvas library is buried a level down. The hierarchy is
241
+ therefore resolved first and the renderer chosen against the resolved tree.
242
+
243
+ The resolver also returns the tree with every registry child's code **inlined**, because the DOM host
244
+ page has no provider: a child it still had to fetch would throw inside the WebView. The native
245
+ renderer gets the same inlined spec, which costs nothing and means both paths reason about one thing.
246
+
247
+ ***
248
+
249
+ ## A crash no longer costs the reader the data
250
+
251
+ By the time most components throw, the fetching has succeeded — the failure is in the drawing.
252
+ Replacing the whole thing with "this component ran into an error" discards rows the reader came for
253
+ and could still read perfectly well.
254
+
255
+ `utilities` is wrapped so every view and query result is recorded, and a component that fails after
256
+ loading shows those rows instead of a dead card, under an explanation that does not pretend anything
257
+ worked. `MJReactComponent` captures for the same reason and calls it a fallback snapshot; the
258
+ difference here is that it is _shown_, because on a phone there is no second pane to offer it in.
259
+
260
+ In the DOM host the capture is nearly free — every data call already funnels through the one bridge
261
+ handler — and only a page that never mounted is treated as failed, so a component that reports an
262
+ error after rendering is not replaced by a table it did not ask for.
263
+
264
+ Rendering goes through the Data artifact view, so captured rows and query-builder output cannot
265
+ drift into describing a row differently.
266
+
267
+ **Verified on both platforms.** The DOM host, its bridge, the canvas chart, registry-resolved
268
+ children and the drill-down all behave identically on Android and iOS. `react-native-webview` is a
269
+ native module, so the app needs a rebuild rather than a Metro reload.
270
+
271
+ **Deliberately not built:** the rest of the host-facing method API (`validate`, `isDirty`, `reset`,
272
+ `scrollTo`, `focus`, `invokeMethod`). Those exist on the web so an Angular container can drive an
273
+ embedded component; mobile has no such container, and adding the surface with no caller would be
274
+ speculative. `getCurrentDataState`'s purpose — a fallback when the component cannot show its own
275
+ data — is served above.
276
+
277
+ - 80905a1: Rename public class members and exported functions to PascalCase, per MJ's naming convention,
278
+ **without breaking a single consumer**.
279
+
280
+ Every renamed symbol keeps its old name beside the new one as a `@deprecated` stub that forwards to
281
+ it — a delegating method or function, a getter/setter pair for a property, and for Angular a
282
+ readable accessor pair for an `@Input` and a second `@Output` sharing the same `EventEmitter`, so a
283
+ template still binding the old name keeps receiving events. Old names still compile, still resolve,
284
+ and still behave identically; the deprecation tag rides through to the published `.d.ts`, so editors
285
+ point callers at the replacement. Where a package re-exports through an explicit `export { … }`
286
+ list, the new name is added alongside the old, so the correct name is actually on the public surface
287
+ rather than merely declared.
288
+
289
+ The rename is deliberately refused wherever a mechanical stub would not be equivalent, because
290
+ several of those shapes change a type contract while still compiling in the package that declares
291
+ them:
292
+ - an **optional** property or parameter property — TypeScript has no optional accessor, so a stub
293
+ would promote `foo?` to a required member and break every object literal that omits it;
294
+ - a class that is a **data shape** (no methods, or `@ObjectType`/`@InputType`) — object literals are
295
+ assigned to it, and an accessor stub changes what they must supply;
296
+ - a property whose **subclass redeclares it**, since TypeScript forbids a property overriding an
297
+ accessor (TS2610);
298
+ - a name whose PascalCase form is **already bound** in that file or class;
299
+ - decorated members, `get`/`set` pairs behind a decorator, generators, destructured parameters,
300
+ overload sets and abstract members.
301
+
302
+ **One wire-visible consequence, for version skew only.** `BaseInfo.toJSON` walks `_`-prefixed
303
+ backing fields and emits them through their public getter, preferring the PascalCase one. Renaming
304
+ the 23 field aliases in `MJCore/src/generic` therefore changes what `AllMetadata` carries:
305
+ `EntityInfo.spCreate` and friends now serialize as `SpCreate`. A same-version client is unaffected —
306
+ `copyInitData` accepts a value through a settable accessor, so either spelling lands on the right
307
+ field. An OLDER client against a newer server has no such path in its `copyInitData` and drops those
308
+ fields silently. Same-version deployments, which is the supported configuration, see no change.
309
+
310
+ Each package was verified against its own pre-change baseline rather than against zero, because
311
+ several packages in this repo do not typecheck cleanly to begin with. Angular packages were verified
312
+ with `ngc`, not `tsc`: a plain typecheck does not compile templates, and an earlier write-only
313
+ `@Input` alias passed `tsc` while breaking six template reads.
314
+
315
+ - 36a3f9e: Security hardening across SQL filter construction, expression sandboxing, token verification, fail-closed endpoints, and client URL/selector screening:
316
+ - **Pure AST transform evaluation (`@memberjunction/global`)**: Replace `new Function` in `FieldTransformEngine` with an Acorn-based AST interpreter (`SafeTransformAstEvaluator`) that blocks prototype climbs, ambient global callback smuggling, and dynamic code generation, while supporting standard string/array transform methods (`split`, `slice`, `join`, `substring`, `replace`, `padStart`, `padEnd`, etc.). Harden `SafeExpressionEvaluator` against higher-order callback smuggling.
317
+ - **SQL filter & token hardening (`@memberjunction/server`, `@memberjunction/external-change-detection`, `@memberjunction/metadata-sync`)**: Enforce strict UUID shape validation and SQL string escaping on `ExtraFilter` interpolations across resolvers and REST handlers, reject non-primitive/non-literal primary key and lookup filter values in `MetadataSync`, perform non-short-circuiting constant-time access-token lookups in `GetDataResolver` with full token redaction from error messages, derive a domain-separated HS256 media-access signing subkey from `MJ_BASE_ENCRYPTION_KEY`, and default `SetupRESTEndpoints` to disabled (`enabled: false`).
318
+ - **Fail-closed registry auth (`@memberjunction/component-registry-server`)**: Refuse requests by default in `ComponentRegistryAPIServer.checkAPIKey` until overridden by a subclass, and protect both `/components` and `/feedback` routes when `requireAuth` is enabled.
319
+ - **Client URL-scheme & DOM selector screening (`@memberjunction/ng-core-entity-forms`, `@memberjunction/ng-conversations`, `@memberjunction/react-runtime`)**: Screen media and subresource URLs to `http:` / `https:` (rejecting `javascript:`, `data:`, `blob:`, and scheme-relative `//` targets) across viewer, open-in-tab, download, session-state rehydration, and dynamic `<script>` / `<link>` loaders, and replace interpolated `document.querySelector` URL lookups with direct attribute comparison.
320
+
321
+ - Updated dependencies [0d81c53]
322
+ - Updated dependencies [1419ba7]
323
+ - Updated dependencies [a709bb6]
324
+ - Updated dependencies [39b35f1]
325
+ - Updated dependencies [d17de94]
326
+ - Updated dependencies [e97d95c]
327
+ - Updated dependencies [38c4a81]
328
+ - Updated dependencies [e51296c]
329
+ - Updated dependencies [a50948e]
330
+ - Updated dependencies [2552b1e]
331
+ - Updated dependencies [25bb295]
332
+ - Updated dependencies [432cb73]
333
+ - Updated dependencies [3080e83]
334
+ - Updated dependencies [4c6a28b]
335
+ - Updated dependencies [c93c0f8]
336
+ - Updated dependencies [6c36fb6]
337
+ - Updated dependencies [0eeb89d]
338
+ - Updated dependencies [ecf36eb]
339
+ - Updated dependencies [cc36de5]
340
+ - Updated dependencies [9cb815b]
341
+ - Updated dependencies [709de1a]
342
+ - Updated dependencies [c159e2f]
343
+ - Updated dependencies [29129bd]
344
+ - Updated dependencies [1d6e3e8]
345
+ - Updated dependencies [d2db108]
346
+ - Updated dependencies [dfe40a4]
347
+ - Updated dependencies [d43d86e]
348
+ - Updated dependencies [a3539d2]
349
+ - Updated dependencies [dde482c]
350
+ - Updated dependencies [db39145]
351
+ - Updated dependencies [41274aa]
352
+ - Updated dependencies [91cba84]
353
+ - Updated dependencies [b14c72f]
354
+ - Updated dependencies [29b16ee]
355
+ - Updated dependencies [a6a4656]
356
+ - Updated dependencies [c671f85]
357
+ - Updated dependencies [49f26d9]
358
+ - Updated dependencies [660ef45]
359
+ - Updated dependencies [5e4205c]
360
+ - Updated dependencies [0cc6b08]
361
+ - Updated dependencies [7be1684]
362
+ - Updated dependencies [21f9e15]
363
+ - Updated dependencies [1090caa]
364
+ - Updated dependencies [c8c48e1]
365
+ - Updated dependencies [f2248d5]
366
+ - Updated dependencies [81aea34]
367
+ - Updated dependencies [7384dd6]
368
+ - Updated dependencies [6849b00]
369
+ - Updated dependencies [67f6c85]
370
+ - Updated dependencies [ac9b00b]
371
+ - Updated dependencies [eb3a8d3]
372
+ - Updated dependencies [5465489]
373
+ - Updated dependencies [3bace5a]
374
+ - Updated dependencies [88e6902]
375
+ - Updated dependencies [6dc3aa9]
376
+ - Updated dependencies [c87f87a]
377
+ - Updated dependencies [f4cd5fb]
378
+ - Updated dependencies [e1fd4c1]
379
+ - Updated dependencies [4248fb3]
380
+ - Updated dependencies [e1dd673]
381
+ - Updated dependencies [f3c6161]
382
+ - Updated dependencies [c6b4b85]
383
+ - Updated dependencies [d29b5c2]
384
+ - Updated dependencies [59e32e0]
385
+ - Updated dependencies [d122a41]
386
+ - Updated dependencies [0a7c255]
387
+ - Updated dependencies [0adaf76]
388
+ - Updated dependencies [5ee02db]
389
+ - Updated dependencies [0ff7523]
390
+ - Updated dependencies [0ff7523]
391
+ - Updated dependencies [d86bcbc]
392
+ - Updated dependencies [307da67]
393
+ - Updated dependencies [42df19d]
394
+ - Updated dependencies [4283a82]
395
+ - Updated dependencies [d6b39c4]
396
+ - Updated dependencies [5f0baf7]
397
+ - Updated dependencies [f65fec7]
398
+ - Updated dependencies [ef43cf3]
399
+ - Updated dependencies [6e6e3f1]
400
+ - Updated dependencies [ea4080e]
401
+ - Updated dependencies [9b5b489]
402
+ - Updated dependencies [cb205de]
403
+ - Updated dependencies [b44c7cf]
404
+ - Updated dependencies [0c634ba]
405
+ - Updated dependencies [a6f8c1c]
406
+ - Updated dependencies [08f8966]
407
+ - Updated dependencies [48c9cd2]
408
+ - Updated dependencies [56d7614]
409
+ - Updated dependencies [223669e]
410
+ - Updated dependencies [683f652]
411
+ - Updated dependencies [914e6ff]
412
+ - Updated dependencies [a8be410]
413
+ - Updated dependencies [7316ac3]
414
+ - Updated dependencies [2274f42]
415
+ - Updated dependencies [7e57b48]
416
+ - Updated dependencies [35ed364]
417
+ - Updated dependencies [9ce7cf4]
418
+ - Updated dependencies [0fb3649]
419
+ - Updated dependencies [131f3c4]
420
+ - Updated dependencies [902d086]
421
+ - Updated dependencies [62c91ea]
422
+ - Updated dependencies [705ab4e]
423
+ - Updated dependencies [5df9486]
424
+ - Updated dependencies [a7da50b]
425
+ - Updated dependencies [0f04590]
426
+ - Updated dependencies [dd34a5c]
427
+ - Updated dependencies [5fed75a]
428
+ - Updated dependencies [4c0eaec]
429
+ - Updated dependencies [1cb1d52]
430
+ - Updated dependencies [f26084f]
431
+ - Updated dependencies [db39145]
432
+ - Updated dependencies [f48dffc]
433
+ - Updated dependencies [41c2c08]
434
+ - Updated dependencies [630bb88]
435
+ - Updated dependencies [e69634e]
436
+ - Updated dependencies [6779eed]
437
+ - Updated dependencies [b73e3bc]
438
+ - Updated dependencies [08be974]
439
+ - Updated dependencies [29b6ec3]
440
+ - Updated dependencies [44faf83]
441
+ - Updated dependencies [17cc774]
442
+ - Updated dependencies [dae1d31]
443
+ - Updated dependencies [bfd67c6]
444
+ - Updated dependencies [80905a1]
445
+ - Updated dependencies [4c97994]
446
+ - Updated dependencies [397ae9a]
447
+ - Updated dependencies [08b3d7b]
448
+ - Updated dependencies [7e72c86]
449
+ - Updated dependencies [dbc3462]
450
+ - Updated dependencies [a17a228]
451
+ - Updated dependencies [6b08ebf]
452
+ - Updated dependencies [5fed75a]
453
+ - Updated dependencies [ee1f0d9]
454
+ - Updated dependencies [ce758af]
455
+ - Updated dependencies [89a5b59]
456
+ - Updated dependencies [1ea4085]
457
+ - Updated dependencies [aee2d53]
458
+ - Updated dependencies [279b93e]
459
+ - Updated dependencies [8420f36]
460
+ - Updated dependencies [f0c78c3]
461
+ - Updated dependencies [4ef13d6]
462
+ - Updated dependencies [25f7b82]
463
+ - Updated dependencies [8b90b41]
464
+ - Updated dependencies [104125c]
465
+ - Updated dependencies [7e57b48]
466
+ - Updated dependencies [7e57b48]
467
+ - Updated dependencies [d296edd]
468
+ - Updated dependencies [66fd011]
469
+ - Updated dependencies [6a5fb64]
470
+ - Updated dependencies [0e93e1f]
471
+ - Updated dependencies [509d2aa]
472
+ - Updated dependencies [68f5c01]
473
+ - Updated dependencies [196160a]
474
+ - Updated dependencies [5513c2a]
475
+ - Updated dependencies [90829e3]
476
+ - Updated dependencies [5986939]
477
+ - Updated dependencies [4d647e6]
478
+ - Updated dependencies [c35f7e5]
479
+ - Updated dependencies [8c120db]
480
+ - Updated dependencies [9a2d7cc]
481
+ - Updated dependencies [3ab85f9]
482
+ - Updated dependencies [aac148b]
483
+ - Updated dependencies [0cc6b08]
484
+ - Updated dependencies [8d1a373]
485
+ - Updated dependencies [17a4137]
486
+ - Updated dependencies [b4afc13]
487
+ - Updated dependencies [36a3f9e]
488
+ - Updated dependencies [539dfe3]
489
+ - Updated dependencies [c65f754]
490
+ - Updated dependencies [49d0d3c]
491
+ - Updated dependencies [5931f0d]
492
+ - Updated dependencies [d046715]
493
+ - Updated dependencies [60bd774]
494
+ - Updated dependencies [0a348e2]
495
+ - Updated dependencies [33226e0]
496
+ - Updated dependencies [ac18db8]
497
+ - Updated dependencies [35da130]
498
+ - Updated dependencies [5b41d48]
499
+ - Updated dependencies [4b9542c]
500
+ - Updated dependencies [28c92e0]
501
+ - Updated dependencies [5f707d1]
502
+ - Updated dependencies [369e229]
503
+ - Updated dependencies [ba00ac7]
504
+ - Updated dependencies [8a5d2c0]
505
+ - Updated dependencies [d13cf6b]
506
+ - Updated dependencies [aca4317]
507
+ - Updated dependencies [d52f9ba]
508
+ - Updated dependencies [d0a8dbf]
509
+ - Updated dependencies [ec97ad4]
510
+ - Updated dependencies [b1b6d3d]
511
+ - Updated dependencies [0e5a4cd]
512
+ - Updated dependencies [b968642]
513
+ - Updated dependencies [af57e8d]
514
+ - Updated dependencies [68a7e3b]
515
+ - Updated dependencies [718b01c]
516
+ - Updated dependencies [57fea6a]
517
+ - Updated dependencies [374b1a4]
518
+ - Updated dependencies [2c590b0]
519
+ - Updated dependencies [1ba9315]
520
+ - Updated dependencies [b8a9e5e]
521
+ - Updated dependencies [e8258a1]
522
+ - Updated dependencies [2854a2e]
523
+ - Updated dependencies [03c085c]
524
+ - Updated dependencies [28df136]
525
+ - Updated dependencies [b0b2cc9]
526
+ - Updated dependencies [dc38250]
527
+ - Updated dependencies [49e0bd8]
528
+ - @memberjunction/core-entities@6.2.0
529
+ - @memberjunction/global@6.2.0
530
+ - @memberjunction/core@6.2.0
531
+ - @memberjunction/graphql-dataprovider@6.2.0
532
+ - @memberjunction/ai-vectors-memory@6.2.0
533
+ - @memberjunction/interactive-component-types@6.2.0
534
+
3
535
  ## 6.2.0-edge.8
4
536
 
5
537
  ### Patch Changes
@@ -365,7 +365,7 @@
365
365
  }
366
366
  }
367
367
  }
368
- `,a={entityName:t.EntityName,valuesJSON:JSON.stringify(t.Values)},u=await this._dataProvider.ExecuteGQL(r,a);return this.processDuplicateEntryCheckResult(u)}catch(t){return this.handleDuplicateEntryCheckError(t)}}processDuplicateEntryCheckResult(t){const r=t?.CheckDuplicateEntry;if(!r)throw new Error("Invalid response from server");const a=r.ElapsedMs??void 0;if(!this.isDuplicateEntryCheckStatus(r.Status))return{Status:"Failed",ErrorMessage:`The server returned an unknown status '${r.Status}'`,Candidates:[],ElapsedMs:a};const u={Status:r.Status,Candidates:(r.Candidates??[]).map(t=>({RecordID:t.RecordID,DisplayName:t.DisplayName,VectorScore:t.VectorScore,Probability:t.Probability??null})),ElapsedMs:a};return r.ErrorMessage&&(u.ErrorMessage=r.ErrorMessage),u}isDuplicateEntryCheckStatus(t){return"Checked"===t||"NotConfigured"===t||"NotAuthorized"===t||"Failed"===t}handleDuplicateEntryCheckError(t){const r=t instanceof Error?t.message:String(t);return(0,T.ZI8)(`Error checking for a duplicate entry: ${r}`),{Status:"Failed",ErrorMessage:r||"Unknown error occurred",Candidates:[]}}}const Xn="6.2.0-edge.8",Zn="default";class _e{static{d(this,"BrowserStorageProviderBase")}constructor(){this._storage=new Map}get SharesReferences(){return!0}get SupportsCrossProcessPersistence(){return!1}getCategoryMap(t){const r=t||Zn;let a=this._storage.get(r);return a||(a=new Map,this._storage.set(r,a)),a}async GetItem(t,r){const a=this.getCategoryMap(r||Zn).get(t);return void 0===a?null:a}async GetItems(t,r){const a=new Map;if(0===t.length)return a;const u=this.getCategoryMap(r||Zn);for(const r of new Set(t)){const t=u.get(r);a.set(r,void 0===t?null:t)}return a}async SetItem(t,r,a){this.getCategoryMap(a||Zn).set(t,r)}async Remove(t,r){this.getCategoryMap(r||Zn).delete(t)}async ClearCategory(t){const r=t||Zn;this._storage.delete(r)}async GetCategoryKeys(t){const r=this._storage.get(t||Zn);return r?Array.from(r.keys()):[]}}function Pt(){try{const t=Xn.split("."),r=parseInt(t[0],10),a=parseInt(t[1],10);if(!Number.isFinite(r)||!Number.isFinite(a))throw new Error(`Could not parse major.minor from version "${Xn}"`);return 1e3*r+a+0}catch(t){return(0,T.Q1A)({error:t,message:"Failed to derive IDB version from PACKAGE_VERSION; using fallback 99999"}),99999}}d(Pt,"computeIdbVersion");const vr=Pt(),_r=["mj:default","mj:Metadata","mj:RunViewCache","mj:RunQueryCache","mj:DatasetCache"];class Ge extends _e{static{d(this,"BrowserIndexedDBStorageProvider")}constructor(){super(),this._dbReady=!1,this.dbPromise=function openDB(t,r,{blocked:a,upgrade:u,blocking:c,terminated:l}={}){const p=indexedDB.open(t,r),y=build_wrap(p);return u&&p.addEventListener("upgradeneeded",t=>{u(build_wrap(p.result),t.oldVersion,t.newVersion,build_wrap(p.transaction),t)}),a&&p.addEventListener("blocked",t=>a(t.oldVersion,t.newVersion,t)),y.then(t=>{l&&t.addEventListener("close",()=>l()),c&&t.addEventListener("versionchange",t=>c(t.oldVersion,t.newVersion,t))}).catch(()=>{}),y}("MJ_Metadata",vr,{upgrade:d((t,r,a)=>{try{(0,T.b09)(`[IDBCache] Upgrading IndexedDB schema v${r} → v${a} (package ${Xn}). Dropping all stores; caches will repopulate on first use.`);for(const r of Array.from(t.objectStoreNames))t.deleteObjectStore(r);for(const r of _r)t.objectStoreNames.contains(r)||t.createObjectStore(r)}catch(t){(0,T.Q1A)({error:t,message:t?.message})}},"upgrade"),blocked:d((t,r)=>{(0,T.b09)(`[IDBCache] Upgrade from v${t} to v${r} blocked by another tab. Close other tabs to allow the upgrade to proceed.`)},"blocked")}),this.dbPromise.then(t=>{this._dbReady=!0,t.onversionchange=()=>{(0,T.b09)("[IDBCache] DB schema upgraded in another tab — closing local connection."),t.close(),this._dbReady=!1}}).catch(t=>{(0,T.Q1A)({error:t,message:"IndexedDB initialization failed: "+t?.message})})}get SharesReferences(){return!1}get SupportsCrossProcessPersistence(){return!0}get IsReady(){return this._dbReady}isKnownCategory(t){const r=`mj:${t}`;return _r.includes(r)}getStoreName(t){const r=t||Zn;return this.isKnownCategory(r)?`mj:${r}`:"mj:default"}getStoreKey(t,r){const a=r||Zn;return this.isKnownCategory(a)?t:`[${a}]:${t}`}async SetItem(t,r,a){try{const u=await this.dbPromise,c=this.getStoreName(a),l=this.getStoreKey(t,a),p=u.transaction(c,"readwrite");await p.objectStore(c).put(r,l),await p.done}catch(t){(0,T.Q1A)({error:t,message:t?.message})}}async GetItem(t,r){try{const a=await this.dbPromise,u=this.getStoreName(r),c=this.getStoreKey(t,r),l=await a.transaction(u).objectStore(u).get(c);return void 0===l?null:l}catch(t){return(0,T.Q1A)({error:t,message:t?.message}),null}}async GetItems(t,r){const a=new Map;if(0===t.length)return a;try{const u=await this.dbPromise,c=this.getStoreName(r),l=Array.from(new Set(t)),p=l.map(t=>this.getStoreKey(t,r)),y=u.transaction(c,"readonly"),h=y.objectStore(c),m=p.map(t=>h.get(t)),g=await Promise.all(m);await y.done;for(let t=0;t<l.length;t++){const r=g[t];a.set(l[t],void 0===r?null:r)}return a}catch(r){(0,T.Q1A)({error:r,message:r?.message});for(const r of new Set(t))a.set(r,null);return a}}async Remove(t,r){try{const a=await this.dbPromise,u=this.getStoreName(r),c=this.getStoreKey(t,r),l=a.transaction(u,"readwrite");await l.objectStore(u).delete(c),await l.done}catch(t){(0,T.Q1A)({error:t,message:t?.message})}}async ClearCategory(t){try{const r=await this.dbPromise,a=t||Zn,u=this.getStoreName(t);if(this.isKnownCategory(a)){const t=r.transaction(u,"readwrite");await t.objectStore(u).clear(),await t.done}else{const t=`[${a}]:`,u=r.transaction("mj:default","readwrite"),c=u.objectStore("mj:default"),l=await c.getAllKeys();for(const r of l)"string"==typeof r&&r.startsWith(t)&&await c.delete(r);await u.done}}catch(t){(0,T.Q1A)({error:t,message:t?.message})}}async GetCategoryKeys(t){try{const r=await this.dbPromise,a=t||Zn,u=this.getStoreName(t),c=await r.transaction(u,"readonly").objectStore(u).getAllKeys();if(this.isKnownCategory(a))return c.map(t=>String(t));const l=`[${a}]:`;return c.map(t=>String(t)).filter(t=>t.startsWith(l)).map(t=>t.slice(l.length))}catch(t){return(0,T.Q1A)({error:t,message:t?.message}),[]}}}class ce extends Error{static{d(this,"SafeGraphQLError")}constructor(t){super(t.message),this.name=t.name,this.response={status:t.status,errors:t.errors},this.request={query:t.query},this.Code=t.code,this.VariableShape=t.variableShape,this.IsTransportFailure=t.isTransport,this.stack=t.stackFrames?`${t.name}: ${t.message}\n${t.stackFrames}`:this.stack}}function Qe(t){return t instanceof ce?t:new ce(le(t))}d(Qe,"ToSafeGraphQLError");function ue(t,r=0){if(null===t)return"null";if(void 0===t)return"undefined";if(Array.isArray(t))return 0===t.length?"array(empty)":`array(${t.length} × ${bt(ue(t[0],r+1))})`;if("object"==typeof t){if(r>=3)return"object(…)";const a=Object.keys(t);if(a.length>25)return`object(${a.length} keys)`;const u={};for(const c of a)u[c]=ue(t[c],r+1);return u}return"string"==typeof t?0===t.length?"string(empty)":"string":typeof t}function bt(t){return"string"==typeof t?t:"object"}function Tt(t){const r=t.indexOf("\n at ");return-1===r?"":t.slice(r+1)}function xt(t,r){const a=t?.[0]?.message;return"string"==typeof a&&a.length>0?a:`GraphQL Error (Code: ${String(r??"unknown")})`}function Lt(t){if(Array.isArray(t))return t.map(t=>{const r=t??{};return{message:"string"==typeof r.message?r.message:void 0,path:Array.isArray(r.path)?r.path:void 0,extensions:r.extensions&&"object"==typeof r.extensions?r.extensions:void 0}})}function le(t,r=!1){if(!t||"object"!=typeof t)return{name:typeof t,message:"Non-object value thrown; contents withheld",variables:"[REDACTED]"};const a=t,u="number"==typeof a.response?.status?a.response.status:void 0,c=Lt(a.response?.errors),l=c?.[0]?.extensions?.code,p=void 0===a.response?(0,T.qIN)(t):(0,T.qIN)({status:u});return{name:"string"==typeof a.name?a.name:"Error",message:xt(c,u),status:u,errors:c,code:"string"==typeof l?l:void 0,query:"string"==typeof a.request?.query?a.request.query:void 0,stackFrames:"string"==typeof a.stack?Tt(a.stack):void 0,variables:r?a.request?.variables:"[REDACTED]",variableShape:void 0===a.request?.variables?void 0:ue(a.request.variables),isTransport:p}}function de(t){return"mutation"===W(t)}function W(t){if(!t)return null;let r=0,a=!1,u=0;const c=t.length;for(;u<c;){const l=t[u];if("#"!==l)if('"'!==l)if("{"!==l&&"("!==l&&"["!==l)if("}"!==l&&")"!==l&&"]"!==l){if(0===r&&z(l)){const r=u;for(;u<c&&me(t[u]);)u++;const l=t.slice(r,u);if(!a){if("query"===l||"mutation"===l||"subscription"===l)return l;"fragment"===l&&(a=!0)}continue}u++}else r=Math.max(0,r-1),"}"===l&&0===r&&(a=!1),u++;else{if("{"===l&&0===r&&!a)return"query";r++,u++}else u=Oe(t,u);else for(;u<c&&"\n"!==t[u]&&"\r"!==t[u];)u++}return null}function ye(t){if(!t)return"Anonymous";let r=0,a=!1,u=!1,c=0;const l=t.length;for(;c<l;){const p=t[c];if("#"!==p)if('"'!==p)if("{"!==p&&"("!==p&&"["!==p)if("}"!==p&&")"!==p&&"]"!==p){if(0===r&&z(p)){const r=c;for(;c<l&&me(t[c]);)c++;const p=t.slice(r,c);if(!a){if(u)return p;if("query"===p||"mutation"===p||"subscription"===p){u=!0;continue}"fragment"===p&&(a=!0)}continue}c++}else r=Math.max(0,r-1),"}"===p&&0===r&&(a=!1),c++;else{if("{"===p&&0===r&&!a){let r=c+1;for(;r<l;){const a=t[r];if("#"!==a){if(z(a)){const a=r;for(;r<l&&me(t[r]);)r++;return t.slice(a,r)||"Anonymous"}if("}"===a||"{"===a)break;r++}else for(;r<l&&"\n"!==t[r]&&"\r"!==t[r];)r++}return"Anonymous"}r++,c++}else c=Oe(t,c);else for(;c<l&&"\n"!==t[c]&&"\r"!==t[c];)c++}return"Anonymous"}function Oe(t,r){const a=t.length;if(t.startsWith('"""',r)){let u=r+3;for(;u<a;)if("\\"===t[u]&&t.startsWith('"""',u+1))u+=4;else{if(t.startsWith('"""',u))return u+3;u++}return a}let u=r+1;for(;u<a;){const r=t[u];if("\\"!==r){if('"'===r||"\n"===r||"\r"===r)return u+1;u++}else u+=2}return a}function z(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||"_"===t}function me(t){return z(t)||t>="0"&&t<="9"}d(ue,"describeShape"),d(bt,"typeOf"),d(Tt,"stripStackHeader"),d(xt,"deriveMessage"),d(Lt,"extractErrors"),d(le,"SanitizeGraphQLError"),d(de,"IsGraphQLMutation"),d(W,"FirstGraphQLOperationKind"),d(ye,"ExtractGraphQLOperationName"),d(Oe,"skipString"),d(z,"isNameStart"),d(me,"isNameContinue");const Cr=new Set;function Ft(t){return Cr.add(t),()=>{Cr.delete(t)}}d(Ft,"RegisterNetworkDiagnosticObserver");const Er=new Set;function _t(t){return Er.add(t),()=>{Er.delete(t)}}function Ut(t){if(!t||"object"!=typeof t)return null;const r=(t instanceof Error?t.response:t)?.headers;return r&&"function"==typeof r.get?r:null}function Gt(t){const r=Er.size>0?Ut(t):null;if(r)for(const t of Er)try{t(r)}catch{}}function Ve(t){const r=globalThis;if(r.crypto&&"function"==typeof r.crypto.getRandomValues){const a=new Uint8Array(t);r.crypto.getRandomValues(a);let u="";for(let t=0;t<a.length;t++)u+=a[t].toString(16).padStart(2,"0");return u}let a="";for(let r=0;r<t;r++)a+=Math.floor(256*Math.random()).toString(16).padStart(2,"0");return a}d(_t,"RegisterResponseHeaderObserver"),d(Ut,"responseHeadersOf"),d(Gt,"notifyResponseHeaderObservers"),d(Ve,"generateHexId");const Pr=new WeakMap;function qe(t,r,a,u){return JSON.stringify([t,r??null,a??null,u??null])}d(qe,"credentialsKey");const wr=new Q,kr=gql`subscription RemoteOperationProgress($channelId: ID!) {
368
+ `,a={entityName:t.EntityName,valuesJSON:JSON.stringify(t.Values)},u=await this._dataProvider.ExecuteGQL(r,a);return this.processDuplicateEntryCheckResult(u)}catch(t){return this.handleDuplicateEntryCheckError(t)}}processDuplicateEntryCheckResult(t){const r=t?.CheckDuplicateEntry;if(!r)throw new Error("Invalid response from server");const a=r.ElapsedMs??void 0;if(!this.isDuplicateEntryCheckStatus(r.Status))return{Status:"Failed",ErrorMessage:`The server returned an unknown status '${r.Status}'`,Candidates:[],ElapsedMs:a};const u={Status:r.Status,Candidates:(r.Candidates??[]).map(t=>({RecordID:t.RecordID,DisplayName:t.DisplayName,VectorScore:t.VectorScore,Probability:t.Probability??null})),ElapsedMs:a};return r.ErrorMessage&&(u.ErrorMessage=r.ErrorMessage),u}isDuplicateEntryCheckStatus(t){return"Checked"===t||"NotConfigured"===t||"NotAuthorized"===t||"Failed"===t}handleDuplicateEntryCheckError(t){const r=t instanceof Error?t.message:String(t);return(0,T.ZI8)(`Error checking for a duplicate entry: ${r}`),{Status:"Failed",ErrorMessage:r||"Unknown error occurred",Candidates:[]}}}const Xn="6.2.1",Zn="default";class _e{static{d(this,"BrowserStorageProviderBase")}constructor(){this._storage=new Map}get SharesReferences(){return!0}get SupportsCrossProcessPersistence(){return!1}getCategoryMap(t){const r=t||Zn;let a=this._storage.get(r);return a||(a=new Map,this._storage.set(r,a)),a}async GetItem(t,r){const a=this.getCategoryMap(r||Zn).get(t);return void 0===a?null:a}async GetItems(t,r){const a=new Map;if(0===t.length)return a;const u=this.getCategoryMap(r||Zn);for(const r of new Set(t)){const t=u.get(r);a.set(r,void 0===t?null:t)}return a}async SetItem(t,r,a){this.getCategoryMap(a||Zn).set(t,r)}async Remove(t,r){this.getCategoryMap(r||Zn).delete(t)}async ClearCategory(t){const r=t||Zn;this._storage.delete(r)}async GetCategoryKeys(t){const r=this._storage.get(t||Zn);return r?Array.from(r.keys()):[]}}function Pt(){try{const t=Xn.split("."),r=parseInt(t[0],10),a=parseInt(t[1],10);if(!Number.isFinite(r)||!Number.isFinite(a))throw new Error(`Could not parse major.minor from version "${Xn}"`);return 1e3*r+a+0}catch(t){return(0,T.Q1A)({error:t,message:"Failed to derive IDB version from PACKAGE_VERSION; using fallback 99999"}),99999}}d(Pt,"computeIdbVersion");const vr=Pt(),_r=["mj:default","mj:Metadata","mj:RunViewCache","mj:RunQueryCache","mj:DatasetCache"];class Ge extends _e{static{d(this,"BrowserIndexedDBStorageProvider")}constructor(){super(),this._dbReady=!1,this.dbPromise=function openDB(t,r,{blocked:a,upgrade:u,blocking:c,terminated:l}={}){const p=indexedDB.open(t,r),y=build_wrap(p);return u&&p.addEventListener("upgradeneeded",t=>{u(build_wrap(p.result),t.oldVersion,t.newVersion,build_wrap(p.transaction),t)}),a&&p.addEventListener("blocked",t=>a(t.oldVersion,t.newVersion,t)),y.then(t=>{l&&t.addEventListener("close",()=>l()),c&&t.addEventListener("versionchange",t=>c(t.oldVersion,t.newVersion,t))}).catch(()=>{}),y}("MJ_Metadata",vr,{upgrade:d((t,r,a)=>{try{(0,T.b09)(`[IDBCache] Upgrading IndexedDB schema v${r} → v${a} (package ${Xn}). Dropping all stores; caches will repopulate on first use.`);for(const r of Array.from(t.objectStoreNames))t.deleteObjectStore(r);for(const r of _r)t.objectStoreNames.contains(r)||t.createObjectStore(r)}catch(t){(0,T.Q1A)({error:t,message:t?.message})}},"upgrade"),blocked:d((t,r)=>{(0,T.b09)(`[IDBCache] Upgrade from v${t} to v${r} blocked by another tab. Close other tabs to allow the upgrade to proceed.`)},"blocked")}),this.dbPromise.then(t=>{this._dbReady=!0,t.onversionchange=()=>{(0,T.b09)("[IDBCache] DB schema upgraded in another tab — closing local connection."),t.close(),this._dbReady=!1}}).catch(t=>{(0,T.Q1A)({error:t,message:"IndexedDB initialization failed: "+t?.message})})}get SharesReferences(){return!1}get SupportsCrossProcessPersistence(){return!0}get IsReady(){return this._dbReady}isKnownCategory(t){const r=`mj:${t}`;return _r.includes(r)}getStoreName(t){const r=t||Zn;return this.isKnownCategory(r)?`mj:${r}`:"mj:default"}getStoreKey(t,r){const a=r||Zn;return this.isKnownCategory(a)?t:`[${a}]:${t}`}async SetItem(t,r,a){try{const u=await this.dbPromise,c=this.getStoreName(a),l=this.getStoreKey(t,a),p=u.transaction(c,"readwrite");await p.objectStore(c).put(r,l),await p.done}catch(t){(0,T.Q1A)({error:t,message:t?.message})}}async GetItem(t,r){try{const a=await this.dbPromise,u=this.getStoreName(r),c=this.getStoreKey(t,r),l=await a.transaction(u).objectStore(u).get(c);return void 0===l?null:l}catch(t){return(0,T.Q1A)({error:t,message:t?.message}),null}}async GetItems(t,r){const a=new Map;if(0===t.length)return a;try{const u=await this.dbPromise,c=this.getStoreName(r),l=Array.from(new Set(t)),p=l.map(t=>this.getStoreKey(t,r)),y=u.transaction(c,"readonly"),h=y.objectStore(c),m=p.map(t=>h.get(t)),g=await Promise.all(m);await y.done;for(let t=0;t<l.length;t++){const r=g[t];a.set(l[t],void 0===r?null:r)}return a}catch(r){(0,T.Q1A)({error:r,message:r?.message});for(const r of new Set(t))a.set(r,null);return a}}async Remove(t,r){try{const a=await this.dbPromise,u=this.getStoreName(r),c=this.getStoreKey(t,r),l=a.transaction(u,"readwrite");await l.objectStore(u).delete(c),await l.done}catch(t){(0,T.Q1A)({error:t,message:t?.message})}}async ClearCategory(t){try{const r=await this.dbPromise,a=t||Zn,u=this.getStoreName(t);if(this.isKnownCategory(a)){const t=r.transaction(u,"readwrite");await t.objectStore(u).clear(),await t.done}else{const t=`[${a}]:`,u=r.transaction("mj:default","readwrite"),c=u.objectStore("mj:default"),l=await c.getAllKeys();for(const r of l)"string"==typeof r&&r.startsWith(t)&&await c.delete(r);await u.done}}catch(t){(0,T.Q1A)({error:t,message:t?.message})}}async GetCategoryKeys(t){try{const r=await this.dbPromise,a=t||Zn,u=this.getStoreName(t),c=await r.transaction(u,"readonly").objectStore(u).getAllKeys();if(this.isKnownCategory(a))return c.map(t=>String(t));const l=`[${a}]:`;return c.map(t=>String(t)).filter(t=>t.startsWith(l)).map(t=>t.slice(l.length))}catch(t){return(0,T.Q1A)({error:t,message:t?.message}),[]}}}class ce extends Error{static{d(this,"SafeGraphQLError")}constructor(t){super(t.message),this.name=t.name,this.response={status:t.status,errors:t.errors},this.request={query:t.query},this.Code=t.code,this.VariableShape=t.variableShape,this.IsTransportFailure=t.isTransport,this.stack=t.stackFrames?`${t.name}: ${t.message}\n${t.stackFrames}`:this.stack}}function Qe(t){return t instanceof ce?t:new ce(le(t))}d(Qe,"ToSafeGraphQLError");function ue(t,r=0){if(null===t)return"null";if(void 0===t)return"undefined";if(Array.isArray(t))return 0===t.length?"array(empty)":`array(${t.length} × ${bt(ue(t[0],r+1))})`;if("object"==typeof t){if(r>=3)return"object(…)";const a=Object.keys(t);if(a.length>25)return`object(${a.length} keys)`;const u={};for(const c of a)u[c]=ue(t[c],r+1);return u}return"string"==typeof t?0===t.length?"string(empty)":"string":typeof t}function bt(t){return"string"==typeof t?t:"object"}function Tt(t){const r=t.indexOf("\n at ");return-1===r?"":t.slice(r+1)}function xt(t,r){const a=t?.[0]?.message;return"string"==typeof a&&a.length>0?a:`GraphQL Error (Code: ${String(r??"unknown")})`}function Lt(t){if(Array.isArray(t))return t.map(t=>{const r=t??{};return{message:"string"==typeof r.message?r.message:void 0,path:Array.isArray(r.path)?r.path:void 0,extensions:r.extensions&&"object"==typeof r.extensions?r.extensions:void 0}})}function le(t,r=!1){if(!t||"object"!=typeof t)return{name:typeof t,message:"Non-object value thrown; contents withheld",variables:"[REDACTED]"};const a=t,u="number"==typeof a.response?.status?a.response.status:void 0,c=Lt(a.response?.errors),l=c?.[0]?.extensions?.code,p=void 0===a.response?(0,T.qIN)(t):(0,T.qIN)({status:u});return{name:"string"==typeof a.name?a.name:"Error",message:xt(c,u),status:u,errors:c,code:"string"==typeof l?l:void 0,query:"string"==typeof a.request?.query?a.request.query:void 0,stackFrames:"string"==typeof a.stack?Tt(a.stack):void 0,variables:r?a.request?.variables:"[REDACTED]",variableShape:void 0===a.request?.variables?void 0:ue(a.request.variables),isTransport:p}}function de(t){return"mutation"===W(t)}function W(t){if(!t)return null;let r=0,a=!1,u=0;const c=t.length;for(;u<c;){const l=t[u];if("#"!==l)if('"'!==l)if("{"!==l&&"("!==l&&"["!==l)if("}"!==l&&")"!==l&&"]"!==l){if(0===r&&z(l)){const r=u;for(;u<c&&me(t[u]);)u++;const l=t.slice(r,u);if(!a){if("query"===l||"mutation"===l||"subscription"===l)return l;"fragment"===l&&(a=!0)}continue}u++}else r=Math.max(0,r-1),"}"===l&&0===r&&(a=!1),u++;else{if("{"===l&&0===r&&!a)return"query";r++,u++}else u=Oe(t,u);else for(;u<c&&"\n"!==t[u]&&"\r"!==t[u];)u++}return null}function ye(t){if(!t)return"Anonymous";let r=0,a=!1,u=!1,c=0;const l=t.length;for(;c<l;){const p=t[c];if("#"!==p)if('"'!==p)if("{"!==p&&"("!==p&&"["!==p)if("}"!==p&&")"!==p&&"]"!==p){if(0===r&&z(p)){const r=c;for(;c<l&&me(t[c]);)c++;const p=t.slice(r,c);if(!a){if(u)return p;if("query"===p||"mutation"===p||"subscription"===p){u=!0;continue}"fragment"===p&&(a=!0)}continue}c++}else r=Math.max(0,r-1),"}"===p&&0===r&&(a=!1),c++;else{if("{"===p&&0===r&&!a){let r=c+1;for(;r<l;){const a=t[r];if("#"!==a){if(z(a)){const a=r;for(;r<l&&me(t[r]);)r++;return t.slice(a,r)||"Anonymous"}if("}"===a||"{"===a)break;r++}else for(;r<l&&"\n"!==t[r]&&"\r"!==t[r];)r++}return"Anonymous"}r++,c++}else c=Oe(t,c);else for(;c<l&&"\n"!==t[c]&&"\r"!==t[c];)c++}return"Anonymous"}function Oe(t,r){const a=t.length;if(t.startsWith('"""',r)){let u=r+3;for(;u<a;)if("\\"===t[u]&&t.startsWith('"""',u+1))u+=4;else{if(t.startsWith('"""',u))return u+3;u++}return a}let u=r+1;for(;u<a;){const r=t[u];if("\\"!==r){if('"'===r||"\n"===r||"\r"===r)return u+1;u++}else u+=2}return a}function z(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||"_"===t}function me(t){return z(t)||t>="0"&&t<="9"}d(ue,"describeShape"),d(bt,"typeOf"),d(Tt,"stripStackHeader"),d(xt,"deriveMessage"),d(Lt,"extractErrors"),d(le,"SanitizeGraphQLError"),d(de,"IsGraphQLMutation"),d(W,"FirstGraphQLOperationKind"),d(ye,"ExtractGraphQLOperationName"),d(Oe,"skipString"),d(z,"isNameStart"),d(me,"isNameContinue");const Cr=new Set;function Ft(t){return Cr.add(t),()=>{Cr.delete(t)}}d(Ft,"RegisterNetworkDiagnosticObserver");const Er=new Set;function _t(t){return Er.add(t),()=>{Er.delete(t)}}function Ut(t){if(!t||"object"!=typeof t)return null;const r=(t instanceof Error?t.response:t)?.headers;return r&&"function"==typeof r.get?r:null}function Gt(t){const r=Er.size>0?Ut(t):null;if(r)for(const t of Er)try{t(r)}catch{}}function Ve(t){const r=globalThis;if(r.crypto&&"function"==typeof r.crypto.getRandomValues){const a=new Uint8Array(t);r.crypto.getRandomValues(a);let u="";for(let t=0;t<a.length;t++)u+=a[t].toString(16).padStart(2,"0");return u}let a="";for(let r=0;r<t;r++)a+=Math.floor(256*Math.random()).toString(16).padStart(2,"0");return a}d(_t,"RegisterResponseHeaderObserver"),d(Ut,"responseHeadersOf"),d(Gt,"notifyResponseHeaderObservers"),d(Ve,"generateHexId");const Pr=new WeakMap;function qe(t,r,a,u){return JSON.stringify([t,r??null,a??null,u??null])}d(qe,"credentialsKey");const wr=new Q,kr=gql`subscription RemoteOperationProgress($channelId: ID!) {
369
369
  RemoteOperationProgress(channelId: $channelId) {
370
370
  ChannelId
371
371
  ProgressJSON
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/react-runtime",
3
- "version": "6.2.0-edge.8",
3
+ "version": "6.2.1",
4
4
  "description": "Platform-agnostic React component runtime for MemberJunction. Provides core compilation, registry, and execution capabilities for React components in any JavaScript environment.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,12 +20,12 @@
20
20
  "homepage": "https://github.com/MemberJunction/MJ#readme",
21
21
  "dependencies": {
22
22
  "@babel/standalone": "^7.29.1",
23
- "@memberjunction/ai-vectors-memory": "6.2.0-edge.8",
24
- "@memberjunction/core": "6.2.0-edge.8",
25
- "@memberjunction/core-entities": "6.2.0-edge.8",
26
- "@memberjunction/global": "6.2.0-edge.8",
27
- "@memberjunction/graphql-dataprovider": "6.2.0-edge.8",
28
- "@memberjunction/interactive-component-types": "6.2.0-edge.8",
23
+ "@memberjunction/ai-vectors-memory": "6.2.1",
24
+ "@memberjunction/core": "6.2.1",
25
+ "@memberjunction/core-entities": "6.2.1",
26
+ "@memberjunction/global": "6.2.1",
27
+ "@memberjunction/graphql-dataprovider": "6.2.1",
28
+ "@memberjunction/interactive-component-types": "6.2.1",
29
29
  "rxjs": "^7.8.2"
30
30
  },
31
31
  "devDependencies": {
package/LICENSE DELETED
@@ -1,183 +0,0 @@
1
- Business Source License 1.1
2
-
3
- License text copyright (c) 2024 MariaDB plc, All Rights Reserved.
4
- "Business Source License" is a trademark of MariaDB plc.
5
-
6
- -----------------------------------------------------------------------------
7
-
8
- Parameters
9
-
10
- Licensor: Blue Cypress, Inc.
11
-
12
- Licensed Work: MemberJunction.
13
- The Licensed Work is (c) 2023-2026 Blue Cypress, Inc.
14
-
15
- Additional Use Grant: Subject to the terms of this License, Licensor grants
16
- you the following additional rights to make Production
17
- Use of the Licensed Work.
18
-
19
- 1. Internal Use
20
-
21
- You may make production use of the Licensed Work for
22
- your own internal business or organizational operations.
23
-
24
- 2. Nonprofit Use
25
-
26
- If you are a Nonprofit, you may make production use of
27
- the Licensed Work for the operations and activities of
28
- your Organizational Family.
29
-
30
- 3. MemberJunction Certified Program Use
31
-
32
- If you are authorized by Licensor under the
33
- MemberJunction Certified Program to provide professional
34
- services using the Licensed Work, you may make
35
- production use of the Licensed Work in providing such
36
- professional services to a client, provided that:
37
-
38
- (a) the Licensed Work is deployed in, and the applicable
39
- production use occurs within, an environment owned,
40
- leased, licensed, subscribed to, or otherwise controlled
41
- by that client; and
42
-
43
- (b) the production use is for that client's own internal
44
- business or organizational operations or is otherwise
45
- independently permitted to that client under this
46
- Additional Use Grant.
47
-
48
- 4. Definitions Applicable to the Additional Use Grant
49
-
50
- "Affiliate" means, with respect to a specified Person,
51
- any other Person that directly or indirectly Controls,
52
- is Controlled by, or is under common Control with such
53
- specified Person.
54
-
55
- "Control" (including the terms "Controls," "Controlled
56
- by," and "under common Control with") means the direct
57
- or indirect possession of the power to direct or cause
58
- the direction of the management and policies of a
59
- Person, whether through ownership of voting interests,
60
- by contract, or otherwise.
61
-
62
- "Organizational Family" means, with respect to a Person,
63
- (a) such Person and its Affiliates, and (b) any
64
- nonprofit organization, governmental entity, chapter,
65
- division, local affiliate, regional affiliate, state
66
- affiliate, national affiliate, or other entity that is
67
- formally affiliated with such Person through governing
68
- documents, a charter, bylaws, a membership agreement, or
69
- another written organizational instrument, and is
70
- recognized under such documents as part of the same
71
- organizational structure.
72
-
73
- "Nonprofit" means a Person recognized by the Internal
74
- Revenue Service as exempt from federal income taxation
75
- under Section 501(c)(3), 501(c)(4), 501(c)(5), or
76
- 501(c)(6) of the Internal Revenue Code, or a foreign
77
- organization recognized under substantially equivalent
78
- laws.
79
-
80
- A Person claiming eligibility as a Nonprofit shall, upon
81
- Licensor's reasonable request, provide documentation
82
- reasonably sufficient to demonstrate that it qualifies
83
- as a Nonprofit. If such Person materially misrepresents,
84
- or is unable to demonstrate, its qualification as a
85
- Nonprofit, the rights granted to such Person under
86
- Section 2 of this Additional Use Grant shall terminate.
87
-
88
- "MemberJunction Certified Program" means Licensor's
89
- then-current program for certifying and authorizing a
90
- Person to provide professional services using the
91
- Licensed Work.
92
-
93
- "Person" means any individual, corporation, limited
94
- liability company, partnership, association, nonprofit
95
- organization, governmental entity, or other legal or
96
- organizational entity.
97
-
98
- Change Date: Four (4) years from the date the Licensed Work is first
99
- made available.
100
-
101
- Change License: MIT License.
102
-
103
- For information about alternative licensing arrangements for the Licensed
104
- Work, please contact Blue Cypress, Inc.
105
-
106
- -----------------------------------------------------------------------------
107
-
108
- Terms
109
-
110
- The Licensor hereby grants you the right to copy, modify, create derivative
111
- works, redistribute, and make non-production use of the Licensed Work. The
112
- Licensor may make an Additional Use Grant, above, permitting limited
113
- production use.
114
-
115
- Effective on the Change Date, or the fourth anniversary of the first publicly
116
- available distribution of a specific version of the Licensed Work under this
117
- License, whichever comes first, the Licensor hereby grants you rights under
118
- the terms of the Change License, and the rights granted in the paragraph
119
- above terminate.
120
-
121
- If your use of the Licensed Work does not comply with the requirements
122
- currently in effect as described in this License, you must purchase a
123
- commercial license from the Licensor, its affiliated entities, or authorized
124
- resellers, or you must refrain from using the Licensed Work.
125
-
126
- All copies of the original and modified Licensed Work, and derivative works
127
- of the Licensed Work, are subject to this License. This License applies
128
- separately for each version of the Licensed Work and the Change Date may vary
129
- for each version of the Licensed Work released by Licensor.
130
-
131
- You must conspicuously display this License on each original or modified copy
132
- of the Licensed Work. If you receive the Licensed Work in original or
133
- modified form from a third party, the terms and conditions set forth in this
134
- License apply to your use of that work.
135
-
136
- Any use of the Licensed Work in violation of this License will automatically
137
- terminate your rights under this License for the current and all other
138
- versions of the Licensed Work.
139
-
140
- This License does not grant you any right in any trademark or logo of
141
- Licensor or its affiliates (provided that you may use a trademark or logo of
142
- Licensor as expressly required by this License).
143
-
144
- TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
145
- AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
146
- EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
147
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
148
- TITLE.
149
-
150
- MariaDB hereby grants you permission to use this License's text to license
151
- your works, and to refer to it using the trademark "Business Source License",
152
- as long as you comply with the Covenants of Licensor below.
153
-
154
- -----------------------------------------------------------------------------
155
-
156
- Covenants of Licensor
157
-
158
- In consideration of the right to use this License's text and the "Business
159
- Source License" name and trademark, Licensor covenants to MariaDB, and to all
160
- other recipients of the licensed work to be provided by Licensor:
161
-
162
- 1. To specify as the Change License the GPL Version 2.0 or any later version,
163
- or a license that is compatible with GPL Version 2.0 or a later version,
164
- where "compatible" means that software provided under the Change License
165
- can be included in a program with software provided under GPL Version 2.0
166
- or a later version. Licensor may specify additional Change Licenses without
167
- limitation.
168
-
169
- 2. To either: (a) specify an additional grant of rights to use that does not
170
- impose any additional restriction on the right granted in this License, as
171
- the Additional Use Grant; or (b) insert the text "None".
172
-
173
- 3. To specify a Change Date.
174
-
175
- 4. Not to modify this License in any other way.
176
-
177
- -----------------------------------------------------------------------------
178
-
179
- Notice
180
-
181
- The Business Source License (this document, or the "License") is not an Open
182
- Source license. However, the Licensed Work will eventually be made available
183
- under an Open Source License, as stated in this License.