@jini-ai/ui 0.6.15 → 0.6.17

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 (50) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/core.d.ts +1 -1
  3. package/dist/core.js +1 -1
  4. package/dist/features/appearance/constants.d.ts +28 -1
  5. package/dist/features/appearance/constants.js +12 -9
  6. package/dist/features/appearance/react/components/AppearanceTab.js +4 -4
  7. package/dist/features/charts/contract.d.ts +4 -4
  8. package/dist/features/charts/react.js +2 -2
  9. package/dist/features/charts/wire.d.ts +19 -0
  10. package/dist/features/charts/wire.js +20 -2
  11. package/dist/features/execution/constants.js +0 -1
  12. package/dist/features/folder-path-drop/rules.d.ts +2 -3
  13. package/dist/features/folder-path-drop/rules.js +3 -4
  14. package/dist/features/i18n/dictionaries/settings-dialog.ar.js +11 -0
  15. package/dist/features/i18n/dictionaries/settings-dialog.bn.js +11 -0
  16. package/dist/features/i18n/dictionaries/settings-dialog.de.js +11 -0
  17. package/dist/features/i18n/dictionaries/settings-dialog.en.js +11 -0
  18. package/dist/features/i18n/dictionaries/settings-dialog.es.js +11 -0
  19. package/dist/features/i18n/dictionaries/settings-dialog.fa.js +11 -0
  20. package/dist/features/i18n/dictionaries/settings-dialog.fr.js +11 -0
  21. package/dist/features/i18n/dictionaries/settings-dialog.hi.js +11 -0
  22. package/dist/features/i18n/dictionaries/settings-dialog.hu.js +11 -0
  23. package/dist/features/i18n/dictionaries/settings-dialog.id.js +11 -0
  24. package/dist/features/i18n/dictionaries/settings-dialog.it.js +11 -0
  25. package/dist/features/i18n/dictionaries/settings-dialog.ja.js +11 -0
  26. package/dist/features/i18n/dictionaries/settings-dialog.ko.js +11 -0
  27. package/dist/features/i18n/dictionaries/settings-dialog.pl.js +11 -0
  28. package/dist/features/i18n/dictionaries/settings-dialog.pt-BR.js +11 -0
  29. package/dist/features/i18n/dictionaries/settings-dialog.ru.js +11 -0
  30. package/dist/features/i18n/dictionaries/settings-dialog.th.js +11 -0
  31. package/dist/features/i18n/dictionaries/settings-dialog.tr.js +11 -0
  32. package/dist/features/i18n/dictionaries/settings-dialog.uk.js +11 -0
  33. package/dist/features/i18n/dictionaries/settings-dialog.ur.js +11 -0
  34. package/dist/features/i18n/dictionaries/settings-dialog.zh-CN.js +11 -0
  35. package/dist/features/i18n/dictionaries/settings-dialog.zh-TW.js +11 -0
  36. package/dist/features/mcp-ui/surfaces/checkbox.d.ts +2 -0
  37. package/dist/features/mcp-ui/surfaces/choice-group.d.ts +2 -0
  38. package/dist/features/mcp-ui/surfaces/choice-group.js +2 -2
  39. package/dist/features/mcp-ui/surfaces/document.d.ts +11 -1
  40. package/dist/features/mcp-ui/surfaces/document.js +9 -1
  41. package/dist/features/mcp-ui/surfaces/fields.d.ts +7 -1
  42. package/dist/features/mcp-ui/surfaces/fields.js +12 -11
  43. package/dist/features/mcp-ui/surfaces/form.js +6 -1
  44. package/dist/features/mcp-ui/surfaces/select.d.ts +2 -0
  45. package/dist/features/mcp-ui/surfaces/text-input.d.ts +2 -0
  46. package/dist/features/mcp-ui/surfaces/tool-approval.js +4 -3
  47. package/dist/react/components/AgentIcon.js +0 -1
  48. package/dist/react/components/agent-icon-data-uris.generated.js +0 -1
  49. package/dist/renderers/shiki.js +7 -1
  50. package/package.json +32 -30
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @jini-ai/ui
2
2
 
3
+ ## 0.6.17
4
+
5
+ ### Patch Changes
6
+
7
+ - Add localized folder-chip strings.
8
+ - Handle npm 12 pack JSON through the shared parser in publication-hygiene tests.
9
+
10
+ ## 0.6.16
11
+
12
+ ### Minor Changes
13
+
14
+ - Remove the GitHub Copilot CLI agent: its def, `createCopilotStreamHandler`/`CopilotStreamEvent`,
15
+ account model discovery and the `@github/copilot-sdk` optional peer, the MCP installer's `copilot`
16
+ slug, and its icon. A saved `copilot` agent id no longer resolves (`getAgentDef` returns `null`).
17
+ CopilotKit/AG-UI is unrelated and unchanged.
18
+
19
+ Drop peers no runtime entry loads: `express` from core and http-kit (type-only imports; type
20
+ consumers keep `@types/express`), `vue` from ui-kit, `react-dom` from vibecoding.
21
+
3
22
  ## 0.6.13
4
23
 
5
24
  ### Patch Changes
package/dist/core.d.ts CHANGED
@@ -9,7 +9,7 @@ export { DEFAULT_FAILURE_SOUND_ID, DEFAULT_SUCCESS_SOUND_ID, FAILURE_SOUNDS, SUC
9
9
  export type { AboutUpdateControl, AboutUpdatePrimaryAction, AboutUpdateTone, AppVersionInfo, SilentUpdatesState, UpdateKind, UpdaterDownloadProgress, UpdaterEnvironment, UpdaterModel, UpdaterState, UpdaterStatus, } from './features/about/types.js';
10
10
  export { ABOUT_UPDATE_KEYS, beginSilentUpdatesWrite, deriveAboutUpdateControl, isAboutUpdateActionDisabled, resolveSilentUpdatesWriteFailure, resolveSilentUpdatesWriteSuccess, } from './features/about/rules.js';
11
11
  export type { SettingsThemeChoice } from './features/appearance/types.js';
12
- export { THEME_OPTIONS, DEFAULT_ACCENT_COLOR, ACCENT_SWATCHES } from './features/appearance/constants.js';
12
+ export { THEME_OPTIONS, DEFAULT_ACCENT_COLOR, ACCENT_SWATCHES, ACCENT_SWATCH_PRESETS } from './features/appearance/constants.js';
13
13
  export type { ThemeOption } from './features/appearance/constants.js';
14
14
  export { normalizeAccentColor, resolveAccentColor, accentVars } from './features/appearance/rules.js';
15
15
  export type { AccentCssVars } from './features/appearance/rules.js';
package/dist/core.js CHANGED
@@ -17,7 +17,7 @@ export { randomUUID } from './utils/uuid.js';
17
17
  export { isAllowedEndpointUrl, isBlockedEndpointHost, isLoopbackEndpointHost, } from './utils/endpoint-policy.js';
18
18
  export { DEFAULT_FAILURE_SOUND_ID, DEFAULT_SUCCESS_SOUND_ID, FAILURE_SOUNDS, SUCCESS_SOUNDS, } from './features/notifications/notifications-catalog.js';
19
19
  export { ABOUT_UPDATE_KEYS, beginSilentUpdatesWrite, deriveAboutUpdateControl, isAboutUpdateActionDisabled, resolveSilentUpdatesWriteFailure, resolveSilentUpdatesWriteSuccess, } from './features/about/rules.js';
20
- export { THEME_OPTIONS, DEFAULT_ACCENT_COLOR, ACCENT_SWATCHES } from './features/appearance/constants.js';
20
+ export { THEME_OPTIONS, DEFAULT_ACCENT_COLOR, ACCENT_SWATCHES, ACCENT_SWATCH_PRESETS } from './features/appearance/constants.js';
21
21
  export { normalizeAccentColor, resolveAccentColor, accentVars } from './features/appearance/rules.js';
22
22
  // --- connectors ---
23
23
  // Full surface of the connectors domain logic. `export *` rather than a hand-listed set,
@@ -12,5 +12,32 @@ export declare const THEME_OPTIONS: ThemeOption[];
12
12
  /** Neutral default accent — hosts are expected to override via their own
13
13
  * config/branding; this only guarantees the CSS vars are always set. */
14
14
  export declare const DEFAULT_ACCENT_COLOR: string;
15
- export declare const ACCENT_SWATCHES: readonly [string, "#c96442", "#7c3aed", "#059669", "#dc2626", "#d97706", "#0891b2", "#db2777"];
15
+ /** One owner for each preset's color and English translation key. Hosts supply translations. */
16
+ export declare const ACCENT_SWATCH_PRESETS: readonly [{
17
+ readonly color: string;
18
+ readonly nameKey: "Charcoal";
19
+ }, {
20
+ readonly color: "#c96442";
21
+ readonly nameKey: "Clay";
22
+ }, {
23
+ readonly color: "#7c3aed";
24
+ readonly nameKey: "Violet";
25
+ }, {
26
+ readonly color: "#059669";
27
+ readonly nameKey: "Green";
28
+ }, {
29
+ readonly color: "#dc2626";
30
+ readonly nameKey: "Red";
31
+ }, {
32
+ readonly color: "#d97706";
33
+ readonly nameKey: "Amber";
34
+ }, {
35
+ readonly color: "#0891b2";
36
+ readonly nameKey: "Teal";
37
+ }, {
38
+ readonly color: "#db2777";
39
+ readonly nameKey: "Pink";
40
+ }];
41
+ /** Keep the existing string palette API for hosts that compose their own swatch lists. */
42
+ export declare const ACCENT_SWATCHES: readonly string[];
16
43
  //# sourceMappingURL=constants.d.ts.map
@@ -11,14 +11,17 @@ export const THEME_OPTIONS = [
11
11
  /** Neutral default accent — hosts are expected to override via their own
12
12
  * config/branding; this only guarantees the CSS vars are always set. */
13
13
  export const DEFAULT_ACCENT_COLOR = defaultAdminTheme.light.primary;
14
- export const ACCENT_SWATCHES = [
15
- DEFAULT_ACCENT_COLOR,
16
- '#c96442',
17
- '#7c3aed',
18
- '#059669',
19
- '#dc2626',
20
- '#d97706',
21
- '#0891b2',
22
- '#db2777',
14
+ /** One owner for each preset's color and English translation key. Hosts supply translations. */
15
+ export const ACCENT_SWATCH_PRESETS = [
16
+ { color: DEFAULT_ACCENT_COLOR, nameKey: 'Charcoal' },
17
+ { color: '#c96442', nameKey: 'Clay' },
18
+ { color: '#7c3aed', nameKey: 'Violet' },
19
+ { color: '#059669', nameKey: 'Green' },
20
+ { color: '#dc2626', nameKey: 'Red' },
21
+ { color: '#d97706', nameKey: 'Amber' },
22
+ { color: '#0891b2', nameKey: 'Teal' },
23
+ { color: '#db2777', nameKey: 'Pink' },
23
24
  ];
25
+ /** Keep the existing string palette API for hosts that compose their own swatch lists. */
26
+ export const ACCENT_SWATCHES = ACCENT_SWATCH_PRESETS.map(({ color }) => color);
24
27
  //# sourceMappingURL=constants.js.map
@@ -4,7 +4,7 @@ import { agentHandleProps, agentSubHandle, buildAgentListHandles } from '@jini-a
4
4
  import { useT } from '../../../i18n/index.js';
5
5
  import { Icon } from '../../../../react/components/Icon.js';
6
6
  import { ACCENT_SWATCHES, DEFAULT_ACCENT_COLOR, applyAppearanceToDocument, normalizeAccentColor, resolveAccentColor, } from '../../../../utils/appearance.js';
7
- import { THEME_OPTIONS } from '../../constants.js';
7
+ import { ACCENT_SWATCH_PRESETS, THEME_OPTIONS } from '../../constants.js';
8
8
  /**
9
9
  * Theme (system/light/dark) segmented control + accent-color swatch grid
10
10
  * with a custom color picker. Origin: `AppearanceSection` in
@@ -17,7 +17,6 @@ export function AppearanceTab({ theme, onThemeChange, accentColor, onAccentColor
17
17
  const swatchHandles = agentHandle ? buildAgentListHandles({ prefix: agentSubHandle({ base: agentHandle, action: 'swatch' }), ids: accentSwatches }) : undefined;
18
18
  const resolvedAriaLabel = ariaLabel ?? t('Appearance');
19
19
  const resolvedAccentLabel = accentLabel ?? t('Accent color');
20
- const resolvedDefaultAccentAriaLabel = defaultAccentAriaLabel ?? t('Default accent color');
21
20
  const resolvedCustomAccentAriaLabel = customAccentAriaLabel ?? t('Custom accent color');
22
21
  const appliedTheme = theme === 'system' ? undefined : theme;
23
22
  useLayoutEffect(() => {
@@ -27,8 +26,9 @@ export function AppearanceTab({ theme, onThemeChange, accentColor, onAccentColor
27
26
  }, [livePreview, appliedTheme, resolvedAccent]);
28
27
  return (_jsxs("section", { className: "jini-settings-section jini-settings-appearance", children: [_jsx("div", { className: "jini-seg-control", role: "group", "aria-label": resolvedAriaLabel, style: { '--seg-cols': THEME_OPTIONS.length }, children: THEME_OPTIONS.map((option) => (_jsxs("button", { type: "button", className: 'jini-seg-btn' + (theme === option.value ? ' active' : ''), "aria-pressed": theme === option.value, onClick: () => onThemeChange(option.value), ...agentHandleProps({}, { base: agentHandle, ...({ action: `theme-${option.value}`, role: 'button', label: t(option.label) }) }), children: [option.icon ? _jsx(Icon, { name: option.icon, size: 14, "aria-hidden": "true" }) : null, _jsx("span", { className: "jini-seg-title", children: t(option.label) })] }, option.value))) }), _jsxs("div", { className: "jini-field", children: [_jsx("span", { className: "jini-field-label", children: resolvedAccentLabel }), _jsxs("div", { className: "jini-accent-swatches", role: "radiogroup", "aria-label": resolvedAccentLabel, children: [accentSwatches.map((color, index) => {
29
28
  const active = resolvedAccent === color;
30
- const swatchLabel = color === DEFAULT_ACCENT_COLOR ? resolvedDefaultAccentAriaLabel : color;
31
- return (_jsx("button", { type: "button", className: `jini-accent-swatch${active ? ' active' : ''}`, style: { background: color }, "aria-label": swatchLabel, "aria-checked": active, role: "radio", onClick: () => onAccentColorChange(normalizeAccentColor({ value: color }) ?? color), ...agentHandleProps({}, { base: swatchHandles?.[index], ...({ role: 'button', label: swatchLabel }) }) }, color));
29
+ const nameKey = ACCENT_SWATCH_PRESETS.find((swatch) => swatch.color === color.toLowerCase())?.nameKey ?? color;
30
+ const swatchLabel = color === DEFAULT_ACCENT_COLOR && defaultAccentAriaLabel !== undefined ? defaultAccentAriaLabel : t(nameKey);
31
+ return (_jsx("button", { type: "button", className: `jini-accent-swatch${active ? ' active' : ''}`, style: { background: color }, "aria-label": swatchLabel, title: color, "aria-checked": active, role: "radio", onClick: () => onAccentColorChange(normalizeAccentColor({ value: color }) ?? color), ...agentHandleProps({}, { base: swatchHandles?.[index], ...({ role: 'button', label: swatchLabel }) }) }, color));
32
32
  }), _jsx("input", { type: "color", "aria-label": resolvedCustomAccentAriaLabel, className: "jini-accent-swatch-picker", value: resolvedAccent, onChange: (event) => onAccentColorChange(event.target.value), ...agentHandleProps({}, { base: agentHandle, ...({ action: 'custom-accent', role: 'field', label: resolvedCustomAccentAriaLabel }) }) })] })] })] }));
33
33
  }
34
34
  //# sourceMappingURL=AppearanceTab.js.map
@@ -15,12 +15,12 @@ export declare const chartSpecSchema: z.ZodObject<{
15
15
  color: z.ZodOptional<z.ZodString>;
16
16
  }, "strict", z.ZodTypeAny, {
17
17
  key: string;
18
- label?: string | undefined;
19
18
  color?: string | undefined;
19
+ label?: string | undefined;
20
20
  }, {
21
21
  key: string;
22
- label?: string | undefined;
23
22
  color?: string | undefined;
23
+ label?: string | undefined;
24
24
  }>, "many">;
25
25
  title: z.ZodOptional<z.ZodString>;
26
26
  description: z.ZodOptional<z.ZodString>;
@@ -122,8 +122,8 @@ export declare const chartSpecSchema: z.ZodObject<{
122
122
  data: Record<string, ChartValue>[];
123
123
  series: {
124
124
  key: string;
125
- label?: string | undefined;
126
125
  color?: string | undefined;
126
+ label?: string | undefined;
127
127
  }[];
128
128
  title?: string | undefined;
129
129
  provider?: string | undefined;
@@ -154,8 +154,8 @@ export declare const chartSpecSchema: z.ZodObject<{
154
154
  data: Record<string, ChartValue>[];
155
155
  series: {
156
156
  key: string;
157
- label?: string | undefined;
158
157
  color?: string | undefined;
158
+ label?: string | undefined;
159
159
  }[];
160
160
  title?: string | undefined;
161
161
  provider?: string | undefined;
@@ -6,7 +6,7 @@ import { InteractiveUiRegistry } from '../interactive-ui/registry.js';
6
6
  import { chartSpecSchema, DEFAULT_CHART_THEME } from './contract.js';
7
7
  import { mountChart } from './browser.js';
8
8
  import { chartCapability, chartProvidersByKind } from './registry.js';
9
- import { chartWireManifests, legacyChartSpec } from './wire.js';
9
+ import { chartWireManifests, legacyChartSpec, withSeriesLabels } from './wire.js';
10
10
  /** React owns only the container; mountChart owns its descendants and lifecycle. */
11
11
  export function ChartHost({ spec, registry, theme = DEFAULT_CHART_THEME, siteProvider, onProviderError }) {
12
12
  const element = useRef(null);
@@ -39,7 +39,7 @@ const LEGACY_CHART_KINDS = ['bar', 'line', 'pie'];
39
39
  function chartComponent(kind, providers, options) {
40
40
  return function RegisteredChart(props) {
41
41
  const legacyKind = LEGACY_CHART_KINDS.find((legacy) => legacy === kind);
42
- const spec = legacyKind ? legacyChartSpec({ kind: legacyKind, props }) : chartSpecSchema.parse(props.spec);
42
+ const spec = withSeriesLabels({ spec: legacyKind ? legacyChartSpec({ kind: legacyKind, props }) : chartSpecSchema.parse(props.spec) });
43
43
  return _jsx(ChartHost, { spec: spec, registry: providers, ...options });
44
44
  };
45
45
  }
@@ -8,32 +8,44 @@ export declare const rechartsBarChartPropsSchema: z.ZodObject<{
8
8
  data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
9
9
  categoryKey: z.ZodString;
10
10
  valueKey: z.ZodString;
11
+ /** The legend/tooltip name for `valueKey` ("Sign-ups"); omitted, the key is humanized. */
12
+ valueLabel: z.ZodOptional<z.ZodString>;
11
13
  color: z.ZodOptional<z.ZodString>;
12
14
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
13
15
  data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
14
16
  categoryKey: z.ZodString;
15
17
  valueKey: z.ZodString;
18
+ /** The legend/tooltip name for `valueKey` ("Sign-ups"); omitted, the key is humanized. */
19
+ valueLabel: z.ZodOptional<z.ZodString>;
16
20
  color: z.ZodOptional<z.ZodString>;
17
21
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
18
22
  data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
19
23
  categoryKey: z.ZodString;
20
24
  valueKey: z.ZodString;
25
+ /** The legend/tooltip name for `valueKey` ("Sign-ups"); omitted, the key is humanized. */
26
+ valueLabel: z.ZodOptional<z.ZodString>;
21
27
  color: z.ZodOptional<z.ZodString>;
22
28
  }, z.ZodTypeAny, "passthrough">>;
23
29
  export declare const rechartsLineChartPropsSchema: z.ZodObject<{
24
30
  data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
25
31
  categoryKey: z.ZodString;
26
32
  valueKey: z.ZodString;
33
+ /** The legend/tooltip name for `valueKey` ("Sign-ups"); omitted, the key is humanized. */
34
+ valueLabel: z.ZodOptional<z.ZodString>;
27
35
  color: z.ZodOptional<z.ZodString>;
28
36
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
29
37
  data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
30
38
  categoryKey: z.ZodString;
31
39
  valueKey: z.ZodString;
40
+ /** The legend/tooltip name for `valueKey` ("Sign-ups"); omitted, the key is humanized. */
41
+ valueLabel: z.ZodOptional<z.ZodString>;
32
42
  color: z.ZodOptional<z.ZodString>;
33
43
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
34
44
  data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
35
45
  categoryKey: z.ZodString;
36
46
  valueKey: z.ZodString;
47
+ /** The legend/tooltip name for `valueKey` ("Sign-ups"); omitted, the key is humanized. */
48
+ valueLabel: z.ZodOptional<z.ZodString>;
37
49
  color: z.ZodOptional<z.ZodString>;
38
50
  }, z.ZodTypeAny, "passthrough">>;
39
51
  export declare const rechartsPieChartPropsSchema: z.ZodObject<{
@@ -85,4 +97,11 @@ export declare function legacyChartSpec({ kind, props }: {
85
97
  kind: 'bar' | 'line' | 'pie';
86
98
  props: Record<string, unknown>;
87
99
  }, _options?: Record<string, never>): ChartSpec;
100
+ /**
101
+ * Give every series a label, so a provider's legend and tooltip never show a raw data key
102
+ * (owner, 2026-10-30: a sign-ups chart's legend read "signups"). A label the caller passed wins.
103
+ */
104
+ export declare function withSeriesLabels({ spec }: {
105
+ spec: ChartSpec;
106
+ }, _options?: Record<string, never>): ChartSpec;
88
107
  //# sourceMappingURL=wire.d.ts.map
@@ -4,7 +4,9 @@ import { chartSpecSchema } from './contract.js';
4
4
  /** Same passthrough/record reasoning as native data-table: A2UI action bindings and extra row data
5
5
  * belong to the wire protocol, not a renderer. Retain their established shapes during extraction. */
6
6
  export const rechartsBarChartPropsSchema = z.object({
7
- data: z.array(z.record(z.unknown())).min(1), categoryKey: z.string(), valueKey: z.string(), color: z.string().optional(),
7
+ data: z.array(z.record(z.unknown())).min(1), categoryKey: z.string(), valueKey: z.string(),
8
+ /** The legend/tooltip name for `valueKey` ("Sign-ups"); omitted, the key is humanized. */
9
+ valueLabel: z.string().min(1).optional().describe('Human name for valueKey shown in the legend and tooltip, e.g. "Sign-ups". Defaults to the humanized key.'), color: z.string().optional(),
8
10
  }).passthrough();
9
11
  export const rechartsLineChartPropsSchema = rechartsBarChartPropsSchema;
10
12
  export const rechartsPieChartPropsSchema = z.object({
@@ -31,8 +33,24 @@ export function legacyChartSpec({ kind, props }, _options = {}) {
31
33
  const parsed = (kind === 'pie' ? rechartsPieChartPropsSchema : rechartsBarChartPropsSchema).parse(props);
32
34
  return chartSpecSchema.parse({
33
35
  kind, data: parsed.data, categoryKey: kind === 'pie' ? 'name' : parsed.categoryKey,
34
- series: [{ key: kind === 'pie' ? 'value' : parsed.valueKey, ...(parsed.color !== undefined ? { color: parsed.color } : {}) }],
36
+ series: [{
37
+ key: kind === 'pie' ? 'value' : parsed.valueKey,
38
+ ...('valueLabel' in parsed && typeof parsed.valueLabel === 'string' ? { label: parsed.valueLabel } : {}),
39
+ ...(parsed.color !== undefined ? { color: parsed.color } : {}),
40
+ }],
35
41
  ...(typeof parsed.provider === 'string' ? { provider: parsed.provider } : {}),
36
42
  });
37
43
  }
44
+ /** `signups` -> `Signups`, `sign_ups`/`signUps` -> `Sign ups`. Display only; the key still addresses the data. */
45
+ function humanizeSeriesKey(key) {
46
+ const words = key.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[_-]+/g, ' ').trim().toLowerCase();
47
+ return words ? words[0].toUpperCase() + words.slice(1) : key;
48
+ }
49
+ /**
50
+ * Give every series a label, so a provider's legend and tooltip never show a raw data key
51
+ * (owner, 2026-10-30: a sign-ups chart's legend read "signups"). A label the caller passed wins.
52
+ */
53
+ export function withSeriesLabels({ spec }, _options = {}) {
54
+ return { ...spec, series: spec.series.map((series) => ({ ...series, label: series.label ?? humanizeSeriesKey(series.key) })) };
55
+ }
38
56
  //# sourceMappingURL=wire.js.map
@@ -70,7 +70,6 @@ export const DEFAULT_AGENT_DESCRIPTIONS = {
70
70
  'cursor-agent': 'Cursor command line',
71
71
  opencode: 'Open-source agent CLI',
72
72
  qwen: 'Qwen coding CLI',
73
- copilot: 'GitHub coding CLI',
74
73
  devin: 'Cognition terminal CLI',
75
74
  kimi: 'Moonshot Kimi CLI',
76
75
  qoder: 'Alibaba coding CLI',
@@ -24,9 +24,8 @@ import type { CaptureFolderPathDropInput } from './types.js';
24
24
  */
25
25
  export declare function folderPathsFromDataTransfer(dataTransfer: DataTransfer, port: FolderPathDropPort): string[];
26
26
  /**
27
- * The text a folder drop inserts: every path, space-joined, in drop order. The one place the format
28
- * lives — a path that itself contains a space is ambiguous in this format, so any change to quoting
29
- * or separators belongs here and nowhere else.
27
+ * The text a folder drop inserts: every path, space-joined, in drop order. Quote whitespace-containing
28
+ * paths so text consumers can distinguish the path from adjacent prose or secrets.
30
29
  *
31
30
  * @complexity Time/space: O(total path length).
32
31
  */
@@ -51,14 +51,13 @@ export function folderPathsFromDataTransfer(dataTransfer, port) {
51
51
  return paths;
52
52
  }
53
53
  /**
54
- * The text a folder drop inserts: every path, space-joined, in drop order. The one place the format
55
- * lives — a path that itself contains a space is ambiguous in this format, so any change to quoting
56
- * or separators belongs here and nowhere else.
54
+ * The text a folder drop inserts: every path, space-joined, in drop order. Quote whitespace-containing
55
+ * paths so text consumers can distinguish the path from adjacent prose or secrets.
57
56
  *
58
57
  * @complexity Time/space: O(total path length).
59
58
  */
60
59
  export function formatDroppedFolderPaths(paths) {
61
- return paths.join(' ');
60
+ return paths.map(path => /\s/.test(path) ? `"${path}"` : path).join(' ');
62
61
  }
63
62
  /**
64
63
  * A capture-phase drop handler's whole decision. A drop carrying at least one folder with a
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_AR = {
2
+ "Folders ({count})": "المجلدات ({count})",
3
+ "Copy folder path: {path}": "نسخ مسار المجلد: {path}",
4
+ "Remove folder: {path}": "إزالة المجلد: {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "أزلت من رسالتك ما بدا كمفتاح. إن كان حقيقيًا، فاستبدله. استخدم النموذج الآمن لحفظه.",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "استخدم النموذج الآمن لحفظ المفاتيح والرموز وكلمات المرور والأسرار. تُرسل إجابات الدردشة إلى المساعد.",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# مهارتي\n\n1. اشرح سير العمل.\n2. صف المدخلات والمخرجات.',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_AR = {
68
71
  'Custom instructions': 'تعليمات مخصصة',
69
72
  'Custom model id': 'معرّف نموذج مخصص',
70
73
  'Custom…': 'مخصص…',
74
+ 'Charcoal': 'فحمي',
75
+ 'Clay': 'طيني',
76
+ 'Violet': 'بنفسجي',
77
+ 'Green': 'أخضر',
78
+ 'Red': 'أحمر',
79
+ 'Amber': 'كهرماني',
80
+ 'Teal': 'أزرق مخضر',
81
+ 'Pink': 'وردي',
71
82
  'Default accent color': 'لون التمييز الافتراضي',
72
83
  'Default endpoint. Usually no need to change this.': 'نقطة النهاية الافتراضية. عادةً لا حاجة لتغيير هذا.',
73
84
  'Default model': 'النموذج الافتراضي',
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_BN = {
2
+ "Folders ({count})": "ফোল্ডার ({count})",
3
+ "Copy folder path: {path}": "ফোল্ডারের পাথ কপি করুন: {path}",
4
+ "Remove folder: {path}": "ফোল্ডার সরান: {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "আপনার বার্তা থেকে কী বলে মনে হওয়া অংশটি সরিয়ে দিয়েছি। সেটি আসল হলে বদলে ফেলুন। সংরক্ষণ করতে নিরাপদ ফর্ম ব্যবহার করুন।",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "কী, টোকেন, পাসওয়ার্ড ও গোপন তথ্য সংরক্ষণ করতে নিরাপদ ফর্ম ব্যবহার করুন। চ্যাটের উত্তর সহকারীকে পাঠানো হয়।",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# আমার স্কিল\n\n1. ওয়ার্কফ্লো ব্যাখ্যা করুন।\n2. ইনপুট এবং আউটপুট বর্ণনা করুন।',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_BN = {
68
71
  'Custom instructions': 'কাস্টম নির্দেশনা',
69
72
  'Custom model id': 'কাস্টম মডেল আইডি',
70
73
  'Custom…': 'কাস্টম…',
74
+ 'Charcoal': 'কয়লা',
75
+ 'Clay': 'মাটি',
76
+ 'Violet': 'বেগুনি',
77
+ 'Green': 'সবুজ',
78
+ 'Red': 'লাল',
79
+ 'Amber': 'অ্যাম্বার',
80
+ 'Teal': 'নীলচে সবুজ',
81
+ 'Pink': 'গোলাপি',
71
82
  'Default accent color': 'ডিফল্ট হাইলাইট রং',
72
83
  'Default endpoint. Usually no need to change this.': 'ডিফল্ট এন্ডপয়েন্ট। সাধারণত এটি পরিবর্তনের প্রয়োজন হয় না।',
73
84
  'Default model': 'ডিফল্ট মডেল',
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_DE = {
2
+ "Folders ({count})": "Ordner ({count})",
3
+ "Copy folder path: {path}": "Ordnerpfad kopieren: {path}",
4
+ "Remove folder: {path}": "Ordner entfernen: {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "Ich habe aus deiner Nachricht entfernt, was wie ein Schlüssel aussah. Falls er echt war, ersetze ihn. Speichere ihn über das sichere Formular.",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "Speichere Schlüssel, Tokens, Passwörter und Geheimnisse über das sichere Formular. Chatantworten werden an den Assistenten gesendet.",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# Meine Skill\n\n1. Erkläre den Workflow.\n2. Beschreibe die Eingaben und Ausgaben.',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_DE = {
68
71
  'Custom instructions': 'Benutzerdefinierte Anweisungen',
69
72
  'Custom model id': 'Benutzerdefinierte Modell-ID',
70
73
  'Custom…': 'Benutzerdefiniert…',
74
+ 'Charcoal': 'Anthrazit',
75
+ 'Clay': 'Ton',
76
+ 'Violet': 'Violett',
77
+ 'Green': 'Grün',
78
+ 'Red': 'Rot',
79
+ 'Amber': 'Bernstein',
80
+ 'Teal': 'Petrol',
81
+ 'Pink': 'Pink',
71
82
  'Default accent color': 'Standard-Akzentfarbe',
72
83
  'Default endpoint. Usually no need to change this.': 'Standard-Endpunkt. Muss normalerweise nicht geändert werden.',
73
84
  'Default model': 'Standardmodell',
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_EN = {
2
+ "Folders ({count})": "Folders ({count})",
3
+ "Copy folder path: {path}": "Copy folder path: {path}",
4
+ "Remove folder: {path}": "Remove folder: {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_EN = {
68
71
  'Custom instructions': 'Custom instructions',
69
72
  'Custom model id': 'Custom model id',
70
73
  'Custom…': 'Custom…',
74
+ 'Charcoal': 'Charcoal',
75
+ 'Clay': 'Clay',
76
+ 'Violet': 'Violet',
77
+ 'Green': 'Green',
78
+ 'Red': 'Red',
79
+ 'Amber': 'Amber',
80
+ 'Teal': 'Teal',
81
+ 'Pink': 'Pink',
71
82
  'Default accent color': 'Default accent color',
72
83
  'Default endpoint. Usually no need to change this.': 'Default endpoint. Usually no need to change this.',
73
84
  'Default model': 'Default model',
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_ES = {
2
+ "Folders ({count})": "Carpetas ({count})",
3
+ "Copy folder path: {path}": "Copiar ruta de carpeta: {path}",
4
+ "Remove folder: {path}": "Quitar carpeta: {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "He eliminado de tu mensaje lo que parecía una clave. Si era real, cámbiala. Usa el formulario seguro para guardarla.",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "Usa el formulario seguro para guardar claves, tokens, contraseñas y secretos. Las respuestas del chat se envían al asistente.",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# Mi skill\n\n1. Explica el flujo de trabajo.\n2. Describe las entradas y salidas.',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_ES = {
68
71
  'Custom instructions': 'Instrucciones personalizadas',
69
72
  'Custom model id': 'Id. de modelo personalizado',
70
73
  'Custom…': 'Personalizado…',
74
+ 'Charcoal': 'Carbón',
75
+ 'Clay': 'Arcilla',
76
+ 'Violet': 'Violeta',
77
+ 'Green': 'Verde',
78
+ 'Red': 'Rojo',
79
+ 'Amber': 'Ámbar',
80
+ 'Teal': 'Verde azulado',
81
+ 'Pink': 'Rosa',
71
82
  'Default accent color': 'Color de acento predeterminado',
72
83
  'Default endpoint. Usually no need to change this.': 'Endpoint predeterminado. Normalmente no hace falta cambiarlo.',
73
84
  'Default model': 'Modelo predeterminado',
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_FA = {
2
+ "Folders ({count})": "پوشه‌ها ({count})",
3
+ "Copy folder path: {path}": "کپی مسیر پوشه: {path}",
4
+ "Remove folder: {path}": "حذف پوشه: {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "متنی را که شبیه کلید بود از پیامتان حذف کردم. اگر واقعی بود، آن را تعویض کنید. برای ذخیره از فرم امن استفاده کنید.",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "برای ذخیره کلیدها، توکن‌ها، گذرواژه‌ها و اطلاعات محرمانه از فرم امن استفاده کنید. پاسخ‌های گفتگو به دستیار فرستاده می‌شوند.",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# مهارت من\n\n1. گردش کار را توضیح دهید.\n2. ورودی‌ها و خروجی‌ها را شرح دهید.',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_FA = {
68
71
  'Custom instructions': 'دستورالعمل‌های سفارشی',
69
72
  'Custom model id': 'شناسهٔ مدل سفارشی',
70
73
  'Custom…': 'سفارشی…',
74
+ 'Charcoal': 'زغالی',
75
+ 'Clay': 'سفالی',
76
+ 'Violet': 'بنفش',
77
+ 'Green': 'سبز',
78
+ 'Red': 'قرمز',
79
+ 'Amber': 'کهربایی',
80
+ 'Teal': 'سبزآبی',
81
+ 'Pink': 'صورتی',
71
82
  'Default accent color': 'رنگ تأکیدی پیش‌فرض',
72
83
  'Default endpoint. Usually no need to change this.': 'نقطهٔ پایانی پیش‌فرض. معمولاً نیازی به تغییر آن نیست.',
73
84
  'Default model': 'مدل پیش‌فرض',
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_FR = {
2
+ "Folders ({count})": "Dossiers ({count})",
3
+ "Copy folder path: {path}": "Copier le chemin du dossier : {path}",
4
+ "Remove folder: {path}": "Retirer le dossier : {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "J’ai supprimé de votre message ce qui ressemblait à une clé. Si elle était réelle, remplacez-la. Utilisez le formulaire sécurisé pour l’enregistrer.",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "Utilisez le formulaire sécurisé pour enregistrer les clés, jetons, mots de passe et secrets. Les réponses du chat sont envoyées à l’assistant.",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# Ma compétence\n\n1. Expliquez le déroulement.\n2. Décrivez les entrées et sorties.',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_FR = {
68
71
  'Custom instructions': 'Instructions personnalisées',
69
72
  'Custom model id': 'Identifiant de modèle personnalisé',
70
73
  'Custom…': 'Personnalisé…',
74
+ 'Charcoal': 'Anthracite',
75
+ 'Clay': 'Argile',
76
+ 'Violet': 'Violet',
77
+ 'Green': 'Vert',
78
+ 'Red': 'Rouge',
79
+ 'Amber': 'Ambre',
80
+ 'Teal': 'Bleu canard',
81
+ 'Pink': 'Rose',
71
82
  'Default accent color': 'Couleur d\'accent par défaut',
72
83
  'Default endpoint. Usually no need to change this.': 'Point de terminaison par défaut. Il n\'est généralement pas nécessaire de le modifier.',
73
84
  'Default model': 'Modèle par défaut',
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_HI = {
2
+ "Folders ({count})": "फ़ोल्डर ({count})",
3
+ "Copy folder path: {path}": "फ़ोल्डर का पथ कॉपी करें: {path}",
4
+ "Remove folder: {path}": "फ़ोल्डर हटाएँ: {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "मैंने आपके संदेश से कुंजी जैसा दिखने वाला हिस्सा हटा दिया है। अगर वह असली कुंजी थी, तो उसे बदलें। उसे सहेजने के लिए सुरक्षित फ़ॉर्म का उपयोग करें।",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "कुंजियाँ, टोकन, पासवर्ड और गोपनीय जानकारी सहेजने के लिए सुरक्षित फ़ॉर्म का उपयोग करें। चैट के उत्तर सहायक को भेजे जाते हैं।",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# मेरी स्किल\n\n1. वर्कफ़्लो के बारे में बताएं।\n2. इनपुट और आउटपुट के बारे में बताएं।',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_HI = {
68
71
  'Custom instructions': 'कस्टम निर्देश',
69
72
  'Custom model id': 'कस्टम मॉडल आईडी',
70
73
  'Custom…': 'कस्टम…',
74
+ 'Charcoal': 'चारकोल',
75
+ 'Clay': 'मिट्टी',
76
+ 'Violet': 'बैंगनी',
77
+ 'Green': 'हरा',
78
+ 'Red': 'लाल',
79
+ 'Amber': 'एम्बर',
80
+ 'Teal': 'हरित-नील',
81
+ 'Pink': 'गुलाबी',
71
82
  'Default accent color': 'डिफ़ॉल्ट हाइलाइट रंग',
72
83
  'Default endpoint. Usually no need to change this.': 'डिफ़ॉल्ट एंडपॉइंट। आमतौर पर इसे बदलने की आवश्यकता नहीं होती।',
73
84
  'Default model': 'डिफ़ॉल्ट मॉडल',
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_HU = {
2
+ "Folders ({count})": "Mappák ({count})",
3
+ "Copy folder path: {path}": "Mappa elérési útjának másolása: {path}",
4
+ "Remove folder: {path}": "Mappa eltávolítása: {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "Eltávolítottam az üzenetedből azt, ami kulcsnak tűnt. Ha valódi volt, cseréld le. A biztonságos űrlapon mentsd el.",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "A kulcsokat, tokeneket, jelszavakat és titkokat a biztonságos űrlapon mentsd el. A chatválaszokat elküldjük az asszisztensnek.",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# Saját képességem\n\n1. Írd le a munkafolyamatot.\n2. Írd le a bemeneteket és a kimeneteket.',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_HU = {
68
71
  'Custom instructions': 'Egyéni utasítások',
69
72
  'Custom model id': 'Egyéni modellazonosító',
70
73
  'Custom…': 'Egyéni…',
74
+ 'Charcoal': 'Grafit',
75
+ 'Clay': 'Agyag',
76
+ 'Violet': 'Ibolya',
77
+ 'Green': 'Zöld',
78
+ 'Red': 'Piros',
79
+ 'Amber': 'Borostyán',
80
+ 'Teal': 'Kékeszöld',
81
+ 'Pink': 'Rózsaszín',
71
82
  'Default accent color': 'Alapértelmezett kiemelőszín',
72
83
  'Default endpoint. Usually no need to change this.': 'Alapértelmezett végpont. Általában nem szükséges módosítani.',
73
84
  'Default model': 'Alapértelmezett modell',
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_ID = {
2
+ "Folders ({count})": "Folder ({count})",
3
+ "Copy folder path: {path}": "Salin jalur folder: {path}",
4
+ "Remove folder: {path}": "Hapus folder: {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "Saya menghapus teks yang tampak seperti kunci dari pesan Anda. Jika itu kunci asli, gantilah. Gunakan formulir aman untuk menyimpannya.",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "Gunakan formulir aman untuk menyimpan kunci, token, kata sandi, dan rahasia. Jawaban chat dikirim ke asisten.",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# Skill saya\n\n1. Jelaskan alur kerjanya.\n2. Jelaskan input dan outputnya.',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_ID = {
68
71
  'Custom instructions': 'Instruksi kustom',
69
72
  'Custom model id': 'ID model kustom',
70
73
  'Custom…': 'Kustom…',
74
+ 'Charcoal': 'Arang',
75
+ 'Clay': 'Tanah liat',
76
+ 'Violet': 'Ungu',
77
+ 'Green': 'Hijau',
78
+ 'Red': 'Merah',
79
+ 'Amber': 'Kuning amber',
80
+ 'Teal': 'Hijau kebiruan',
81
+ 'Pink': 'Merah muda',
71
82
  'Default accent color': 'Warna aksen default',
72
83
  'Default endpoint. Usually no need to change this.': 'Endpoint default. Biasanya tidak perlu diubah.',
73
84
  'Default model': 'Model default',
@@ -1,4 +1,7 @@
1
1
  export const SETTINGS_DIALOG_IT = {
2
+ "Folders ({count})": "Cartelle ({count})",
3
+ "Copy folder path: {path}": "Copia percorso cartella: {path}",
4
+ "Remove folder: {path}": "Rimuovi cartella: {path}",
2
5
  "I removed what looked like a key from your message. If it was real, rotate it. Use the secure form to save it.": "Ho rimosso dal messaggio ciò che sembrava una chiave. Se era reale, sostituiscila. Usa il modulo sicuro per salvarla.",
3
6
  "Use the secure form to save keys, tokens, passwords, and secrets. Chat answers are sent to the assistant.": "Usa il modulo sicuro per salvare chiavi, token, password e segreti. Le risposte nella chat vengono inviate all’assistente.",
4
7
  '# My skill\n\n1. Explain the workflow.\n2. Describe the inputs and outputs.': '# La mia competenza\n\n1. Spiega il flusso di lavoro.\n2. Descrivi gli input e gli output.',
@@ -68,6 +71,14 @@ export const SETTINGS_DIALOG_IT = {
68
71
  'Custom instructions': 'Istruzioni personalizzate',
69
72
  'Custom model id': 'ID modello personalizzato',
70
73
  'Custom…': 'Personalizzato…',
74
+ 'Charcoal': 'Antracite',
75
+ 'Clay': 'Argilla',
76
+ 'Violet': 'Viola',
77
+ 'Green': 'Verde',
78
+ 'Red': 'Rosso',
79
+ 'Amber': 'Ambra',
80
+ 'Teal': 'Verde acqua',
81
+ 'Pink': 'Rosa',
71
82
  'Default accent color': 'Colore di accento predefinito',
72
83
  'Default endpoint. Usually no need to change this.': 'Endpoint predefinito. Di solito non è necessario modificarlo.',
73
84
  'Default model': 'Modello predefinito',