@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 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: '#ffffff' }, { key: 'textColor', label: 'Text', fallback: '#222222' }, { key: 'borderColor', label: 'Border', fallback: '#222222' },
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 engine default and offers no reset. */
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.4.13",
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.4.4",
452
- "@jini-ai/ui": "^0.5.5",
453
- "@jini-ai/ui-kit": "^0.1.3",
454
- "@jini-ai/agent-plugins": "^0.4.3",
455
- "@jini-ai/cms": "^0.5.13",
456
- "@jini-ai/core": "^0.4.3"
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/ui-kit": "^0.1.5",
495
- "@jini-ai/cms": "^0.5.14",
496
- "@jini-ai/core": "^0.4.9",
497
- "@jini-ai/agent-plugins": "^0.4.8",
498
- "@jini-ai/agentic": "^0.4.5",
499
- "@jini-ai/ui": "^0.5.6"
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
  "*": {