@agentuity/workbench 0.0.87 → 0.0.89

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 (258) hide show
  1. package/dist/components/App.d.ts.map +1 -1
  2. package/dist/components/App.js +18 -2
  3. package/dist/components/App.js.map +1 -1
  4. package/dist/components/ai-elements/code-block.d.ts +3 -3
  5. package/dist/components/ai-elements/code-block.d.ts.map +1 -1
  6. package/dist/components/ai-elements/code-block.js +29 -7
  7. package/dist/components/ai-elements/code-block.js.map +1 -1
  8. package/dist/components/internal/Chat.d.ts +3 -2
  9. package/dist/components/internal/Chat.d.ts.map +1 -1
  10. package/dist/components/internal/Chat.js +23 -24
  11. package/dist/components/internal/Chat.js.map +1 -1
  12. package/dist/components/internal/MonacoJsonEditor.d.ts.map +1 -1
  13. package/dist/components/internal/MonacoJsonEditor.js +10 -53
  14. package/dist/components/internal/MonacoJsonEditor.js.map +1 -1
  15. package/dist/components/internal/Schema.d.ts +1 -2
  16. package/dist/components/internal/Schema.d.ts.map +1 -1
  17. package/dist/components/internal/Schema.js +2 -3
  18. package/dist/components/internal/Schema.js.map +1 -1
  19. package/dist/components/ui/button.d.ts +1 -1
  20. package/dist/components/ui/input.d.ts.map +1 -1
  21. package/dist/components/ui/input.js +1 -1
  22. package/dist/components/ui/input.js.map +1 -1
  23. package/dist/index.d.ts +3 -5
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +4 -6
  26. package/dist/index.js.map +1 -1
  27. package/dist/{styles.css → standalone.css} +207 -1537
  28. package/package.json +29 -29
  29. package/src/{styles.css → base.css} +36 -52
  30. package/src/components/App.tsx +41 -5
  31. package/src/components/ai-elements/code-block.tsx +42 -10
  32. package/src/components/internal/Chat.tsx +112 -120
  33. package/src/components/internal/MonacoJsonEditor.tsx +15 -63
  34. package/src/components/internal/Schema.tsx +74 -86
  35. package/src/components/ui/input.tsx +2 -3
  36. package/src/index.ts +5 -14
  37. package/src/integration.css +15 -0
  38. package/src/standalone.css +25 -0
  39. package/dist/components/ConnectionStatus.d.ts +0 -7
  40. package/dist/components/ConnectionStatus.d.ts.map +0 -1
  41. package/dist/components/ConnectionStatus.js +0 -52
  42. package/dist/components/ConnectionStatus.js.map +0 -1
  43. package/dist/components/Inline.d.ts +0 -10
  44. package/dist/components/Inline.d.ts.map +0 -1
  45. package/dist/components/Inline.js +0 -11
  46. package/dist/components/Inline.js.map +0 -1
  47. package/dist/components/ai-elements/artifact.d.ts +0 -24
  48. package/dist/components/ai-elements/artifact.d.ts.map +0 -1
  49. package/dist/components/ai-elements/artifact.js +0 -21
  50. package/dist/components/ai-elements/artifact.js.map +0 -1
  51. package/dist/components/ai-elements/branch.d.ts +0 -21
  52. package/dist/components/ai-elements/branch.d.ts.map +0 -1
  53. package/dist/components/ai-elements/branch.js +0 -71
  54. package/dist/components/ai-elements/branch.js.map +0 -1
  55. package/dist/components/ai-elements/canvas.d.ts +0 -9
  56. package/dist/components/ai-elements/canvas.d.ts.map +0 -1
  57. package/dist/components/ai-elements/canvas.js +0 -6
  58. package/dist/components/ai-elements/canvas.js.map +0 -1
  59. package/dist/components/ai-elements/chain-of-thought.d.ts +0 -30
  60. package/dist/components/ai-elements/chain-of-thought.d.ts.map +0 -1
  61. package/dist/components/ai-elements/chain-of-thought.js +0 -52
  62. package/dist/components/ai-elements/chain-of-thought.js.map +0 -1
  63. package/dist/components/ai-elements/confirmation.d.ts +0 -27
  64. package/dist/components/ai-elements/confirmation.d.ts.map +0 -1
  65. package/dist/components/ai-elements/confirmation.js +0 -57
  66. package/dist/components/ai-elements/confirmation.js.map +0 -1
  67. package/dist/components/ai-elements/connection.d.ts +0 -3
  68. package/dist/components/ai-elements/connection.d.ts.map +0 -1
  69. package/dist/components/ai-elements/connection.js +0 -4
  70. package/dist/components/ai-elements/connection.js.map +0 -1
  71. package/dist/components/ai-elements/context.d.ts +0 -33
  72. package/dist/components/ai-elements/context.d.ts.map +0 -1
  73. package/dist/components/ai-elements/context.js +0 -167
  74. package/dist/components/ai-elements/context.js.map +0 -1
  75. package/dist/components/ai-elements/controls.d.ts +0 -5
  76. package/dist/components/ai-elements/controls.d.ts.map +0 -1
  77. package/dist/components/ai-elements/controls.js +0 -6
  78. package/dist/components/ai-elements/controls.js.map +0 -1
  79. package/dist/components/ai-elements/edge.d.ts +0 -6
  80. package/dist/components/ai-elements/edge.d.ts.map +0 -1
  81. package/dist/components/ai-elements/edge.js +0 -83
  82. package/dist/components/ai-elements/edge.js.map +0 -1
  83. package/dist/components/ai-elements/image.d.ts +0 -7
  84. package/dist/components/ai-elements/image.d.ts.map +0 -1
  85. package/dist/components/ai-elements/image.js +0 -4
  86. package/dist/components/ai-elements/image.js.map +0 -1
  87. package/dist/components/ai-elements/inline-citation.d.ts +0 -39
  88. package/dist/components/ai-elements/inline-citation.d.ts.map +0 -1
  89. package/dist/components/ai-elements/inline-citation.js +0 -62
  90. package/dist/components/ai-elements/inline-citation.js.map +0 -1
  91. package/dist/components/ai-elements/loader.d.ts +0 -6
  92. package/dist/components/ai-elements/loader.d.ts.map +0 -1
  93. package/dist/components/ai-elements/loader.js +0 -5
  94. package/dist/components/ai-elements/loader.js.map +0 -1
  95. package/dist/components/ai-elements/node.d.ts +0 -22
  96. package/dist/components/ai-elements/node.d.ts.map +0 -1
  97. package/dist/components/ai-elements/node.js +0 -12
  98. package/dist/components/ai-elements/node.js.map +0 -1
  99. package/dist/components/ai-elements/open-in-chat.d.ts +0 -29
  100. package/dist/components/ai-elements/open-in-chat.d.ts.map +0 -1
  101. package/dist/components/ai-elements/open-in-chat.js +0 -97
  102. package/dist/components/ai-elements/open-in-chat.js.map +0 -1
  103. package/dist/components/ai-elements/panel.d.ts +0 -6
  104. package/dist/components/ai-elements/panel.d.ts.map +0 -1
  105. package/dist/components/ai-elements/panel.js +0 -5
  106. package/dist/components/ai-elements/panel.js.map +0 -1
  107. package/dist/components/ai-elements/plan.d.ts +0 -26
  108. package/dist/components/ai-elements/plan.d.ts.map +0 -1
  109. package/dist/components/ai-elements/plan.js +0 -32
  110. package/dist/components/ai-elements/plan.js.map +0 -1
  111. package/dist/components/ai-elements/queue.d.ts +0 -62
  112. package/dist/components/ai-elements/queue.d.ts.map +0 -1
  113. package/dist/components/ai-elements/queue.js +0 -25
  114. package/dist/components/ai-elements/queue.js.map +0 -1
  115. package/dist/components/ai-elements/reasoning.d.ts +0 -17
  116. package/dist/components/ai-elements/reasoning.d.ts.map +0 -1
  117. package/dist/components/ai-elements/reasoning.js +0 -77
  118. package/dist/components/ai-elements/reasoning.js.map +0 -1
  119. package/dist/components/ai-elements/response.d.ts +0 -6
  120. package/dist/components/ai-elements/response.d.ts.map +0 -1
  121. package/dist/components/ai-elements/response.js +0 -8
  122. package/dist/components/ai-elements/response.js.map +0 -1
  123. package/dist/components/ai-elements/sources.d.ts +0 -13
  124. package/dist/components/ai-elements/sources.d.ts.map +0 -1
  125. package/dist/components/ai-elements/sources.js +0 -10
  126. package/dist/components/ai-elements/sources.js.map +0 -1
  127. package/dist/components/ai-elements/suggestion.d.ts +0 -11
  128. package/dist/components/ai-elements/suggestion.d.ts.map +0 -1
  129. package/dist/components/ai-elements/suggestion.js +0 -13
  130. package/dist/components/ai-elements/suggestion.js.map +0 -1
  131. package/dist/components/ai-elements/task.d.ts +0 -15
  132. package/dist/components/ai-elements/task.d.ts.map +0 -1
  133. package/dist/components/ai-elements/task.js +0 -11
  134. package/dist/components/ai-elements/task.js.map +0 -1
  135. package/dist/components/ai-elements/tool.d.ts +0 -24
  136. package/dist/components/ai-elements/tool.d.ts.map +0 -1
  137. package/dist/components/ai-elements/tool.js +0 -47
  138. package/dist/components/ai-elements/tool.js.map +0 -1
  139. package/dist/components/ai-elements/toolbar.d.ts +0 -6
  140. package/dist/components/ai-elements/toolbar.d.ts.map +0 -1
  141. package/dist/components/ai-elements/toolbar.js +0 -5
  142. package/dist/components/ai-elements/toolbar.js.map +0 -1
  143. package/dist/components/ai-elements/web-preview.d.ts +0 -35
  144. package/dist/components/ai-elements/web-preview.d.ts.map +0 -1
  145. package/dist/components/ai-elements/web-preview.js +0 -63
  146. package/dist/components/ai-elements/web-preview.js.map +0 -1
  147. package/dist/components/ui/alert.d.ts +0 -10
  148. package/dist/components/ui/alert.d.ts.map +0 -1
  149. package/dist/components/ui/alert.js +0 -25
  150. package/dist/components/ui/alert.js.map +0 -1
  151. package/dist/components/ui/badge.d.ts +0 -10
  152. package/dist/components/ui/badge.d.ts.map +0 -1
  153. package/dist/components/ui/badge.js +0 -23
  154. package/dist/components/ui/badge.js.map +0 -1
  155. package/dist/components/ui/card.d.ts +0 -10
  156. package/dist/components/ui/card.d.ts.map +0 -1
  157. package/dist/components/ui/card.js +0 -25
  158. package/dist/components/ui/card.js.map +0 -1
  159. package/dist/components/ui/carousel.d.ts +0 -20
  160. package/dist/components/ui/carousel.d.ts.map +0 -1
  161. package/dist/components/ui/carousel.js +0 -92
  162. package/dist/components/ui/carousel.js.map +0 -1
  163. package/dist/components/ui/checkbox.d.ts +0 -5
  164. package/dist/components/ui/checkbox.d.ts.map +0 -1
  165. package/dist/components/ui/checkbox.js +0 -9
  166. package/dist/components/ui/checkbox.js.map +0 -1
  167. package/dist/components/ui/collapsible.d.ts +0 -6
  168. package/dist/components/ui/collapsible.d.ts.map +0 -1
  169. package/dist/components/ui/collapsible.js +0 -14
  170. package/dist/components/ui/collapsible.js.map +0 -1
  171. package/dist/components/ui/field.d.ts +0 -25
  172. package/dist/components/ui/field.d.ts.map +0 -1
  173. package/dist/components/ui/field.js +0 -74
  174. package/dist/components/ui/field.js.map +0 -1
  175. package/dist/components/ui/form.d.ts +0 -25
  176. package/dist/components/ui/form.d.ts.map +0 -1
  177. package/dist/components/ui/form.js +0 -58
  178. package/dist/components/ui/form.js.map +0 -1
  179. package/dist/components/ui/label.d.ts +0 -5
  180. package/dist/components/ui/label.d.ts.map +0 -1
  181. package/dist/components/ui/label.js +0 -9
  182. package/dist/components/ui/label.js.map +0 -1
  183. package/dist/components/ui/progress.d.ts +0 -5
  184. package/dist/components/ui/progress.d.ts.map +0 -1
  185. package/dist/components/ui/progress.js +0 -9
  186. package/dist/components/ui/progress.js.map +0 -1
  187. package/dist/components/ui/separator.d.ts +0 -5
  188. package/dist/components/ui/separator.d.ts.map +0 -1
  189. package/dist/components/ui/separator.js +0 -9
  190. package/dist/components/ui/separator.js.map +0 -1
  191. package/dist/components/ui/switch.d.ts +0 -5
  192. package/dist/components/ui/switch.d.ts.map +0 -1
  193. package/dist/components/ui/switch.js +0 -8
  194. package/dist/components/ui/switch.js.map +0 -1
  195. package/dist/components/ui/tabs.d.ts +0 -8
  196. package/dist/components/ui/tabs.d.ts.map +0 -1
  197. package/dist/components/ui/tabs.js +0 -17
  198. package/dist/components/ui/tabs.js.map +0 -1
  199. package/dist/components/ui/toggle.d.ts +0 -10
  200. package/dist/components/ui/toggle.d.ts.map +0 -1
  201. package/dist/components/ui/toggle.js +0 -26
  202. package/dist/components/ui/toggle.js.map +0 -1
  203. package/dist/components.d.ts +0 -12
  204. package/dist/components.d.ts.map +0 -1
  205. package/dist/components.js +0 -13
  206. package/dist/components.js.map +0 -1
  207. package/dist/hooks/index.d.ts +0 -7
  208. package/dist/hooks/index.d.ts.map +0 -1
  209. package/dist/hooks/index.js +0 -5
  210. package/dist/hooks/index.js.map +0 -1
  211. package/dist/hooks/useWorkbenchSchemas.d.ts +0 -56
  212. package/dist/hooks/useWorkbenchSchemas.d.ts.map +0 -1
  213. package/dist/hooks/useWorkbenchSchemas.js +0 -63
  214. package/dist/hooks/useWorkbenchSchemas.js.map +0 -1
  215. package/src/components/ConnectionStatus.tsx +0 -67
  216. package/src/components/Inline.tsx +0 -16
  217. package/src/components/ai-elements/artifact.tsx +0 -118
  218. package/src/components/ai-elements/branch.tsx +0 -187
  219. package/src/components/ai-elements/canvas.tsx +0 -24
  220. package/src/components/ai-elements/chain-of-thought.tsx +0 -198
  221. package/src/components/ai-elements/confirmation.tsx +0 -119
  222. package/src/components/ai-elements/connection.tsx +0 -16
  223. package/src/components/ai-elements/context.tsx +0 -357
  224. package/src/components/ai-elements/controls.tsx +0 -18
  225. package/src/components/ai-elements/edge.tsx +0 -131
  226. package/src/components/ai-elements/image.tsx +0 -16
  227. package/src/components/ai-elements/inline-citation.tsx +0 -246
  228. package/src/components/ai-elements/loader.tsx +0 -88
  229. package/src/components/ai-elements/node.tsx +0 -66
  230. package/src/components/ai-elements/open-in-chat.tsx +0 -333
  231. package/src/components/ai-elements/panel.tsx +0 -12
  232. package/src/components/ai-elements/plan.tsx +0 -123
  233. package/src/components/ai-elements/queue.tsx +0 -231
  234. package/src/components/ai-elements/reasoning.tsx +0 -163
  235. package/src/components/ai-elements/response.tsx +0 -19
  236. package/src/components/ai-elements/sources.tsx +0 -53
  237. package/src/components/ai-elements/suggestion.tsx +0 -47
  238. package/src/components/ai-elements/task.tsx +0 -64
  239. package/src/components/ai-elements/tool.tsx +0 -136
  240. package/src/components/ai-elements/toolbar.tsx +0 -13
  241. package/src/components/ai-elements/web-preview.tsx +0 -238
  242. package/src/components/ui/alert.tsx +0 -60
  243. package/src/components/ui/badge.tsx +0 -40
  244. package/src/components/ui/card.tsx +0 -41
  245. package/src/components/ui/carousel.tsx +0 -234
  246. package/src/components/ui/checkbox.tsx +0 -27
  247. package/src/components/ui/collapsible.tsx +0 -21
  248. package/src/components/ui/field.tsx +0 -234
  249. package/src/components/ui/form.tsx +0 -154
  250. package/src/components/ui/label.tsx +0 -21
  251. package/src/components/ui/progress.tsx +0 -28
  252. package/src/components/ui/separator.tsx +0 -28
  253. package/src/components/ui/switch.tsx +0 -26
  254. package/src/components/ui/tabs.tsx +0 -52
  255. package/src/components/ui/toggle.tsx +0 -44
  256. package/src/components.tsx +0 -29
  257. package/src/hooks/index.ts +0 -20
  258. package/src/hooks/useWorkbenchSchemas.ts +0 -69
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/workbench",
3
- "version": "0.0.87",
3
+ "version": "0.0.89",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Agentuity employees and contributors",
6
6
  "type": "module",
@@ -9,13 +9,16 @@
9
9
  "exports": {
10
10
  ".": {
11
11
  "types": "./dist/index.d.ts",
12
- "import": "./dist/index.js"
12
+ "import": "./dist/index.js",
13
+ "style": "./src/integration.css"
13
14
  },
14
15
  "./server": {
15
16
  "types": "./dist/server.d.ts",
16
17
  "import": "./dist/server.js"
17
18
  },
18
- "./styles": "./dist/styles.css"
19
+ "./styles": "./src/integration.css",
20
+ "./styles-standalone": "./dist/standalone.css",
21
+ "./base": "./src/base.css"
19
22
  },
20
23
  "files": [
21
24
  "README.md",
@@ -26,38 +29,22 @@
26
29
  "clean": "rm -rf dist",
27
30
  "build": "bun run build:ts && bun run build:css",
28
31
  "build:ts": "bunx tsc --build --force",
29
- "build:css": "bun x tailwindcss -i ./src/styles.css -o ./dist/styles.css",
32
+ "build:css": "bun x tailwindcss -i ./src/standalone.css -o ./dist/standalone.css",
30
33
  "dev": "bun run build && concurrently \"bun run dev:ts\" \"bun run dev:css\" --names \"ts,css\" --prefix-colors \"blue,yellow\"",
31
34
  "dev:ts": "bunx tsc --watch",
32
- "dev:css": "bun x tailwindcss -i ./src/styles.css -o ./dist/styles.css --watch",
35
+ "dev:css": "bun x tailwindcss -i ./src/standalone.css -o ./dist/standalone.css --watch",
33
36
  "typecheck": "bunx tsc --noEmit",
34
37
  "prepublishOnly": "bun run clean && bun run build"
35
38
  },
36
39
  "dependencies": {
37
- "@agentuity/core": "0.0.87",
38
- "@agentuity/react": "0.0.87",
40
+ "@agentuity/core": "0.0.89",
41
+ "@agentuity/react": "0.0.89",
39
42
  "@ai-sdk/react": "^2.0.82",
40
43
  "@hookform/resolvers": "^5.2.2",
41
- "@radix-ui/react-avatar": "^1.1.10",
42
- "@radix-ui/react-checkbox": "^1.3.3",
43
- "@radix-ui/react-collapsible": "^1.1.12",
44
- "@radix-ui/react-dialog": "^1.1.15",
45
- "@radix-ui/react-dropdown-menu": "^2.1.16",
46
- "@radix-ui/react-hover-card": "^1.1.15",
47
- "@radix-ui/react-label": "^2.1.7",
48
- "@radix-ui/react-popover": "^1.1.15",
49
- "@radix-ui/react-progress": "^1.1.7",
50
- "@radix-ui/react-scroll-area": "^1.2.10",
51
- "@radix-ui/react-select": "^2.2.6",
52
- "@radix-ui/react-separator": "^1.1.7",
53
- "@radix-ui/react-slot": "^1.2.3",
54
- "@radix-ui/react-switch": "^1.2.6",
55
- "@radix-ui/react-tabs": "^1.1.13",
56
- "@radix-ui/react-toggle": "^1.1.10",
57
- "@radix-ui/react-tooltip": "^1.2.8",
58
- "@radix-ui/react-use-controllable-state": "^1.2.2",
59
- "@xyflow/react": "^12.9.1",
60
44
  "@monaco-editor/react": "^4.6.0",
45
+ "@shikijs/langs": "^3.19.0",
46
+ "@shikijs/themes": "^3.19.0",
47
+ "@xyflow/react": "^12.9.1",
61
48
  "ai": "^5.0.82",
62
49
  "bun-plugin-tailwind": "^0.0.14",
63
50
  "class-variance-authority": "^0.7.1",
@@ -81,26 +68,39 @@
81
68
  "zod-from-json-schema": "^0.5.2"
82
69
  },
83
70
  "devDependencies": {
84
- "@tailwindcss/cli": "^4.1.17",
71
+ "@tailwindcss/cli": "^4.1.12",
85
72
  "@types/bun": "latest",
86
73
  "@types/hast": "^3.0.4",
87
74
  "bun-types": "latest",
88
75
  "concurrently": "^9.2.1",
89
- "tailwindcss": "^4.1.11",
76
+ "tailwindcss": "^4.1.12",
90
77
  "typescript": "^5.9.0"
91
78
  },
92
79
  "peerDependencies": {
80
+ "@radix-ui/react-avatar": "^1.1.8",
81
+ "@radix-ui/react-dialog": "^1.1.12",
82
+ "@radix-ui/react-dropdown-menu": "^2.1.13",
83
+ "@radix-ui/react-hover-card": "^1.1.12",
84
+ "@radix-ui/react-popover": "^1.1.12",
85
+ "@radix-ui/react-scroll-area": "^1.2.7",
86
+ "@radix-ui/react-select": "^2.2.3",
87
+ "@radix-ui/react-slot": "^1.1.2",
88
+ "@radix-ui/react-tooltip": "^1.2.5",
89
+ "@radix-ui/react-use-controllable-state": "^1.2.2",
93
90
  "@types/react": "^19.0.0",
94
91
  "@types/react-dom": "^19.0.0",
95
92
  "react": "^19.0.0",
96
93
  "react-dom": "^19.0.0"
97
94
  },
95
+ "resolutions": {
96
+ "@radix-ui/react-dismissable-layer": "1.1.5",
97
+ "@radix-ui/react-focus-scope": "1.1.2"
98
+ },
98
99
  "publishConfig": {
99
100
  "access": "public"
100
101
  },
101
102
  "sideEffects": [
102
103
  "**/*.css",
103
- "src/components/ai-elements/canvas.tsx",
104
104
  "src/components/internal/Chat.tsx"
105
105
  ]
106
106
  }
@@ -1,8 +1,5 @@
1
- @import url('https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&family=Geist:wght@100..900&display=block');
2
- @import 'tailwindcss';
3
- @plugin "tailwindcss-animate";
4
- @variant dark (&:is(.dark *));
5
- @import 'tailwindcss';
1
+ /* Common base CSS - shared between standalone and integration versions */
2
+ /* This file contains CSS variables, theme, and keyframes used by both versions */
6
3
 
7
4
  :root {
8
5
  --background: hsl(0 0% 100%);
@@ -173,63 +170,50 @@
173
170
  --animate-accordion-down: accordion-down 0.2s ease-out;
174
171
  --animate-accordion-up: accordion-up 0.2s ease-out;
175
172
  --animate-ellipsis: ellipsis 1.5s steps(4, end) infinite;
173
+ }
176
174
 
177
- @keyframes accordion-down {
178
- from {
179
- height: 0;
180
- }
181
- to {
182
- height: var(--radix-accordion-content-height);
183
- }
175
+ @keyframes accordion-down {
176
+ from {
177
+ height: 0;
184
178
  }
185
-
186
- @keyframes accordion-up {
187
- from {
188
- height: var(--radix-accordion-content-height);
189
- }
190
- to {
191
- height: 0;
192
- }
179
+ to {
180
+ height: var(--radix-accordion-content-height);
193
181
  }
182
+ }
194
183
 
195
- @keyframes ellipsis {
196
- 0% {
197
- content: '.';
198
- }
199
- 25% {
200
- content: '..';
201
- }
202
- 50% {
203
- content: '...';
204
- }
205
- 75% {
206
- content: '';
207
- }
184
+ @keyframes accordion-up {
185
+ from {
186
+ height: var(--radix-accordion-content-height);
187
+ }
188
+ to {
189
+ height: 0;
208
190
  }
209
191
  }
210
192
 
211
- @layer base {
212
- :root {
213
- @apply font-sans;
193
+ @keyframes ellipsis {
194
+ 0% {
195
+ content: '.';
214
196
  }
215
-
216
- * {
217
- @apply border-border outline-ring/50;
197
+ 25% {
198
+ content: '..';
218
199
  }
219
-
220
- #root {
221
- @apply w-full h-screen relative flex flex-col m-0 bg-background text-foreground;
200
+ 50% {
201
+ content: '...';
222
202
  }
223
-
224
- button:not([disabled]):not([aria-disabled='true']),
225
- [role='button']:not([disabled]):not([aria-disabled='true']) {
226
- @apply cursor-pointer;
203
+ 75% {
204
+ content: '';
227
205
  }
206
+ }
228
207
 
229
- [data-loading]::after {
230
- content: '.';
231
- display: inline-block;
232
- width: 1em;
233
- @apply animate-ellipsis;
234
- }
208
+ /* Shared base styles for buttons and loading indicators */
209
+ button:not([disabled]):not([aria-disabled='true']),
210
+ [role='button']:not([disabled]):not([aria-disabled='true']) {
211
+ cursor: pointer;
212
+ }
213
+
214
+ [data-loading]::after {
215
+ content: '.';
216
+ display: inline-block;
217
+ width: 1em;
218
+ animation: ellipsis 1.5s steps(4, end) infinite;
235
219
  }
@@ -1,25 +1,61 @@
1
- import React from 'react';
1
+ import React, { useState } from 'react';
2
2
  import { WorkbenchProvider } from './internal/WorkbenchProvider';
3
3
  import { Header } from './internal/Header';
4
4
  import { Chat } from './internal/Chat';
5
+ import { Schema } from './internal/Schema';
5
6
  import { ThemeProvider } from './ui/theme-provider';
6
7
  import { ResizableProvider } from './ui/resizable-provider';
8
+ import { ResizablePanelGroup, ResizablePanel, ResizableHandle } from './ui/resizable';
9
+ import { useResizable } from './ui/resizable-provider';
7
10
  import { decodeWorkbenchConfig } from '@agentuity/core/workbench';
8
11
 
9
12
  export interface AppProps {
10
13
  configBase64: string;
11
14
  }
12
15
 
16
+ function AppContent() {
17
+ const [schemaOpen, setSchemaOpen] = useState(false);
18
+ const { getPanelSizes, setPanelSizes } = useResizable();
19
+
20
+ const defaultSizes = [55, 45];
21
+ const panelSizes = getPanelSizes('main-layout') || defaultSizes;
22
+
23
+ return (
24
+ <div className="flex flex-col h-full">
25
+ <Header />
26
+ <ResizablePanelGroup
27
+ direction="horizontal"
28
+ className="flex-1"
29
+ onLayout={(sizes) => {
30
+ // Only save sizes when schema panel is open
31
+ if (schemaOpen && sizes.length === 2) {
32
+ setPanelSizes('main-layout', sizes);
33
+ }
34
+ }}
35
+ >
36
+ <ResizablePanel defaultSize={panelSizes[0]} minSize={30} className="flex flex-col">
37
+ <Chat schemaOpen={schemaOpen} onSchemaToggle={() => setSchemaOpen(!schemaOpen)} />
38
+ </ResizablePanel>
39
+ {schemaOpen && (
40
+ <>
41
+ <ResizableHandle withHandle />
42
+ <ResizablePanel defaultSize={panelSizes[1]} minSize={20} maxSize={50}>
43
+ <Schema onOpenChange={setSchemaOpen} />
44
+ </ResizablePanel>
45
+ </>
46
+ )}
47
+ </ResizablePanelGroup>
48
+ </div>
49
+ );
50
+ }
51
+
13
52
  export function App({ configBase64 }: AppProps) {
14
53
  const decodedConfig = decodeWorkbenchConfig(configBase64);
15
54
  return (
16
55
  <WorkbenchProvider config={decodedConfig}>
17
56
  <ThemeProvider>
18
57
  <ResizableProvider>
19
- <div className="flex flex-col h-screen">
20
- <Header />
21
- <Chat />
22
- </div>
58
+ <AppContent />
23
59
  </ResizableProvider>
24
60
  </ThemeProvider>
25
61
  </WorkbenchProvider>
@@ -13,11 +13,28 @@ import {
13
13
  useRef,
14
14
  useState,
15
15
  } from 'react';
16
- import { type BundledLanguage, codeToHtml, type ShikiTransformer } from 'shiki';
16
+ import { createHighlighterCore } from 'shiki/core';
17
+ import { createOnigurumaEngine } from 'shiki/engine/oniguruma';
18
+ import type { ShikiTransformer, ThemeRegistration } from 'shiki';
19
+ import oneLightModule from '@shikijs/themes/one-light';
20
+ import oneDarkProModule from '@shikijs/themes/one-dark-pro';
21
+ import jsonLang from '@shikijs/langs/json';
22
+ import javascriptLang from '@shikijs/langs/javascript';
23
+ import typescriptLang from '@shikijs/langs/typescript';
24
+
25
+ // Extract theme objects from default exports
26
+ const oneLight = (
27
+ 'default' in oneLightModule ? oneLightModule.default : oneLightModule
28
+ ) as ThemeRegistration;
29
+ const oneDarkPro = (
30
+ 'default' in oneDarkProModule ? oneDarkProModule.default : oneDarkProModule
31
+ ) as ThemeRegistration;
32
+
33
+ type SupportedLanguage = 'json' | 'javascript' | 'typescript';
17
34
 
18
35
  type CodeBlockProps = HTMLAttributes<HTMLDivElement> & {
19
36
  code: string;
20
- language: BundledLanguage;
37
+ language: SupportedLanguage;
21
38
  showLineNumbers?: boolean;
22
39
  };
23
40
 
@@ -29,6 +46,20 @@ const CodeBlockContext = createContext<CodeBlockContextType>({
29
46
  code: '',
30
47
  });
31
48
 
49
+ // Initialize highlighter with only the languages and themes we need
50
+ let highlighterPromise: ReturnType<typeof createHighlighterCore> | null = null;
51
+
52
+ function getHighlighter() {
53
+ if (!highlighterPromise) {
54
+ highlighterPromise = createHighlighterCore({
55
+ themes: [oneLight, oneDarkPro],
56
+ langs: [jsonLang, javascriptLang, typescriptLang],
57
+ engine: createOnigurumaEngine(import('shiki/wasm')),
58
+ });
59
+ }
60
+ return highlighterPromise;
61
+ }
62
+
32
63
  const lineNumberTransformer: ShikiTransformer = {
33
64
  name: 'line-numbers',
34
65
  line(node: Element, line: number) {
@@ -52,23 +83,24 @@ const lineNumberTransformer: ShikiTransformer = {
52
83
 
53
84
  export async function highlightCode(
54
85
  code: string,
55
- language: BundledLanguage,
86
+ language: SupportedLanguage,
56
87
  showLineNumbers = false
57
- ) {
88
+ ): Promise<readonly [string, string]> {
89
+ const highlighter = await getHighlighter();
58
90
  const transformers: ShikiTransformer[] = showLineNumbers ? [lineNumberTransformer] : [];
59
91
 
60
- return await Promise.all([
61
- codeToHtml(code, {
92
+ return [
93
+ highlighter.codeToHtml(code, {
62
94
  lang: language,
63
- theme: 'one-light',
95
+ theme: oneLight.name ?? 'one-light',
64
96
  transformers,
65
97
  }),
66
- codeToHtml(code, {
98
+ highlighter.codeToHtml(code, {
67
99
  lang: language,
68
- theme: 'one-dark-pro',
100
+ theme: oneDarkPro.name ?? 'one-dark-pro',
69
101
  transformers,
70
102
  }),
71
- ]);
103
+ ] as const;
72
104
  }
73
105
 
74
106
  export const CodeBlock = ({
@@ -1,4 +1,5 @@
1
- import '../../styles.css';
1
+ /* Styles should be imported in app's CSS file (e.g., globals.css) */
2
+ /* import '../../styles.css'; */
2
3
  import React, { useState } from 'react';
3
4
  import { ChevronRight, Copy, Loader, RefreshCcw } from 'lucide-react';
4
5
  import { Action, Actions } from '../ai-elements/actions';
@@ -13,17 +14,18 @@ import { Shimmer } from '../ai-elements/shimmer';
13
14
  import { cn } from '../../lib/utils';
14
15
  import { useWorkbench } from './WorkbenchProvider';
15
16
  import { useLogger } from '../../hooks/useLogger';
16
- import { Schema } from './Schema';
17
17
 
18
18
  export interface ChatProps {
19
19
  className?: string;
20
+ schemaOpen: boolean;
21
+ onSchemaToggle: () => void;
20
22
  }
21
23
 
22
24
  /**
23
25
  * Chat component - conversation and input area (everything except header)
24
26
  * Must be used within WorkbenchProvider
25
27
  */
26
- export function Chat({ className: _className }: ChatProps) {
28
+ export function Chat({ className: _className, schemaOpen, onSchemaToggle }: ChatProps) {
27
29
  const logger = useLogger('Chat');
28
30
  const {
29
31
  agents,
@@ -36,7 +38,6 @@ export function Chat({ className: _className }: ChatProps) {
36
38
  } = useWorkbench();
37
39
 
38
40
  const [value, setValue] = useState('');
39
- const [schemaOpen, setSchemaOpen] = useState(false);
40
41
 
41
42
  const handleSubmit = async () => {
42
43
  logger.debug('🎯 Chat handleSubmit - selectedAgent:', selectedAgent, 'value:', value);
@@ -60,140 +61,131 @@ export function Chat({ className: _className }: ChatProps) {
60
61
  };
61
62
 
62
63
  return (
63
- <div className="relative flex flex-1 overflow-hidden">
64
- <div
65
- className={cn(
66
- 'flex flex-col flex-1 transition-all duration-300 ease-in-out min-w-0',
67
- schemaOpen && 'mr-[600px]'
68
- )}
69
- >
70
- <Conversation className="flex-1 overflow-y-auto">
71
- <ConversationContent className="pb-0">
72
- {messages.map((message) => {
73
- const { role, parts, id } = message;
74
- const isStreaming = parts.some(
75
- (part) => part.type === 'text' && part.state === 'streaming'
76
- );
77
- const tokens =
78
- 'tokens' in message ? (message as { tokens?: string }).tokens : undefined;
79
- const duration =
80
- 'duration' in message
81
- ? (message as { duration?: string }).duration
82
- : undefined;
64
+ <div className="flex flex-col h-full overflow-hidden">
65
+ <Conversation className="flex-1 overflow-y-auto">
66
+ <ConversationContent className="pb-0">
67
+ {messages.map((message) => {
68
+ const { role, parts, id } = message;
69
+ const isStreaming = parts.some(
70
+ (part) => part.type === 'text' && part.state === 'streaming'
71
+ );
72
+ const tokens =
73
+ 'tokens' in message ? (message as { tokens?: string }).tokens : undefined;
74
+ const duration =
75
+ 'duration' in message
76
+ ? (message as { duration?: string }).duration
77
+ : undefined;
83
78
 
84
- return (
85
- <div key={id} className="mb-2">
86
- {role === 'assistant' && (
87
- <div
79
+ return (
80
+ <div key={id} className="mb-2">
81
+ {role === 'assistant' && (
82
+ <div
83
+ className={cn(
84
+ 'w-fit flex items-center mb-2 text-muted-foreground text-sm transition-colors',
85
+ !isStreaming && 'hover:text-foreground cursor-pointer'
86
+ )}
87
+ >
88
+ <Loader
88
89
  className={cn(
89
- 'w-fit flex items-center mb-2 text-muted-foreground text-sm transition-colors',
90
- !isStreaming && 'hover:text-foreground cursor-pointer'
90
+ 'size-4 transition-all',
91
+ isStreaming || isLoading ? 'animate-spin mr-2' : 'w-0 mr-2.5'
91
92
  )}
92
- >
93
- <Loader
94
- className={cn(
95
- 'size-4 transition-all',
96
- isStreaming || isLoading ? 'animate-spin mr-2' : 'w-0 mr-2.5'
97
- )}
98
- />
99
-
100
- {isStreaming || isLoading ? (
101
- <Shimmer duration={1}>Running...</Shimmer>
102
- ) : (
103
- <>
104
- {duration && (
105
- <>
106
- Ran for
107
- <span className="mx-1">{duration}</span>
108
- </>
109
- )}
110
- {duration && tokens && ` and consumed ${tokens} tokens`}
111
- {(duration || tokens) && <ChevronRight className="size-4" />}
112
- </>
113
- )}
114
- </div>
115
- )}
93
+ />
116
94
 
117
- {(role === 'user' || !(isStreaming || isLoading)) && (
118
- <>
119
- <Message
120
- key={id}
121
- from={role as 'user' | 'system' | 'assistant'}
122
- className="p-0"
123
- >
124
- <MessageContent>
125
- {parts.map((part, index) => {
126
- switch (part.type) {
127
- case 'text':
128
- return (
129
- <div key={`${id}-${part.text}-${index}`}>
130
- {part.text || ''}
131
- </div>
132
- );
133
- }
134
- })}
135
- </MessageContent>
136
- </Message>
137
-
138
- <Actions
139
- className={cn('mt-1 gap-0', role === 'user' && 'justify-end')}
140
- >
141
- {role === 'user' && (
142
- <Action
143
- label="Retry"
144
- className="size-8 hover:bg-transparent!"
145
- onClick={() =>
146
- setValue(
147
- parts
148
- .filter((part) => part.type === 'text')
149
- .map((part) => part.text)
150
- .join('')
151
- )
152
- }
153
- >
154
- <RefreshCcw className="size-4" />
155
- </Action>
95
+ {isStreaming || isLoading ? (
96
+ <Shimmer duration={1}>Running...</Shimmer>
97
+ ) : (
98
+ <>
99
+ {duration && (
100
+ <>
101
+ Ran for
102
+ <span className="mx-1">{duration}</span>
103
+ </>
156
104
  )}
105
+ {duration && tokens && ` and consumed ${tokens} tokens`}
106
+ {(duration || tokens) && <ChevronRight className="size-4" />}
107
+ </>
108
+ )}
109
+ </div>
110
+ )}
157
111
 
112
+ {(role === 'user' || !(isStreaming || isLoading)) && (
113
+ <>
114
+ <Message
115
+ key={id}
116
+ from={role as 'user' | 'system' | 'assistant'}
117
+ className="p-0"
118
+ >
119
+ <MessageContent>
120
+ {parts.map((part, index) => {
121
+ switch (part.type) {
122
+ case 'text':
123
+ return (
124
+ <div key={`${id}-${part.text}-${index}`}>
125
+ {part.text || ''}
126
+ </div>
127
+ );
128
+ }
129
+ })}
130
+ </MessageContent>
131
+ </Message>
132
+
133
+ <Actions
134
+ className={cn('mt-1 gap-0', role === 'user' && 'justify-end')}
135
+ >
136
+ {role === 'user' && (
158
137
  <Action
138
+ label="Retry"
139
+ className="size-8 hover:bg-transparent!"
159
140
  onClick={() =>
160
- navigator.clipboard.writeText(
141
+ setValue(
161
142
  parts
162
143
  .filter((part) => part.type === 'text')
163
144
  .map((part) => part.text)
164
145
  .join('')
165
146
  )
166
147
  }
167
- label="Copy"
168
- className="size-8 hover:bg-transparent!"
169
148
  >
170
- <Copy className="size-4" />
149
+ <RefreshCcw className="size-4" />
171
150
  </Action>
172
- </Actions>
173
- </>
174
- )}
175
- </div>
176
- );
177
- })}
178
- </ConversationContent>
151
+ )}
179
152
 
180
- <ConversationScrollButton />
181
- </Conversation>
182
- <InputSection
183
- value={value}
184
- onChange={setValue}
185
- onSubmit={handleSubmit}
186
- isLoading={isLoading}
187
- agents={agents}
188
- selectedAgent={selectedAgent}
189
- setSelectedAgent={setSelectedAgent}
190
- suggestions={suggestions}
191
- isSchemaOpen={schemaOpen}
192
- onSchemaToggle={() => setSchemaOpen(!schemaOpen)}
193
- />
194
- </div>
153
+ <Action
154
+ onClick={() =>
155
+ navigator.clipboard.writeText(
156
+ parts
157
+ .filter((part) => part.type === 'text')
158
+ .map((part) => part.text)
159
+ .join('')
160
+ )
161
+ }
162
+ label="Copy"
163
+ className="size-8 hover:bg-transparent!"
164
+ >
165
+ <Copy className="size-4" />
166
+ </Action>
167
+ </Actions>
168
+ </>
169
+ )}
170
+ </div>
171
+ );
172
+ })}
173
+ </ConversationContent>
195
174
 
196
- <Schema open={schemaOpen} onOpenChange={setSchemaOpen} />
175
+ <ConversationScrollButton />
176
+ </Conversation>
177
+ <InputSection
178
+ value={value}
179
+ onChange={setValue}
180
+ onSubmit={handleSubmit}
181
+ isLoading={isLoading}
182
+ agents={agents}
183
+ selectedAgent={selectedAgent}
184
+ setSelectedAgent={setSelectedAgent}
185
+ suggestions={suggestions}
186
+ isSchemaOpen={schemaOpen}
187
+ onSchemaToggle={onSchemaToggle}
188
+ />
197
189
  </div>
198
190
  );
199
191
  }