@docyrus/ui-pro-ai-assistant 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/dist/index.js +26161 -0
  2. package/dist/index.js.map +1 -0
  3. package/package.json +155 -0
  4. package/src/components/assistant-animations.tsx +29 -0
  5. package/src/components/assistant-dialogs.tsx +235 -0
  6. package/src/components/code-view.tsx +278 -0
  7. package/src/components/create-agent-task.tsx +104 -0
  8. package/src/components/create-new-work-version.tsx +30 -0
  9. package/src/components/extract-web.tsx +160 -0
  10. package/src/components/forward-to-agent.tsx +90 -0
  11. package/src/components/generate-chart.tsx +101 -0
  12. package/src/components/generative-action-button.tsx +122 -0
  13. package/src/components/generative-tool.tsx +685 -0
  14. package/src/components/generative-ui-object.tsx +210 -0
  15. package/src/components/input-area.tsx +1209 -0
  16. package/src/components/json-schema-layout.tsx +326 -0
  17. package/src/components/list-item-card.tsx +92 -0
  18. package/src/components/mermaid-diagram.tsx +192 -0
  19. package/src/components/preview-image.tsx +47 -0
  20. package/src/components/request-approval.tsx +48 -0
  21. package/src/components/request-user-input.tsx +270 -0
  22. package/src/components/search-web.tsx +319 -0
  23. package/src/components/sheet-command.tsx +88 -0
  24. package/src/components/shell-canvas.tsx +122 -0
  25. package/src/components/show-advanced-data-table.tsx +352 -0
  26. package/src/components/show-generated-content-options.tsx +93 -0
  27. package/src/components/show-people-cards.tsx +180 -0
  28. package/src/components/subagent-tool.tsx +180 -0
  29. package/src/components/text-editor-tool.tsx +328 -0
  30. package/src/components/work-canvas.tsx +88 -0
  31. package/src/components/work-card.tsx +42 -0
  32. package/src/declarations.d.ts +1 -0
  33. package/src/docy-assistant.tsx +1962 -0
  34. package/src/hooks/index.ts +7 -0
  35. package/src/hooks/use-assistant-api.ts +507 -0
  36. package/src/hooks/use-deployment-data.ts +162 -0
  37. package/src/hooks/use-project-state.ts +347 -0
  38. package/src/hooks/use-session-state.ts +207 -0
  39. package/src/hooks/use-speech-recognition.ts +137 -0
  40. package/src/hooks/use-ui-state.ts +185 -0
  41. package/src/hooks/use-works-state.ts +146 -0
  42. package/src/i18n/context.tsx +253 -0
  43. package/src/i18n/index.ts +19 -0
  44. package/src/i18n/locales/de.json +198 -0
  45. package/src/i18n/locales/el.json +198 -0
  46. package/src/i18n/locales/en.json +226 -0
  47. package/src/i18n/locales/es.json +198 -0
  48. package/src/i18n/locales/fr.json +198 -0
  49. package/src/i18n/locales/it.json +198 -0
  50. package/src/i18n/locales/pt.json +198 -0
  51. package/src/i18n/locales/sl.json +198 -0
  52. package/src/i18n/locales/tr.json +211 -0
  53. package/src/i18n/types.ts +23 -0
  54. package/src/i18n/use-translation.ts +17 -0
  55. package/src/index.ts +18 -0
  56. package/src/internal/plate-editor/editor/auth-context.ts +11 -0
  57. package/src/internal/plate-editor/editor/editor-base-kit.tsx +39 -0
  58. package/src/internal/plate-editor/editor/editor-kit.tsx +89 -0
  59. package/src/internal/plate-editor/editor/plate-editor.tsx +75 -0
  60. package/src/internal/plate-editor/editor/plate-types.ts +126 -0
  61. package/src/internal/plate-editor/editor/plugins/ai-kit.tsx +172 -0
  62. package/src/internal/plate-editor/editor/plugins/autoformat-kit.tsx +211 -0
  63. package/src/internal/plate-editor/editor/plugins/basic-blocks-base-kit.tsx +26 -0
  64. package/src/internal/plate-editor/editor/plugins/basic-blocks-kit.tsx +51 -0
  65. package/src/internal/plate-editor/editor/plugins/basic-marks-base-kit.tsx +24 -0
  66. package/src/internal/plate-editor/editor/plugins/basic-marks-kit.tsx +38 -0
  67. package/src/internal/plate-editor/editor/plugins/basic-nodes-kit.tsx +6 -0
  68. package/src/internal/plate-editor/editor/plugins/block-menu-kit.tsx +14 -0
  69. package/src/internal/plate-editor/editor/plugins/block-placeholder-kit.tsx +17 -0
  70. package/src/internal/plate-editor/editor/plugins/block-selection-kit.tsx +31 -0
  71. package/src/internal/plate-editor/editor/plugins/callout-base-kit.tsx +5 -0
  72. package/src/internal/plate-editor/editor/plugins/callout-kit.tsx +7 -0
  73. package/src/internal/plate-editor/editor/plugins/code-block-base-kit.tsx +23 -0
  74. package/src/internal/plate-editor/editor/plugins/code-block-kit.tsx +26 -0
  75. package/src/internal/plate-editor/editor/plugins/column-base-kit.tsx +8 -0
  76. package/src/internal/plate-editor/editor/plugins/column-kit.tsx +7 -0
  77. package/src/internal/plate-editor/editor/plugins/comment-base-kit.tsx +5 -0
  78. package/src/internal/plate-editor/editor/plugins/comment-kit.tsx +174 -0
  79. package/src/internal/plate-editor/editor/plugins/copilot-kit.tsx +68 -0
  80. package/src/internal/plate-editor/editor/plugins/cursor-overlay-kit.tsx +13 -0
  81. package/src/internal/plate-editor/editor/plugins/date-base-kit.tsx +5 -0
  82. package/src/internal/plate-editor/editor/plugins/date-kit.tsx +7 -0
  83. package/src/internal/plate-editor/editor/plugins/discussion-kit.tsx +36 -0
  84. package/src/internal/plate-editor/editor/plugins/dnd-kit.tsx +27 -0
  85. package/src/internal/plate-editor/editor/plugins/docx-export-kit.tsx +43 -0
  86. package/src/internal/plate-editor/editor/plugins/docx-kit.tsx +6 -0
  87. package/src/internal/plate-editor/editor/plugins/emoji-kit.tsx +15 -0
  88. package/src/internal/plate-editor/editor/plugins/exit-break-kit.tsx +12 -0
  89. package/src/internal/plate-editor/editor/plugins/floating-toolbar-kit.tsx +19 -0
  90. package/src/internal/plate-editor/editor/plugins/font-base-kit.tsx +36 -0
  91. package/src/internal/plate-editor/editor/plugins/font-kit.tsx +47 -0
  92. package/src/internal/plate-editor/editor/plugins/indent-base-kit.tsx +19 -0
  93. package/src/internal/plate-editor/editor/plugins/indent-kit.tsx +22 -0
  94. package/src/internal/plate-editor/editor/plugins/link-base-kit.tsx +5 -0
  95. package/src/internal/plate-editor/editor/plugins/link-kit.tsx +35 -0
  96. package/src/internal/plate-editor/editor/plugins/list-base-kit.tsx +24 -0
  97. package/src/internal/plate-editor/editor/plugins/list-kit.tsx +27 -0
  98. package/src/internal/plate-editor/editor/plugins/markdown-kit.tsx +18 -0
  99. package/src/internal/plate-editor/editor/plugins/math-base-kit.tsx +8 -0
  100. package/src/internal/plate-editor/editor/plugins/math-kit.tsx +10 -0
  101. package/src/internal/plate-editor/editor/plugins/media-base-kit.tsx +37 -0
  102. package/src/internal/plate-editor/editor/plugins/media-kit.tsx +53 -0
  103. package/src/internal/plate-editor/editor/plugins/mention-base-kit.tsx +5 -0
  104. package/src/internal/plate-editor/editor/plugins/mention-kit.tsx +36 -0
  105. package/src/internal/plate-editor/editor/plugins/slash-kit.tsx +17 -0
  106. package/src/internal/plate-editor/editor/plugins/suggestion-base-kit.tsx +5 -0
  107. package/src/internal/plate-editor/editor/plugins/suggestion-kit.tsx +95 -0
  108. package/src/internal/plate-editor/editor/plugins/table-base-kit.tsx +20 -0
  109. package/src/internal/plate-editor/editor/plugins/table-kit.tsx +22 -0
  110. package/src/internal/plate-editor/editor/plugins/toc-base-kit.tsx +5 -0
  111. package/src/internal/plate-editor/editor/plugins/toc-kit.tsx +14 -0
  112. package/src/internal/plate-editor/editor/plugins/toggle-base-kit.tsx +5 -0
  113. package/src/internal/plate-editor/editor/plugins/toggle-kit.tsx +9 -0
  114. package/src/internal/plate-editor/editor/transforms.ts +165 -0
  115. package/src/internal/plate-editor/editor/use-chat.ts +152 -0
  116. package/src/internal/plate-editor/hooks/index.ts +3 -0
  117. package/src/internal/plate-editor/hooks/use-copy-to-clipboard.ts +31 -0
  118. package/src/internal/plate-editor/hooks/use-is-touch-device.ts +26 -0
  119. package/src/internal/plate-editor/hooks/use-lock-scroll.ts +21 -0
  120. package/src/internal/plate-editor/hooks/use-media-query.ts +44 -0
  121. package/src/internal/plate-editor/hooks/use-mounted.ts +18 -0
  122. package/src/internal/plate-editor/hooks/use-on-click-outside.ts +114 -0
  123. package/src/internal/plate-editor/hooks/use-upload-file.ts +81 -0
  124. package/src/internal/plate-editor/i18n/context.tsx +58 -0
  125. package/src/internal/plate-editor/i18n/index.ts +3 -0
  126. package/src/internal/plate-editor/i18n/locales/de.json +57 -0
  127. package/src/internal/plate-editor/i18n/locales/el.json +57 -0
  128. package/src/internal/plate-editor/i18n/locales/en.json +57 -0
  129. package/src/internal/plate-editor/i18n/locales/es.json +57 -0
  130. package/src/internal/plate-editor/i18n/locales/fr.json +57 -0
  131. package/src/internal/plate-editor/i18n/locales/it.json +57 -0
  132. package/src/internal/plate-editor/i18n/locales/pt.json +57 -0
  133. package/src/internal/plate-editor/i18n/locales/sl.json +57 -0
  134. package/src/internal/plate-editor/i18n/locales/tr.json +57 -0
  135. package/src/internal/plate-editor/i18n/types.ts +59 -0
  136. package/src/internal/plate-editor/i18n/use-translation.ts +22 -0
  137. package/src/internal/plate-editor/index.ts +39 -0
  138. package/src/internal/plate-editor/lib/ai-output-converter.ts +153 -0
  139. package/src/internal/plate-editor/lib/download-file.ts +17 -0
  140. package/src/internal/plate-editor/plate-ui/ai-chat-editor.tsx +26 -0
  141. package/src/internal/plate-editor/plate-ui/ai-menu.tsx +828 -0
  142. package/src/internal/plate-editor/plate-ui/ai-node.tsx +41 -0
  143. package/src/internal/plate-editor/plate-ui/ai-toolbar-button.tsx +27 -0
  144. package/src/internal/plate-editor/plate-ui/alert-dialog.tsx +147 -0
  145. package/src/internal/plate-editor/plate-ui/align-toolbar-button.tsx +90 -0
  146. package/src/internal/plate-editor/plate-ui/avatar.tsx +3 -0
  147. package/src/internal/plate-editor/plate-ui/block-context-menu.tsx +106 -0
  148. package/src/internal/plate-editor/plate-ui/block-discussion.tsx +364 -0
  149. package/src/internal/plate-editor/plate-ui/block-draggable.tsx +556 -0
  150. package/src/internal/plate-editor/plate-ui/block-list-static.tsx +78 -0
  151. package/src/internal/plate-editor/plate-ui/block-list.tsx +85 -0
  152. package/src/internal/plate-editor/plate-ui/block-menu.tsx +557 -0
  153. package/src/internal/plate-editor/plate-ui/block-selection.tsx +47 -0
  154. package/src/internal/plate-editor/plate-ui/block-suggestion.tsx +469 -0
  155. package/src/internal/plate-editor/plate-ui/blockquote-node-static.tsx +10 -0
  156. package/src/internal/plate-editor/plate-ui/blockquote-node.tsx +11 -0
  157. package/src/internal/plate-editor/plate-ui/button.tsx +190 -0
  158. package/src/internal/plate-editor/plate-ui/calendar.tsx +3 -0
  159. package/src/internal/plate-editor/plate-ui/callout-node-static.tsx +76 -0
  160. package/src/internal/plate-editor/plate-ui/callout-node.tsx +54 -0
  161. package/src/internal/plate-editor/plate-ui/caption.tsx +48 -0
  162. package/src/internal/plate-editor/plate-ui/checkbox.tsx +3 -0
  163. package/src/internal/plate-editor/plate-ui/code-block-node-static.tsx +172 -0
  164. package/src/internal/plate-editor/plate-ui/code-block-node.tsx +228 -0
  165. package/src/internal/plate-editor/plate-ui/code-node-static.tsx +11 -0
  166. package/src/internal/plate-editor/plate-ui/code-node.tsx +12 -0
  167. package/src/internal/plate-editor/plate-ui/column-node-static.tsx +65 -0
  168. package/src/internal/plate-editor/plate-ui/column-node.tsx +24 -0
  169. package/src/internal/plate-editor/plate-ui/command.tsx +204 -0
  170. package/src/internal/plate-editor/plate-ui/comment-node-static.tsx +12 -0
  171. package/src/internal/plate-editor/plate-ui/comment-node.tsx +45 -0
  172. package/src/internal/plate-editor/plate-ui/comment-toolbar-button.tsx +24 -0
  173. package/src/internal/plate-editor/plate-ui/comment.tsx +619 -0
  174. package/src/internal/plate-editor/plate-ui/cursor-overlay.tsx +85 -0
  175. package/src/internal/plate-editor/plate-ui/date-node-static.tsx +43 -0
  176. package/src/internal/plate-editor/plate-ui/date-node.tsx +56 -0
  177. package/src/internal/plate-editor/plate-ui/dialog.tsx +426 -0
  178. package/src/internal/plate-editor/plate-ui/dropdown-menu.tsx +266 -0
  179. package/src/internal/plate-editor/plate-ui/editor-static.tsx +40 -0
  180. package/src/internal/plate-editor/plate-ui/editor.tsx +148 -0
  181. package/src/internal/plate-editor/plate-ui/emoji-node.tsx +48 -0
  182. package/src/internal/plate-editor/plate-ui/emoji-toolbar-button.tsx +626 -0
  183. package/src/internal/plate-editor/plate-ui/equation-node-static.tsx +155 -0
  184. package/src/internal/plate-editor/plate-ui/equation-node.tsx +226 -0
  185. package/src/internal/plate-editor/plate-ui/equation-toolbar-button.tsx +26 -0
  186. package/src/internal/plate-editor/plate-ui/export-toolbar-button.tsx +208 -0
  187. package/src/internal/plate-editor/plate-ui/fixed-toolbar-buttons.tsx +157 -0
  188. package/src/internal/plate-editor/plate-ui/fixed-toolbar.tsx +27 -0
  189. package/src/internal/plate-editor/plate-ui/floating-discussion.tsx +1129 -0
  190. package/src/internal/plate-editor/plate-ui/floating-toolbar-buttons.tsx +129 -0
  191. package/src/internal/plate-editor/plate-ui/floating-toolbar.tsx +99 -0
  192. package/src/internal/plate-editor/plate-ui/font-color-toolbar-button.tsx +211 -0
  193. package/src/internal/plate-editor/plate-ui/font-size-toolbar-button.tsx +154 -0
  194. package/src/internal/plate-editor/plate-ui/ghost-text.tsx +20 -0
  195. package/src/internal/plate-editor/plate-ui/heading-node-static.tsx +52 -0
  196. package/src/internal/plate-editor/plate-ui/heading-node.tsx +56 -0
  197. package/src/internal/plate-editor/plate-ui/highlight-node-static.tsx +9 -0
  198. package/src/internal/plate-editor/plate-ui/highlight-node.tsx +11 -0
  199. package/src/internal/plate-editor/plate-ui/history-toolbar-button.tsx +52 -0
  200. package/src/internal/plate-editor/plate-ui/hover-card.tsx +7 -0
  201. package/src/internal/plate-editor/plate-ui/hr-node-static.tsx +18 -0
  202. package/src/internal/plate-editor/plate-ui/hr-node.tsx +28 -0
  203. package/src/internal/plate-editor/plate-ui/import-toolbar-button.tsx +124 -0
  204. package/src/internal/plate-editor/plate-ui/indent-toolbar-button.tsx +34 -0
  205. package/src/internal/plate-editor/plate-ui/inline-combobox.tsx +409 -0
  206. package/src/internal/plate-editor/plate-ui/input.tsx +39 -0
  207. package/src/internal/plate-editor/plate-ui/insert-toolbar-button.tsx +260 -0
  208. package/src/internal/plate-editor/plate-ui/label.tsx +1 -0
  209. package/src/internal/plate-editor/plate-ui/line-height-toolbar-button.tsx +71 -0
  210. package/src/internal/plate-editor/plate-ui/link-node-static.tsx +15 -0
  211. package/src/internal/plate-editor/plate-ui/link-node.tsx +33 -0
  212. package/src/internal/plate-editor/plate-ui/link-toolbar-button.tsx +30 -0
  213. package/src/internal/plate-editor/plate-ui/link-toolbar.tsx +149 -0
  214. package/src/internal/plate-editor/plate-ui/list-toolbar-button.tsx +179 -0
  215. package/src/internal/plate-editor/plate-ui/mark-toolbar-button.tsx +36 -0
  216. package/src/internal/plate-editor/plate-ui/media-audio-node-static.tsx +21 -0
  217. package/src/internal/plate-editor/plate-ui/media-audio-node.tsx +32 -0
  218. package/src/internal/plate-editor/plate-ui/media-embed-node.tsx +103 -0
  219. package/src/internal/plate-editor/plate-ui/media-file-node-static.tsx +30 -0
  220. package/src/internal/plate-editor/plate-ui/media-file-node.tsx +52 -0
  221. package/src/internal/plate-editor/plate-ui/media-image-node-static.tsx +37 -0
  222. package/src/internal/plate-editor/plate-ui/media-image-node.tsx +183 -0
  223. package/src/internal/plate-editor/plate-ui/media-placeholder-node.tsx +441 -0
  224. package/src/internal/plate-editor/plate-ui/media-preview-dialog.tsx +127 -0
  225. package/src/internal/plate-editor/plate-ui/media-toolbar-button.tsx +229 -0
  226. package/src/internal/plate-editor/plate-ui/media-toolbar.tsx +216 -0
  227. package/src/internal/plate-editor/plate-ui/media-upload-toast.tsx +73 -0
  228. package/src/internal/plate-editor/plate-ui/media-video-node-static.tsx +35 -0
  229. package/src/internal/plate-editor/plate-ui/media-video-node.tsx +119 -0
  230. package/src/internal/plate-editor/plate-ui/mention-node-static.tsx +46 -0
  231. package/src/internal/plate-editor/plate-ui/mention-node.tsx +79 -0
  232. package/src/internal/plate-editor/plate-ui/menu.tsx +532 -0
  233. package/src/internal/plate-editor/plate-ui/mode-toolbar-button.tsx +126 -0
  234. package/src/internal/plate-editor/plate-ui/more-toolbar-button.tsx +34 -0
  235. package/src/internal/plate-editor/plate-ui/paragraph-node-static.tsx +15 -0
  236. package/src/internal/plate-editor/plate-ui/paragraph-node.tsx +16 -0
  237. package/src/internal/plate-editor/plate-ui/popover.tsx +77 -0
  238. package/src/internal/plate-editor/plate-ui/progress.tsx +1 -0
  239. package/src/internal/plate-editor/plate-ui/remote-cursor-overlay.tsx +81 -0
  240. package/src/internal/plate-editor/plate-ui/resize-handle.tsx +88 -0
  241. package/src/internal/plate-editor/plate-ui/separator.tsx +43 -0
  242. package/src/internal/plate-editor/plate-ui/slash-node.tsx +435 -0
  243. package/src/internal/plate-editor/plate-ui/spinner.tsx +1 -0
  244. package/src/internal/plate-editor/plate-ui/suggestion-node-static.tsx +35 -0
  245. package/src/internal/plate-editor/plate-ui/suggestion-node.tsx +168 -0
  246. package/src/internal/plate-editor/plate-ui/suggestion-toolbar-button.tsx +24 -0
  247. package/src/internal/plate-editor/plate-ui/table-node-static.tsx +85 -0
  248. package/src/internal/plate-editor/plate-ui/table-node.tsx +285 -0
  249. package/src/internal/plate-editor/plate-ui/table-toolbar-button.tsx +254 -0
  250. package/src/internal/plate-editor/plate-ui/tabs.tsx +3 -0
  251. package/src/internal/plate-editor/plate-ui/textarea.tsx +58 -0
  252. package/src/internal/plate-editor/plate-ui/toc-node-static.tsx +142 -0
  253. package/src/internal/plate-editor/plate-ui/toc-node.tsx +57 -0
  254. package/src/internal/plate-editor/plate-ui/toc-sidebar.tsx +50 -0
  255. package/src/internal/plate-editor/plate-ui/toggle-node-static.tsx +18 -0
  256. package/src/internal/plate-editor/plate-ui/toggle-node.tsx +33 -0
  257. package/src/internal/plate-editor/plate-ui/toggle-toolbar-button.tsx +26 -0
  258. package/src/internal/plate-editor/plate-ui/toggle.tsx +3 -0
  259. package/src/internal/plate-editor/plate-ui/toolbar.tsx +380 -0
  260. package/src/internal/plate-editor/plate-ui/tooltip.tsx +149 -0
  261. package/src/internal/plate-editor/plate-ui/turn-into-toolbar-button.tsx +177 -0
  262. package/src/internal/plate-editor/types/index.ts +22 -0
  263. package/src/internal/plate-editor/vite.ts +284 -0
  264. package/src/internal/sheets/components/univer-sheets.tsx +1104 -0
  265. package/src/internal/sheets/i18n/context.tsx +183 -0
  266. package/src/internal/sheets/i18n/index.ts +19 -0
  267. package/src/internal/sheets/i18n/locales/de.json +21 -0
  268. package/src/internal/sheets/i18n/locales/el.json +21 -0
  269. package/src/internal/sheets/i18n/locales/en.json +21 -0
  270. package/src/internal/sheets/i18n/locales/es.json +21 -0
  271. package/src/internal/sheets/i18n/locales/fr.json +21 -0
  272. package/src/internal/sheets/i18n/locales/it.json +21 -0
  273. package/src/internal/sheets/i18n/locales/pt.json +21 -0
  274. package/src/internal/sheets/i18n/locales/sl.json +21 -0
  275. package/src/internal/sheets/i18n/locales/tr.json +21 -0
  276. package/src/internal/sheets/i18n/types.ts +23 -0
  277. package/src/internal/sheets/i18n/use-translation.ts +17 -0
  278. package/src/internal/sheets/index.ts +14 -0
  279. package/src/internal/sheets/types/css.d.ts +11 -0
  280. package/src/internal/sheets/types/index.ts +260 -0
  281. package/src/internal/sheets/xlsx.ts +1169 -0
  282. package/src/lib/api-client.ts +77 -0
  283. package/src/lib/assistant-api-actions.ts +549 -0
  284. package/src/lib/assistant-config.tsx +71 -0
  285. package/src/lib/class-utils.ts +40 -0
  286. package/src/lib/index.ts +7 -0
  287. package/src/lib/message-utils.ts +131 -0
  288. package/src/tools/tools-schema.json +512 -0
  289. package/src/types/index.ts +235 -0
  290. package/src/views/assistant-view.tsx +1137 -0
  291. package/src/views/canvas-app.tsx +839 -0
  292. package/src/views/canvas-code.tsx +93 -0
  293. package/src/views/canvas-deep-research.tsx +44 -0
  294. package/src/views/canvas-image.tsx +25 -0
  295. package/src/views/canvas-record-view.tsx +285 -0
  296. package/src/views/canvas-spreadsheet.tsx +125 -0
  297. package/src/views/canvas-text.tsx +52 -0
  298. package/src/views/canvas.tsx +274 -0
  299. package/src/views/chat-panel.tsx +149 -0
  300. package/src/views/index.ts +20 -0
  301. package/src/views/memories-panel.tsx +365 -0
  302. package/src/views/message-list.tsx +370 -0
  303. package/src/views/project-detail.tsx +257 -0
  304. package/src/views/projects-panel.tsx +131 -0
  305. package/src/views/sessions-list.tsx +98 -0
  306. package/src/views/sidebar-content.tsx +256 -0
  307. package/src/views/work-detail.tsx +98 -0
  308. package/src/vite.ts +284 -0
@@ -0,0 +1,48 @@
1
+ 'use client';
2
+
3
+ import { ConfirmationAction } from '@docyrus/ui-pro-shared/ai-elements/confirmation';
4
+
5
+ import { useAssistantTranslation } from '../i18n';
6
+
7
+ interface RequestApprovalProps {
8
+ state: string;
9
+ action?: string;
10
+ details?: string;
11
+ onApprove: () => void;
12
+ onReject: () => void;
13
+ }
14
+
15
+ export function RequestApproval({
16
+ state,
17
+ action,
18
+ details,
19
+ onApprove,
20
+ onReject
21
+ }: RequestApprovalProps) {
22
+ const { t } = useAssistantTranslation();
23
+
24
+ if (state === 'input-streaming') return null;
25
+
26
+ const isResolved = state === 'output-available'
27
+ || state === 'output-denied'
28
+ || state === 'approval-responded';
29
+
30
+ return (
31
+ <div className="rounded-lg border bg-card p-4 space-y-3">
32
+ <h4 className="font-medium text-sm">{action || t('actions.approve')}</h4>
33
+ {details && (
34
+ <p className="text-sm text-muted-foreground">{details}</p>
35
+ )}
36
+ {!isResolved && (
37
+ <div className="flex items-center justify-end gap-2">
38
+ <ConfirmationAction onClick={onApprove}>
39
+ {t('actions.approve')}
40
+ </ConfirmationAction>
41
+ <ConfirmationAction variant="outline" onClick={onReject}>
42
+ {t('actions.reject')}
43
+ </ConfirmationAction>
44
+ </div>
45
+ )}
46
+ </div>
47
+ );
48
+ }
@@ -0,0 +1,270 @@
1
+ 'use client';
2
+
3
+ import { useCallback, useState } from 'react';
4
+
5
+ import { Button } from '@docyrus/ui-pro-shared/components/button';
6
+ import { Input } from '@docyrus/ui-pro-shared/components/input';
7
+ import { Textarea } from '@docyrus/ui-pro-shared/components/textarea';
8
+
9
+ interface JsonSchemaProperty {
10
+ type?: string | string[];
11
+ title?: string;
12
+ description?: string;
13
+ enum?: any[];
14
+ items?: { type?: string; enum?: any[] };
15
+ format?: string;
16
+ minimum?: number;
17
+ maximum?: number;
18
+ multiline?: boolean;
19
+ }
20
+
21
+ interface JsonSchema {
22
+ type?: string;
23
+ properties?: Record<string, JsonSchemaProperty>;
24
+ required?: string[];
25
+ }
26
+
27
+ interface RequestUserInputProps {
28
+ schema: JsonSchema | string;
29
+ title?: string;
30
+ description?: string;
31
+ submitLabel?: string;
32
+ state: string;
33
+ output?: any;
34
+ onSubmit: (data: Record<string, any>) => void;
35
+ onCancel: () => void;
36
+ }
37
+
38
+ function parseSchema(schema: JsonSchema | string): JsonSchema {
39
+ if (typeof schema === 'string') {
40
+ try {
41
+ return JSON.parse(schema);
42
+ } catch {
43
+ return {};
44
+ }
45
+ }
46
+
47
+ return schema || {};
48
+ }
49
+
50
+ function FieldRenderer({
51
+ fieldKey,
52
+ property,
53
+ value,
54
+ onChange
55
+ }: {
56
+ fieldKey: string;
57
+ property: JsonSchemaProperty;
58
+ value: any;
59
+ onChange: (key: string, val: any) => void;
60
+ }) {
61
+ const label = property.title || fieldKey;
62
+ const isEnum = Array.isArray(property.enum) && property.enum.length > 0;
63
+ const type = Array.isArray(property.type) ? property.type[0] : property.type;
64
+
65
+ if (isEnum) {
66
+ return (
67
+ <div className="space-y-1">
68
+ <label className="text-sm font-medium">{label}</label>
69
+ {property.description && (
70
+ <p className="text-xs text-muted-foreground">{property.description}</p>
71
+ )}
72
+ <select
73
+ className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2"
74
+ value={value ?? ''}
75
+ onChange={e => onChange(fieldKey, e.target.value)}>
76
+ <option value="">Select...</option>
77
+ {property.enum!.map(opt => (
78
+ <option key={String(opt)} value={String(opt)}>
79
+ {String(opt)}
80
+ </option>
81
+ ))}
82
+ </select>
83
+ </div>
84
+ );
85
+ }
86
+
87
+ if (type === 'boolean') {
88
+ return (
89
+ <div className="flex items-center gap-2">
90
+ <input
91
+ type="checkbox"
92
+ id={fieldKey}
93
+ className="rounded border-input"
94
+ checked={!!value}
95
+ onChange={e => onChange(fieldKey, e.target.checked)} />
96
+ <label htmlFor={fieldKey} className="text-sm font-medium cursor-pointer">
97
+ {label}
98
+ </label>
99
+ {property.description && (
100
+ <span className="text-xs text-muted-foreground">{property.description}</span>
101
+ )}
102
+ </div>
103
+ );
104
+ }
105
+
106
+ if (type === 'number' || type === 'integer') {
107
+ return (
108
+ <div className="space-y-1">
109
+ <label className="text-sm font-medium">{label}</label>
110
+ {property.description && (
111
+ <p className="text-xs text-muted-foreground">{property.description}</p>
112
+ )}
113
+ <Input
114
+ type="number"
115
+ value={value ?? ''}
116
+ min={property.minimum}
117
+ max={property.maximum}
118
+ onChange={e => onChange(fieldKey, e.target.value === '' ? '' : Number(e.target.value))} />
119
+ </div>
120
+ );
121
+ }
122
+
123
+ if (property.format === 'textarea' || property.multiline) {
124
+ return (
125
+ <div className="space-y-1">
126
+ <label className="text-sm font-medium">{label}</label>
127
+ {property.description && (
128
+ <p className="text-xs text-muted-foreground">{property.description}</p>
129
+ )}
130
+ <Textarea
131
+ value={value ?? ''}
132
+ rows={4}
133
+ onChange={e => onChange(fieldKey, e.target.value)} />
134
+ </div>
135
+ );
136
+ }
137
+
138
+ return (
139
+ <div className="space-y-1">
140
+ <label className="text-sm font-medium">{label}</label>
141
+ {property.description && (
142
+ <p className="text-xs text-muted-foreground">{property.description}</p>
143
+ )}
144
+ <Input
145
+ type={property.format === 'email' ? 'email' : property.format === 'uri' ? 'url' : 'text'}
146
+ value={value ?? ''}
147
+ onChange={e => onChange(fieldKey, e.target.value)} />
148
+ </div>
149
+ );
150
+ }
151
+
152
+ export function RequestUserInput({
153
+ schema,
154
+ title,
155
+ description,
156
+ submitLabel = 'Submit',
157
+ state,
158
+ output,
159
+ onSubmit,
160
+ onCancel
161
+ }: RequestUserInputProps) {
162
+ const [formData, setFormData] = useState<Record<string, any>>({});
163
+ const [isSubmitting, setIsSubmitting] = useState(false);
164
+
165
+ const parsedSchema = parseSchema(schema);
166
+ const properties = parsedSchema.properties || {};
167
+ const requiredFields = parsedSchema.required || [];
168
+
169
+ const isOutputAvailable = state === 'output-available';
170
+
171
+ const isFormValid = requiredFields.every((key) => {
172
+ const value = formData[key];
173
+
174
+ if (value === null || value === undefined || value === '') return false;
175
+ if (Array.isArray(value) && value.length === 0) return false;
176
+
177
+ return true;
178
+ });
179
+
180
+ const handleChange = useCallback((key: string, val: any) => {
181
+ setFormData(prev => ({ ...prev, [key]: val }));
182
+ }, []);
183
+
184
+ const handleSubmit = async () => {
185
+ if (!isFormValid || isSubmitting) return;
186
+
187
+ setIsSubmitting(true);
188
+
189
+ const validatedData: Record<string, any> = {};
190
+
191
+ Object.entries(properties).forEach(([key]) => {
192
+ const value = formData[key];
193
+ const isRequired = requiredFields.includes(key);
194
+
195
+ if (!isRequired && (value === '' || value === null || value === undefined)) return;
196
+
197
+ validatedData[key] = value;
198
+ });
199
+
200
+ onSubmit(validatedData);
201
+ setTimeout(() => setIsSubmitting(false), 500);
202
+ };
203
+
204
+ if (isOutputAvailable) {
205
+ const displayData = output?.input ?? output ?? {};
206
+
207
+ return (
208
+ <div className="rounded-lg border bg-card p-4 space-y-3">
209
+ <h4 className="font-medium text-sm">Thanks for your input</h4>
210
+ {Object.keys(displayData).length > 0 && (
211
+ <div className="space-y-1">
212
+ {Object.entries(displayData).map(([key, val]) => {
213
+ const prop = properties[key];
214
+ const label = prop?.title || key;
215
+
216
+ return (
217
+ <div key={key} className="flex gap-2 text-sm">
218
+ <span className="font-medium text-muted-foreground min-w-24">{label}:</span>
219
+ <span>{String(val ?? '')}</span>
220
+ </div>
221
+ );
222
+ })}
223
+ </div>
224
+ )}
225
+ </div>
226
+ );
227
+ }
228
+
229
+ const hasProperties = Object.keys(properties).length > 0;
230
+
231
+ return (
232
+ <div className="rounded-lg border bg-card p-4 space-y-4">
233
+ <div className="space-y-1">
234
+ <h4 className="font-medium text-base">{title || 'User Input Required'}</h4>
235
+ {description && (
236
+ <p className="text-sm text-muted-foreground">{description}</p>
237
+ )}
238
+ </div>
239
+
240
+ {hasProperties && (
241
+ <div className="space-y-3">
242
+ {Object.entries(properties).map(([key, prop]) => (
243
+ <FieldRenderer
244
+ key={key}
245
+ fieldKey={key}
246
+ property={prop}
247
+ value={formData[key]}
248
+ onChange={handleChange} />
249
+ ))}
250
+ </div>
251
+ )}
252
+
253
+ <div className="flex gap-2 pt-2 border-t">
254
+ <Button
255
+ size="sm"
256
+ disabled={!isFormValid || isSubmitting}
257
+ onClick={handleSubmit}>
258
+ {submitLabel}
259
+ </Button>
260
+ <Button
261
+ size="sm"
262
+ variant="outline"
263
+ disabled={isSubmitting}
264
+ onClick={onCancel}>
265
+ Cancel
266
+ </Button>
267
+ </div>
268
+ </div>
269
+ );
270
+ }
@@ -0,0 +1,319 @@
1
+ 'use client';
2
+
3
+ import { useMemo, useState } from 'react';
4
+
5
+ import { cn } from '@docyrus/ui-pro-shared/lib/utils';
6
+ import { ChevronDown, Search } from 'lucide-react';
7
+
8
+ interface SearchResult {
9
+ title: string;
10
+ link: string;
11
+ snippet?: string;
12
+ publishedDate?: string;
13
+ text?: string;
14
+ summary?: string;
15
+ favicon?: string;
16
+ }
17
+
18
+ interface WebSearchResult {
19
+ url: string;
20
+ type: string;
21
+ title: string;
22
+ pageAge?: string;
23
+ }
24
+
25
+ interface NewsResult {
26
+ title: string;
27
+ url: string;
28
+ snippet?: string;
29
+ date?: string;
30
+ imageUrl?: string;
31
+ }
32
+
33
+ interface ParsedOutput {
34
+ action?: { url?: string; query?: string };
35
+ output?: WebSearchResult[];
36
+ news?: NewsResult[];
37
+ results?: SearchResult[];
38
+ result?: string | SearchResult[] | { news?: NewsResult[] };
39
+ searchType?: string;
40
+ context?: string;
41
+ }
42
+
43
+ interface SearchWebProps {
44
+ state: string;
45
+ output?: any;
46
+ errorText?: string;
47
+ title?: string;
48
+ }
49
+
50
+ function parseOutput(output: any): ParsedOutput {
51
+ if (!output) return {};
52
+
53
+ let parsed: ParsedOutput;
54
+
55
+ if (typeof output === 'string') {
56
+ try {
57
+ const result = JSON.parse(output);
58
+
59
+ if (Array.isArray(result)) return { results: result as SearchResult[] };
60
+ parsed = result as ParsedOutput;
61
+ } catch {
62
+ return {};
63
+ }
64
+ } else if (Array.isArray(output)) {
65
+ return { results: output as SearchResult[] };
66
+ } else {
67
+ parsed = output as ParsedOutput;
68
+ }
69
+
70
+ if (parsed.result && typeof parsed.result === 'string') {
71
+ try {
72
+ const nested = JSON.parse(parsed.result);
73
+
74
+ if (nested && typeof nested === 'object') {
75
+ if (Array.isArray(nested.results)) parsed.results = nested.results;
76
+ if (nested.searchType) parsed.searchType = nested.searchType;
77
+ if (nested.context) parsed.context = nested.context;
78
+ } else if (Array.isArray(nested)) {
79
+ parsed.results = nested;
80
+ }
81
+ } catch {
82
+ // not valid JSON
83
+ }
84
+ }
85
+
86
+ return parsed;
87
+ }
88
+
89
+ function getDomain(url: string): string {
90
+ try {
91
+ return new URL(url).hostname.replace('www.', '');
92
+ } catch {
93
+ return url;
94
+ }
95
+ }
96
+
97
+ function cleanSnippet(snippet: string, maxLength = 150): string {
98
+ if (!snippet) return '';
99
+
100
+ return snippet
101
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
102
+ .replace(/[#*_]/g, '')
103
+ .replace(/\s+/g, ' ')
104
+ .trim()
105
+ .substring(0, maxLength);
106
+ }
107
+
108
+ function formatDate(dateString: string): string {
109
+ if (!dateString) return '';
110
+ try {
111
+ const date = new Date(dateString);
112
+ const now = new Date();
113
+ const hours = Math.floor((now.getTime() - date.getTime()) / 3600000);
114
+
115
+ if (hours < 1) return 'Just now';
116
+ if (hours < 24) return `${hours}h ago`;
117
+ if (hours < 48) return 'Yesterday';
118
+
119
+ return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
120
+ } catch {
121
+ return dateString;
122
+ }
123
+ }
124
+
125
+ export function SearchWeb({
126
+ state, output, errorText, title
127
+ }: SearchWebProps) {
128
+ const [open, setOpen] = useState(false);
129
+
130
+ const parsed = useMemo(() => parseOutput(output), [output]);
131
+
132
+ const webSearchResults = useMemo((): WebSearchResult[] => {
133
+ const out = parsed.output;
134
+
135
+ if (!Array.isArray(out)) return [];
136
+
137
+ return out.filter(item => item.type === 'web_search_result');
138
+ }, [parsed]);
139
+
140
+ const newsResults = useMemo((): NewsResult[] => {
141
+ const { result } = parsed;
142
+
143
+ if (result && typeof result === 'object' && !Array.isArray(result)) {
144
+ const { news } = result as { news?: NewsResult[] };
145
+
146
+ return Array.isArray(news) ? news : [];
147
+ }
148
+
149
+ return [];
150
+ }, [parsed]);
151
+
152
+ const searchResults = useMemo((): SearchResult[] => {
153
+ if (parsed.action || webSearchResults.length > 0 || newsResults.length > 0) return [];
154
+
155
+ if (Array.isArray(parsed.results)) return parsed.results;
156
+
157
+ const { result } = parsed;
158
+
159
+ if (typeof result === 'string') {
160
+ try {
161
+ const p = JSON.parse(result);
162
+
163
+ if (Array.isArray(p)) return p as SearchResult[];
164
+ } catch {
165
+ // not valid JSON
166
+ }
167
+ }
168
+ if (Array.isArray(result)) return result as SearchResult[];
169
+
170
+ return [];
171
+ }, [parsed, webSearchResults.length, newsResults.length]);
172
+
173
+ const hasResults
174
+ = searchResults.length > 0
175
+ || webSearchResults.length > 0
176
+ || newsResults.length > 0
177
+ || !!parsed.action?.url
178
+ || !!parsed.action?.query;
179
+
180
+ const headerText = parsed.action?.url ? 'URL Result' : parsed.action?.query ? 'Query' : newsResults.length > 0 ? `${newsResults.length} news` : webSearchResults.length > 0 ? `${webSearchResults.length} results` : `${searchResults.length} results`;
181
+
182
+ if (state === 'output-error') {
183
+ return (
184
+ <div className="text-xs text-destructive py-1">
185
+ Search failed: {errorText || 'Error'}
186
+ </div>
187
+ );
188
+ }
189
+
190
+ if (state !== 'output-available') return null;
191
+
192
+ if (!hasResults) {
193
+ return <div className="text-xs text-muted-foreground py-1">No results found</div>;
194
+ }
195
+
196
+ return (
197
+ <div className="text-primary text-xs">
198
+ <button
199
+ type="button"
200
+ className="flex items-center gap-2 mt-1 cursor-pointer"
201
+ onClick={() => setOpen(prev => !prev)}>
202
+ <Search className="w-4 h-4" />
203
+ <span className="font-medium">{title || headerText}</span>
204
+ <ChevronDown className={cn('size-3 transition-transform', open && 'rotate-180')} />
205
+ </button>
206
+
207
+ {open && (
208
+ <div className="mt-3 rounded-lg border bg-card overflow-hidden">
209
+ {parsed.action?.url && (
210
+ <div className="p-4">
211
+ <a
212
+ href={parsed.action.url}
213
+ target="_blank"
214
+ rel="noopener noreferrer"
215
+ className="text-xs text-muted-foreground hover:underline break-all line-clamp-1">
216
+ {parsed.action.url}
217
+ </a>
218
+ </div>
219
+ )}
220
+
221
+ {!parsed.action?.url && parsed.action?.query && (
222
+ <div className="px-3 py-2">
223
+ <p className="text-xs text-muted-foreground">{parsed.action.query}</p>
224
+ </div>
225
+ )}
226
+
227
+ {!parsed.action && webSearchResults.length > 0 && (
228
+ <div className="divide-y">
229
+ {webSearchResults.map((result, i) => (
230
+ <div key={i} className="p-4 hover:bg-accent/5 transition-colors">
231
+ <a
232
+ href={result.url}
233
+ target="_blank"
234
+ rel="noopener noreferrer"
235
+ className="block space-y-1">
236
+ <h3 className="text-xs font-medium text-foreground line-clamp-1">{result.title}</h3>
237
+ <div className="flex items-center gap-1.5 text-[10px] text-muted-foreground">
238
+ <span className="truncate max-w-[120px]">{getDomain(result.url)}</span>
239
+ {result.pageAge && <span>• {result.pageAge}</span>}
240
+ </div>
241
+ </a>
242
+ </div>
243
+ ))}
244
+ </div>
245
+ )}
246
+
247
+ {!parsed.action && webSearchResults.length === 0 && newsResults.length > 0 && (
248
+ <div className="divide-y">
249
+ {newsResults.map((result, i) => (
250
+ <div key={i} className="p-4 hover:bg-accent/5 transition-colors">
251
+ <a
252
+ href={result.url}
253
+ target="_blank"
254
+ rel="noopener noreferrer"
255
+ className="flex gap-3">
256
+ {result.imageUrl && (
257
+ <img
258
+ src={result.imageUrl}
259
+ alt={result.title}
260
+ className="w-16 h-16 object-cover rounded flex-shrink-0" />
261
+ )}
262
+ <div className="flex-1 min-w-0 space-y-0.5">
263
+ <h3 className="text-xs font-medium text-foreground line-clamp-1">{result.title}</h3>
264
+ {result.snippet && (
265
+ <p className="text-[11px] text-muted-foreground line-clamp-1">
266
+ {cleanSnippet(result.snippet, 100)}
267
+ </p>
268
+ )}
269
+ <div className="flex items-center gap-1.5 text-[10px] text-muted-foreground">
270
+ <span className="truncate max-w-[120px]">{getDomain(result.url)}</span>
271
+ {result.date && <span>• {result.date}</span>}
272
+ </div>
273
+ </div>
274
+ </a>
275
+ </div>
276
+ ))}
277
+ </div>
278
+ )}
279
+
280
+ {!parsed.action && webSearchResults.length === 0 && newsResults.length === 0 && searchResults.length > 0 && (
281
+ <div className="divide-y">
282
+ {searchResults.map((result, i) => (
283
+ <div key={i} className="px-3 py-2 hover:bg-accent/5 transition-colors">
284
+ <a
285
+ href={result.link}
286
+ target="_blank"
287
+ rel="noopener noreferrer"
288
+ className="block space-y-0.5">
289
+ <div className="flex items-center gap-1.5">
290
+ {result.favicon && (
291
+ <img
292
+ src={result.favicon}
293
+ alt={getDomain(result.link)}
294
+ className="w-3.5 h-3.5 rounded flex-shrink-0"
295
+ onError={(e) => { (e.target as HTMLImageElement).style.display = 'none'; }} />
296
+ )}
297
+ <h3 className="text-xs font-medium text-foreground hover:underline line-clamp-1 flex-1">
298
+ {result.title}
299
+ </h3>
300
+ </div>
301
+ {(result.summary || result.text || result.snippet) && (
302
+ <p className="text-[11px] text-muted-foreground line-clamp-2 leading-tight">
303
+ {result.summary || cleanSnippet(result.text || result.snippet || '')}
304
+ </p>
305
+ )}
306
+ <div className="flex items-center gap-1.5 text-[10px] text-muted-foreground">
307
+ <span className="truncate max-w-[120px]">{getDomain(result.link)}</span>
308
+ {result.publishedDate && <span>• {formatDate(result.publishedDate)}</span>}
309
+ </div>
310
+ </a>
311
+ </div>
312
+ ))}
313
+ </div>
314
+ )}
315
+ </div>
316
+ )}
317
+ </div>
318
+ );
319
+ }