@tai42/studio-sdk 0.10.0 → 0.12.0

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.
@@ -4,7 +4,10 @@
4
4
  * confirm button (showing a pending Spinner while the action runs and disabled
5
5
  * meanwhile), and a loud `ErrorState` when the action fails. The caller supplies
6
6
  * the prompt as `children` and drives the action through `onConfirm` /
7
- * `isPending` / `error`.
7
+ * `isPending` / `error`. When the failure is an OFF (disabled-feature) state
8
+ * rather than a real error, the caller passes `disabledNote` — a muted note that
9
+ * takes the error slot and blocks the confirm button, so an unconfigured store
10
+ * never shows a loud red alert or a retry loop.
8
11
  *
9
12
  * Mount it only while the confirmation is active; any close gesture — Cancel,
10
13
  * Escape, the overlay — calls `onClose`. The confirm button is destructive
@@ -32,9 +35,16 @@ export interface ConfirmDialogProps {
32
35
  * the other's.
33
36
  */
34
37
  readonly error?: Error | string | null;
38
+ /**
39
+ * A muted node shown in the error slot INSTEAD of the loud `ErrorState`, for the
40
+ * OFF (disabled-feature) case: the action's store is not configured, so the
41
+ * failure is a state, not an error. When set it takes the error slot AND disables
42
+ * the confirm button — the action can only refuse, so there is nothing to retry.
43
+ */
44
+ readonly disabledNote?: ReactNode;
35
45
  readonly confirmVariant?: 'primary' | 'danger';
36
46
  /** The prompt body — what the operator is confirming. */
37
47
  readonly children: ReactNode;
38
48
  }
39
- export declare function ConfirmDialog({ title, confirmLabel, pendingLabel, onConfirm, onClose, isPending, error, confirmVariant, children, }: ConfirmDialogProps): ReactNode;
49
+ export declare function ConfirmDialog({ title, confirmLabel, pendingLabel, onConfirm, onClose, isPending, error, disabledNote, confirmVariant, children, }: ConfirmDialogProps): ReactNode;
40
50
  //# sourceMappingURL=confirm-dialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/C,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,SAAS,EACT,KAAK,EACL,cAAyB,EACzB,QAAQ,GACT,EAAE,kBAAkB,GAAG,SAAS,CAsBhC"}
1
+ {"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/C,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAyB,EACzB,QAAQ,GACT,EAAE,kBAAkB,GAAG,SAAS,CA2BhC"}
@@ -2,10 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Dialog } from './dialog';
3
3
  import { Button, ErrorState, Spinner } from './primitives';
4
4
  import { errorMessage } from '../errors';
5
- export function ConfirmDialog({ title, confirmLabel, pendingLabel, onConfirm, onClose, isPending, error, confirmVariant = 'danger', children, }) {
5
+ export function ConfirmDialog({ title, confirmLabel, pendingLabel, onConfirm, onClose, isPending, error, disabledNote, confirmVariant = 'danger', children, }) {
6
6
  return (_jsxs(Dialog, { title: title, open: true, onOpenChange: (next) => {
7
7
  if (!next)
8
8
  onClose();
9
- }, children: [children, error != null ? _jsx(ErrorState, { message: errorMessage(error) }) : null, _jsxs("div", { className: "tai-dialog-actions", children: [_jsx(Button, { type: "button", onClick: onClose, children: "Cancel" }), _jsxs(Button, { type: "button", variant: confirmVariant, disabled: isPending, onClick: onConfirm, children: [isPending ? _jsx(Spinner, { label: pendingLabel }) : null, confirmLabel] })] })] }));
9
+ }, children: [children, disabledNote ?? (error != null ? _jsx(ErrorState, { message: errorMessage(error) }) : null), _jsxs("div", { className: "tai-dialog-actions", children: [_jsx(Button, { type: "button", onClick: onClose, children: "Cancel" }), _jsxs(Button, { type: "button", variant: confirmVariant, disabled: isPending || disabledNote != null, onClick: onConfirm, children: [isPending ? _jsx(Spinner, { label: pendingLabel }) : null, confirmLabel] })] })] }));
10
10
  }
11
11
  //# sourceMappingURL=confirm-dialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-dialog.js","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":";AAiBA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAyBzC,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,SAAS,EACT,KAAK,EACL,cAAc,GAAG,QAAQ,EACzB,QAAQ,GACW;IACnB,OAAO,CACL,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,EACZ,IAAI,QACJ,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC;QACvB,CAAC,aAEA,QAAQ,EACR,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,GAAI,CAAC,CAAC,CAAC,IAAI,EACpE,eAAK,SAAS,EAAC,oBAAoB,aACjC,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,uBAE7B,EACT,MAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,aACnF,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,YAAY,GAAI,CAAC,CAAC,CAAC,IAAI,EACnD,YAAY,IACN,IACL,IACC,CACV,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"confirm-dialog.js","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":";AAoBA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAgCzC,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAc,GAAG,QAAQ,EACzB,QAAQ,GACW;IACnB,OAAO,CACL,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,EACZ,IAAI,QACJ,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC;QACvB,CAAC,aAEA,QAAQ,EACR,YAAY,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,GAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EACtF,eAAK,SAAS,EAAC,oBAAoB,aACjC,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,uBAE7B,EACT,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,SAAS,IAAI,YAAY,IAAI,IAAI,EAC3C,OAAO,EAAE,SAAS,aAEjB,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,YAAY,GAAI,CAAC,CAAC,CAAC,IAAI,EACnD,YAAY,IACN,IACL,IACC,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The shared "this DB-backed feature is not configured" client idiom — one helper,
3
+ * every consumer.
4
+ *
5
+ * A deployment leaves a database-backed feature cleanly OFF by configuring no store
6
+ * for it. The skeleton then answers that feature's WRITES with an HTTP 501
7
+ * `NotSupportedError` carrying a machine code ending `-not-configured`
8
+ * (`<feature>-not-configured`); collection reads stay 200-empty and named reads
9
+ * 404, so only a write (or a terminal read stream) reveals the OFF state. `OFF is a
10
+ * state, not an error`: a consumer keys on this predicate to hide or disable the
11
+ * write affordance and show the muted `FeatureDisabled` note that names the enabling
12
+ * env var — never a loud red ErrorState or a retry loop.
13
+ *
14
+ * The predicate DUCK-TYPES the error (a numeric `status` / string `code`) rather
15
+ * than `instanceof ApiError`: this package is the leaf of the plugin boundary and
16
+ * must not import `@tai42/api-client` at runtime — the same reason `useSse` matches
17
+ * `ApiUnauthorizedError` by name.
18
+ */
19
+ import type { ReactNode } from 'react';
20
+ /**
21
+ * True when `error` is a disabled-feature refusal from the skeleton: an HTTP 501, or
22
+ * a `code` ending `-not-configured`. The `code` is authoritative; the 501 status is
23
+ * the fallback signal — either alone is enough.
24
+ */
25
+ export declare function isFeatureDisabled(error: unknown): boolean;
26
+ export interface FeatureDisabledProps {
27
+ /** The human name of the OFF feature, e.g. `Interactions`. */
28
+ readonly feature: string;
29
+ /** The env var that turns it on, named verbatim so an operator can act. */
30
+ readonly envVar: string;
31
+ }
32
+ /**
33
+ * The muted, honest OFF state for a feature whose store this deployment has not
34
+ * configured. A `role="status"` EmptyState (never the loud alert ErrorState): the
35
+ * feature is not broken, it is simply off, and the copy names the enabling env var.
36
+ */
37
+ export declare function FeatureDisabled({ feature, envVar }: FeatureDisabledProps): ReactNode;
38
+ //# sourceMappingURL=feature-disabled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-disabled.d.ts","sourceRoot":"","sources":["../src/feature-disabled.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKzD;AAED,MAAM,WAAW,oBAAoB;IACnC,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,oBAAoB,GAAG,SAAS,CASpF"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { EmptyState } from './components/primitives';
3
+ /**
4
+ * True when `error` is a disabled-feature refusal from the skeleton: an HTTP 501, or
5
+ * a `code` ending `-not-configured`. The `code` is authoritative; the 501 status is
6
+ * the fallback signal — either alone is enough.
7
+ */
8
+ export function isFeatureDisabled(error) {
9
+ if (typeof error !== 'object' || error === null)
10
+ return false;
11
+ const { status, code } = error;
12
+ if (status === 501)
13
+ return true;
14
+ return typeof code === 'string' && code.endsWith('-not-configured');
15
+ }
16
+ /**
17
+ * The muted, honest OFF state for a feature whose store this deployment has not
18
+ * configured. A `role="status"` EmptyState (never the loud alert ErrorState): the
19
+ * feature is not broken, it is simply off, and the copy names the enabling env var.
20
+ */
21
+ export function FeatureDisabled({ feature, envVar }) {
22
+ return (_jsx("div", { "data-testid": "feature-disabled", children: _jsx(EmptyState, { title: `${feature} is not configured`, description: `This deployment has no store configured for ${feature.toLowerCase()}. Set ${envVar} to enable it.` }) }));
23
+ }
24
+ //# sourceMappingURL=feature-disabled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-disabled.js","sourceRoot":"","sources":["../src/feature-disabled.tsx"],"names":[],"mappings":";AAoBA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAA6C,CAAC;IACvE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AACtE,CAAC;AASD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,EAAwB;IACvE,OAAO,CACL,6BAAiB,kBAAkB,YACjC,KAAC,UAAU,IACT,KAAK,EAAE,GAAG,OAAO,oBAAoB,EACrC,WAAW,EAAE,+CAA+C,OAAO,CAAC,WAAW,EAAE,SAAS,MAAM,gBAAgB,GAChH,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -8,6 +8,13 @@ export interface InteractionsStreamState {
8
8
  readonly connected: boolean;
9
9
  readonly backlogLoaded: boolean;
10
10
  readonly error: Error | null;
11
+ /**
12
+ * The interactions store is not configured on this deployment: the stream
13
+ * answered with a terminal 501 `interactions-not-configured`. Reconnection is
14
+ * abandoned (retrying would replay the same refusal forever) and the consumer
15
+ * renders the muted OFF state instead of a red error or a floating badge.
16
+ */
17
+ readonly disabled: boolean;
11
18
  }
12
19
  export declare function useInteractionsStream(): InteractionsStreamState;
13
20
  //# sourceMappingURL=useSse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSse.d.ts","sourceRoot":"","sources":["../../src/hooks/useSse.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD,qEAAqE;AACrE,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAU7E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CAC9B;AA+HD,wBAAgB,qBAAqB,IAAI,uBAAuB,CAgN/D"}
1
+ {"version":3,"file":"useSse.d.ts","sourceRoot":"","sources":["../../src/hooks/useSse.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD,qEAAqE;AACrE,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAU7E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AA+HD,wBAAgB,qBAAqB,IAAI,uBAAuB,CA8N/D"}
@@ -33,6 +33,7 @@
33
33
  import { useEffect, useRef, useState } from 'react';
34
34
  import { useApi } from './useApi';
35
35
  import { useOnUnauthorized } from './useUnauthorized';
36
+ import { isFeatureDisabled } from '../feature-disabled';
36
37
  // Reconnect backoff: capped exponential with full jitter. The delay for attempt
37
38
  // n is a random value in [0, min(CAP, BASE * 2**n)); the attempt counter resets
38
39
  // only when a connection is proven healthy (`interaction.backlog_done`), not when
@@ -161,6 +162,7 @@ export function useInteractionsStream() {
161
162
  connected: false,
162
163
  backlogLoaded: false,
163
164
  error: null,
165
+ disabled: false,
164
166
  });
165
167
  // Source of truth: a dedupe map keyed by interaction_id, rebuilt into the
166
168
  // ordered array on every change.
@@ -306,7 +308,11 @@ export function useInteractionsStream() {
306
308
  if (aborted())
307
309
  return;
308
310
  beginConnection();
309
- setState((prev) => ({ ...prev, connected: true, error: null }));
311
+ // Clear `disabled` on a fresh connect: the terminal-501 branch sets it and
312
+ // returns, so within a single mount this only ever writes false-over-false —
313
+ // but should the effect re-run and a later stream connect, the hook must not
314
+ // carry a stale OFF flag. Correct-by-construction, not load-bearing today.
315
+ setState((prev) => ({ ...prev, connected: true, error: null, disabled: false }));
310
316
  for await (const frame of frames) {
311
317
  if (aborted())
312
318
  return;
@@ -326,6 +332,15 @@ export function useInteractionsStream() {
326
332
  onUnauthorized();
327
333
  return;
328
334
  }
335
+ if (isFeatureDisabled(error)) {
336
+ // A terminal 501 `interactions-not-configured`: the deployment runs no
337
+ // interactions store, so reconnecting would replay the same refusal on
338
+ // every backoff forever (this stream is always-mounted via the shell
339
+ // badge). Stop, and flag the OFF state so the badge disappears and the
340
+ // page renders the muted "not configured" note instead of a red error.
341
+ setState((prev) => ({ ...prev, connected: false, disabled: true }));
342
+ return;
343
+ }
329
344
  }
330
345
  // Stream ended or errored → wait, then reconnect (server replays backlog).
331
346
  // Guard before the setState, like every other setState in run(): a
@@ -1 +1 @@
1
- {"version":3,"file":"useSse.js","sourceRoot":"","sources":["../../src/hooks/useSse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSse.js","sourceRoot":"","sources":["../../src/hooks/useSse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * `useFeatureOff` — the PROACTIVE read of a DB-backed feature's OFF state, off the
3
+ * system kind-status table (`GET /api/system/kinds`), fetched once per auth flip and
4
+ * held as SDK state.
5
+ *
6
+ * A deployment leaves a database-backed feature cleanly OFF by configuring no store
7
+ * for it; the kind-status table then reports that kind's `state` as `off` (rather
8
+ * than `active` / `default`). A write affordance for an OFF feature reads this and
9
+ * hides itself BEFORE the user acts, instead of learning OFF only from a write's 501
10
+ * refusal — the reactive `isFeatureDisabled` swallow stays as the backstop for a
11
+ * stale table.
12
+ *
13
+ * A PLAIN fetch state machine (`loading` / `ready` / `failed`), NOT TanStack Query:
14
+ * the SDK is the shared leaf across the plugin boundary and holds no query context,
15
+ * exactly as `useCapabilities` does. It is DELIBERATELY non-blocking — a kind counts
16
+ * as not-off until the table is `ready`, and a failed fetch leaves every kind not-off
17
+ * so the surface falls back to its reactive 501 handling, never a hard-failed page.
18
+ */
19
+ import { type ReactNode } from 'react';
20
+ import type { KindStatus } from '@tai42/api-client';
21
+ export type SystemKindsState = {
22
+ readonly status: 'loading';
23
+ } | {
24
+ readonly status: 'ready';
25
+ readonly kinds: readonly KindStatus[];
26
+ } | {
27
+ readonly status: 'failed';
28
+ readonly error: unknown;
29
+ };
30
+ /**
31
+ * Fetch the kind-status table once the caller is authenticated and hold it as SDK
32
+ * state. Gated on `isAuthenticated` (the table is an authed read), so the login
33
+ * screen never fires a doomed request; a fetch failure settles into `failed`
34
+ * QUIETLY — no unauthorized routing, no loud error — because the consuming
35
+ * affordance falls back to its reactive OFF handling.
36
+ */
37
+ export declare function SystemKindsProvider({ children }: {
38
+ children: ReactNode;
39
+ }): import("react").FunctionComponentElement<import("react").ProviderProps<SystemKindsState | null>>;
40
+ /**
41
+ * The live kind-status state. Falls back to `loading` when no provider is mounted, so
42
+ * a consumer rendered outside the shell reads every kind as not-off rather than
43
+ * throwing — the fail-open default this proactive-hiding idiom relies on.
44
+ */
45
+ export declare function useSystemKinds(): SystemKindsState;
46
+ /**
47
+ * Whether `kind` is reported OFF by the kind-status table — the single proactive
48
+ * predicate a write affordance folds in to hide itself before a doomed write. It is
49
+ * `true` ONLY once the table is `ready` AND that kind's row carries `state: 'off'`;
50
+ * while the table is loading/failed, no provider is mounted, or the kind is unknown,
51
+ * it is `false` (treat as not-off until known — under-hiding is safe, the reactive
52
+ * 501 backstop still catches a genuinely-off feature).
53
+ */
54
+ export declare function useFeatureOff(kind: string): boolean;
55
+ //# sourceMappingURL=useSystemKinds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSystemKinds.d.ts","sourceRoot":"","sources":["../../src/hooks/useSystemKinds.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKpD,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAI3D;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,oGA4BxE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,gBAAgB,CAEjD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAInD"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * `useFeatureOff` — the PROACTIVE read of a DB-backed feature's OFF state, off the
3
+ * system kind-status table (`GET /api/system/kinds`), fetched once per auth flip and
4
+ * held as SDK state.
5
+ *
6
+ * A deployment leaves a database-backed feature cleanly OFF by configuring no store
7
+ * for it; the kind-status table then reports that kind's `state` as `off` (rather
8
+ * than `active` / `default`). A write affordance for an OFF feature reads this and
9
+ * hides itself BEFORE the user acts, instead of learning OFF only from a write's 501
10
+ * refusal — the reactive `isFeatureDisabled` swallow stays as the backstop for a
11
+ * stale table.
12
+ *
13
+ * A PLAIN fetch state machine (`loading` / `ready` / `failed`), NOT TanStack Query:
14
+ * the SDK is the shared leaf across the plugin boundary and holds no query context,
15
+ * exactly as `useCapabilities` does. It is DELIBERATELY non-blocking — a kind counts
16
+ * as not-off until the table is `ready`, and a failed fetch leaves every kind not-off
17
+ * so the surface falls back to its reactive 501 handling, never a hard-failed page.
18
+ */
19
+ import { createContext, createElement, useContext, useEffect, useState, } from 'react';
20
+ import { useApi } from './useApi';
21
+ import { useAuth } from './useAuth';
22
+ const SystemKindsContext = createContext(null);
23
+ /**
24
+ * Fetch the kind-status table once the caller is authenticated and hold it as SDK
25
+ * state. Gated on `isAuthenticated` (the table is an authed read), so the login
26
+ * screen never fires a doomed request; a fetch failure settles into `failed`
27
+ * QUIETLY — no unauthorized routing, no loud error — because the consuming
28
+ * affordance falls back to its reactive OFF handling.
29
+ */
30
+ export function SystemKindsProvider({ children }) {
31
+ const { isAuthenticated } = useAuth();
32
+ const api = useApi();
33
+ const [state, setState] = useState({ status: 'loading' });
34
+ useEffect(() => {
35
+ if (!isAuthenticated) {
36
+ // No credential → nothing to read. Reset to the neutral `loading` state so the
37
+ // next sign-in re-fetches cleanly; every kind reads not-off meanwhile.
38
+ setState({ status: 'loading' });
39
+ return;
40
+ }
41
+ const controller = new AbortController();
42
+ setState({ status: 'loading' });
43
+ api.getSystemKinds(controller.signal).then((kinds) => {
44
+ if (!controller.signal.aborted)
45
+ setState({ status: 'ready', kinds });
46
+ }, (error) => {
47
+ if (!controller.signal.aborted)
48
+ setState({ status: 'failed', error });
49
+ });
50
+ return () => {
51
+ controller.abort();
52
+ };
53
+ }, [api, isAuthenticated]);
54
+ return createElement(SystemKindsContext.Provider, { value: state }, children);
55
+ }
56
+ /**
57
+ * The live kind-status state. Falls back to `loading` when no provider is mounted, so
58
+ * a consumer rendered outside the shell reads every kind as not-off rather than
59
+ * throwing — the fail-open default this proactive-hiding idiom relies on.
60
+ */
61
+ export function useSystemKinds() {
62
+ return useContext(SystemKindsContext) ?? { status: 'loading' };
63
+ }
64
+ /**
65
+ * Whether `kind` is reported OFF by the kind-status table — the single proactive
66
+ * predicate a write affordance folds in to hide itself before a doomed write. It is
67
+ * `true` ONLY once the table is `ready` AND that kind's row carries `state: 'off'`;
68
+ * while the table is loading/failed, no provider is mounted, or the kind is unknown,
69
+ * it is `false` (treat as not-off until known — under-hiding is safe, the reactive
70
+ * 501 backstop still catches a genuinely-off feature).
71
+ */
72
+ export function useFeatureOff(kind) {
73
+ const state = useSystemKinds();
74
+ if (state.status !== 'ready')
75
+ return false;
76
+ return state.kinds.some((row) => row.kind === kind && row.state === 'off');
77
+ }
78
+ //# sourceMappingURL=useSystemKinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSystemKinds.js","sourceRoot":"","sources":["../../src/hooks/useSystemKinds.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,SAAS,EACT,QAAQ,GAET,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,kBAAkB,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAE,QAAQ,EAA2B;IACvE,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAE5E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,+EAA+E;YAC/E,uEAAuE;YACvE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAChC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CACxC,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC,CACF,CAAC;QACF,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;IAE3B,OAAO,aAAa,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACjE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAC7E,CAAC"}
package/dist/index.d.ts CHANGED
@@ -28,6 +28,8 @@ export { AuthProvider, useAuth } from './hooks/useAuth';
28
28
  export type { AuthState } from './hooks/useAuth';
29
29
  export { CapabilityProvider, useCapabilities, useCanWrite, isFullProjection, coversAnyRoute, coversRoute, coversWrite, } from './hooks/useCapabilities';
30
30
  export type { CapabilityState, CapabilityContextValue } from './hooks/useCapabilities';
31
+ export { SystemKindsProvider, useSystemKinds, useFeatureOff } from './hooks/useSystemKinds';
32
+ export type { SystemKindsState } from './hooks/useSystemKinds';
31
33
  export { ThemeProvider, useTheme } from './hooks/useTheme';
32
34
  export type { Theme, ThemePreference, ThemeState } from './hooks/useTheme';
33
35
  export { useBreakpoint } from './hooks/useBreakpoint';
@@ -38,6 +40,8 @@ export { NavigationProvider, AppLink, useAppNavigate, useResolvePath, usePluginN
38
40
  export type { AppLinkProps, RouteToken, RouteSearch, RouteSearchByToken, PageProps, NavigationContextValue, PluginSearch, } from './navigation';
39
41
  export { errorMessage } from './errors';
40
42
  export { downloadBlob } from './download';
43
+ export { isFeatureDisabled, FeatureDisabled } from './feature-disabled';
44
+ export type { FeatureDisabledProps } from './feature-disabled';
41
45
  export { toolsListKey, extensionsQueryKey, subMcpKey, tokensPayloadKey } from './query-keys';
42
46
  export { comboElementNames, extensionElementName } from './extension-combos';
43
47
  export { effectiveHidden, hiddenToolNames } from './tool-visibility';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -31,6 +31,7 @@ export { ApiProvider, useApi } from './hooks/useApi';
31
31
  export { UnauthorizedProvider, useOnUnauthorized } from './hooks/useUnauthorized';
32
32
  export { AuthProvider, useAuth } from './hooks/useAuth';
33
33
  export { CapabilityProvider, useCapabilities, useCanWrite, isFullProjection, coversAnyRoute, coversRoute, coversWrite, } from './hooks/useCapabilities';
34
+ export { SystemKindsProvider, useSystemKinds, useFeatureOff } from './hooks/useSystemKinds';
34
35
  export { ThemeProvider, useTheme } from './hooks/useTheme';
35
36
  export { useBreakpoint } from './hooks/useBreakpoint';
36
37
  export { useInteractionsStream } from './hooks/useSse';
@@ -39,6 +40,8 @@ export { NavigationProvider, AppLink, useAppNavigate, useResolvePath, usePluginN
39
40
  // -- Utilities ---------------------------------------------------------------
40
41
  export { errorMessage } from './errors';
41
42
  export { downloadBlob } from './download';
43
+ // -- Disabled-feature idiom (one helper + component, every consumer) ----------
44
+ export { isFeatureDisabled, FeatureDisabled } from './feature-disabled';
42
45
  // -- Cross-feature query keys ------------------------------------------------
43
46
  export { toolsListKey, extensionsQueryKey, subMcpKey, tokensPayloadKey } from './query-keys';
44
47
  // -- Extension-combo editing helpers -----------------------------------------
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tai42/studio-sdk",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "description": "The Studio plugin contract, shared UI components, and hooks that every feature builds on.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "tai42 <oss@tai42.ai>",
@@ -89,7 +89,7 @@
89
89
  "@radix-ui/react-select": "^2.3.2",
90
90
  "@radix-ui/react-tabs": "^1.1.16",
91
91
  "@radix-ui/react-tooltip": "^1.2.11",
92
- "@tai42/api-client": "0.10.0"
92
+ "@tai42/api-client": "0.12.0"
93
93
  },
94
94
  "scripts": {
95
95
  "build": "tsc -b tsconfig.build.json && node scripts/copy-assets.mjs",
@@ -4,7 +4,10 @@
4
4
  * confirm button (showing a pending Spinner while the action runs and disabled
5
5
  * meanwhile), and a loud `ErrorState` when the action fails. The caller supplies
6
6
  * the prompt as `children` and drives the action through `onConfirm` /
7
- * `isPending` / `error`.
7
+ * `isPending` / `error`. When the failure is an OFF (disabled-feature) state
8
+ * rather than a real error, the caller passes `disabledNote` — a muted note that
9
+ * takes the error slot and blocks the confirm button, so an unconfigured store
10
+ * never shows a loud red alert or a retry loop.
8
11
  *
9
12
  * Mount it only while the confirmation is active; any close gesture — Cancel,
10
13
  * Escape, the overlay — calls `onClose`. The confirm button is destructive
@@ -37,6 +40,13 @@ export interface ConfirmDialogProps {
37
40
  * the other's.
38
41
  */
39
42
  readonly error?: Error | string | null;
43
+ /**
44
+ * A muted node shown in the error slot INSTEAD of the loud `ErrorState`, for the
45
+ * OFF (disabled-feature) case: the action's store is not configured, so the
46
+ * failure is a state, not an error. When set it takes the error slot AND disables
47
+ * the confirm button — the action can only refuse, so there is nothing to retry.
48
+ */
49
+ readonly disabledNote?: ReactNode;
40
50
  readonly confirmVariant?: 'primary' | 'danger';
41
51
  /** The prompt body — what the operator is confirming. */
42
52
  readonly children: ReactNode;
@@ -50,6 +60,7 @@ export function ConfirmDialog({
50
60
  onClose,
51
61
  isPending,
52
62
  error,
63
+ disabledNote,
53
64
  confirmVariant = 'danger',
54
65
  children,
55
66
  }: ConfirmDialogProps): ReactNode {
@@ -62,12 +73,17 @@ export function ConfirmDialog({
62
73
  }}
63
74
  >
64
75
  {children}
65
- {error != null ? <ErrorState message={errorMessage(error)} /> : null}
76
+ {disabledNote ?? (error != null ? <ErrorState message={errorMessage(error)} /> : null)}
66
77
  <div className="tai-dialog-actions">
67
78
  <Button type="button" onClick={onClose}>
68
79
  Cancel
69
80
  </Button>
70
- <Button type="button" variant={confirmVariant} disabled={isPending} onClick={onConfirm}>
81
+ <Button
82
+ type="button"
83
+ variant={confirmVariant}
84
+ disabled={isPending || disabledNote != null}
85
+ onClick={onConfirm}
86
+ >
71
87
  {isPending ? <Spinner label={pendingLabel} /> : null}
72
88
  {confirmLabel}
73
89
  </Button>
@@ -0,0 +1,56 @@
1
+ /**
2
+ * The shared "this DB-backed feature is not configured" client idiom — one helper,
3
+ * every consumer.
4
+ *
5
+ * A deployment leaves a database-backed feature cleanly OFF by configuring no store
6
+ * for it. The skeleton then answers that feature's WRITES with an HTTP 501
7
+ * `NotSupportedError` carrying a machine code ending `-not-configured`
8
+ * (`<feature>-not-configured`); collection reads stay 200-empty and named reads
9
+ * 404, so only a write (or a terminal read stream) reveals the OFF state. `OFF is a
10
+ * state, not an error`: a consumer keys on this predicate to hide or disable the
11
+ * write affordance and show the muted `FeatureDisabled` note that names the enabling
12
+ * env var — never a loud red ErrorState or a retry loop.
13
+ *
14
+ * The predicate DUCK-TYPES the error (a numeric `status` / string `code`) rather
15
+ * than `instanceof ApiError`: this package is the leaf of the plugin boundary and
16
+ * must not import `@tai42/api-client` at runtime — the same reason `useSse` matches
17
+ * `ApiUnauthorizedError` by name.
18
+ */
19
+ import type { ReactNode } from 'react';
20
+
21
+ import { EmptyState } from './components/primitives';
22
+
23
+ /**
24
+ * True when `error` is a disabled-feature refusal from the skeleton: an HTTP 501, or
25
+ * a `code` ending `-not-configured`. The `code` is authoritative; the 501 status is
26
+ * the fallback signal — either alone is enough.
27
+ */
28
+ export function isFeatureDisabled(error: unknown): boolean {
29
+ if (typeof error !== 'object' || error === null) return false;
30
+ const { status, code } = error as { status?: unknown; code?: unknown };
31
+ if (status === 501) return true;
32
+ return typeof code === 'string' && code.endsWith('-not-configured');
33
+ }
34
+
35
+ export interface FeatureDisabledProps {
36
+ /** The human name of the OFF feature, e.g. `Interactions`. */
37
+ readonly feature: string;
38
+ /** The env var that turns it on, named verbatim so an operator can act. */
39
+ readonly envVar: string;
40
+ }
41
+
42
+ /**
43
+ * The muted, honest OFF state for a feature whose store this deployment has not
44
+ * configured. A `role="status"` EmptyState (never the loud alert ErrorState): the
45
+ * feature is not broken, it is simply off, and the copy names the enabling env var.
46
+ */
47
+ export function FeatureDisabled({ feature, envVar }: FeatureDisabledProps): ReactNode {
48
+ return (
49
+ <div data-testid="feature-disabled">
50
+ <EmptyState
51
+ title={`${feature} is not configured`}
52
+ description={`This deployment has no store configured for ${feature.toLowerCase()}. Set ${envVar} to enable it.`}
53
+ />
54
+ </div>
55
+ );
56
+ }
@@ -35,6 +35,7 @@ import type { Interaction } from '@tai42/api-client';
35
35
 
36
36
  import { useApi } from './useApi';
37
37
  import { useOnUnauthorized } from './useUnauthorized';
38
+ import { isFeatureDisabled } from '../feature-disabled';
38
39
 
39
40
  /** A live interaction plus the client-maintained `answered` flag. */
40
41
  export type StreamInteraction = Interaction & { readonly answered: boolean };
@@ -52,6 +53,13 @@ export interface InteractionsStreamState {
52
53
  readonly connected: boolean;
53
54
  readonly backlogLoaded: boolean;
54
55
  readonly error: Error | null;
56
+ /**
57
+ * The interactions store is not configured on this deployment: the stream
58
+ * answered with a terminal 501 `interactions-not-configured`. Reconnection is
59
+ * abandoned (retrying would replay the same refusal forever) and the consumer
60
+ * renders the muted OFF state instead of a red error or a floating badge.
61
+ */
62
+ readonly disabled: boolean;
55
63
  }
56
64
 
57
65
  // Reconnect backoff: capped exponential with full jitter. The delay for attempt
@@ -187,6 +195,7 @@ export function useInteractionsStream(): InteractionsStreamState {
187
195
  connected: false,
188
196
  backlogLoaded: false,
189
197
  error: null,
198
+ disabled: false,
190
199
  });
191
200
  // Source of truth: a dedupe map keyed by interaction_id, rebuilt into the
192
201
  // ordered array on every change.
@@ -337,7 +346,11 @@ export function useInteractionsStream(): InteractionsStreamState {
337
346
  const frames = await api.streamInteractions(controller.signal);
338
347
  if (aborted()) return;
339
348
  beginConnection();
340
- setState((prev) => ({ ...prev, connected: true, error: null }));
349
+ // Clear `disabled` on a fresh connect: the terminal-501 branch sets it and
350
+ // returns, so within a single mount this only ever writes false-over-false —
351
+ // but should the effect re-run and a later stream connect, the hook must not
352
+ // carry a stale OFF flag. Correct-by-construction, not load-bearing today.
353
+ setState((prev) => ({ ...prev, connected: true, error: null, disabled: false }));
341
354
  for await (const frame of frames) {
342
355
  if (aborted()) return;
343
356
  applyFrame(frame.event, frame.data);
@@ -354,6 +367,15 @@ export function useInteractionsStream(): InteractionsStreamState {
354
367
  onUnauthorized();
355
368
  return;
356
369
  }
370
+ if (isFeatureDisabled(error)) {
371
+ // A terminal 501 `interactions-not-configured`: the deployment runs no
372
+ // interactions store, so reconnecting would replay the same refusal on
373
+ // every backoff forever (this stream is always-mounted via the shell
374
+ // badge). Stop, and flag the OFF state so the badge disappears and the
375
+ // page renders the muted "not configured" note instead of a red error.
376
+ setState((prev) => ({ ...prev, connected: false, disabled: true }));
377
+ return;
378
+ }
357
379
  }
358
380
  // Stream ended or errored → wait, then reconnect (server replays backlog).
359
381
  // Guard before the setState, like every other setState in run(): a
@@ -0,0 +1,97 @@
1
+ /**
2
+ * `useFeatureOff` — the PROACTIVE read of a DB-backed feature's OFF state, off the
3
+ * system kind-status table (`GET /api/system/kinds`), fetched once per auth flip and
4
+ * held as SDK state.
5
+ *
6
+ * A deployment leaves a database-backed feature cleanly OFF by configuring no store
7
+ * for it; the kind-status table then reports that kind's `state` as `off` (rather
8
+ * than `active` / `default`). A write affordance for an OFF feature reads this and
9
+ * hides itself BEFORE the user acts, instead of learning OFF only from a write's 501
10
+ * refusal — the reactive `isFeatureDisabled` swallow stays as the backstop for a
11
+ * stale table.
12
+ *
13
+ * A PLAIN fetch state machine (`loading` / `ready` / `failed`), NOT TanStack Query:
14
+ * the SDK is the shared leaf across the plugin boundary and holds no query context,
15
+ * exactly as `useCapabilities` does. It is DELIBERATELY non-blocking — a kind counts
16
+ * as not-off until the table is `ready`, and a failed fetch leaves every kind not-off
17
+ * so the surface falls back to its reactive 501 handling, never a hard-failed page.
18
+ */
19
+ import {
20
+ createContext,
21
+ createElement,
22
+ useContext,
23
+ useEffect,
24
+ useState,
25
+ type ReactNode,
26
+ } from 'react';
27
+ import type { KindStatus } from '@tai42/api-client';
28
+
29
+ import { useApi } from './useApi';
30
+ import { useAuth } from './useAuth';
31
+
32
+ export type SystemKindsState =
33
+ | { readonly status: 'loading' }
34
+ | { readonly status: 'ready'; readonly kinds: readonly KindStatus[] }
35
+ | { readonly status: 'failed'; readonly error: unknown };
36
+
37
+ const SystemKindsContext = createContext<SystemKindsState | null>(null);
38
+
39
+ /**
40
+ * Fetch the kind-status table once the caller is authenticated and hold it as SDK
41
+ * state. Gated on `isAuthenticated` (the table is an authed read), so the login
42
+ * screen never fires a doomed request; a fetch failure settles into `failed`
43
+ * QUIETLY — no unauthorized routing, no loud error — because the consuming
44
+ * affordance falls back to its reactive OFF handling.
45
+ */
46
+ export function SystemKindsProvider({ children }: { children: ReactNode }) {
47
+ const { isAuthenticated } = useAuth();
48
+ const api = useApi();
49
+ const [state, setState] = useState<SystemKindsState>({ status: 'loading' });
50
+
51
+ useEffect(() => {
52
+ if (!isAuthenticated) {
53
+ // No credential → nothing to read. Reset to the neutral `loading` state so the
54
+ // next sign-in re-fetches cleanly; every kind reads not-off meanwhile.
55
+ setState({ status: 'loading' });
56
+ return;
57
+ }
58
+ const controller = new AbortController();
59
+ setState({ status: 'loading' });
60
+ api.getSystemKinds(controller.signal).then(
61
+ (kinds) => {
62
+ if (!controller.signal.aborted) setState({ status: 'ready', kinds });
63
+ },
64
+ (error: unknown) => {
65
+ if (!controller.signal.aborted) setState({ status: 'failed', error });
66
+ },
67
+ );
68
+ return () => {
69
+ controller.abort();
70
+ };
71
+ }, [api, isAuthenticated]);
72
+
73
+ return createElement(SystemKindsContext.Provider, { value: state }, children);
74
+ }
75
+
76
+ /**
77
+ * The live kind-status state. Falls back to `loading` when no provider is mounted, so
78
+ * a consumer rendered outside the shell reads every kind as not-off rather than
79
+ * throwing — the fail-open default this proactive-hiding idiom relies on.
80
+ */
81
+ export function useSystemKinds(): SystemKindsState {
82
+ return useContext(SystemKindsContext) ?? { status: 'loading' };
83
+ }
84
+
85
+ /**
86
+ * Whether `kind` is reported OFF by the kind-status table — the single proactive
87
+ * predicate a write affordance folds in to hide itself before a doomed write. It is
88
+ * `true` ONLY once the table is `ready` AND that kind's row carries `state: 'off'`;
89
+ * while the table is loading/failed, no provider is mounted, or the kind is unknown,
90
+ * it is `false` (treat as not-off until known — under-hiding is safe, the reactive
91
+ * 501 backstop still catches a genuinely-off feature).
92
+ */
93
+ export function useFeatureOff(kind: string): boolean {
94
+ const state = useSystemKinds();
95
+ if (state.status !== 'ready') return false;
96
+ return state.kinds.some((row) => row.kind === kind && row.state === 'off');
97
+ }
package/src/index.ts CHANGED
@@ -64,6 +64,8 @@ export {
64
64
  coversWrite,
65
65
  } from './hooks/useCapabilities';
66
66
  export type { CapabilityState, CapabilityContextValue } from './hooks/useCapabilities';
67
+ export { SystemKindsProvider, useSystemKinds, useFeatureOff } from './hooks/useSystemKinds';
68
+ export type { SystemKindsState } from './hooks/useSystemKinds';
67
69
  export { ThemeProvider, useTheme } from './hooks/useTheme';
68
70
  export type { Theme, ThemePreference, ThemeState } from './hooks/useTheme';
69
71
  export { useBreakpoint } from './hooks/useBreakpoint';
@@ -93,6 +95,10 @@ export type {
93
95
  export { errorMessage } from './errors';
94
96
  export { downloadBlob } from './download';
95
97
 
98
+ // -- Disabled-feature idiom (one helper + component, every consumer) ----------
99
+ export { isFeatureDisabled, FeatureDisabled } from './feature-disabled';
100
+ export type { FeatureDisabledProps } from './feature-disabled';
101
+
96
102
  // -- Cross-feature query keys ------------------------------------------------
97
103
  export { toolsListKey, extensionsQueryKey, subMcpKey, tokensPayloadKey } from './query-keys';
98
104