@jini-ai/ui 0.6.12 → 0.6.15-rc.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.
Files changed (42) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +14 -0
  3. package/dist/features/admin-widgets/components/InfoTip.d.ts +3 -2
  4. package/dist/features/admin-widgets/components/InfoTip.hooks.d.ts +17 -2
  5. package/dist/features/admin-widgets/components/InfoTip.hooks.js +64 -14
  6. package/dist/features/admin-widgets/components/InfoTip.js +2 -2
  7. package/dist/features/admin-widgets/index.d.ts +1 -1
  8. package/dist/features/admin-widgets/index.js +1 -1
  9. package/dist/features/execution/react/components/AgentCliEnvFields.js +27 -8
  10. package/dist/features/execution/react/components/ByokProviderForm.js +16 -19
  11. package/dist/features/mcp-ui/surfaces/document.d.ts +1 -1
  12. package/dist/features/mcp-ui/surfaces/document.js +28 -0
  13. package/dist/features/mcp-ui/surfaces/fields.d.ts +28 -1
  14. package/dist/features/mcp-ui/surfaces/fields.js +5 -1
  15. package/dist/features/mcp-ui/surfaces/form.js +86 -16
  16. package/dist/features/mcp-ui/surfaces/text-input.d.ts +3 -3
  17. package/dist/features/mcp-ui/surfaces/text-input.js +26 -11
  18. package/dist/features/media-providers/catalog.d.ts +3 -0
  19. package/dist/features/media-providers/catalog.js +3 -0
  20. package/dist/features/media-providers/react/components/MediaProviderCard.js +5 -4
  21. package/dist/features/media-providers/react/components/media-providers-tab-labels.js +2 -1
  22. package/dist/features/panel-kit/fetch-query/adapter.react.d.ts +10 -5
  23. package/dist/features/panel-kit/fetch-query/adapter.react.js +9 -3
  24. package/dist/features/panel-kit/fetch-query/binding.react.d.ts +4 -0
  25. package/dist/features/panel-kit/fetch-query/binding.react.js +29 -10
  26. package/dist/features/panel-kit/fetch-query/index.d.ts +1 -1
  27. package/dist/features/panel-kit/fetch-query/index.js +1 -1
  28. package/dist/features/panel-kit/fetch-query/tanstack.d.ts +1 -1
  29. package/dist/features/panel-kit/fetch-query/tanstack.js +1 -1
  30. package/dist/features/privacy/react/components/PrivacyTab.d.ts +1 -3
  31. package/dist/features/privacy/react/components/PrivacyTab.js +5 -8
  32. package/dist/features/settings/dialog/styles/settings-dialog.css +5 -70
  33. package/dist/features/source-config-list/react/components/SourceConfigField.js +27 -26
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.js +1 -0
  36. package/dist/react/components/SecretInput.d.ts +47 -0
  37. package/dist/react/components/SecretInput.hooks.d.ts +26 -0
  38. package/dist/react/components/SecretInput.hooks.js +25 -0
  39. package/dist/react/components/SecretInput.js +30 -0
  40. package/dist/styles/lightbox.css +1 -1
  41. package/dist/styles/variables.css +1 -1
  42. package/package.json +9 -9
@@ -1,6 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useRef, useState } from 'react';
2
+ import { useEffect, useRef } from 'react';
3
3
  import { useT } from '../../../i18n/index.js';
4
+ import { SecretInput, SecretTextarea } from '../../../../react/components/SecretInput.js';
5
+ import { useSecretReveal as useSecretInputReveal } from '../../../../react/components/SecretInput.hooks.js';
4
6
  import { sourceConfigAgentProps } from '../../agent-handles.js';
5
7
  import { maskFieldValue } from '../../rules.js';
6
8
  /**
@@ -36,10 +38,10 @@ import { maskFieldValue } from '../../rules.js';
36
38
  */
37
39
  export function SourceConfigField({ spec, value, error, disabled = false, idPrefix = 'source-config-field', agentHandle, onChange }) {
38
40
  const t = useT();
39
- const { revealed, toggleRevealed, isLockedSecret } = useSecretReveal({ kind: spec.kind, value });
40
41
  const inputId = `${idPrefix}-${spec.key}`;
41
42
  const errorId = error ? `${inputId}-error` : undefined;
42
43
  const fieldLabel = t(spec.label);
44
+ const { revealed, toggleRevealed, isLockedSecret } = useSecretReveal({ kind: spec.kind, value, label: fieldLabel });
43
45
  const shared = {
44
46
  disabled,
45
47
  'aria-invalid': Boolean(error) || undefined,
@@ -55,15 +57,16 @@ export function SourceConfigField({ spec, value, error, disabled = false, idPref
55
57
  action: 'reveal',
56
58
  });
57
59
  const reveal = { revealed, disabled, agentProps: revealAgentProps, onToggle: toggleRevealed };
58
- return (_jsxs("label", { className: "source-config-field", htmlFor: inputId, children: [_jsxs("span", { className: "source-config-field-label", children: [fieldLabel, spec.required ? (_jsx("span", { className: "source-config-field-required", "aria-label": t('required'), children: "*" })) : null] }), _jsx(SourceConfigFieldControl, { spec: spec, value: value, inputId: inputId, shared: shared, reveal: reveal, isLockedSecret: isLockedSecret }), error ? (_jsx("span", { id: errorId, className: "source-config-field-error", role: "alert", children: error })) : null] }));
60
+ return (_jsxs("div", { className: "source-config-field", children: [_jsxs("label", { className: "source-config-field-label", htmlFor: inputId, children: [fieldLabel, spec.required ? (_jsx("span", { className: "source-config-field-required", "aria-label": t('required'), children: "*" })) : null] }), _jsx(SourceConfigFieldControl, { spec: spec, value: value, inputId: inputId, shared: shared, reveal: reveal, isLockedSecret: isLockedSecret }), error ? (_jsx("span", { id: errorId, className: "source-config-field-error", role: "alert", children: error })) : null] }));
59
61
  }
60
62
  /**
61
63
  * The `password`/`secret-textarea` show-hide state. The toggle is small local
62
64
  * disclosure state (per the vertical-slice guardrail allowing that in a leaf
63
65
  * component).
64
66
  */
65
- function useSecretReveal({ kind, value }) {
66
- const [revealed, setRevealed] = useState(false);
67
+ function useSecretReveal({ kind, value, label }, _options = {}) {
68
+ const t = useT();
69
+ const { revealed, toggle } = useSecretInputReveal({ value, labels: { show: `${t('Show')} ${label}`, hide: `${t('Hide')} ${label}` } });
67
70
  // Whether THIS mount ever had a pre-existing secret to protect, captured
68
71
  // once rather than recomputed from `value` on every render. A plain
69
72
  // `Boolean(value)` gate would look right at first glance but re-locks the
@@ -87,7 +90,6 @@ function useSecretReveal({ kind, value }) {
87
90
  // or from the user clearing an existing secret mid-edit to type a new one.
88
91
  useEffect(() => {
89
92
  if (!value) {
90
- setRevealed(false);
91
93
  hadStoredSecretRef.current = false;
92
94
  }
93
95
  }, [value]);
@@ -95,8 +97,8 @@ function useSecretReveal({ kind, value }) {
95
97
  // secret still un-revealed. A field with nothing to protect — first-time
96
98
  // entry, or one already cleared out — is immediately editable, no
97
99
  // "Show"/reveal click required.
98
- const isLockedSecret = kind === 'secret-textarea' && hadStoredSecretRef.current && !revealed;
99
- return { revealed, toggleRevealed: () => setRevealed((current) => !current), isLockedSecret };
100
+ const isLockedSecret = kind === 'secret-textarea' && Boolean(value) && hadStoredSecretRef.current && !revealed;
101
+ return { revealed, toggleRevealed: toggle, isLockedSecret };
100
102
  }
101
103
  /** Picks the control for `spec.kind`: a select, a (secret-)textarea, a password input, or a plain text/url input. */
102
104
  function SourceConfigFieldControl(props) {
@@ -116,25 +118,24 @@ function SelectControl({ spec, value, inputId, shared, placeholder, }) {
116
118
  return (_jsxs("select", { id: inputId, value: value, ...shared, children: [_jsx("option", { value: "", disabled: true, hidden: true, children: placeholder ?? t('Select…') }), (spec.options ?? []).map((option) => (_jsx("option", { value: option.value, children: t(option.label) }, option.value)))] }));
117
119
  }
118
120
  function TextareaControl({ spec, value, inputId, shared, reveal, isLockedSecret, placeholder }) {
119
- return (_jsxs("span", { className: "source-config-field-row", children: [_jsx("textarea", { id: inputId, value: isLockedSecret ? maskFieldValue(spec.kind, value) : value, placeholder: placeholder,
120
- // A masked textarea must not be typed into — the visible text is not
121
- // the real value, so an edit would commit the mask characters.
122
- // Revealing is the way in, exactly like the password field. Only
123
- // applies when there is a stored secret to protect — see
124
- // `isLockedSecret`.
125
- readOnly: isLockedSecret, ...shared }), spec.kind === 'secret-textarea' ? _jsx(RevealToggle, { ...reveal }) : null] }));
126
- }
127
- function PasswordControl({ value, inputId, shared, reveal, placeholder }) {
128
- return (_jsxs("span", { className: "source-config-field-row", children: [_jsx("input", { id: inputId, type: reveal.revealed ? 'text' : 'password',
129
- // `new-password`, NOT `off`: Chrome deliberately ignores `off` and fills a saved site
130
- // login into the first password input it finds (and the text input above it as the
131
- // username). A source's credential is never the operator's own login.
132
- autoComplete: "new-password", value: value, placeholder: placeholder, ...shared }), _jsx(RevealToggle, { ...reveal })] }));
121
+ const t = useT();
122
+ if (spec.kind !== 'secret-textarea') {
123
+ return _jsx("span", { className: "source-config-field-row", children: _jsx("textarea", { id: inputId, value: value, placeholder: placeholder, ...shared }) });
124
+ }
125
+ return (_jsx("span", { className: "source-config-field-row", children: _jsx(SecretTextarea, { id: inputId, label: t(spec.label), revealed: reveal.revealed, onRevealedChange: reveal.onToggle, toggleAttrs: reveal.agentProps, value: value, maskedValue: isLockedSecret ? maskFieldValue(spec.kind, value) : undefined, placeholder: placeholder,
126
+ // A masked textarea must not be typed into — the visible text is not
127
+ // the real value, so an edit would commit the mask characters.
128
+ // Revealing is the way in, exactly like the password field. Only
129
+ // applies when there is a stored secret to protect — see
130
+ // `isLockedSecret`.
131
+ readOnly: isLockedSecret, autoComplete: "off", ...shared }) }));
133
132
  }
134
- /** The `password`/`secret-textarea` Show/Hide button. */
135
- function RevealToggle({ revealed, disabled, agentProps, onToggle }) {
133
+ function PasswordControl({ spec, value, inputId, shared, reveal, placeholder }) {
136
134
  const t = useT();
137
- const label = revealed ? t('Hide') : t('Show');
138
- return (_jsx("button", { type: "button", className: "source-config-field-toggle", disabled: disabled, ...agentProps, onClick: onToggle, title: label, children: label }));
135
+ return (_jsx("span", { className: "source-config-field-row", children: _jsx(SecretInput, { id: inputId, label: t(spec.label), "aria-label": t(spec.label), revealed: reveal.revealed, onRevealedChange: reveal.onToggle, toggleAttrs: reveal.agentProps,
136
+ // `new-password`, NOT `off`: Chrome deliberately ignores `off` and fills a saved site
137
+ // login into the first password input it finds (and the text input above it as the
138
+ // username). A source's credential is never the operator's own login.
139
+ autoComplete: "new-password", value: value, placeholder: placeholder, ...shared }) }));
139
140
  }
140
141
  //# sourceMappingURL=SourceConfigField.js.map
package/dist/index.d.ts CHANGED
@@ -105,6 +105,7 @@ export * from './browser/useModalWindowDragGuard.js';
105
105
  export * from './browser/index.js';
106
106
  export { Icon, ICON_PATH_DATA, type IconName } from './react/components/Icon.js';
107
107
  export * from './react/components/RemixIcon.js';
108
+ export { SecretInput, SecretTextarea, type SecretInputProps, type SecretTextareaProps } from './react/components/SecretInput.js';
108
109
  export * from './react/components/AgentIcon.js';
109
110
  export * from './react/components/Toast.js';
110
111
  export * from './react/components/Loading.js';
package/dist/index.js CHANGED
@@ -112,6 +112,7 @@ export * from './browser/index.js';
112
112
  // not reach this published package's public surface.
113
113
  export { Icon, ICON_PATH_DATA } from './react/components/Icon.js';
114
114
  export * from './react/components/RemixIcon.js';
115
+ export { SecretInput, SecretTextarea } from './react/components/SecretInput.js';
115
116
  export * from './react/components/AgentIcon.js';
116
117
  export * from './react/components/Toast.js';
117
118
  export * from './react/components/Loading.js';
@@ -0,0 +1,47 @@
1
+ import type { InputHTMLAttributes, TextareaHTMLAttributes } from 'react';
2
+ /**
3
+ * @file The shared masked input: a password/token/key `<input>` with an eye toggle inside its right
4
+ * edge. Drop-in for `<input type="password">` — every other input prop passes straight through.
5
+ *
6
+ * Same markup and classes as `@jini-ai/ui-kit`'s password `TextField` and the mcp-ui secret fields
7
+ * (`.jini-secret` / `.jini-secret-toggle`), so one host stylesheet styles all of them; hosts own
8
+ * the visual rules.
9
+ *
10
+ * Keep it OUT of a wrapping `<label>`: the toggle's "Show <label>" name would join the input's own
11
+ * accessible name. Pair it with a sibling `<label htmlFor>` (or `aria-label`) instead.
12
+ *
13
+ * `SecretTextarea` is the multi-line twin (a `<textarea>` cannot be `type="password"`, so it masks
14
+ * with `-webkit-text-security` while hidden); its wrapper adds `.jini-secret--multiline` so a host
15
+ * can pin the toggle to the top corner instead of the vertical middle.
16
+ */
17
+ /** The props both secret fields share: how the eye toggle is named and whether it starts shown. */
18
+ interface SecretToggleProps {
19
+ /** The field's visible label, translated; names the toggle ("Show API key"). */
20
+ readonly label: string;
21
+ /** The toggle's full names, for a host with its own translator (chat, user-management). Default:
22
+ * `t('Show')`/`t('Hide')` + `label`, from this package's `I18nProvider`. Same contract as
23
+ * ui-kit `TextField`'s `secretToggleLabels`. */
24
+ readonly toggleLabels?: {
25
+ readonly show: string;
26
+ readonly hide: string;
27
+ };
28
+ /** Extra attributes for the toggle button, e.g. an agent handle. */
29
+ readonly toggleAttrs?: Readonly<Record<string, string | boolean | undefined>>;
30
+ /** Controlled mode: the host owns the shown/hidden state. */
31
+ readonly revealed?: boolean;
32
+ readonly onRevealedChange?: (revealed: boolean) => void;
33
+ }
34
+ export type SecretInputProps = SecretToggleProps & Omit<InputHTMLAttributes<HTMLInputElement>, 'type'>;
35
+ export type SecretTextareaProps = SecretToggleProps & TextareaHTMLAttributes<HTMLTextAreaElement> & {
36
+ /** Safe replacement text while hidden (e.g. env names with masked values). Read-only while
37
+ * displayed: editing replacement characters would overwrite the actual secret. */
38
+ readonly maskedValue?: string | undefined;
39
+ };
40
+ export declare const SecretInput: import("react").ForwardRefExoticComponent<SecretToggleProps & Omit<InputHTMLAttributes<HTMLInputElement>, "type"> & import("react").RefAttributes<HTMLInputElement>>;
41
+ export declare const SecretTextarea: import("react").ForwardRefExoticComponent<SecretToggleProps & TextareaHTMLAttributes<HTMLTextAreaElement> & {
42
+ /** Safe replacement text while hidden (e.g. env names with masked values). Read-only while
43
+ * displayed: editing replacement characters would overwrite the actual secret. */
44
+ readonly maskedValue?: string | undefined;
45
+ } & import("react").RefAttributes<HTMLTextAreaElement>>;
46
+ export {};
47
+ //# sourceMappingURL=SecretInput.d.ts.map
@@ -0,0 +1,26 @@
1
+ export interface SecretRevealRequired {
2
+ /** The input's current value. A transition to `''` re-hides (the usual sign a save succeeded). */
3
+ readonly value: unknown;
4
+ /** The toggle's full accessible names, translated ("Show API key" / "Hide API key"). */
5
+ readonly labels: {
6
+ readonly show: string;
7
+ readonly hide: string;
8
+ };
9
+ }
10
+ export interface SecretRevealOptional {
11
+ /** Controlled mode: the host owns the shown/hidden state (e.g. to reset it per provider). */
12
+ readonly revealed?: boolean;
13
+ readonly onRevealedChange?: (revealed: boolean) => void;
14
+ }
15
+ /**
16
+ * The show/hide state behind `SecretInput`'s eye toggle. Starts hidden. Uncontrolled, it re-hides on
17
+ * the value's transition to empty only — an empty field may still be revealed before pasting.
18
+ * @complexity O(1).
19
+ */
20
+ export declare function useSecretReveal(required: SecretRevealRequired, optional?: SecretRevealOptional): {
21
+ readonly revealed: boolean;
22
+ readonly inputType: "text" | "password";
23
+ readonly toggleLabel: string;
24
+ readonly toggle: () => void;
25
+ };
26
+ //# sourceMappingURL=SecretInput.hooks.d.ts.map
@@ -0,0 +1,25 @@
1
+ import { useState } from 'react';
2
+ /**
3
+ * The show/hide state behind `SecretInput`'s eye toggle. Starts hidden. Uncontrolled, it re-hides on
4
+ * the value's transition to empty only — an empty field may still be revealed before pasting.
5
+ * @complexity O(1).
6
+ */
7
+ export function useSecretReveal(required, optional = {}) {
8
+ const [ownRevealed, setOwnRevealed] = useState(false);
9
+ const [lastValue, setLastValue] = useState(required.value);
10
+ if (required.value !== lastValue) {
11
+ setLastValue(required.value);
12
+ if (required.value === '')
13
+ setOwnRevealed(false);
14
+ }
15
+ const revealed = optional.revealed ?? ownRevealed;
16
+ const toggleLabel = revealed ? required.labels.hide : required.labels.show;
17
+ const toggle = () => {
18
+ if (optional.onRevealedChange)
19
+ optional.onRevealedChange(!revealed);
20
+ else
21
+ setOwnRevealed(!revealed);
22
+ };
23
+ return { revealed, inputType: revealed ? 'text' : 'password', toggleLabel, toggle };
24
+ }
25
+ //# sourceMappingURL=SecretInput.hooks.js.map
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import { useT } from '../../features/i18n/index.js';
4
+ import { Icon } from './Icon.js';
5
+ import { useSecretReveal } from './SecretInput.hooks.js';
6
+ /** Reveal state + the eye button, shared by `SecretInput` and `SecretTextarea`. */
7
+ function useSecretToggle({ label, toggleLabels, toggleAttrs, revealed, onRevealedChange }, { value, disabled } = {}) {
8
+ const t = useT();
9
+ const reveal = useSecretReveal({ value, labels: toggleLabels ?? { show: `${t('Show')} ${label}`, hide: `${t('Hide')} ${label}` } }, { ...(revealed === undefined ? {} : { revealed }), ...(onRevealedChange ? { onRevealedChange } : {}) });
10
+ // One signal only: the name flips Show/Hide, so no `aria-pressed` — both together made screen
11
+ // readers announce "Hide API key, toggle button, pressed" (Opus UI review 2026-10-26).
12
+ const button = (_jsx("button", { ...toggleAttrs, type: "button", className: "jini-secret-toggle", "aria-label": reveal.toggleLabel, title: reveal.toggleLabel, disabled: disabled, onClick: reveal.toggle, children: _jsx(Icon, { name: reveal.revealed ? 'eye-off' : 'eye', size: 18 }) }));
13
+ return { reveal, button };
14
+ }
15
+ export const SecretInput = forwardRef(function SecretInput(props, ref) {
16
+ // The toggle props are pulled off so they never reach the DOM `<input>`.
17
+ const { label, toggleLabels, toggleAttrs, revealed, onRevealedChange, ...inputProps } = props;
18
+ const { reveal, button } = useSecretToggle(props, { value: inputProps.value, disabled: inputProps.disabled });
19
+ return (_jsxs("span", { className: "jini-secret", children: [_jsx("input", { ...inputProps, spellCheck: false, ref: ref, type: reveal.inputType }), button] }));
20
+ });
21
+ export const SecretTextarea = forwardRef(function SecretTextarea(props, ref) {
22
+ const { label, toggleLabels, toggleAttrs, revealed, onRevealedChange, style, maskedValue, ...textareaProps } = props;
23
+ const { reveal, button } = useSecretToggle(props, { value: textareaProps.value, disabled: textareaProps.disabled });
24
+ const replacementShown = !reveal.revealed && maskedValue !== undefined;
25
+ /* Not a standard CSS property, so it is set here rather than left to a host stylesheet: a host
26
+ that forgot it would show the secret in clear text. pre-wrap keeps line breaks while masked. */
27
+ const masked = { ...style, ...{ WebkitTextSecurity: reveal.revealed || replacementShown ? 'none' : 'disc' }, whiteSpace: 'pre-wrap' };
28
+ return (_jsxs("span", { className: "jini-secret jini-secret--multiline", children: [_jsx("textarea", { ...textareaProps, ...(replacementShown ? { value: maskedValue, readOnly: true } : {}), spellCheck: false, ref: ref, style: masked }), button] }));
29
+ });
30
+ //# sourceMappingURL=SecretInput.js.map
@@ -126,7 +126,7 @@
126
126
  }
127
127
  .jini-lightbox-button:hover:not(:disabled) { background: var(--jini-lightbox-button-bg-hover); border-color: var(--jini-lightbox-button-border-hover); }
128
128
  .jini-lightbox-button:focus-visible { outline: 2px solid var(--jini-lightbox-ink); outline-offset: 2px; }
129
- /* Same chip, only fainter: a host `button:disabled` fill (the Tovu admin's light `--surface-3`) would
129
+ /* Same chip, only fainter: a host `button:disabled` fill (the host admin's light `--surface-3`) would
130
130
  otherwise turn the end-of-set arrow into a bright pressed-looking disc. */
131
131
  .jini-lightbox-button:disabled {
132
132
  opacity: 0.3;
@@ -250,7 +250,7 @@
250
250
  /* Chat uses its own stylesheet so hosts can load it independently of the admin palette.
251
251
  Aliases live on :root only so nested theme/scheme scopes inherit ChatPane's component-local
252
252
  values. Moving that component wiring is a later step. Classic retains its existing scoped
253
- host bridge in Tovu. */
253
+ host application bridge. */
254
254
  :root {
255
255
  --jini-chat-font-body: var(--jini-theme-chat-font-body, -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", "Noto Sans", Roboto, "Helvetica Neue", Arial, sans-serif);
256
256
  --jini-chat-font-mono: var(--jini-theme-chat-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jini-ai/ui",
3
- "version": "0.6.12",
3
+ "version": "0.6.15-rc.1",
4
4
  "description": "Generic, product-neutral React UI primitives and feature domains. Framework-free types, decision rules, catalogs, and host port contracts live behind ./core (no React, no DOM). The Excalidraw and Lexical editors live behind ./sketch-editor and ./lexical-rich-text-editor; the GrapesJS-backed inline HTML editor lives behind ./html-editor.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -243,14 +243,14 @@
243
243
  "shiki": "^1.24.4",
244
244
  "tailwind-merge": "^2.6.0",
245
245
  "zod": "^3.25.76",
246
- "@jini-ai/agent-runtime": "^0.6.12",
247
- "@jini-ai/integrations": "^0.6.12",
248
- "@jini-ai/platform": "^0.6.12",
249
- "@jini-ai/agentic": "^0.6.12",
250
- "@jini-ai/core": "^0.6.12"
246
+ "@jini-ai/agent-runtime": "^0.6.15-rc.1",
247
+ "@jini-ai/integrations": "^0.6.15-rc.1",
248
+ "@jini-ai/platform": "^0.6.15-rc.1",
249
+ "@jini-ai/agentic": "^0.6.15-rc.1",
250
+ "@jini-ai/core": "^0.6.15-rc.1"
251
251
  },
252
252
  "dependencies": {
253
- "@jini-ai/core": "^0.6.12"
253
+ "@jini-ai/core": "^0.6.15-rc.1"
254
254
  },
255
255
  "peerDependencies": {
256
256
  "@tanstack/react-query": "^5.0.0",
@@ -267,8 +267,8 @@
267
267
  "lexical": "0.36.2",
268
268
  "react": "^18.3.0 || ^19.0.0",
269
269
  "react-dom": "^18.3.0 || ^19.0.0",
270
- "@jini-ai/platform": "^0.6.10",
271
- "@jini-ai/agentic": "^0.6.10",
270
+ "@jini-ai/platform": "^0.6.15-rc.1",
271
+ "@jini-ai/agentic": "^0.6.15-rc.1",
272
272
  "class-variance-authority": "^0.7.1",
273
273
  "clsx": "^2.1.1",
274
274
  "micromark": "^4.0.0",