@agentuity/workbench 0.0.86 → 0.0.88

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 (271) 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/InputSection.d.ts +3 -2
  13. package/dist/components/internal/InputSection.d.ts.map +1 -1
  14. package/dist/components/internal/InputSection.js +68 -6
  15. package/dist/components/internal/InputSection.js.map +1 -1
  16. package/dist/components/internal/MonacoJsonEditor.d.ts +3 -1
  17. package/dist/components/internal/MonacoJsonEditor.d.ts.map +1 -1
  18. package/dist/components/internal/MonacoJsonEditor.js +41 -57
  19. package/dist/components/internal/MonacoJsonEditor.js.map +1 -1
  20. package/dist/components/internal/Schema.d.ts +1 -2
  21. package/dist/components/internal/Schema.d.ts.map +1 -1
  22. package/dist/components/internal/Schema.js +2 -3
  23. package/dist/components/internal/Schema.js.map +1 -1
  24. package/dist/components/internal/WorkbenchProvider.d.ts.map +1 -1
  25. package/dist/components/internal/WorkbenchProvider.js +55 -8
  26. package/dist/components/internal/WorkbenchProvider.js.map +1 -1
  27. package/dist/components/ui/button.d.ts +1 -1
  28. package/dist/components/ui/input-group.js +2 -2
  29. package/dist/components/ui/input-group.js.map +1 -1
  30. package/dist/components/ui/input.d.ts.map +1 -1
  31. package/dist/components/ui/input.js +1 -1
  32. package/dist/components/ui/input.js.map +1 -1
  33. package/dist/index.d.ts +3 -5
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +4 -6
  36. package/dist/index.js.map +1 -1
  37. package/dist/{styles.css → standalone.css} +206 -1554
  38. package/package.json +29 -29
  39. package/src/{styles.css → base.css} +36 -52
  40. package/src/components/App.tsx +41 -5
  41. package/src/components/ai-elements/code-block.tsx +42 -10
  42. package/src/components/internal/Chat.tsx +112 -119
  43. package/src/components/internal/InputSection.tsx +79 -9
  44. package/src/components/internal/MonacoJsonEditor.tsx +59 -65
  45. package/src/components/internal/Schema.tsx +74 -86
  46. package/src/components/internal/WorkbenchProvider.tsx +69 -10
  47. package/src/components/ui/input-group.tsx +2 -2
  48. package/src/components/ui/input.tsx +2 -3
  49. package/src/index.ts +5 -14
  50. package/src/integration.css +15 -0
  51. package/src/standalone.css +25 -0
  52. package/dist/components/ConnectionStatus.d.ts +0 -7
  53. package/dist/components/ConnectionStatus.d.ts.map +0 -1
  54. package/dist/components/ConnectionStatus.js +0 -52
  55. package/dist/components/ConnectionStatus.js.map +0 -1
  56. package/dist/components/Inline.d.ts +0 -10
  57. package/dist/components/Inline.d.ts.map +0 -1
  58. package/dist/components/Inline.js +0 -11
  59. package/dist/components/Inline.js.map +0 -1
  60. package/dist/components/ai-elements/artifact.d.ts +0 -24
  61. package/dist/components/ai-elements/artifact.d.ts.map +0 -1
  62. package/dist/components/ai-elements/artifact.js +0 -21
  63. package/dist/components/ai-elements/artifact.js.map +0 -1
  64. package/dist/components/ai-elements/branch.d.ts +0 -21
  65. package/dist/components/ai-elements/branch.d.ts.map +0 -1
  66. package/dist/components/ai-elements/branch.js +0 -71
  67. package/dist/components/ai-elements/branch.js.map +0 -1
  68. package/dist/components/ai-elements/canvas.d.ts +0 -9
  69. package/dist/components/ai-elements/canvas.d.ts.map +0 -1
  70. package/dist/components/ai-elements/canvas.js +0 -6
  71. package/dist/components/ai-elements/canvas.js.map +0 -1
  72. package/dist/components/ai-elements/chain-of-thought.d.ts +0 -30
  73. package/dist/components/ai-elements/chain-of-thought.d.ts.map +0 -1
  74. package/dist/components/ai-elements/chain-of-thought.js +0 -52
  75. package/dist/components/ai-elements/chain-of-thought.js.map +0 -1
  76. package/dist/components/ai-elements/confirmation.d.ts +0 -27
  77. package/dist/components/ai-elements/confirmation.d.ts.map +0 -1
  78. package/dist/components/ai-elements/confirmation.js +0 -57
  79. package/dist/components/ai-elements/confirmation.js.map +0 -1
  80. package/dist/components/ai-elements/connection.d.ts +0 -3
  81. package/dist/components/ai-elements/connection.d.ts.map +0 -1
  82. package/dist/components/ai-elements/connection.js +0 -4
  83. package/dist/components/ai-elements/connection.js.map +0 -1
  84. package/dist/components/ai-elements/context.d.ts +0 -33
  85. package/dist/components/ai-elements/context.d.ts.map +0 -1
  86. package/dist/components/ai-elements/context.js +0 -167
  87. package/dist/components/ai-elements/context.js.map +0 -1
  88. package/dist/components/ai-elements/controls.d.ts +0 -5
  89. package/dist/components/ai-elements/controls.d.ts.map +0 -1
  90. package/dist/components/ai-elements/controls.js +0 -6
  91. package/dist/components/ai-elements/controls.js.map +0 -1
  92. package/dist/components/ai-elements/edge.d.ts +0 -6
  93. package/dist/components/ai-elements/edge.d.ts.map +0 -1
  94. package/dist/components/ai-elements/edge.js +0 -83
  95. package/dist/components/ai-elements/edge.js.map +0 -1
  96. package/dist/components/ai-elements/image.d.ts +0 -7
  97. package/dist/components/ai-elements/image.d.ts.map +0 -1
  98. package/dist/components/ai-elements/image.js +0 -4
  99. package/dist/components/ai-elements/image.js.map +0 -1
  100. package/dist/components/ai-elements/inline-citation.d.ts +0 -39
  101. package/dist/components/ai-elements/inline-citation.d.ts.map +0 -1
  102. package/dist/components/ai-elements/inline-citation.js +0 -62
  103. package/dist/components/ai-elements/inline-citation.js.map +0 -1
  104. package/dist/components/ai-elements/loader.d.ts +0 -6
  105. package/dist/components/ai-elements/loader.d.ts.map +0 -1
  106. package/dist/components/ai-elements/loader.js +0 -5
  107. package/dist/components/ai-elements/loader.js.map +0 -1
  108. package/dist/components/ai-elements/node.d.ts +0 -22
  109. package/dist/components/ai-elements/node.d.ts.map +0 -1
  110. package/dist/components/ai-elements/node.js +0 -12
  111. package/dist/components/ai-elements/node.js.map +0 -1
  112. package/dist/components/ai-elements/open-in-chat.d.ts +0 -29
  113. package/dist/components/ai-elements/open-in-chat.d.ts.map +0 -1
  114. package/dist/components/ai-elements/open-in-chat.js +0 -97
  115. package/dist/components/ai-elements/open-in-chat.js.map +0 -1
  116. package/dist/components/ai-elements/panel.d.ts +0 -6
  117. package/dist/components/ai-elements/panel.d.ts.map +0 -1
  118. package/dist/components/ai-elements/panel.js +0 -5
  119. package/dist/components/ai-elements/panel.js.map +0 -1
  120. package/dist/components/ai-elements/plan.d.ts +0 -26
  121. package/dist/components/ai-elements/plan.d.ts.map +0 -1
  122. package/dist/components/ai-elements/plan.js +0 -32
  123. package/dist/components/ai-elements/plan.js.map +0 -1
  124. package/dist/components/ai-elements/queue.d.ts +0 -62
  125. package/dist/components/ai-elements/queue.d.ts.map +0 -1
  126. package/dist/components/ai-elements/queue.js +0 -25
  127. package/dist/components/ai-elements/queue.js.map +0 -1
  128. package/dist/components/ai-elements/reasoning.d.ts +0 -17
  129. package/dist/components/ai-elements/reasoning.d.ts.map +0 -1
  130. package/dist/components/ai-elements/reasoning.js +0 -77
  131. package/dist/components/ai-elements/reasoning.js.map +0 -1
  132. package/dist/components/ai-elements/response.d.ts +0 -6
  133. package/dist/components/ai-elements/response.d.ts.map +0 -1
  134. package/dist/components/ai-elements/response.js +0 -8
  135. package/dist/components/ai-elements/response.js.map +0 -1
  136. package/dist/components/ai-elements/sources.d.ts +0 -13
  137. package/dist/components/ai-elements/sources.d.ts.map +0 -1
  138. package/dist/components/ai-elements/sources.js +0 -10
  139. package/dist/components/ai-elements/sources.js.map +0 -1
  140. package/dist/components/ai-elements/suggestion.d.ts +0 -11
  141. package/dist/components/ai-elements/suggestion.d.ts.map +0 -1
  142. package/dist/components/ai-elements/suggestion.js +0 -13
  143. package/dist/components/ai-elements/suggestion.js.map +0 -1
  144. package/dist/components/ai-elements/task.d.ts +0 -15
  145. package/dist/components/ai-elements/task.d.ts.map +0 -1
  146. package/dist/components/ai-elements/task.js +0 -11
  147. package/dist/components/ai-elements/task.js.map +0 -1
  148. package/dist/components/ai-elements/tool.d.ts +0 -24
  149. package/dist/components/ai-elements/tool.d.ts.map +0 -1
  150. package/dist/components/ai-elements/tool.js +0 -47
  151. package/dist/components/ai-elements/tool.js.map +0 -1
  152. package/dist/components/ai-elements/toolbar.d.ts +0 -6
  153. package/dist/components/ai-elements/toolbar.d.ts.map +0 -1
  154. package/dist/components/ai-elements/toolbar.js +0 -5
  155. package/dist/components/ai-elements/toolbar.js.map +0 -1
  156. package/dist/components/ai-elements/web-preview.d.ts +0 -35
  157. package/dist/components/ai-elements/web-preview.d.ts.map +0 -1
  158. package/dist/components/ai-elements/web-preview.js +0 -63
  159. package/dist/components/ai-elements/web-preview.js.map +0 -1
  160. package/dist/components/ui/alert.d.ts +0 -10
  161. package/dist/components/ui/alert.d.ts.map +0 -1
  162. package/dist/components/ui/alert.js +0 -25
  163. package/dist/components/ui/alert.js.map +0 -1
  164. package/dist/components/ui/badge.d.ts +0 -10
  165. package/dist/components/ui/badge.d.ts.map +0 -1
  166. package/dist/components/ui/badge.js +0 -23
  167. package/dist/components/ui/badge.js.map +0 -1
  168. package/dist/components/ui/card.d.ts +0 -10
  169. package/dist/components/ui/card.d.ts.map +0 -1
  170. package/dist/components/ui/card.js +0 -25
  171. package/dist/components/ui/card.js.map +0 -1
  172. package/dist/components/ui/carousel.d.ts +0 -20
  173. package/dist/components/ui/carousel.d.ts.map +0 -1
  174. package/dist/components/ui/carousel.js +0 -92
  175. package/dist/components/ui/carousel.js.map +0 -1
  176. package/dist/components/ui/checkbox.d.ts +0 -5
  177. package/dist/components/ui/checkbox.d.ts.map +0 -1
  178. package/dist/components/ui/checkbox.js +0 -9
  179. package/dist/components/ui/checkbox.js.map +0 -1
  180. package/dist/components/ui/collapsible.d.ts +0 -6
  181. package/dist/components/ui/collapsible.d.ts.map +0 -1
  182. package/dist/components/ui/collapsible.js +0 -14
  183. package/dist/components/ui/collapsible.js.map +0 -1
  184. package/dist/components/ui/field.d.ts +0 -25
  185. package/dist/components/ui/field.d.ts.map +0 -1
  186. package/dist/components/ui/field.js +0 -74
  187. package/dist/components/ui/field.js.map +0 -1
  188. package/dist/components/ui/form.d.ts +0 -25
  189. package/dist/components/ui/form.d.ts.map +0 -1
  190. package/dist/components/ui/form.js +0 -58
  191. package/dist/components/ui/form.js.map +0 -1
  192. package/dist/components/ui/label.d.ts +0 -5
  193. package/dist/components/ui/label.d.ts.map +0 -1
  194. package/dist/components/ui/label.js +0 -9
  195. package/dist/components/ui/label.js.map +0 -1
  196. package/dist/components/ui/progress.d.ts +0 -5
  197. package/dist/components/ui/progress.d.ts.map +0 -1
  198. package/dist/components/ui/progress.js +0 -9
  199. package/dist/components/ui/progress.js.map +0 -1
  200. package/dist/components/ui/separator.d.ts +0 -5
  201. package/dist/components/ui/separator.d.ts.map +0 -1
  202. package/dist/components/ui/separator.js +0 -9
  203. package/dist/components/ui/separator.js.map +0 -1
  204. package/dist/components/ui/switch.d.ts +0 -5
  205. package/dist/components/ui/switch.d.ts.map +0 -1
  206. package/dist/components/ui/switch.js +0 -8
  207. package/dist/components/ui/switch.js.map +0 -1
  208. package/dist/components/ui/tabs.d.ts +0 -8
  209. package/dist/components/ui/tabs.d.ts.map +0 -1
  210. package/dist/components/ui/tabs.js +0 -17
  211. package/dist/components/ui/tabs.js.map +0 -1
  212. package/dist/components/ui/toggle.d.ts +0 -10
  213. package/dist/components/ui/toggle.d.ts.map +0 -1
  214. package/dist/components/ui/toggle.js +0 -26
  215. package/dist/components/ui/toggle.js.map +0 -1
  216. package/dist/components.d.ts +0 -12
  217. package/dist/components.d.ts.map +0 -1
  218. package/dist/components.js +0 -13
  219. package/dist/components.js.map +0 -1
  220. package/dist/hooks/index.d.ts +0 -7
  221. package/dist/hooks/index.d.ts.map +0 -1
  222. package/dist/hooks/index.js +0 -5
  223. package/dist/hooks/index.js.map +0 -1
  224. package/dist/hooks/useWorkbenchSchemas.d.ts +0 -56
  225. package/dist/hooks/useWorkbenchSchemas.d.ts.map +0 -1
  226. package/dist/hooks/useWorkbenchSchemas.js +0 -63
  227. package/dist/hooks/useWorkbenchSchemas.js.map +0 -1
  228. package/src/components/ConnectionStatus.tsx +0 -67
  229. package/src/components/Inline.tsx +0 -16
  230. package/src/components/ai-elements/artifact.tsx +0 -118
  231. package/src/components/ai-elements/branch.tsx +0 -187
  232. package/src/components/ai-elements/canvas.tsx +0 -24
  233. package/src/components/ai-elements/chain-of-thought.tsx +0 -198
  234. package/src/components/ai-elements/confirmation.tsx +0 -119
  235. package/src/components/ai-elements/connection.tsx +0 -16
  236. package/src/components/ai-elements/context.tsx +0 -357
  237. package/src/components/ai-elements/controls.tsx +0 -18
  238. package/src/components/ai-elements/edge.tsx +0 -131
  239. package/src/components/ai-elements/image.tsx +0 -16
  240. package/src/components/ai-elements/inline-citation.tsx +0 -246
  241. package/src/components/ai-elements/loader.tsx +0 -88
  242. package/src/components/ai-elements/node.tsx +0 -66
  243. package/src/components/ai-elements/open-in-chat.tsx +0 -333
  244. package/src/components/ai-elements/panel.tsx +0 -12
  245. package/src/components/ai-elements/plan.tsx +0 -123
  246. package/src/components/ai-elements/queue.tsx +0 -231
  247. package/src/components/ai-elements/reasoning.tsx +0 -163
  248. package/src/components/ai-elements/response.tsx +0 -19
  249. package/src/components/ai-elements/sources.tsx +0 -53
  250. package/src/components/ai-elements/suggestion.tsx +0 -47
  251. package/src/components/ai-elements/task.tsx +0 -64
  252. package/src/components/ai-elements/tool.tsx +0 -136
  253. package/src/components/ai-elements/toolbar.tsx +0 -13
  254. package/src/components/ai-elements/web-preview.tsx +0 -238
  255. package/src/components/ui/alert.tsx +0 -60
  256. package/src/components/ui/badge.tsx +0 -40
  257. package/src/components/ui/card.tsx +0 -41
  258. package/src/components/ui/carousel.tsx +0 -234
  259. package/src/components/ui/checkbox.tsx +0 -27
  260. package/src/components/ui/collapsible.tsx +0 -21
  261. package/src/components/ui/field.tsx +0 -234
  262. package/src/components/ui/form.tsx +0 -154
  263. package/src/components/ui/label.tsx +0 -21
  264. package/src/components/ui/progress.tsx +0 -28
  265. package/src/components/ui/separator.tsx +0 -28
  266. package/src/components/ui/switch.tsx +0 -26
  267. package/src/components/ui/tabs.tsx +0 -52
  268. package/src/components/ui/toggle.tsx +0 -44
  269. package/src/components.tsx +0 -29
  270. package/src/hooks/index.ts +0 -20
  271. 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.86",
3
+ "version": "0.0.88",
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.86",
38
- "@agentuity/react": "0.0.86",
40
+ "@agentuity/core": "0.0.88",
41
+ "@agentuity/react": "0.0.88",
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,139 +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
- {!(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
- onSchemaOpen={() => setSchemaOpen(true)}
192
- />
193
- </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>
194
174
 
195
- <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
+ />
196
189
  </div>
197
190
  );
198
191
  }