@cadraos/sdk 0.3.16-dev.0 → 0.3.16-dev.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.
@@ -831,16 +831,18 @@ interface ExecuteResponse {
831
831
  status: ExecutionStatus;
832
832
  }
833
833
  /**
834
- * Languages an agent message can be stored and rendered in.
834
+ * Language code an agent message is stored and rendered in (e.g. `en`,
835
+ * `pt-br`). Each agent sets its own language list; see
836
+ * `AgentMessageList.languages`. Was `'en' | 'es' | 'id'` before p13.
835
837
  */
836
- type AgentMessageLang = 'en' | 'es' | 'id';
838
+ type AgentMessageLang = string;
837
839
  /**
838
840
  * One saved agent message (e.g. `handoff.requested`), text per language.
839
841
  */
840
842
  interface AgentMessage {
841
843
  /** Lowercase dotted key, e.g. `chat.welcome` */
842
844
  key: string;
843
- /** Text per language; `en` is the fallback language */
845
+ /** Text per language code */
844
846
  text: Partial<Record<AgentMessageLang, string>>;
845
847
  /** `{word}` placeholder names found in any language */
846
848
  placeholders: string[];
@@ -855,12 +857,22 @@ interface AgentMessageList {
855
857
  messages: AgentMessage[];
856
858
  /** Every key the platform knows about, for pickers (saved or not) */
857
859
  knownKeys: string[];
860
+ /**
861
+ * The agent's message languages, in display order. Missing from older
862
+ * servers; fall back to the languages seen in `messages[].text`.
863
+ */
864
+ languages?: AgentMessageLang[];
865
+ /** The agent's default message language. Missing from older servers; treat as `en`. */
866
+ defaultLanguage?: AgentMessageLang;
858
867
  }
859
868
  /**
860
869
  * Options for `client.agents.messages.render()`
861
870
  */
862
871
  interface AgentMessageRenderOptions {
863
- /** Requested language; falls back to `en` server-side */
872
+ /**
873
+ * Requested language. Server falls back: exact, then base (`pt-br` to `pt`),
874
+ * then the agent's default language, then `en`, then the first non-empty text.
875
+ */
864
876
  lang?: AgentMessageLang;
865
877
  /** Values for `{word}` placeholders; unknown placeholders are left as-is */
866
878
  vars?: Record<string, string | number>;
@@ -870,7 +882,7 @@ interface AgentMessageRenderOptions {
870
882
  */
871
883
  interface AgentMessageRenderResult {
872
884
  key: string;
873
- /** The language actually rendered */
885
+ /** The language actually rendered (after fallback) */
874
886
  lang: AgentMessageLang;
875
887
  /** Filled text, or `null` when the agent has no message for this key */
876
888
  text: string | null;
@@ -2821,8 +2833,9 @@ interface StreamImagesResult {
2821
2833
  *
2822
2834
  * Read-only access to an agent's saved messages (welcome, handoff, fallback
2823
2835
  * copy, ...). Reached as `client.agents.messages`.
2824
- * - list(): the agent's saved messages + every known key
2825
- * - render(): one message filled with vars, in a language (falls back to en)
2836
+ * - list(): the agent's saved messages, every known key, the agent's languages
2837
+ * - render(): one message filled with vars, in a language (server falls back:
2838
+ * exact, base, agent default, en, first non-empty; `lang` says which was used)
2826
2839
  */
2827
2840
 
2828
2841
  declare class AgentMessagesAPI extends BaseResourceAPI {
@@ -2834,7 +2847,7 @@ declare class AgentMessagesAPI extends BaseResourceAPI {
2834
2847
  *
2835
2848
  * @example
2836
2849
  * ```typescript
2837
- * const { messages, knownKeys } = await client.agents.messages.list('agent-uuid');
2850
+ * const { messages, knownKeys, languages, defaultLanguage } = await client.agents.messages.list('agent-uuid');
2838
2851
  * ```
2839
2852
  */
2840
2853
  list(agentUuid: string): Promise<AgentMessageList>;
@@ -5282,6 +5295,8 @@ interface AgentMessagePickerLabels {
5282
5295
  notSet: string;
5283
5296
  useCustom: (key: string) => string;
5284
5297
  invalidCustom: string;
5298
+ /** Accessible label of the preview-language select */
5299
+ language: string;
5285
5300
  }
5286
5301
  interface AgentMessagePickerProps {
5287
5302
  client: AgentMessagePickerClient;
@@ -5291,12 +5306,14 @@ interface AgentMessagePickerProps {
5291
5306
  onChange: (key: string) => void;
5292
5307
  /** Let the user type a new dotted key */
5293
5308
  allowCustom?: boolean;
5294
- /** Preview language (falls back to en). Default: en */
5309
+ /** Starting preview language. Default: the agent's defaultLanguage, else en */
5295
5310
  lang?: AgentMessageLang;
5311
+ /** Called when the user picks another preview language */
5312
+ onLangChange?: (lang: AgentMessageLang) => void;
5296
5313
  labels?: Partial<AgentMessagePickerLabels>;
5297
5314
  className?: string;
5298
5315
  }
5299
- declare function AgentMessagePicker({ client, agentUuid, value, onChange, allowCustom, lang, labels: labelOverrides, className, }: AgentMessagePickerProps): react_jsx_runtime.JSX.Element;
5316
+ declare function AgentMessagePicker({ client, agentUuid, value, onChange, allowCustom, lang, onLangChange, labels: labelOverrides, className, }: AgentMessagePickerProps): react_jsx_runtime.JSX.Element;
5300
5317
 
5301
5318
  /**
5302
5319
  * Agent message keys (p13) — lowercase dotted, e.g. `chat.welcome`.
@@ -831,16 +831,18 @@ interface ExecuteResponse {
831
831
  status: ExecutionStatus;
832
832
  }
833
833
  /**
834
- * Languages an agent message can be stored and rendered in.
834
+ * Language code an agent message is stored and rendered in (e.g. `en`,
835
+ * `pt-br`). Each agent sets its own language list; see
836
+ * `AgentMessageList.languages`. Was `'en' | 'es' | 'id'` before p13.
835
837
  */
836
- type AgentMessageLang = 'en' | 'es' | 'id';
838
+ type AgentMessageLang = string;
837
839
  /**
838
840
  * One saved agent message (e.g. `handoff.requested`), text per language.
839
841
  */
840
842
  interface AgentMessage {
841
843
  /** Lowercase dotted key, e.g. `chat.welcome` */
842
844
  key: string;
843
- /** Text per language; `en` is the fallback language */
845
+ /** Text per language code */
844
846
  text: Partial<Record<AgentMessageLang, string>>;
845
847
  /** `{word}` placeholder names found in any language */
846
848
  placeholders: string[];
@@ -855,12 +857,22 @@ interface AgentMessageList {
855
857
  messages: AgentMessage[];
856
858
  /** Every key the platform knows about, for pickers (saved or not) */
857
859
  knownKeys: string[];
860
+ /**
861
+ * The agent's message languages, in display order. Missing from older
862
+ * servers; fall back to the languages seen in `messages[].text`.
863
+ */
864
+ languages?: AgentMessageLang[];
865
+ /** The agent's default message language. Missing from older servers; treat as `en`. */
866
+ defaultLanguage?: AgentMessageLang;
858
867
  }
859
868
  /**
860
869
  * Options for `client.agents.messages.render()`
861
870
  */
862
871
  interface AgentMessageRenderOptions {
863
- /** Requested language; falls back to `en` server-side */
872
+ /**
873
+ * Requested language. Server falls back: exact, then base (`pt-br` to `pt`),
874
+ * then the agent's default language, then `en`, then the first non-empty text.
875
+ */
864
876
  lang?: AgentMessageLang;
865
877
  /** Values for `{word}` placeholders; unknown placeholders are left as-is */
866
878
  vars?: Record<string, string | number>;
@@ -870,7 +882,7 @@ interface AgentMessageRenderOptions {
870
882
  */
871
883
  interface AgentMessageRenderResult {
872
884
  key: string;
873
- /** The language actually rendered */
885
+ /** The language actually rendered (after fallback) */
874
886
  lang: AgentMessageLang;
875
887
  /** Filled text, or `null` when the agent has no message for this key */
876
888
  text: string | null;
@@ -2821,8 +2833,9 @@ interface StreamImagesResult {
2821
2833
  *
2822
2834
  * Read-only access to an agent's saved messages (welcome, handoff, fallback
2823
2835
  * copy, ...). Reached as `client.agents.messages`.
2824
- * - list(): the agent's saved messages + every known key
2825
- * - render(): one message filled with vars, in a language (falls back to en)
2836
+ * - list(): the agent's saved messages, every known key, the agent's languages
2837
+ * - render(): one message filled with vars, in a language (server falls back:
2838
+ * exact, base, agent default, en, first non-empty; `lang` says which was used)
2826
2839
  */
2827
2840
 
2828
2841
  declare class AgentMessagesAPI extends BaseResourceAPI {
@@ -2834,7 +2847,7 @@ declare class AgentMessagesAPI extends BaseResourceAPI {
2834
2847
  *
2835
2848
  * @example
2836
2849
  * ```typescript
2837
- * const { messages, knownKeys } = await client.agents.messages.list('agent-uuid');
2850
+ * const { messages, knownKeys, languages, defaultLanguage } = await client.agents.messages.list('agent-uuid');
2838
2851
  * ```
2839
2852
  */
2840
2853
  list(agentUuid: string): Promise<AgentMessageList>;
@@ -5282,6 +5295,8 @@ interface AgentMessagePickerLabels {
5282
5295
  notSet: string;
5283
5296
  useCustom: (key: string) => string;
5284
5297
  invalidCustom: string;
5298
+ /** Accessible label of the preview-language select */
5299
+ language: string;
5285
5300
  }
5286
5301
  interface AgentMessagePickerProps {
5287
5302
  client: AgentMessagePickerClient;
@@ -5291,12 +5306,14 @@ interface AgentMessagePickerProps {
5291
5306
  onChange: (key: string) => void;
5292
5307
  /** Let the user type a new dotted key */
5293
5308
  allowCustom?: boolean;
5294
- /** Preview language (falls back to en). Default: en */
5309
+ /** Starting preview language. Default: the agent's defaultLanguage, else en */
5295
5310
  lang?: AgentMessageLang;
5311
+ /** Called when the user picks another preview language */
5312
+ onLangChange?: (lang: AgentMessageLang) => void;
5296
5313
  labels?: Partial<AgentMessagePickerLabels>;
5297
5314
  className?: string;
5298
5315
  }
5299
- declare function AgentMessagePicker({ client, agentUuid, value, onChange, allowCustom, lang, labels: labelOverrides, className, }: AgentMessagePickerProps): react_jsx_runtime.JSX.Element;
5316
+ declare function AgentMessagePicker({ client, agentUuid, value, onChange, allowCustom, lang, onLangChange, labels: labelOverrides, className, }: AgentMessagePickerProps): react_jsx_runtime.JSX.Element;
5300
5317
 
5301
5318
  /**
5302
5319
  * Agent message keys (p13) — lowercase dotted, e.g. `chat.welcome`.
@@ -1841,7 +1841,7 @@ var AgentMessagesAPI = class extends BaseResourceAPI {
1841
1841
  *
1842
1842
  * @example
1843
1843
  * ```typescript
1844
- * const { messages, knownKeys } = await client.agents.messages.list('agent-uuid');
1844
+ * const { messages, knownKeys, languages, defaultLanguage } = await client.agents.messages.list('agent-uuid');
1845
1845
  * ```
1846
1846
  */
1847
1847
  async list(agentUuid) {
@@ -9666,10 +9666,24 @@ var DEFAULT_LABELS = {
9666
9666
  empty: "No matching messages",
9667
9667
  notSet: "not set",
9668
9668
  useCustom: (key) => `Use "${key}"`,
9669
- invalidCustom: "Keys are lowercase and dotted, like chat.welcome"
9669
+ invalidCustom: "Keys are lowercase and dotted, like chat.welcome",
9670
+ language: "Preview language"
9670
9671
  };
9671
- function previewOf(message, lang) {
9672
- return message.text[lang] ?? message.text.en ?? Object.values(message.text).find(Boolean) ?? null;
9672
+ function previewOf(message, lang, defaultLanguage = "en") {
9673
+ const base = lang.split("-")[0] ?? lang;
9674
+ for (const candidate of [lang, base, defaultLanguage, "en"]) {
9675
+ const text = message.text[candidate];
9676
+ if (text) return text;
9677
+ }
9678
+ return Object.values(message.text).find((t) => Boolean(t)) ?? null;
9679
+ }
9680
+ function languagesOf(list) {
9681
+ if (list.languages && list.languages.length > 0) return list.languages;
9682
+ const seen = /* @__PURE__ */ new Set([list.defaultLanguage ?? "en"]);
9683
+ for (const m of list.messages) {
9684
+ for (const [code, text] of Object.entries(m.text)) if (text) seen.add(code);
9685
+ }
9686
+ return [...seen];
9673
9687
  }
9674
9688
  function AgentMessagePicker({
9675
9689
  client,
@@ -9677,7 +9691,8 @@ function AgentMessagePicker({
9677
9691
  value,
9678
9692
  onChange,
9679
9693
  allowCustom = false,
9680
- lang = "en",
9694
+ lang,
9695
+ onLangChange,
9681
9696
  labels: labelOverrides,
9682
9697
  className = ""
9683
9698
  }) {
@@ -9685,6 +9700,13 @@ function AgentMessagePicker({
9685
9700
  const [data, setData] = useState(null);
9686
9701
  const [error, setError] = useState(false);
9687
9702
  const [query, setQuery] = useState("");
9703
+ const [pickedLang, setPickedLang] = useState(null);
9704
+ useEffect(() => {
9705
+ setPickedLang(null);
9706
+ }, [lang, agentUuid]);
9707
+ const defaultLanguage = data?.defaultLanguage ?? "en";
9708
+ const languages = useMemo(() => data ? languagesOf(data) : [], [data]);
9709
+ const activeLang = pickedLang ?? lang ?? defaultLanguage;
9688
9710
  useEffect(() => {
9689
9711
  let cancelled = false;
9690
9712
  setData(null);
@@ -9700,11 +9722,14 @@ function AgentMessagePicker({
9700
9722
  }, [client, agentUuid]);
9701
9723
  const items = useMemo(() => {
9702
9724
  if (!data) return [];
9703
- const saved = data.messages.map((m) => ({ key: m.key, preview: previewOf(m, lang) }));
9725
+ const saved = data.messages.map((m) => ({
9726
+ key: m.key,
9727
+ preview: previewOf(m, activeLang, defaultLanguage)
9728
+ }));
9704
9729
  const savedKeys = new Set(saved.map((i) => i.key));
9705
9730
  const unsaved = data.knownKeys.filter((k) => !savedKeys.has(k)).sort().map((key) => ({ key, preview: null }));
9706
9731
  return [...saved, ...unsaved];
9707
- }, [data, lang]);
9732
+ }, [data, activeLang, defaultLanguage]);
9708
9733
  const needle = query.trim().toLowerCase();
9709
9734
  const visible = needle ? items.filter(
9710
9735
  (i) => i.key.includes(needle) || (i.preview?.toLowerCase().includes(needle) ?? false)
@@ -9712,18 +9737,34 @@ function AgentMessagePicker({
9712
9737
  const custom = query.trim();
9713
9738
  const showCustom = allowCustom && custom.length > 0 && !items.some((i) => i.key === custom);
9714
9739
  const customValid = showCustom && isValidMessageKey(custom);
9740
+ const languageChoices = languages.includes(activeLang) ? languages : [...languages, activeLang];
9715
9741
  return /* @__PURE__ */ jsxs("div", { className: `flex flex-col gap-2 text-sm ${className}`, children: [
9716
- /* @__PURE__ */ jsx(
9717
- "input",
9718
- {
9719
- type: "search",
9720
- value: query,
9721
- onChange: (e) => setQuery(e.target.value),
9722
- placeholder: labels.search,
9723
- "aria-label": labels.search,
9724
- className: "w-full rounded-lg bg-gray-100 dark:bg-gray-800 px-3 py-2 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"
9725
- }
9726
- ),
9742
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
9743
+ /* @__PURE__ */ jsx(
9744
+ "input",
9745
+ {
9746
+ type: "search",
9747
+ value: query,
9748
+ onChange: (e) => setQuery(e.target.value),
9749
+ placeholder: labels.search,
9750
+ "aria-label": labels.search,
9751
+ className: "w-full min-w-0 flex-1 rounded-lg bg-gray-100 dark:bg-gray-800 px-3 py-2 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"
9752
+ }
9753
+ ),
9754
+ data && languages.length > 1 && /* @__PURE__ */ jsx(
9755
+ "select",
9756
+ {
9757
+ value: activeLang,
9758
+ onChange: (e) => {
9759
+ setPickedLang(e.target.value);
9760
+ onLangChange?.(e.target.value);
9761
+ },
9762
+ "aria-label": labels.language,
9763
+ className: "rounded-lg bg-gray-100 dark:bg-gray-800 px-2 py-2 font-mono text-xs text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500",
9764
+ children: languageChoices.map((code) => /* @__PURE__ */ jsx("option", { value: code, children: code }, code))
9765
+ }
9766
+ )
9767
+ ] }),
9727
9768
  error ? /* @__PURE__ */ jsx("p", { role: "alert", className: "px-1 text-red-500", children: labels.loadError }) : !data ? /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2 px-1 text-gray-500 dark:text-gray-400", children: [
9728
9769
  /* @__PURE__ */ jsx(LoadingSpinner, { className: "h-4 w-4" }),
9729
9770
  labels.loading