@jini-ai/admin 0.4.13 → 0.6.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -2
- package/dist/consent/react/ConsentFields.js +4 -2
- package/package.json +13 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,70 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.6.10
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- e27fa91: Removed the `./server` export subpath. It held only the Composio integration, which moves back
|
|
8
|
+
out — now `@jini-ai/integrations/composio`, a subpath of `@jini-ai/integrations`
|
|
9
|
+
(`packages/integrations/`; see that package's own changeset for the full history). `jini.entries`
|
|
10
|
+
drops its `"./server": "node"` entry, and the `@jini-ai/protocol` devDependency (which existed only
|
|
11
|
+
for composio's type-only `JsonValue` references) is removed. No other consumer imported
|
|
12
|
+
`@jini-ai/admin/server` — nothing else needs an import-path change.
|
|
13
|
+
- cc33cf1: Folded `@jini-ai/composio` into `@jini-ai/admin` as a `./server` subpath, and retired the package.
|
|
14
|
+
|
|
15
|
+
Composio's only consumer is the admin surface, so a standalone package was a boundary that bought
|
|
16
|
+
nothing — the same reasoning that retired `@jini-ai/ui-core` into `@jini-ai/ui/core`. All 11 source
|
|
17
|
+
files and 8 test files move as-is; no production logic changed.
|
|
18
|
+
|
|
19
|
+
It lands under `./server`, not `./core`, because it imports `node:fs`, `node:crypto`, and
|
|
20
|
+
`node:path`. `/core` is the framework-free, DOM-free, universal layer, and that property is what
|
|
21
|
+
makes it installable without React — it is not a general-purpose home for anything non-React.
|
|
22
|
+
`jini.entries` now reads `{".": universal, "./core": universal, "./browser": browser,
|
|
23
|
+
"./server": node}`. `@jini-ai/protocol` becomes a **devDependency**: all seven references are
|
|
24
|
+
`import type { JsonValue }`, so admin's consumers pay nothing at runtime for this.
|
|
25
|
+
|
|
26
|
+
**Composio's tests had never been type-checked.** Its `tsconfig.json` set `include: ["src"]` while
|
|
27
|
+
its tests lived in a top-level `tests/` directory, so `tsc` never looked at them, and `vitest` does
|
|
28
|
+
not type-check. Twenty errors under `exactOptionalPropertyTypes: true` — a setting predating the
|
|
29
|
+
package — had been latent since its creation. Admin co-locates tests under `src/**/__tests__/`,
|
|
30
|
+
which `include: ["src"]` does cover, so the move surfaced them; it did not cause them. Nineteen
|
|
31
|
+
were mechanical fixture shapes. The twentieth was not: a `credentialStore.set` fixture in
|
|
32
|
+
`service.contract.test.ts` was missing `accountLabel` **on purpose**, simulating a persisted record
|
|
33
|
+
without one so the test could assert the resulting rejection path. "Fixing" it to satisfy the
|
|
34
|
+
compiler made the request match instead of mismatch and broke the test at runtime; it is now
|
|
35
|
+
preserved verbatim behind a documented assertion. No production type was widened to satisfy a
|
|
36
|
+
fixture. `src/server/**` keeps composio's own 100% coverage threshold via a scoped glob rather than
|
|
37
|
+
promoting it package-wide onto `/core` and `/browser`, which never carried it.
|
|
38
|
+
|
|
39
|
+
**`@jini-ai/composio` is retired, not versioned forward.** It was published (0.1.0, 0.2.0, 0.2.1 —
|
|
40
|
+
a longer public life than ui-core's single version), but has zero consumers: no source file,
|
|
41
|
+
package.json, or lockfile in either this repo or Tovu has ever referenced it, verified with a `-S`
|
|
42
|
+
pickaxe over full git history rather than current state alone. Deleting the source does **not**
|
|
43
|
+
unpublish anything — 0.2.1 stays installable and no existing build breaks — so a deprecation-stub
|
|
44
|
+
package was judged not worth keeping alive for a name nothing needs. Whoever runs the next release
|
|
45
|
+
should follow up against the registry with:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
npm deprecate @jini-ai/composio "Merged into @jini-ai/admin; import from '@jini-ai/admin/server' instead."
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
One caution for anyone re-examining that consumer question later: composio's CHANGELOG for 0.2.1
|
|
52
|
+
says "Verified against a real external consumer (Tovu...)", which reads like direct evidence of a
|
|
53
|
+
dependency. It is not. That exact sentence appears verbatim in 23 other packages' CHANGELOGs — it
|
|
54
|
+
is boilerplate from a repo-wide `main`/`types` resolution fix that was batch-applied, not a
|
|
55
|
+
composio-specific claim.
|
|
56
|
+
|
|
57
|
+
Composio's `source-map.md` is carried forward to `src/server/source-map.md`. Its package-level
|
|
58
|
+
`UNLOCKED.md` is not: it tracked admission evidence for the locked/incubating gate removed
|
|
59
|
+
2026-07-28, and its one substantive point is covered in more detail by `source-map.md`. The root
|
|
60
|
+
`UNLOCKED.md`'s composio entry is deliberately left untouched as historical record, per that file's
|
|
61
|
+
own header.
|
|
62
|
+
|
|
63
|
+
- 82ed2d3: Media, SEO and widgets require FetchQueryProvider. Successful media refreshes clear errors; editor reads request fresh versions. Remove redundant settings-loader/provider reads and limit media invalidation to the library. Retain the exported headless entry-picker controller as deprecated pending owner-approved removal.
|
|
64
|
+
- ea8d883: Restore host media-prefix invalidation while isolating provider queries, and validate single-owner SEO form reads.
|
|
65
|
+
- ea8d883: Skip cross-origin image HEAD probes, translate social image warnings through the SEO translator, and use the existing warning notice class.
|
|
66
|
+
- 1c5d476: Hydrate reopened SEO forms from the fresh settings read through the shared query loader so cached default values cannot hide newer settings.
|
|
67
|
+
|
|
3
68
|
## 0.4.13 — 2026-10-22
|
|
4
69
|
|
|
5
70
|
- 2026-10-22: Consent banner editor sections and preview, redirect list fixes, media lightbox via @jini-ai/ui, media provider tab fixes, coverage.
|
|
@@ -62,7 +127,7 @@
|
|
|
62
127
|
|
|
63
128
|
## Unreleased
|
|
64
129
|
|
|
65
|
-
- Add portable Forms admin screens, HTTP/memory adapters and core-port conformance under ./forms
|
|
130
|
+
- Add portable Forms admin screens, HTTP/memory adapters and core-port conformance under ./forms\*.
|
|
66
131
|
- Add composable comments admin queue/settings module with HTTP and memory adapters and API conformance.
|
|
67
132
|
- Add portable redirects admin module, React list, HTTP/memory adapters and API conformance.
|
|
68
133
|
- Add portable SEO admin settings, sitemap viewer, entry overrides and analysis with HTTP/memory adapters and API conformance.
|
|
@@ -78,7 +143,6 @@
|
|
|
78
143
|
|
|
79
144
|
- Adopt shared kernel contracts and preserve the module rationale in neutral documentation.
|
|
80
145
|
|
|
81
|
-
|
|
82
146
|
- Complete object-argument calls in Sidebar, RowMenu and ConfirmDialog, preserving
|
|
83
147
|
preferences, routing, tone precedence, selection and agent handle behavior.
|
|
84
148
|
- Merge every per-request `HeadersInit` form through `Headers`, with case-insensitive
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useId } from 'react';
|
|
3
|
+
import { defaultAdminTheme } from '@jini-ai/ui/theme';
|
|
3
4
|
import { pixelInputValue, problemsFor, useConsentSettingsPanel, usePolicyVersionInput } from './settings-panel.hooks.js';
|
|
4
5
|
const BANNER_FIELDS = [
|
|
5
6
|
{ key: 'title', label: 'Banner title' }, { key: 'message', label: 'Banner message', multiline: true },
|
|
@@ -11,8 +12,9 @@ const REGION_LABELS = {
|
|
|
11
12
|
auto: 'Automatic (unknown region: opt-in)', 'opt-in': 'Opt-in everywhere (EU / UK)', 'opt-out': 'Opt-out everywhere (California)',
|
|
12
13
|
};
|
|
13
14
|
const PLACEMENT_LABELS = { 'bottom-bar': 'Bottom bar', 'bottom-left': 'Bottom left', 'bottom-right': 'Bottom right', 'top-bar': 'Top bar' };
|
|
15
|
+
// Native color inputs need concrete colors rather than CSS variable expressions.
|
|
14
16
|
const COLOR_TOKENS = [
|
|
15
|
-
{ key: 'backgroundColor', label: 'Background', fallback:
|
|
17
|
+
{ key: 'backgroundColor', label: 'Background', fallback: defaultAdminTheme.light.bg }, { key: 'textColor', label: 'Text', fallback: defaultAdminTheme.light.text }, { key: 'borderColor', label: 'Border', fallback: defaultAdminTheme.light.border },
|
|
16
18
|
];
|
|
17
19
|
/** The engine's own pixel bounds (`compileConsentCss`); out-of-range values come back as problems. */
|
|
18
20
|
const PIXEL_TOKENS = [
|
|
@@ -60,7 +62,7 @@ export function ConsentLookFields({ value, onChange, disabled = false, problems,
|
|
|
60
62
|
const appearance = value.appearance ?? {};
|
|
61
63
|
return _jsxs("fieldset", { disabled: disabled, className: "jini-consent-settings-fields", children: [_jsx("legend", { children: t('Look & position') }), _jsx(Field, { label: t('Position'), field: "placement", problems: problems, children: aria => _jsx("select", { className: "jini-input", value: value.placement ?? placements[0], onChange: handlers.placement, ...aria, children: placements.map(placement => _jsx("option", { value: placement, children: t(PLACEMENT_LABELS[placement] ?? placement) }, placement)) }) }), _jsxs("div", { className: "jini-consent-token-grid", children: [COLOR_TOKENS.map(token => _jsx(ColorToken, { label: t(token.label), value: appearance[token.key], fallback: token.fallback, resetLabel: t('Default'), onChange: handlers.token(token.key) }, token.key)), PIXEL_TOKENS.map(token => _jsx(Field, { label: t(token.label), field: token.key, children: attributes => _jsx("input", { className: "jini-input", type: "number", inputMode: "numeric", min: token.min, max: token.max, step: 1, placeholder: t('Default'), value: pixelInputValue({ value: appearance[token.key] }), onChange: event => handlers.token(token.key)(event.target.value === '' ? '' : `${event.target.value}px`), ...attributes }) }, token.key))] }), _jsx(Field, { label: t('Custom CSS'), field: "appearance", problems: problems, children: aria => _jsx("textarea", { className: "jini-input jini-consent-css", value: value.customCss ?? '', rows: 6, spellCheck: false, onChange: handlers.text('customCss'), ...aria }) }), _jsx("p", { className: "jini-hint", children: t('Only banner selectors and safe properties are allowed. Text needs 4.5:1 contrast.') })] });
|
|
62
64
|
}
|
|
63
|
-
/** A native color picker; unset shows the
|
|
65
|
+
/** A native color picker; unset shows the shared theme default and offers no reset. */
|
|
64
66
|
function ColorToken({ label, value, fallback, resetLabel, onChange }) {
|
|
65
67
|
const id = useId();
|
|
66
68
|
return _jsxs("div", { className: "jini-consent-settings-field", children: [_jsx("label", { htmlFor: id, className: "jini-field-label", children: label }), _jsxs("span", { className: "jini-consent-color-row", children: [_jsx("input", { id: id, className: "jini-consent-color", type: "color", value: value ?? fallback, onChange: event => onChange(event.target.value) }), _jsx("code", { className: "jini-hint", children: value ?? resetLabel }), value !== undefined && _jsx("button", { type: "button", className: "jini-btn-link", "aria-label": `${resetLabel}: ${label}`, onClick: () => onChange(''), children: resetLabel })] })] });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jini-ai/admin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.10",
|
|
4
4
|
"description": "Composable admin surface for Jini-hosted products: framework-free contracts, panel registry, and route model in `/core`; React shell and panels in `/react`. Import only the layers you need.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -448,12 +448,12 @@
|
|
|
448
448
|
"peerDependencies": {
|
|
449
449
|
"react": "^18.3.0 || ^19.0.0",
|
|
450
450
|
"react-dom": "^18.3.0 || ^19.0.0",
|
|
451
|
-
"@jini-ai/agentic": "^0.
|
|
452
|
-
"@jini-ai/ui": "^0.
|
|
453
|
-
"@jini-ai/ui-kit": "^0.
|
|
454
|
-
"@jini-ai/agent-plugins": "^0.
|
|
455
|
-
"@jini-ai/cms": "^0.
|
|
456
|
-
"@jini-ai/core": "^0.
|
|
451
|
+
"@jini-ai/agentic": "^0.6.10",
|
|
452
|
+
"@jini-ai/ui": "^0.6.10",
|
|
453
|
+
"@jini-ai/ui-kit": "^0.6.10",
|
|
454
|
+
"@jini-ai/agent-plugins": "^0.6.10",
|
|
455
|
+
"@jini-ai/cms": "^0.6.10",
|
|
456
|
+
"@jini-ai/core": "^0.6.10"
|
|
457
457
|
},
|
|
458
458
|
"peerDependenciesMeta": {
|
|
459
459
|
"react": {
|
|
@@ -491,12 +491,12 @@
|
|
|
491
491
|
"react": "^19.2.0",
|
|
492
492
|
"react-dom": "^19.2.0",
|
|
493
493
|
"@testing-library/user-event": "^14.6.1",
|
|
494
|
-
"@jini-ai/
|
|
495
|
-
"@jini-ai/
|
|
496
|
-
"@jini-ai/
|
|
497
|
-
"@jini-ai/
|
|
498
|
-
"@jini-ai/
|
|
499
|
-
"@jini-ai/
|
|
494
|
+
"@jini-ai/agentic": "^0.6.10",
|
|
495
|
+
"@jini-ai/core": "^0.6.10",
|
|
496
|
+
"@jini-ai/agent-plugins": "^0.6.10",
|
|
497
|
+
"@jini-ai/ui-kit": "^0.6.10",
|
|
498
|
+
"@jini-ai/ui": "^0.6.10",
|
|
499
|
+
"@jini-ai/cms": "^0.6.10"
|
|
500
500
|
},
|
|
501
501
|
"typesVersions": {
|
|
502
502
|
"*": {
|