@calliopelabs/ui 0.13.0 → 0.16.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.
Files changed (115) hide show
  1. package/README.md +192 -4
  2. package/dist/agent/AgentChat.d.ts +63 -0
  3. package/dist/agent/AgentChat.js +117 -0
  4. package/dist/agent/AgentLauncher.d.ts +25 -0
  5. package/dist/agent/AgentLauncher.js +25 -0
  6. package/dist/agent/AgentProvider.d.ts +82 -0
  7. package/dist/agent/AgentProvider.js +176 -0
  8. package/dist/agent/CalliopeAgent.d.ts +43 -0
  9. package/dist/agent/CalliopeAgent.js +111 -0
  10. package/dist/agent/WorkflowRenderers.d.ts +61 -0
  11. package/dist/agent/WorkflowRenderers.js +102 -0
  12. package/dist/agent/controller.d.ts +167 -0
  13. package/dist/agent/controller.js +496 -0
  14. package/dist/agent/copilotkit/CopilotKitAgentProvider.d.ts +41 -0
  15. package/dist/agent/copilotkit/CopilotKitAgentProvider.js +145 -0
  16. package/dist/agent/copilotkit/index.d.ts +6 -0
  17. package/dist/agent/copilotkit/index.js +6 -0
  18. package/dist/agent/engine.d.ts +41 -0
  19. package/dist/agent/engine.js +93 -0
  20. package/dist/agent/index.d.ts +17 -0
  21. package/dist/agent/index.js +17 -0
  22. package/dist/agent/mock.d.ts +56 -0
  23. package/dist/agent/mock.js +143 -0
  24. package/dist/agent/renderers.d.ts +49 -0
  25. package/dist/agent/renderers.js +27 -0
  26. package/dist/agent/surface.d.ts +30 -0
  27. package/dist/agent/surface.js +90 -0
  28. package/dist/agent/tool.d.ts +98 -0
  29. package/dist/agent/tool.js +81 -0
  30. package/dist/appearance/brands.d.ts +31 -12
  31. package/dist/appearance/brands.js +32 -51
  32. package/dist/chat/AgentProgress.d.ts +19 -0
  33. package/dist/chat/AgentProgress.js +34 -0
  34. package/dist/chat/Composer.d.ts +31 -0
  35. package/dist/chat/Composer.js +44 -0
  36. package/dist/chat/MessageBubble.d.ts +23 -0
  37. package/dist/chat/MessageBubble.js +26 -0
  38. package/dist/chat/MessageList.d.ts +43 -0
  39. package/dist/chat/MessageList.js +71 -0
  40. package/dist/chat/ModelPicker.d.ts +17 -0
  41. package/dist/chat/ModelPicker.js +13 -0
  42. package/dist/chat/ToolCallCard.d.ts +27 -0
  43. package/dist/chat/ToolCallCard.js +52 -0
  44. package/dist/chat/model.d.ts +123 -0
  45. package/dist/chat/model.js +337 -0
  46. package/dist/chat/patch.d.ts +12 -0
  47. package/dist/chat/patch.js +149 -0
  48. package/dist/chat/useAgUiRun.d.ts +52 -0
  49. package/dist/chat/useAgUiRun.js +137 -0
  50. package/dist/css/appearance.js +1 -1
  51. package/dist/css/calliope.css +5 -0
  52. package/dist/css/tokens.css +5 -0
  53. package/dist/index.d.ts +15 -1
  54. package/dist/index.js +16 -1
  55. package/dist/primitives/Badge.d.ts +14 -0
  56. package/dist/primitives/Badge.js +25 -0
  57. package/dist/primitives/Button.d.ts +1 -1
  58. package/dist/primitives/ContextMenu.d.ts +18 -0
  59. package/dist/primitives/ContextMenu.js +34 -0
  60. package/dist/primitives/ScrollArea.d.ts +16 -0
  61. package/dist/primitives/ScrollArea.js +11 -0
  62. package/dist/primitives/Toast.d.ts +37 -0
  63. package/dist/primitives/Toast.js +43 -0
  64. package/dist/primitives/Tooltip.d.ts +16 -0
  65. package/dist/primitives/Tooltip.js +26 -0
  66. package/dist/provider/messages.d.ts +135 -0
  67. package/dist/provider/messages.js +131 -0
  68. package/dist/theme/css-layer.js +2 -1
  69. package/dist/theme/mappings/palette.d.ts +52 -0
  70. package/dist/theme/mappings/palette.js +208 -0
  71. package/dist/theme/mappings/render.d.ts +9 -0
  72. package/dist/theme/mappings/render.js +520 -0
  73. package/dist/theme/mappings/targets.d.ts +43 -0
  74. package/dist/theme/mappings/targets.js +222 -0
  75. package/dist/theme/tokens.d.ts +10 -9
  76. package/dist/theme/tokens.generated.d.ts +356 -0
  77. package/dist/theme/tokens.generated.js +360 -0
  78. package/dist/theme/tokens.js +20 -264
  79. package/dist/tokens/README.jupyterlab.md +125 -0
  80. package/dist/tokens/README.md +15 -0
  81. package/dist/tokens/README.native.md +29 -0
  82. package/dist/tokens/README.plain.md +84 -0
  83. package/dist/tokens/README.python.md +33 -0
  84. package/dist/tokens/README.vscode.md +114 -0
  85. package/dist/tokens/jupyterlab.css +1710 -0
  86. package/dist/tokens/plain.css +930 -0
  87. package/dist/tokens/tokens.native.d.ts +85 -0
  88. package/dist/tokens/tokens.native.js +773 -0
  89. package/dist/tokens/tokens.py +1043 -0
  90. package/dist/tokens/vscode.css +1138 -0
  91. package/dist/workbench/FileBrowser.d.ts +62 -0
  92. package/dist/workbench/FileBrowser.js +117 -0
  93. package/dist/workbench/FileGrid.d.ts +13 -0
  94. package/dist/workbench/FileGrid.js +114 -0
  95. package/dist/workbench/FileIcon.d.ts +10 -0
  96. package/dist/workbench/FileIcon.js +24 -0
  97. package/dist/workbench/FileList.d.ts +35 -0
  98. package/dist/workbench/FileList.js +160 -0
  99. package/dist/workbench/FilePreview.d.ts +66 -0
  100. package/dist/workbench/FilePreview.js +108 -0
  101. package/dist/workbench/FileTree.d.ts +37 -0
  102. package/dist/workbench/FileTree.js +218 -0
  103. package/dist/workbench/UploadDropzone.d.ts +52 -0
  104. package/dist/workbench/UploadDropzone.js +115 -0
  105. package/dist/workbench/dnd.d.ts +17 -0
  106. package/dist/workbench/dnd.js +77 -0
  107. package/dist/workbench/index.d.ts +16 -0
  108. package/dist/workbench/index.js +16 -0
  109. package/dist/workbench/model.d.ts +72 -0
  110. package/dist/workbench/model.js +214 -0
  111. package/dist/workbench/selection.d.ts +16 -0
  112. package/dist/workbench/selection.js +46 -0
  113. package/dist/workbench/typeahead.d.ts +15 -0
  114. package/dist/workbench/typeahead.js +22 -0
  115. package/package.json +39 -2
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `@calliopelabs/ui/workbench`: the pieces of an IDE-style tool that more
3
+ * than one Calliope AI product draws. Opt-in, like `./agent`: an app that
4
+ * has no file browser never loads it. Everything is host-driven: data comes
5
+ * in as props, every change goes out through a callback, nothing fetches.
6
+ * Styles come from the package preset (`@calliopelabs/ui/preset.css`).
7
+ */
8
+ export { canDrop, fileExtension, formatBytes, isWithin, joinPath, parentPath, parseDelimited, pathSegments, previewKindFor, sortFiles, } from "./model.js";
9
+ export { FILE_DRAG_TYPE } from "./dnd.js";
10
+ export { FileIcon } from "./FileIcon.js";
11
+ export { FileTree } from "./FileTree.js";
12
+ export { FileList } from "./FileList.js";
13
+ export { FileGrid } from "./FileGrid.js";
14
+ export { FileBrowser } from "./FileBrowser.js";
15
+ export { UploadDropzone, } from "./UploadDropzone.js";
16
+ export { FilePreview } from "./FilePreview.js";
@@ -0,0 +1,72 @@
1
+ /**
2
+ * The file browser's data: plain values the host maps its own listing onto.
3
+ * Pure (no "use client"), so a server can sort or build fixtures with it.
4
+ */
5
+ export type FileKind = "file" | "directory";
6
+ /** One entry of a listing. `path` is its identity: unique, `/`-separated, no leading slash. */
7
+ export interface FileItem {
8
+ path: string;
9
+ name: string;
10
+ kind: FileKind;
11
+ /** Bytes. Absent or null for directories and unknown sizes. */
12
+ size?: number | null;
13
+ /** ISO 8601 or a Date. */
14
+ modified?: string | Date | null;
15
+ mimeType?: string | null;
16
+ }
17
+ export type FileSortKey = "name" | "size" | "modified" | "kind";
18
+ export interface FileSort {
19
+ key: FileSortKey;
20
+ dir: "asc" | "desc";
21
+ }
22
+ export type FileView = "list" | "grid";
23
+ /** Where an upload stands. */
24
+ export type UploadState = "queued" | "uploading" | "done" | "error" | "canceled";
25
+ /**
26
+ * A directory's children as the host knows them. Absent from the map means
27
+ * "never asked for": the tree calls `onLoad` when it first opens.
28
+ */
29
+ export type FileBranch = {
30
+ state: "loading";
31
+ } | {
32
+ state: "error";
33
+ message?: string;
34
+ } | {
35
+ state: "ready";
36
+ items: readonly FileItem[];
37
+ };
38
+ /** The parent directory of a path; the root is "". */
39
+ export declare function parentPath(path: string): string;
40
+ /** A path under a directory; the root is "". */
41
+ export declare function joinPath(dir: string, name: string): string;
42
+ /** True when `path` is `ancestor` or lies under it. */
43
+ export declare function isWithin(path: string, ancestor: string): boolean;
44
+ /** The lower-case extension without the dot, or "" (".bashrc" has none). */
45
+ export declare function fileExtension(name: string): string;
46
+ /** The breadcrumb trail of a path: the root, then each directory down to it. */
47
+ export declare function pathSegments(path: string): {
48
+ name: string;
49
+ path: string;
50
+ }[];
51
+ /**
52
+ * Whether moving `sources` into `target` does anything sensible: never into
53
+ * itself or its own subtree, and a move into the folder it is already in is
54
+ * a no-op. Copies (`copy`) may land in the same folder.
55
+ */
56
+ export declare function canDrop(sources: readonly string[], target: string, copy?: boolean): boolean;
57
+ /**
58
+ * A listing in display order: directories first, then by the key, ties and
59
+ * missing values by name. Natural order, so "file10" follows "file9".
60
+ */
61
+ export declare function sortFiles(items: readonly FileItem[], sort: FileSort): FileItem[];
62
+ /** Bytes for people: 0 B, 912 B, 1.5 KB, 23 MB (1024-based, as file managers show). */
63
+ export declare function formatBytes(bytes: number, locale?: string): string;
64
+ /** What a preview can show for a file, from its name and MIME type. */
65
+ export type PreviewKind = "csv" | "json" | "image" | "markdown" | "text" | "binary";
66
+ export declare function previewKindFor(name: string, mimeType?: string | null): PreviewKind;
67
+ /**
68
+ * Parses CSV (RFC 4180: quoted fields, doubled quotes, newlines inside
69
+ * quotes) or, with `delimiter: "\t"`, TSV. Returns rows of strings; the
70
+ * caller decides whether the first row is a header.
71
+ */
72
+ export declare function parseDelimited(text: string, delimiter?: string): string[][];
@@ -0,0 +1,214 @@
1
+ /**
2
+ * The file browser's data: plain values the host maps its own listing onto.
3
+ * Pure (no "use client"), so a server can sort or build fixtures with it.
4
+ */
5
+ /** The parent directory of a path; the root is "". */
6
+ export function parentPath(path) {
7
+ const i = path.lastIndexOf("/");
8
+ return i < 0 ? "" : path.slice(0, i);
9
+ }
10
+ /** A path under a directory; the root is "". */
11
+ export function joinPath(dir, name) {
12
+ return dir ? `${dir}/${name}` : name;
13
+ }
14
+ /** True when `path` is `ancestor` or lies under it. */
15
+ export function isWithin(path, ancestor) {
16
+ return ancestor === "" || path === ancestor || path.startsWith(`${ancestor}/`);
17
+ }
18
+ /** The lower-case extension without the dot, or "" (".bashrc" has none). */
19
+ export function fileExtension(name) {
20
+ const i = name.lastIndexOf(".");
21
+ return i > 0 ? name.slice(i + 1).toLowerCase() : "";
22
+ }
23
+ /** The breadcrumb trail of a path: the root, then each directory down to it. */
24
+ export function pathSegments(path) {
25
+ const parts = path.split("/").filter(Boolean);
26
+ return parts.map((name, i) => ({ name, path: parts.slice(0, i + 1).join("/") }));
27
+ }
28
+ /**
29
+ * Whether moving `sources` into `target` does anything sensible: never into
30
+ * itself or its own subtree, and a move into the folder it is already in is
31
+ * a no-op. Copies (`copy`) may land in the same folder.
32
+ */
33
+ export function canDrop(sources, target, copy = false) {
34
+ return (sources.length > 0 &&
35
+ sources.every((src) => !(target === src || target.startsWith(`${src}/`)) && (copy || parentPath(src) !== target)));
36
+ }
37
+ const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: "base" });
38
+ function time(value) {
39
+ if (value == null)
40
+ return null;
41
+ const t = value instanceof Date ? value.getTime() : Date.parse(value);
42
+ return Number.isNaN(t) ? null : t;
43
+ }
44
+ /**
45
+ * A listing in display order: directories first, then by the key, ties and
46
+ * missing values by name. Natural order, so "file10" follows "file9".
47
+ */
48
+ export function sortFiles(items, sort) {
49
+ const sign = sort.dir === "asc" ? 1 : -1;
50
+ const byName = (a, b) => collator.compare(a.name, b.name);
51
+ const compare = (a, b) => {
52
+ switch (sort.key) {
53
+ case "size": {
54
+ const x = a.size ?? null;
55
+ const y = b.size ?? null;
56
+ if (x === y)
57
+ return 0;
58
+ if (x === null)
59
+ return 1;
60
+ if (y === null)
61
+ return -1;
62
+ return (x - y) * sign;
63
+ }
64
+ case "modified": {
65
+ const x = time(a.modified);
66
+ const y = time(b.modified);
67
+ if (x === y)
68
+ return 0;
69
+ if (x === null)
70
+ return 1;
71
+ if (y === null)
72
+ return -1;
73
+ return (x - y) * sign;
74
+ }
75
+ case "kind":
76
+ return collator.compare(fileExtension(a.name), fileExtension(b.name)) * sign;
77
+ case "name":
78
+ return byName(a, b) * sign;
79
+ }
80
+ };
81
+ return [...items].sort((a, b) => {
82
+ if (a.kind !== b.kind)
83
+ return a.kind === "directory" ? -1 : 1;
84
+ return compare(a, b) || byName(a, b);
85
+ });
86
+ }
87
+ /** Bytes for people: 0 B, 912 B, 1.5 KB, 23 MB (1024-based, as file managers show). */
88
+ export function formatBytes(bytes, locale) {
89
+ if (!Number.isFinite(bytes) || bytes < 0)
90
+ return "";
91
+ const units = ["B", "KB", "MB", "GB", "TB", "PB"];
92
+ let value = bytes;
93
+ let unit = 0;
94
+ while (value >= 1024 && unit < units.length - 1) {
95
+ value /= 1024;
96
+ unit++;
97
+ }
98
+ const digits = unit === 0 || value >= 10 ? 0 : 1;
99
+ return `${value.toLocaleString(locale, { maximumFractionDigits: digits })} ${units[unit]}`;
100
+ }
101
+ const TEXT_EXTENSIONS = new Set([
102
+ "txt",
103
+ "log",
104
+ "py",
105
+ "js",
106
+ "jsx",
107
+ "ts",
108
+ "tsx",
109
+ "mjs",
110
+ "cjs",
111
+ "rs",
112
+ "go",
113
+ "java",
114
+ "kt",
115
+ "rb",
116
+ "sh",
117
+ "bash",
118
+ "zsh",
119
+ "sql",
120
+ "html",
121
+ "css",
122
+ "scss",
123
+ "xml",
124
+ "yaml",
125
+ "yml",
126
+ "toml",
127
+ "ini",
128
+ "cfg",
129
+ "conf",
130
+ "env",
131
+ "r",
132
+ "c",
133
+ "h",
134
+ "cpp",
135
+ "hpp",
136
+ "cs",
137
+ "php",
138
+ "swift",
139
+ "lua",
140
+ "dockerfile",
141
+ "tf",
142
+ ]);
143
+ const IMAGE_EXTENSIONS = new Set([
144
+ "png",
145
+ "jpg",
146
+ "jpeg",
147
+ "gif",
148
+ "svg",
149
+ "webp",
150
+ "avif",
151
+ "bmp",
152
+ "ico",
153
+ ]);
154
+ export function previewKindFor(name, mimeType) {
155
+ const ext = fileExtension(name);
156
+ if (ext === "csv" || ext === "tsv" || mimeType === "text/csv")
157
+ return "csv";
158
+ if (ext === "json" || ext === "jsonl" || ext === "ipynb" || mimeType === "application/json")
159
+ return "json";
160
+ if (IMAGE_EXTENSIONS.has(ext) || mimeType?.startsWith("image/"))
161
+ return "image";
162
+ if (ext === "md" || ext === "markdown" || mimeType === "text/markdown")
163
+ return "markdown";
164
+ if (TEXT_EXTENSIONS.has(ext) || mimeType?.startsWith("text/"))
165
+ return "text";
166
+ return "binary";
167
+ }
168
+ /**
169
+ * Parses CSV (RFC 4180: quoted fields, doubled quotes, newlines inside
170
+ * quotes) or, with `delimiter: "\t"`, TSV. Returns rows of strings; the
171
+ * caller decides whether the first row is a header.
172
+ */
173
+ export function parseDelimited(text, delimiter = ",") {
174
+ const rows = [];
175
+ let row = [];
176
+ let field = "";
177
+ let quoted = false;
178
+ for (let i = 0; i < text.length; i++) {
179
+ const c = text[i];
180
+ if (quoted) {
181
+ if (c === '"') {
182
+ if (text[i + 1] === '"') {
183
+ field += '"';
184
+ i++;
185
+ }
186
+ else
187
+ quoted = false;
188
+ }
189
+ else
190
+ field += c;
191
+ }
192
+ else if (c === '"' && field === "")
193
+ quoted = true;
194
+ else if (c === delimiter) {
195
+ row.push(field);
196
+ field = "";
197
+ }
198
+ else if (c === "\n" || c === "\r") {
199
+ if (c === "\r" && text[i + 1] === "\n")
200
+ i++;
201
+ row.push(field);
202
+ rows.push(row);
203
+ row = [];
204
+ field = "";
205
+ }
206
+ else
207
+ field += c;
208
+ }
209
+ if (field !== "" || row.length > 0) {
210
+ row.push(field);
211
+ rows.push(row);
212
+ }
213
+ return rows;
214
+ }
@@ -0,0 +1,16 @@
1
+ export type SelectMode = "replace" | "toggle" | "range";
2
+ /**
3
+ * Finder-style selection over an ordered listing: a plain click or arrow
4
+ * selects one, Cmd or Ctrl toggles, Shift selects the range from the
5
+ * anchor (the last item chosen without Shift). The set is the host's.
6
+ */
7
+ export declare function useSelectionModel(order: readonly string[], selection: ReadonlySet<string>, onSelectionChange: (next: Set<string>) => void): {
8
+ select(path: string, mode: SelectMode): void;
9
+ selectAll(): void;
10
+ clear(): void;
11
+ };
12
+ export declare function modeOf(event: {
13
+ shiftKey: boolean;
14
+ metaKey: boolean;
15
+ ctrlKey: boolean;
16
+ }): SelectMode;
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ /**
4
+ * Finder-style selection over an ordered listing: a plain click or arrow
5
+ * selects one, Cmd or Ctrl toggles, Shift selects the range from the
6
+ * anchor (the last item chosen without Shift). The set is the host's.
7
+ */
8
+ export function useSelectionModel(order, selection, onSelectionChange) {
9
+ const anchor = React.useRef(null);
10
+ return React.useMemo(() => ({
11
+ select(path, mode) {
12
+ if (mode === "range") {
13
+ const from = order.indexOf(anchor.current ?? path);
14
+ const to = order.indexOf(path);
15
+ const [a, b] = from < 0 ? [to, to] : from < to ? [from, to] : [to, from];
16
+ onSelectionChange(new Set(order.slice(a, b + 1)));
17
+ return;
18
+ }
19
+ anchor.current = path;
20
+ if (mode === "toggle") {
21
+ const next = new Set(selection);
22
+ if (next.has(path))
23
+ next.delete(path);
24
+ else
25
+ next.add(path);
26
+ onSelectionChange(next);
27
+ }
28
+ else
29
+ onSelectionChange(new Set([path]));
30
+ },
31
+ selectAll() {
32
+ onSelectionChange(new Set(order));
33
+ },
34
+ clear() {
35
+ anchor.current = null;
36
+ onSelectionChange(new Set());
37
+ },
38
+ }), [order, selection, onSelectionChange]);
39
+ }
40
+ export function modeOf(event) {
41
+ if (event.shiftKey)
42
+ return "range";
43
+ if (event.metaKey || event.ctrlKey)
44
+ return "toggle";
45
+ return "replace";
46
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Type-to-find for trees, lists and grids: printable keys typed within half
3
+ * a second build a prefix; the next name after the current one that starts
4
+ * with it (case-insensitive) is the answer. Returns that index, or null when
5
+ * the key is not a typeahead key or nothing matches.
6
+ */
7
+ export declare function typeahead(state: {
8
+ text: string;
9
+ at: number;
10
+ }, event: {
11
+ key: string;
12
+ ctrlKey: boolean;
13
+ metaKey: boolean;
14
+ altKey: boolean;
15
+ }, names: readonly string[], current: number): number | null;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Type-to-find for trees, lists and grids: printable keys typed within half
3
+ * a second build a prefix; the next name after the current one that starts
4
+ * with it (case-insensitive) is the answer. Returns that index, or null when
5
+ * the key is not a typeahead key or nothing matches.
6
+ */
7
+ export function typeahead(state, event, names, current) {
8
+ if (event.key.length !== 1 || event.ctrlKey || event.metaKey || event.altKey || event.key === " ")
9
+ return null;
10
+ const now = Date.now();
11
+ state.text = now - state.at > 500 ? event.key : state.text + event.key;
12
+ state.at = now;
13
+ const prefix = state.text.toLowerCase();
14
+ // A repeated single letter cycles; a longer prefix may stay on the current name.
15
+ const start = state.text.length === 1 ? current + 1 : current;
16
+ for (let i = 0; i < names.length; i++) {
17
+ const index = (start + i) % names.length;
18
+ if (names[index]?.toLowerCase().startsWith(prefix))
19
+ return index;
20
+ }
21
+ return null;
22
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@calliopelabs/ui",
3
- "version": "0.13.0",
3
+ "version": "0.16.0",
4
4
  "description": "Calliope AI shared operator UI: app shell, navigation, page frame, data table and list patterns, status colours, design tokens and appearance for Astrolift AI and Zentinelle AI.",
5
5
  "keywords": [
6
6
  "calliope-ai",
@@ -30,12 +30,36 @@
30
30
  "types": "./dist/index.d.ts",
31
31
  "default": "./dist/index.js"
32
32
  },
33
+ "./agent": {
34
+ "types": "./dist/agent/index.d.ts",
35
+ "default": "./dist/agent/index.js"
36
+ },
37
+ "./agent/copilotkit": {
38
+ "types": "./dist/agent/copilotkit/index.d.ts",
39
+ "default": "./dist/agent/copilotkit/index.js"
40
+ },
41
+ "./workbench": {
42
+ "types": "./dist/workbench/index.d.ts",
43
+ "default": "./dist/workbench/index.js"
44
+ },
33
45
  "./theme.css": "./dist/styles/theme.css",
34
46
  "./preset.css": "./dist/styles/preset.css",
35
47
  "./css/tokens.css": "./dist/css/tokens.css",
36
48
  "./css/appearance.js": "./dist/css/appearance.js",
37
49
  "./css/components.css": "./dist/css/components.css",
38
50
  "./css/calliope.css": "./dist/css/calliope.css",
51
+ "./tokens/jupyterlab.css": "./dist/tokens/jupyterlab.css",
52
+ "./tokens/vscode.css": "./dist/tokens/vscode.css",
53
+ "./tokens/plain.css": "./dist/tokens/plain.css",
54
+ "./tokens/tokens.py": "./dist/tokens/tokens.py",
55
+ "./tokens/native": {
56
+ "types": "./dist/tokens/tokens.native.d.ts",
57
+ "default": "./dist/tokens/tokens.native.js"
58
+ },
59
+ "./tokens/tokens.native.js": {
60
+ "types": "./dist/tokens/tokens.native.d.ts",
61
+ "default": "./dist/tokens/tokens.native.js"
62
+ },
39
63
  "./package.json": "./package.json"
40
64
  },
41
65
  "main": "./dist/index.js",
@@ -59,6 +83,7 @@
59
83
  "build-storybook": "storybook build --quiet"
60
84
  },
61
85
  "dependencies": {
86
+ "@ag-ui/core": "~1.0.3",
62
87
  "@xyflow/react": "^12.12.1",
63
88
  "class-variance-authority": "^0.7.1",
64
89
  "clsx": "^2.1.1",
@@ -67,11 +92,14 @@
67
92
  "tailwind-merge": "^3.7.0"
68
93
  },
69
94
  "devDependencies": {
95
+ "@ag-ui/client": "1.0.2",
96
+ "@copilotkit/react-core": "1.88.0",
70
97
  "@eslint/js": "^9.39.5",
71
98
  "@fontsource-variable/dm-sans": "^5.3.0",
72
99
  "@fontsource/ibm-plex-mono": "^5.3.0",
73
100
  "@fontsource/ibm-plex-sans": "^5.3.0",
74
101
  "@storybook/addon-a11y": "^10.6.2",
102
+ "@storybook/addon-docs": "^10.6.2",
75
103
  "@storybook/react-vite": "^10.6.2",
76
104
  "@tailwindcss/cli": "^4.3.3",
77
105
  "@tailwindcss/vite": "^4.3.3",
@@ -101,14 +129,23 @@
101
129
  "typescript": "~6.0.3",
102
130
  "typescript-eslint": "^8.71.2",
103
131
  "vite": "^8.3.4",
104
- "vitest": "^5.0.5"
132
+ "vitest": "^5.0.5",
133
+ "zod": "^4.6.7"
105
134
  },
106
135
  "peerDependencies": {
136
+ "@ag-ui/client": "^1.0.2",
137
+ "@copilotkit/react-core": ">=1.79.1 <2",
107
138
  "react": "^19.0.0",
108
139
  "react-dom": "^19.0.0",
109
140
  "tailwindcss": "^4.0.0"
110
141
  },
111
142
  "peerDependenciesMeta": {
143
+ "@ag-ui/client": {
144
+ "optional": true
145
+ },
146
+ "@copilotkit/react-core": {
147
+ "optional": true
148
+ },
112
149
  "tailwindcss": {
113
150
  "optional": true
114
151
  }