@signalcore/ui 0.1.0 → 1.0.0-beta.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 (611) hide show
  1. package/README.md +896 -513
  2. package/dist/AgentAbout.d.ts +186 -0
  3. package/dist/AgentAbout.js +1020 -0
  4. package/dist/AgentAbout.js.map +1 -0
  5. package/dist/AgentCard.d.ts +49 -0
  6. package/dist/AgentCard.js +77 -0
  7. package/dist/AgentCard.js.map +1 -0
  8. package/dist/AgentChat.d.ts +233 -0
  9. package/dist/AgentChat.js +1127 -0
  10. package/dist/AgentChat.js.map +1 -0
  11. package/dist/AgentSpace.d.ts +112 -0
  12. package/dist/AgentSpace.js +339 -0
  13. package/dist/AgentSpace.js.map +1 -0
  14. package/dist/AgentTasks.d.ts +48 -0
  15. package/dist/AgentTasks.js +120 -0
  16. package/dist/AgentTasks.js.map +1 -0
  17. package/dist/BrowserView.d.ts +52 -0
  18. package/dist/BrowserView.js +328 -0
  19. package/dist/BrowserView.js.map +1 -0
  20. package/dist/FileView.d.ts +63 -0
  21. package/dist/FileView.js +449 -0
  22. package/dist/FileView.js.map +1 -0
  23. package/dist/Modes.d.ts +13 -0
  24. package/dist/Modes.js +75 -0
  25. package/dist/Modes.js.map +1 -0
  26. package/dist/VoiceCall.d.ts +91 -0
  27. package/dist/VoiceCall.js +302 -0
  28. package/dist/VoiceCall.js.map +1 -0
  29. package/dist/about.d.ts +212 -0
  30. package/dist/about.js +136 -0
  31. package/dist/about.js.map +1 -0
  32. package/dist/agentIcons.d.ts +33 -0
  33. package/dist/agentIcons.js +36 -0
  34. package/dist/agentIcons.js.map +1 -0
  35. package/dist/automation/Automation.d.ts +35 -0
  36. package/dist/automation/Automation.js +268 -0
  37. package/dist/automation/Automation.js.map +1 -0
  38. package/dist/automation/RunView.d.ts +25 -0
  39. package/dist/automation/RunView.js +187 -0
  40. package/dist/automation/RunView.js.map +1 -0
  41. package/dist/automation/cron.d.ts +41 -0
  42. package/dist/automation/cron.js +169 -0
  43. package/dist/automation/cron.js.map +1 -0
  44. package/dist/automation/marks.js +121 -0
  45. package/dist/automation/marks.js.map +1 -0
  46. package/dist/automation/messages.d.ts +113 -0
  47. package/dist/automation/messages.js +113 -0
  48. package/dist/automation/messages.js.map +1 -0
  49. package/dist/automation/record.d.ts +47 -0
  50. package/dist/automation/record.js +177 -0
  51. package/dist/automation/record.js.map +1 -0
  52. package/dist/automation/types.d.ts +143 -0
  53. package/dist/automation/when.d.ts +36 -0
  54. package/dist/automation/when.js +168 -0
  55. package/dist/automation/when.js.map +1 -0
  56. package/dist/blocks.d.ts +185 -0
  57. package/dist/browser.js +292 -0
  58. package/dist/browser.js.map +1 -0
  59. package/dist/call.d.ts +89 -0
  60. package/dist/call.js +218 -0
  61. package/dist/call.js.map +1 -0
  62. package/dist/channelParts.js +26 -0
  63. package/dist/channelParts.js.map +1 -0
  64. package/dist/classes.js +8 -3
  65. package/dist/classes.js.map +1 -0
  66. package/dist/client.d.ts +146 -54
  67. package/dist/client.js +204 -1
  68. package/dist/client.js.map +1 -0
  69. package/dist/conversationFiles.js +46 -0
  70. package/dist/conversationFiles.js.map +1 -0
  71. package/dist/credentials.d.ts +45 -0
  72. package/dist/credentials.js +98 -0
  73. package/dist/credentials.js.map +1 -0
  74. package/dist/dev.js +17 -0
  75. package/dist/dev.js.map +1 -0
  76. package/dist/es.d.ts +17 -0
  77. package/dist/es.js +382 -0
  78. package/dist/es.js.map +1 -0
  79. package/dist/files.d.ts +21 -0
  80. package/dist/files.js +214 -0
  81. package/dist/files.js.map +1 -0
  82. package/dist/frames.d.ts +115 -0
  83. package/dist/frames.js +219 -0
  84. package/dist/frames.js.map +1 -0
  85. package/dist/icons.js +29 -0
  86. package/dist/icons.js.map +1 -0
  87. package/dist/index.d.ts +63 -60
  88. package/dist/index.js +59 -45
  89. package/dist/kit/AudioPlayer.d.ts +20 -0
  90. package/dist/kit/AudioPlayer.js +116 -0
  91. package/dist/kit/AudioPlayer.js.map +1 -0
  92. package/dist/kit/Button.d.ts +29 -0
  93. package/dist/kit/Button.js +59 -0
  94. package/dist/kit/Button.js.map +1 -0
  95. package/dist/kit/Card.d.ts +16 -0
  96. package/dist/kit/Card.js +36 -0
  97. package/dist/kit/Card.js.map +1 -0
  98. package/dist/kit/Chart.js +152 -0
  99. package/dist/kit/Chart.js.map +1 -0
  100. package/dist/kit/Choices.d.ts +21 -0
  101. package/dist/kit/Choices.js +99 -0
  102. package/dist/kit/Choices.js.map +1 -0
  103. package/dist/kit/Combobox.d.ts +26 -0
  104. package/dist/kit/Combobox.js +190 -0
  105. package/dist/kit/Combobox.js.map +1 -0
  106. package/dist/kit/DateField.d.ts +17 -0
  107. package/dist/kit/DateField.js +133 -0
  108. package/dist/kit/DateField.js.map +1 -0
  109. package/dist/kit/Field.d.ts +40 -0
  110. package/dist/kit/Field.js +98 -0
  111. package/dist/kit/Field.js.map +1 -0
  112. package/dist/kit/FileField.d.ts +113 -0
  113. package/dist/kit/FileField.js +341 -0
  114. package/dist/kit/FileField.js.map +1 -0
  115. package/dist/kit/FileMark.d.ts +15 -0
  116. package/dist/kit/FileMark.js +39 -0
  117. package/dist/kit/FileMark.js.map +1 -0
  118. package/dist/kit/Inputs.d.ts +59 -0
  119. package/dist/kit/Inputs.js +205 -0
  120. package/dist/kit/Inputs.js.map +1 -0
  121. package/dist/kit/List.d.ts +47 -0
  122. package/dist/kit/List.js +85 -0
  123. package/dist/kit/List.js.map +1 -0
  124. package/dist/kit/Mark.d.ts +30 -0
  125. package/dist/kit/Mark.js +27 -0
  126. package/dist/kit/Mark.js.map +1 -0
  127. package/dist/kit/MarkStack.d.ts +15 -0
  128. package/dist/kit/MarkStack.js +26 -0
  129. package/dist/kit/MarkStack.js.map +1 -0
  130. package/dist/kit/Note.d.ts +11 -0
  131. package/dist/kit/Note.js +31 -0
  132. package/dist/kit/Note.js.map +1 -0
  133. package/dist/kit/Popover.js +90 -0
  134. package/dist/kit/Popover.js.map +1 -0
  135. package/dist/kit/RangeField.d.ts +14 -0
  136. package/dist/kit/RangeField.js +47 -0
  137. package/dist/kit/RangeField.js.map +1 -0
  138. package/dist/kit/RatingField.d.ts +14 -0
  139. package/dist/kit/RatingField.js +50 -0
  140. package/dist/kit/RatingField.js.map +1 -0
  141. package/dist/kit/Stat.d.ts +26 -0
  142. package/dist/kit/Stat.js +46 -0
  143. package/dist/kit/Stat.js.map +1 -0
  144. package/dist/kit/Switch.d.ts +14 -0
  145. package/dist/kit/Switch.js +21 -0
  146. package/dist/kit/Switch.js.map +1 -0
  147. package/dist/kit/Tag.d.ts +16 -0
  148. package/dist/kit/Tag.js +20 -0
  149. package/dist/kit/Tag.js.map +1 -0
  150. package/dist/kit/Tile.d.ts +34 -0
  151. package/dist/kit/Tile.js +52 -0
  152. package/dist/kit/Tile.js.map +1 -0
  153. package/dist/kit/TimeField.d.ts +31 -0
  154. package/dist/kit/TimeField.js +109 -0
  155. package/dist/kit/TimeField.js.map +1 -0
  156. package/dist/kit/context.d.ts +22 -0
  157. package/dist/kit/context.js +46 -0
  158. package/dist/kit/context.js.map +1 -0
  159. package/dist/kit/dates.d.ts +14 -0
  160. package/dist/kit/dates.js +129 -0
  161. package/dist/kit/dates.js.map +1 -0
  162. package/dist/kit/messages.d.ts +99 -0
  163. package/dist/kit/messages.js +66 -0
  164. package/dist/kit/messages.js.map +1 -0
  165. package/dist/kit/numbers.d.ts +12 -0
  166. package/dist/kit/numbers.js +40 -0
  167. package/dist/kit/numbers.js.map +1 -0
  168. package/dist/kit/options.d.ts +10 -0
  169. package/dist/kit/options.js +23 -0
  170. package/dist/kit/options.js.map +1 -0
  171. package/dist/kit/uploads.d.ts +42 -0
  172. package/dist/kit/uploads.js +165 -0
  173. package/dist/kit/uploads.js.map +1 -0
  174. package/dist/kit/waveform.js +76 -0
  175. package/dist/kit/waveform.js.map +1 -0
  176. package/dist/locale.d.ts +1 -0
  177. package/dist/locale.js +1 -0
  178. package/dist/markdown.js +84 -0
  179. package/dist/markdown.js.map +1 -0
  180. package/dist/marks.js +217 -0
  181. package/dist/marks.js.map +1 -0
  182. package/dist/reveal.js +48 -0
  183. package/dist/reveal.js.map +1 -0
  184. package/dist/stepGlyphs.js +62 -0
  185. package/dist/stepGlyphs.js.map +1 -0
  186. package/dist/surface/Form.js +264 -0
  187. package/dist/surface/Form.js.map +1 -0
  188. package/dist/surface/Markdown.js +42 -0
  189. package/dist/surface/Markdown.js.map +1 -0
  190. package/dist/surface/Surface.d.ts +31 -17
  191. package/dist/surface/Surface.js +480 -57
  192. package/dist/surface/Surface.js.map +1 -0
  193. package/dist/surface/scope.d.ts +32 -0
  194. package/dist/surface/scope.js +23 -0
  195. package/dist/surface/scope.js.map +1 -0
  196. package/dist/surface/values.d.ts +44 -0
  197. package/dist/surface/values.js +237 -0
  198. package/dist/surface/values.js.map +1 -0
  199. package/dist/tint.d.ts +10 -0
  200. package/dist/tint.js +19 -0
  201. package/dist/tint.js.map +1 -0
  202. package/dist/types.d.ts +541 -0
  203. package/dist/types.js +16 -0
  204. package/dist/types.js.map +1 -0
  205. package/dist/useAgentFace.d.ts +18 -0
  206. package/dist/useAgentFace.js +45 -0
  207. package/dist/useAgentFace.js.map +1 -0
  208. package/dist/useCall.d.ts +39 -0
  209. package/dist/useCall.js +273 -0
  210. package/dist/useCall.js.map +1 -0
  211. package/dist/useConversation.d.ts +77 -0
  212. package/dist/useConversation.js +523 -0
  213. package/dist/useConversation.js.map +1 -0
  214. package/dist/useDictation.d.ts +17 -0
  215. package/dist/useDictation.js +68 -0
  216. package/dist/useDictation.js.map +1 -0
  217. package/dist/useLive.d.ts +26 -0
  218. package/dist/useLive.js +88 -0
  219. package/dist/useLive.js.map +1 -0
  220. package/dist/usePolled.js +68 -0
  221. package/dist/usePolled.js.map +1 -0
  222. package/dist/voice/Orb.d.ts +10 -9
  223. package/dist/voice/Orb.js +43 -39
  224. package/dist/voice/Orb.js.map +1 -0
  225. package/dist/voice/StillOrb.js +33 -0
  226. package/dist/voice/StillOrb.js.map +1 -0
  227. package/dist/voice/WebGLOrb.js +98 -0
  228. package/dist/voice/WebGLOrb.js.map +1 -0
  229. package/dist/voice/fluidDots.js +161 -0
  230. package/dist/voice/fluidDots.js.map +1 -0
  231. package/dist/voice/motion.js +84 -0
  232. package/dist/voice/motion.js.map +1 -0
  233. package/dist/voice/orbs.d.ts +32 -0
  234. package/dist/voice/orbs.js +16 -0
  235. package/dist/voice/orbs.js.map +1 -0
  236. package/dist/voice/useReducedMotion.js +16 -16
  237. package/dist/voice/useReducedMotion.js.map +1 -0
  238. package/dist/voice/wave.js +116 -0
  239. package/dist/voice/wave.js.map +1 -0
  240. package/dist/voice/webgl.js +177 -0
  241. package/dist/voice/webgl.js.map +1 -0
  242. package/dist/widget.js +284 -8
  243. package/package.json +49 -39
  244. package/src/AgentAbout.tsx +1621 -0
  245. package/src/AgentCard.tsx +123 -0
  246. package/src/AgentChat.tsx +1812 -0
  247. package/src/AgentSpace.tsx +540 -0
  248. package/src/AgentTasks.tsx +163 -0
  249. package/src/BrowserView.tsx +442 -0
  250. package/src/FileView.tsx +620 -0
  251. package/src/Modes.tsx +112 -0
  252. package/src/VoiceCall.tsx +411 -0
  253. package/src/about.ts +355 -0
  254. package/src/agentIcons.ts +56 -0
  255. package/src/automation/Automation.tsx +308 -0
  256. package/src/automation/RunView.tsx +213 -0
  257. package/src/automation/cron.ts +196 -0
  258. package/src/automation/marks.tsx +144 -0
  259. package/src/automation/messages.ts +231 -0
  260. package/src/automation/record.ts +206 -0
  261. package/src/automation/types.ts +146 -0
  262. package/src/automation/when.ts +195 -0
  263. package/src/blocks.ts +249 -0
  264. package/src/browser.ts +334 -0
  265. package/src/call.ts +300 -0
  266. package/src/channelParts.ts +17 -0
  267. package/src/classes.ts +10 -0
  268. package/src/client.ts +397 -0
  269. package/src/conversationFiles.ts +54 -0
  270. package/src/credentials.ts +158 -0
  271. package/src/dev.ts +20 -0
  272. package/src/es.ts +423 -0
  273. package/src/files.ts +238 -0
  274. package/src/frames.ts +291 -0
  275. package/src/icons.tsx +49 -0
  276. package/src/index.ts +271 -0
  277. package/src/kit/AudioPlayer.tsx +129 -0
  278. package/src/kit/Button.tsx +97 -0
  279. package/src/kit/Card.tsx +47 -0
  280. package/src/kit/Chart.tsx +129 -0
  281. package/src/kit/Choices.tsx +131 -0
  282. package/src/kit/Combobox.tsx +247 -0
  283. package/src/kit/DateField.tsx +156 -0
  284. package/src/kit/Field.tsx +137 -0
  285. package/src/kit/FileField.tsx +492 -0
  286. package/src/kit/FileMark.tsx +56 -0
  287. package/src/kit/Inputs.tsx +250 -0
  288. package/src/kit/List.tsx +135 -0
  289. package/src/kit/Mark.tsx +64 -0
  290. package/src/kit/MarkStack.tsx +29 -0
  291. package/src/kit/Note.tsx +42 -0
  292. package/src/kit/Popover.tsx +121 -0
  293. package/src/kit/RangeField.tsx +53 -0
  294. package/src/kit/RatingField.tsx +62 -0
  295. package/src/kit/Stat.tsx +60 -0
  296. package/src/kit/Switch.tsx +28 -0
  297. package/src/kit/Tag.tsx +32 -0
  298. package/src/kit/Tile.tsx +74 -0
  299. package/src/kit/TimeField.tsx +157 -0
  300. package/src/kit/context.tsx +246 -0
  301. package/src/kit/dates.ts +150 -0
  302. package/src/kit/messages.ts +160 -0
  303. package/src/kit/numbers.ts +44 -0
  304. package/src/kit/options.ts +30 -0
  305. package/src/kit/uploads.ts +244 -0
  306. package/src/kit/waveform.ts +84 -0
  307. package/src/locale.ts +6 -0
  308. package/src/markdown.ts +69 -0
  309. package/src/marks.tsx +328 -0
  310. package/src/reveal.ts +52 -0
  311. package/src/stepGlyphs.ts +83 -0
  312. package/src/styles.css +6970 -0
  313. package/src/surface/Form.tsx +299 -0
  314. package/src/surface/Markdown.tsx +55 -0
  315. package/src/surface/Surface.tsx +605 -0
  316. package/src/surface/scope.ts +82 -0
  317. package/src/surface/values.ts +361 -0
  318. package/src/tint.ts +14 -0
  319. package/src/types.ts +604 -0
  320. package/src/useAgentFace.ts +47 -0
  321. package/src/useCall.ts +292 -0
  322. package/src/useConversation.ts +627 -0
  323. package/src/useDictation.ts +83 -0
  324. package/src/useLive.ts +115 -0
  325. package/src/usePolled.ts +60 -0
  326. package/src/voice/Orb.tsx +45 -0
  327. package/src/voice/StillOrb.tsx +29 -0
  328. package/src/voice/WebGLOrb.tsx +98 -0
  329. package/src/voice/fluidDots.tsx +171 -0
  330. package/src/voice/motion.ts +112 -0
  331. package/src/voice/orbs.ts +39 -0
  332. package/src/voice/useReducedMotion.ts +24 -0
  333. package/src/voice/wave.tsx +129 -0
  334. package/src/voice/webgl.ts +209 -0
  335. package/src/widget/css.d.ts +5 -0
  336. package/src/widget/element.tsx +535 -0
  337. package/src/widget/index.ts +10 -0
  338. package/src/widget/mount.ts +27 -0
  339. package/src/widget/widget.css +253 -0
  340. package/dist/SignalcoreProvider.d.ts +0 -113
  341. package/dist/SignalcoreProvider.js +0 -84
  342. package/dist/automations/AppMarks.d.ts +0 -11
  343. package/dist/automations/AppMarks.js +0 -18
  344. package/dist/automations/AutomationCard.d.ts +0 -27
  345. package/dist/automations/AutomationCard.js +0 -53
  346. package/dist/automations/AutomationsWindow.d.ts +0 -38
  347. package/dist/automations/AutomationsWindow.js +0 -57
  348. package/dist/automations/Card.d.ts +0 -46
  349. package/dist/automations/Card.js +0 -45
  350. package/dist/automations/ScheduleMarks.d.ts +0 -13
  351. package/dist/automations/ScheduleMarks.js +0 -24
  352. package/dist/automations/presentationIcons.d.ts +0 -7
  353. package/dist/automations/presentationIcons.js +0 -67
  354. package/dist/automations/schedule.d.ts +0 -25
  355. package/dist/automations/schedule.js +0 -59
  356. package/dist/automations/time.d.ts +0 -3
  357. package/dist/automations/time.js +0 -25
  358. package/dist/browser/BrowserView.d.ts +0 -43
  359. package/dist/browser/BrowserView.js +0 -94
  360. package/dist/browser/room.d.ts +0 -21
  361. package/dist/browser/room.js +0 -33
  362. package/dist/browser/useBrowserSession.d.ts +0 -17
  363. package/dist/browser/useBrowserSession.js +0 -67
  364. package/dist/builder/BuilderChat.d.ts +0 -32
  365. package/dist/builder/BuilderChat.js +0 -41
  366. package/dist/builder/BuilderTranscript.d.ts +0 -49
  367. package/dist/builder/BuilderTranscript.js +0 -62
  368. package/dist/builder/StatusLine.d.ts +0 -8
  369. package/dist/builder/StatusLine.js +0 -17
  370. package/dist/builder/answer.d.ts +0 -7
  371. package/dist/builder/answer.js +0 -8
  372. package/dist/builder/blocks.d.ts +0 -31
  373. package/dist/builder/blocks.js +0 -74
  374. package/dist/builder/items.d.ts +0 -15
  375. package/dist/builder/items.js +0 -21
  376. package/dist/builder/steps.d.ts +0 -20
  377. package/dist/builder/steps.js +0 -120
  378. package/dist/builder/time.d.ts +0 -4
  379. package/dist/builder/time.js +0 -24
  380. package/dist/builder/useBuildSession.d.ts +0 -36
  381. package/dist/builder/useBuildSession.js +0 -130
  382. package/dist/builder/workingOn.d.ts +0 -7
  383. package/dist/builder/workingOn.js +0 -15
  384. package/dist/chat/AgentChat.d.ts +0 -37
  385. package/dist/chat/AgentChat.js +0 -21
  386. package/dist/chat/ChatView.d.ts +0 -25
  387. package/dist/chat/ChatView.js +0 -34
  388. package/dist/chat/Composer.d.ts +0 -20
  389. package/dist/chat/Composer.js +0 -22
  390. package/dist/chat/MessageRow.d.ts +0 -22
  391. package/dist/chat/MessageRow.js +0 -32
  392. package/dist/chat/arrival.d.ts +0 -15
  393. package/dist/chat/arrival.js +0 -25
  394. package/dist/chat/history.d.ts +0 -24
  395. package/dist/chat/history.js +0 -45
  396. package/dist/chat/moments.d.ts +0 -25
  397. package/dist/chat/moments.js +0 -72
  398. package/dist/chat/types.d.ts +0 -12
  399. package/dist/chat/types.js +0 -1
  400. package/dist/chat/useComposer.d.ts +0 -46
  401. package/dist/chat/useComposer.js +0 -62
  402. package/dist/chat/useConversation.d.ts +0 -35
  403. package/dist/chat/useConversation.js +0 -71
  404. package/dist/chat/useStickToBottom.d.ts +0 -9
  405. package/dist/chat/useStickToBottom.js +0 -33
  406. package/dist/chat/useTurns.d.ts +0 -49
  407. package/dist/chat/useTurns.js +0 -111
  408. package/dist/classes.d.ts +0 -2
  409. package/dist/development.d.ts +0 -5
  410. package/dist/development.js +0 -8
  411. package/dist/flow/FlowWindow.d.ts +0 -42
  412. package/dist/flow/FlowWindow.js +0 -126
  413. package/dist/flow/index.d.ts +0 -16
  414. package/dist/flow/index.js +0 -16
  415. package/dist/flow/kinds.d.ts +0 -23
  416. package/dist/flow/kinds.js +0 -48
  417. package/dist/flow/map.d.ts +0 -44
  418. package/dist/flow/map.js +0 -225
  419. package/dist/flow/nodePaths.d.ts +0 -7
  420. package/dist/flow/nodePaths.js +0 -17
  421. package/dist/flow/relations.d.ts +0 -42
  422. package/dist/flow/relations.js +0 -174
  423. package/dist/host.d.ts +0 -124
  424. package/dist/host.js +0 -1
  425. package/dist/live/LiveView.d.ts +0 -28
  426. package/dist/live/LiveView.js +0 -55
  427. package/dist/live/capture.d.ts +0 -20
  428. package/dist/live/capture.js +0 -100
  429. package/dist/live/follow.d.ts +0 -26
  430. package/dist/live/follow.js +0 -72
  431. package/dist/live/paint.d.ts +0 -13
  432. package/dist/live/paint.js +0 -77
  433. package/dist/live/useLiveStream.d.ts +0 -16
  434. package/dist/live/useLiveStream.js +0 -57
  435. package/dist/look.d.ts +0 -33
  436. package/dist/look.js +0 -241
  437. package/dist/messages/en.d.ts +0 -3
  438. package/dist/messages/en.js +0 -251
  439. package/dist/messages/es.d.ts +0 -3
  440. package/dist/messages/es.js +0 -251
  441. package/dist/messages/index.d.ts +0 -16
  442. package/dist/messages/index.js +0 -33
  443. package/dist/messages/types.d.ts +0 -246
  444. package/dist/messages/types.js +0 -1
  445. package/dist/parts/Button.d.ts +0 -18
  446. package/dist/parts/Button.js +0 -17
  447. package/dist/parts/Icon.d.ts +0 -39
  448. package/dist/parts/Icon.js +0 -37
  449. package/dist/parts/Input.d.ts +0 -6
  450. package/dist/parts/Input.js +0 -11
  451. package/dist/parts/Spinner.d.ts +0 -2
  452. package/dist/parts/Spinner.js +0 -7
  453. package/dist/patterns.d.ts +0 -15
  454. package/dist/patterns.js +0 -5
  455. package/dist/presets.d.ts +0 -82
  456. package/dist/presets.js +0 -81
  457. package/dist/primitives.d.ts +0 -22
  458. package/dist/primitives.js +0 -58
  459. package/dist/request/RequestCard.d.ts +0 -34
  460. package/dist/request/RequestCard.js +0 -101
  461. package/dist/request/approval/ApprovalPreview.d.ts +0 -5
  462. package/dist/request/approval/ApprovalPreview.js +0 -27
  463. package/dist/request/approval/shapes.d.ts +0 -32
  464. package/dist/request/approval/shapes.js +0 -68
  465. package/dist/request/apps.d.ts +0 -11
  466. package/dist/request/apps.js +0 -27
  467. package/dist/request/cards.d.ts +0 -12
  468. package/dist/request/cards.js +0 -24
  469. package/dist/request/deliver.d.ts +0 -12
  470. package/dist/request/deliver.js +0 -21
  471. package/dist/request/handOver.d.ts +0 -18
  472. package/dist/request/handOver.js +0 -33
  473. package/dist/request/kinds/Approval.d.ts +0 -3
  474. package/dist/request/kinds/Approval.js +0 -9
  475. package/dist/request/kinds/Choice.d.ts +0 -3
  476. package/dist/request/kinds/Choice.js +0 -8
  477. package/dist/request/kinds/Connect.d.ts +0 -9
  478. package/dist/request/kinds/Connect.js +0 -119
  479. package/dist/request/kinds/FreeText.d.ts +0 -3
  480. package/dist/request/kinds/FreeText.js +0 -20
  481. package/dist/request/kinds/HandOver.d.ts +0 -13
  482. package/dist/request/kinds/HandOver.js +0 -20
  483. package/dist/request/kinds/Secret.d.ts +0 -7
  484. package/dist/request/kinds/Secret.js +0 -49
  485. package/dist/request/kinds/Upload.d.ts +0 -6
  486. package/dist/request/kinds/Upload.js +0 -47
  487. package/dist/request/types.d.ts +0 -83
  488. package/dist/request/types.js +0 -1
  489. package/dist/safeUrl.d.ts +0 -6
  490. package/dist/safeUrl.js +0 -8
  491. package/dist/stream/builder.d.ts +0 -176
  492. package/dist/stream/builder.js +0 -202
  493. package/dist/stream/reduce.d.ts +0 -51
  494. package/dist/stream/reduce.js +0 -58
  495. package/dist/stream/untilAborted.d.ts +0 -7
  496. package/dist/stream/untilAborted.js +0 -32
  497. package/dist/stream/useRunStream.d.ts +0 -26
  498. package/dist/stream/useRunStream.js +0 -137
  499. package/dist/styles.css +0 -2318
  500. package/dist/surface/HostNode.d.ts +0 -14
  501. package/dist/surface/HostNode.js +0 -30
  502. package/dist/surface/Node.d.ts +0 -7
  503. package/dist/surface/Node.js +0 -49
  504. package/dist/surface/SurfaceBoundary.d.ts +0 -26
  505. package/dist/surface/SurfaceBoundary.js +0 -20
  506. package/dist/surface/bindings.d.ts +0 -14
  507. package/dist/surface/bindings.js +0 -37
  508. package/dist/surface/check.d.ts +0 -27
  509. package/dist/surface/check.js +0 -102
  510. package/dist/surface/format.d.ts +0 -10
  511. package/dist/surface/format.js +0 -32
  512. package/dist/surface/hosts.d.ts +0 -6
  513. package/dist/surface/hosts.js +0 -11
  514. package/dist/surface/scene.d.ts +0 -21
  515. package/dist/surface/scene.js +0 -8
  516. package/dist/surface/templates/Browser.d.ts +0 -6
  517. package/dist/surface/templates/Browser.js +0 -11
  518. package/dist/surface/templates/Chart.d.ts +0 -6
  519. package/dist/surface/templates/Chart.js +0 -13
  520. package/dist/surface/templates/Choices.d.ts +0 -3
  521. package/dist/surface/templates/Choices.js +0 -12
  522. package/dist/surface/templates/Form.d.ts +0 -3
  523. package/dist/surface/templates/Form.js +0 -44
  524. package/dist/surface/templates/KeyValue.d.ts +0 -3
  525. package/dist/surface/templates/KeyValue.js +0 -7
  526. package/dist/surface/templates/Layout.d.ts +0 -5
  527. package/dist/surface/templates/Layout.js +0 -16
  528. package/dist/surface/templates/Live.d.ts +0 -6
  529. package/dist/surface/templates/Live.js +0 -9
  530. package/dist/surface/templates/Media.d.ts +0 -5
  531. package/dist/surface/templates/Media.js +0 -13
  532. package/dist/surface/templates/Slots.d.ts +0 -3
  533. package/dist/surface/templates/Slots.js +0 -19
  534. package/dist/surface/templates/Table.d.ts +0 -3
  535. package/dist/surface/templates/Table.js +0 -12
  536. package/dist/surface/templates/Text.d.ts +0 -4
  537. package/dist/surface/templates/Text.js +0 -15
  538. package/dist/surface/templates/index.d.ts +0 -7
  539. package/dist/surface/templates/index.js +0 -32
  540. package/dist/surface/types.d.ts +0 -68
  541. package/dist/surface/types.js +0 -6
  542. package/dist/theme.d.ts +0 -62
  543. package/dist/theme.js +0 -9
  544. package/dist/useTokens.d.ts +0 -7
  545. package/dist/useTokens.js +0 -41
  546. package/dist/voice/VoiceWindow.d.ts +0 -18
  547. package/dist/voice/VoiceWindow.js +0 -35
  548. package/dist/voice/index.d.ts +0 -13
  549. package/dist/voice/index.js +0 -12
  550. package/dist/voice/meter.d.ts +0 -16
  551. package/dist/voice/meter.js +0 -52
  552. package/dist/voice/orbColors.d.ts +0 -16
  553. package/dist/voice/orbColors.js +0 -75
  554. package/dist/voice/pushable.d.ts +0 -16
  555. package/dist/voice/pushable.js +0 -56
  556. package/dist/voice/useDictation.d.ts +0 -24
  557. package/dist/voice/useDictation.js +0 -60
  558. package/dist/voice/useReducedMotion.d.ts +0 -5
  559. package/dist/voice/useVoice.d.ts +0 -70
  560. package/dist/voice/useVoice.js +0 -197
  561. package/dist/voice/useVoicePrimitives.d.ts +0 -7
  562. package/dist/voice/useVoicePrimitives.js +0 -11
  563. package/dist/voice/voice.d.ts +0 -55
  564. package/dist/voice/voice.js +0 -9
  565. package/dist/voice/webSpeech.d.ts +0 -33
  566. package/dist/voice/webSpeech.js +0 -258
  567. package/dist/widget.js.map +0 -1
  568. package/dist/windows/AgentSpace.d.ts +0 -78
  569. package/dist/windows/AgentSpace.js +0 -135
  570. package/dist/windows/Captions.d.ts +0 -13
  571. package/dist/windows/Captions.js +0 -22
  572. package/dist/windows/Dock.d.ts +0 -37
  573. package/dist/windows/Dock.js +0 -22
  574. package/dist/windows/Journal.d.ts +0 -15
  575. package/dist/windows/Journal.js +0 -19
  576. package/dist/windows/KindMark.d.ts +0 -7
  577. package/dist/windows/KindMark.js +0 -31
  578. package/dist/windows/Pending.d.ts +0 -8
  579. package/dist/windows/Pending.js +0 -17
  580. package/dist/windows/Stage.d.ts +0 -18
  581. package/dist/windows/Stage.js +0 -21
  582. package/dist/windows/StatusLabel.d.ts +0 -9
  583. package/dist/windows/StatusLabel.js +0 -7
  584. package/dist/windows/Strip.d.ts +0 -17
  585. package/dist/windows/Strip.js +0 -42
  586. package/dist/windows/SurfaceWindow.d.ts +0 -20
  587. package/dist/windows/SurfaceWindow.js +0 -12
  588. package/dist/windows/WindowFrame.d.ts +0 -23
  589. package/dist/windows/WindowFrame.js +0 -22
  590. package/dist/windows/hearing.d.ts +0 -11
  591. package/dist/windows/hearing.js +0 -26
  592. package/dist/windows/kinds.d.ts +0 -47
  593. package/dist/windows/kinds.js +0 -28
  594. package/dist/windows/reduce.d.ts +0 -98
  595. package/dist/windows/reduce.js +0 -151
  596. package/dist/windows/registry.d.ts +0 -18
  597. package/dist/windows/registry.js +0 -61
  598. package/dist/windows/reveal.d.ts +0 -9
  599. package/dist/windows/reveal.js +0 -6
  600. package/dist/windows/space.d.ts +0 -21
  601. package/dist/windows/space.js +0 -6
  602. package/dist/windows/status.d.ts +0 -11
  603. package/dist/windows/status.js +0 -30
  604. package/dist/windows/types.d.ts +0 -15
  605. package/dist/windows/types.js +0 -1
  606. package/dist/windows/useLoaded.d.ts +0 -44
  607. package/dist/windows/useLoaded.js +0 -58
  608. package/dist/windows/useUnread.d.ts +0 -7
  609. package/dist/windows/useUnread.js +0 -21
  610. package/dist/windows/useWindows.d.ts +0 -70
  611. package/dist/windows/useWindows.js +0 -60
@@ -0,0 +1,540 @@
1
+ import { PhoneIcon, XIcon } from "@phosphor-icons/react";
2
+ import { lazy, Suspense, useEffect, useRef, useState } from "react";
3
+
4
+ import { AgentChat, type ChatMessages, type ChatPart, type ChatSteps } from "./AgentChat";
5
+ import { agentGlyph } from "./agentIcons";
6
+ import {
7
+ AgentTasks,
8
+ TASK_MESSAGES,
9
+ useTasks,
10
+ type TaskMessages,
11
+ type TaskPart,
12
+ } from "./AgentTasks";
13
+ import type { BrowserPart } from "./BrowserView";
14
+ import { classes } from "./classes";
15
+ import { ApiError, type Client } from "./client";
16
+ import { Button } from "./kit/Button";
17
+ import { KitProvider, type KitPart } from "./kit/context";
18
+ import type { KitLocale } from "./kit/messages";
19
+ import { Modes, type ModeMessages, type ModePart, type SpaceMode } from "./Modes";
20
+ import type { SurfaceComponents, SurfacePart } from "./surface/scope";
21
+ import { agentTint, type AgentTint } from "./tint";
22
+ import { useAgentFace } from "./useAgentFace";
23
+ import { useConversation, type LiveConversation, type ToolHandler } from "./useConversation";
24
+ import type { VoiceCallMessages, VoiceCallPart } from "./VoiceCall";
25
+ import type { OrbStyle } from "./voice/orbs";
26
+
27
+ // The call, and LiveKit under it, load the first time someone calls.
28
+ const VoiceCall = lazy(() =>
29
+ import("./VoiceCall").then((module) => ({ default: module.VoiceCall })),
30
+ );
31
+
32
+ /** The words the space says around the chat and the call; a host gives its own, in its language. */
33
+ export interface SpaceMessages {
34
+ /** The two modes beside the composer's paperclip: the group's name, and each mode's. */
35
+ modes: ModeMessages;
36
+ /** After a call that couldn't begin: try it again. */
37
+ again: string;
38
+ /** The button that closes the space, where the host gives `onClose`. */
39
+ close: string;
40
+ /** The agent's name when its face can't be read. */
41
+ agent: string;
42
+ /** While the conversation is found, or started. */
43
+ opening: string;
44
+ /** The conversation could not be opened; and the button that tries again. */
45
+ failed: string;
46
+ retry: string;
47
+ /** What the chat says (`AgentChat`'s words). */
48
+ chat: Partial<ChatMessages>;
49
+ /** What a call says (`VoiceCall`'s words). */
50
+ voice: Partial<VoiceCallMessages>;
51
+ /** What the person's tasks say (`AgentTasks`'s words). */
52
+ tasks: TaskMessages;
53
+ }
54
+
55
+ export const SPACE_MESSAGES: SpaceMessages = {
56
+ modes: { label: "Mode", text: "Text", voice: "Voice" },
57
+ again: "Call again",
58
+ close: "Close",
59
+ agent: "Agent",
60
+ opening: "Opening the conversation…",
61
+ failed: "The conversation couldn't be opened.",
62
+ retry: "Try again",
63
+ chat: {},
64
+ voice: {},
65
+ tasks: TASK_MESSAGES,
66
+ };
67
+
68
+ /** The space's parts, by the class each carries; `classNames` adds a host's own under the same keys. */
69
+ export type SpacePart =
70
+ | "sc-space"
71
+ | "sc-space--compact"
72
+ | "sc-space--full"
73
+ | "sc-space--voice"
74
+ | "sc-space__face"
75
+ | "sc-space__mark"
76
+ | `sc-space__mark--${AgentTint}`
77
+ | "sc-space__who"
78
+ | "sc-space__name"
79
+ | "sc-space__role"
80
+ | "sc-space__close"
81
+ | "sc-space__body"
82
+ | "sc-space__voice"
83
+ | "sc-space__foot"
84
+ | "sc-space__caption"
85
+ | "sc-space__caption--person"
86
+ | "sc-space__caption--agent"
87
+ | "sc-space__status"
88
+ | "sc-space__tasks"
89
+ | ModePart;
90
+
91
+ /**
92
+ * How the space sits: `compact` in a small panel (a widget's, a side of the host's page); `full`
93
+ * as a page's main column, the conversation at a reading measure.
94
+ */
95
+ export type SpaceLayout = "compact" | "full";
96
+
97
+ /** How big a call's orb is drawn in each layout: a small panel keeps room for what is said. */
98
+ const ORB_SIZES: Readonly<Record<SpaceLayout, number>> = { compact: 200, full: 280 };
99
+
100
+ export interface AgentSpaceProps {
101
+ client: Client;
102
+ /** The agent the person talks to (its face is read with `client`). One per mount: key on it. */
103
+ agentId: string;
104
+ /**
105
+ * The person's conversation to go on with, read when the space opens. Without one, or once it
106
+ * is gone (not theirs, not there), a new one starts, told through `onConversation`.
107
+ */
108
+ conversationId?: string | undefined;
109
+ /** Hears the conversation the space started, for the host to keep and give back next time. */
110
+ onConversation?: ((id: string) => void) | undefined;
111
+ layout?: SpaceLayout | undefined;
112
+ /**
113
+ * Draws the agent's face at the top: its mark in its tint, its name and role (and the close).
114
+ * Off by default: the host's page says who it is, or draws its own with `useAgentFace`.
115
+ */
116
+ header?: boolean | undefined;
117
+ /**
118
+ * Whether the chat shows the agent's steps (`AgentChat`'s `steps`): by default hidden for a
119
+ * person or a visitor, shown for the business.
120
+ */
121
+ steps?: ChatSteps | undefined;
122
+ messages?: Partial<SpaceMessages> | undefined;
123
+ classNames?:
124
+ | Partial<
125
+ Record<
126
+ SpacePart | ChatPart | SurfacePart | KitPart | BrowserPart | VoiceCallPart | TaskPart,
127
+ string
128
+ >
129
+ >
130
+ | undefined;
131
+ /** The host's own drawing of a block type, for every surface the agent shows. */
132
+ components?: SurfaceComponents | undefined;
133
+ /** The language of the surfaces' calendars, days, times and numbers; English by default. */
134
+ locale?: KitLocale | undefined;
135
+ /** A few things the person might say first, offered while nothing has been said. */
136
+ suggestions?: readonly string[] | undefined;
137
+ /** Runs the host's own tools the agent calls in the page (`AgentChat`'s `onTool`). */
138
+ onTool?: ToolHandler | undefined;
139
+ /** An error's code, from the chat's socket or `load`; the host words it. */
140
+ onError?: ((code: string) => void) | undefined;
141
+ /** How a call's orb is drawn: `"wave"` (the default) or `"fluid-dots"`. */
142
+ orb?: OrbStyle | undefined;
143
+ /** Draws a close button (in the face, or at the top's end without it), for a space in a panel. */
144
+ onClose?: (() => void) | undefined;
145
+ /**
146
+ * Whether a person sees the tasks the agent runs for them (`AgentTasks`): a line over the chat
147
+ * while there are any, which opens them. On by default; the business's own space never has it.
148
+ */
149
+ tasks?: boolean | undefined;
150
+ }
151
+
152
+ /**
153
+ * An agent in a host's page, for the people it serves: the conversation, and when the agent has a
154
+ * voice, two modes beside the composer's paperclip, text and voice. Voice turns the space into
155
+ * the call (`VoiceCall`, with the orb and what is being said), in the same place and size, with
156
+ * the modes at its foot to go back; a call is a conversation of its own (the API makes one with
157
+ * each), and once the agent took it the space goes on in it, where what was said shows, told
158
+ * through `onConversation`. Ending the call, or choosing text, comes back to writing; a call that
159
+ * couldn't begin stays to say why, and offers to try again. While the agent runs tasks for the
160
+ * person (what they asked it to do later), a line over the chat opens them, with their runs, to
161
+ * pause or take away. The conversation is the one given, or
162
+ * one the space starts. The agent's face over it all is the host's to turn on (`header`). Styled
163
+ * as `AgentChat` is: the tokens, `messages`, `classNames` and `components`. One agent per mount:
164
+ * key it on the agent's id.
165
+ */
166
+ export function AgentSpace({
167
+ client,
168
+ agentId,
169
+ conversationId,
170
+ onConversation,
171
+ layout = "compact",
172
+ header = false,
173
+ steps,
174
+ messages,
175
+ classNames,
176
+ components,
177
+ locale,
178
+ suggestions,
179
+ onTool,
180
+ onError,
181
+ orb,
182
+ onClose,
183
+ tasks: showsTasks = true,
184
+ }: AgentSpaceProps) {
185
+ const words = { ...SPACE_MESSAGES, ...messages };
186
+ const theirs = useTasks(client, agentId, showsTasks && client.who === "person");
187
+ const [listing, setListing] = useState(false);
188
+ const { face, loading } = useAgentFace(client, agentId);
189
+ const opened = useOpened(client, agentId, conversationId, onConversation);
190
+ const [mode, setMode] = useState<SpaceMode>("text");
191
+ // Each call made is a new attempt, which keys a new `VoiceCall`.
192
+ const [attempt, setAttempt] = useState(0);
193
+ // The conversation the call being made is (each call is one of its own, made with it), and
194
+ // whether the agent took it: once it did, the space goes on in it.
195
+ const [called, setCalled] = useState<string | null>(null);
196
+ const answered = useRef(false);
197
+ // Whether the modes drawn after a switch take the keyboard: when it was in the space (asked of
198
+ // the space itself, which a shadow root's focus answers too).
199
+ const [refocus, setRefocus] = useState(false);
200
+ const root = useRef<HTMLElement>(null);
201
+ const tint = agentTint(agentId);
202
+ const Glyph = agentGlyph(face?.icon);
203
+ const name = face?.name ?? (loading ? "" : words.agent);
204
+ const id = opened.id;
205
+ const voice = face?.voice.enabled === true;
206
+ const parts: SpacePart[] = [`sc-space--${layout}`];
207
+ if (mode === "voice") parts.push("sc-space--voice");
208
+
209
+ /** Back to writing: in the call's conversation once the agent took the call. */
210
+ const write = () => {
211
+ if (answered.current && called !== null) opened.go(called);
212
+ setMode("text");
213
+ };
214
+ const choose = (next: SpaceMode) => {
215
+ setRefocus(root.current?.matches(":focus-within") ?? false);
216
+ if (next === "text") {
217
+ write();
218
+ return;
219
+ }
220
+ answered.current = false;
221
+ setCalled(null);
222
+ setAttempt((count) => count + 1);
223
+ setMode("voice");
224
+ };
225
+ const modes = (current: SpaceMode) => (
226
+ <Modes
227
+ mode={current}
228
+ onChange={choose}
229
+ words={words.modes}
230
+ classNames={classNames}
231
+ focus={refocus}
232
+ />
233
+ );
234
+
235
+ const body = () => {
236
+ if (opened.failed) {
237
+ return (
238
+ <div className={classes(classNames, "sc-space__status")}>
239
+ <p>{words.failed}</p>
240
+ <Button size="sm" onClick={opened.retry}>
241
+ {words.retry}
242
+ </Button>
243
+ </div>
244
+ );
245
+ }
246
+ if (id === null || loading) {
247
+ return (
248
+ <p role="status" className={classes(classNames, "sc-space__status")}>
249
+ {words.opening}
250
+ </p>
251
+ );
252
+ }
253
+ if (listing && theirs.tasks !== null) {
254
+ return (
255
+ <AgentTasks
256
+ client={client}
257
+ agentId={agentId}
258
+ tasks={theirs.tasks}
259
+ onChange={theirs.refresh}
260
+ onBack={() => {
261
+ setListing(false);
262
+ }}
263
+ words={words.tasks}
264
+ classNames={classNames}
265
+ />
266
+ );
267
+ }
268
+ if (mode === "voice" && voice) {
269
+ return (
270
+ <div part="voice" className={classes(classNames, "sc-space__voice")}>
271
+ <Suspense fallback={null}>
272
+ <VoiceCall
273
+ key={attempt}
274
+ connect={async () => {
275
+ const join = await client.conversations.call(agentId);
276
+ setCalled(join.conversation_id);
277
+ return join;
278
+ }}
279
+ onAnswer={() => {
280
+ answered.current = true;
281
+ }}
282
+ // Over, the call gives the space back to writing; one that couldn't begin stays to
283
+ // say why, with the way to try again and the modes to go back.
284
+ onEnd={(_, problem) => {
285
+ if (problem !== null) return;
286
+ setRefocus(root.current?.matches(":focus-within") ?? false);
287
+ write();
288
+ }}
289
+ name={name}
290
+ tint={tint}
291
+ orb={orb}
292
+ orbSize={ORB_SIZES[layout]}
293
+ messages={words.voice}
294
+ classNames={classNames}
295
+ captions={
296
+ called !== null && (
297
+ <Captions
298
+ client={client}
299
+ conversationId={called}
300
+ onTool={onTool}
301
+ classNames={classNames}
302
+ />
303
+ )
304
+ }
305
+ after={
306
+ <Button
307
+ tone="primary"
308
+ icon={PhoneIcon}
309
+ onClick={() => {
310
+ choose("voice");
311
+ }}
312
+ >
313
+ {words.again}
314
+ </Button>
315
+ }
316
+ />
317
+ </Suspense>
318
+ <div className={classes(classNames, "sc-space__foot")}>{modes("voice")}</div>
319
+ </div>
320
+ );
321
+ }
322
+ const count = theirs.tasks?.length ?? 0;
323
+ return (
324
+ <>
325
+ {count > 0 && (
326
+ <button
327
+ type="button"
328
+ part="tasks-open"
329
+ className={classes(classNames, "sc-space__tasks")}
330
+ onClick={() => {
331
+ setListing(true);
332
+ void theirs.refresh();
333
+ }}
334
+ >
335
+ {words.tasks.open(count)}
336
+ </button>
337
+ )}
338
+ <AgentChat
339
+ client={client}
340
+ conversationId={id}
341
+ name={name}
342
+ messages={words.chat}
343
+ classNames={classNames}
344
+ components={components}
345
+ locale={locale}
346
+ suggestions={suggestions}
347
+ steps={steps}
348
+ actions={voice ? modes("text") : undefined}
349
+ onTool={onTool}
350
+ onError={onError}
351
+ />
352
+ </>
353
+ );
354
+ };
355
+
356
+ const close = onClose && (
357
+ <Button
358
+ tone="ghost"
359
+ size="sm"
360
+ icon={XIcon}
361
+ aria-label={words.close}
362
+ title={words.close}
363
+ onClick={onClose}
364
+ part="close"
365
+ className={classes(classNames, "sc-space__close")}
366
+ />
367
+ );
368
+
369
+ return (
370
+ <KitProvider classNames={classNames} messages={words.chat.kit} locale={locale}>
371
+ <section
372
+ ref={root}
373
+ aria-label={name || undefined}
374
+ part="space"
375
+ className={`sc ${classes(classNames, "sc-space", ...parts)}`}
376
+ >
377
+ {header ? (
378
+ <header part="header" className={classes(classNames, "sc-space__face")}>
379
+ <span
380
+ aria-hidden
381
+ className={classes(classNames, "sc-space__mark", `sc-space__mark--${tint}`)}
382
+ >
383
+ <Glyph weight="duotone" />
384
+ </span>
385
+ <div className={classes(classNames, "sc-space__who")}>
386
+ <h2 className={classes(classNames, "sc-space__name")}>{name}</h2>
387
+ {face?.role && <p className={classes(classNames, "sc-space__role")}>{face.role}</p>}
388
+ </div>
389
+ {close}
390
+ </header>
391
+ ) : (
392
+ close
393
+ )}
394
+ <div className={classes(classNames, "sc-space__body")}>{body()}</div>
395
+ </section>
396
+ </KitProvider>
397
+ );
398
+ }
399
+
400
+ /**
401
+ * What is being said on the call, under the orb: the person's last words, and the agent's answer
402
+ * as it comes, read live from the call's own conversation (where the platform keeps them). The
403
+ * host's tools the agent calls meanwhile run here too, as in the chat.
404
+ */
405
+ function Captions({
406
+ client,
407
+ conversationId,
408
+ onTool,
409
+ classNames,
410
+ }: {
411
+ client: Client;
412
+ conversationId: string;
413
+ onTool: ToolHandler | undefined;
414
+ classNames: Partial<Record<SpacePart, string>> | undefined;
415
+ }) {
416
+ const live = useConversation(client, conversationId, { onTool });
417
+ const { person, agent } = captionsOf(live);
418
+ return (
419
+ <>
420
+ {person !== "" && (
421
+ <p className={classes(classNames, "sc-space__caption", "sc-space__caption--person")}>
422
+ {person}
423
+ </p>
424
+ )}
425
+ {agent !== "" && (
426
+ <p className={classes(classNames, "sc-space__caption", "sc-space__caption--agent")}>
427
+ {agent}
428
+ </p>
429
+ )}
430
+ </>
431
+ );
432
+ }
433
+
434
+ /**
435
+ * The last exchange of a call, as its captions say it: what the person last said, and the agent's
436
+ * words after it (as they stream, else the last it said; its greeting before anything was said).
437
+ */
438
+ export function captionsOf({
439
+ messages,
440
+ pending,
441
+ draft,
442
+ }: Pick<LiveConversation, "messages" | "pending" | "draft">): {
443
+ person: string;
444
+ agent: string;
445
+ } {
446
+ const lastSaid = messages.findLastIndex((message) => message.role === "user");
447
+ const replied = messages
448
+ .slice(lastSaid + 1)
449
+ .findLast(
450
+ (message) =>
451
+ message.role === "assistant" && message.author !== "operator" && message.text !== "",
452
+ );
453
+ return {
454
+ person: messages[lastSaid]?.text ?? "",
455
+ agent: pending && draft !== "" ? draft : (replied?.text ?? ""),
456
+ };
457
+ }
458
+
459
+ /** Whether a conversation asked for is gone for this person: not there, or not theirs. */
460
+ const isGone = (error: unknown): boolean =>
461
+ error instanceof ApiError && (error.status === 404 || error.status === 403);
462
+
463
+ /**
464
+ * The conversation the space shows: the one given while it is still the person's, else a new one
465
+ * with the agent, told to `onConversation`. Asked once per attempt (a second effect of the same
466
+ * attempt, as React's strict mode runs, waits on the first rather than starting another); after
467
+ * that, the conversation it opened is the one it goes on with, until it goes on in another (`go`:
468
+ * a call's), told the same way.
469
+ */
470
+ function useOpened(
471
+ client: Client,
472
+ agentId: string,
473
+ given: string | undefined,
474
+ onConversation: ((id: string) => void) | undefined,
475
+ ): { id: string | null; failed: boolean; retry: () => void; go: (id: string) => void } {
476
+ const kept = useRef(given);
477
+ const asking = useRef<{ client: Client; attempt: number; id: Promise<string> } | null>(null);
478
+ const [id, setId] = useState<string | null>(null);
479
+ const [failed, setFailed] = useState(false);
480
+ const [attempt, setAttempt] = useState(0);
481
+ // The host's ear as it last gave it, told from the effect's answer and from a call's end alike.
482
+ const told = useRef(onConversation);
483
+ useEffect(() => {
484
+ told.current = onConversation;
485
+ });
486
+ const started = (conversation: string) => {
487
+ told.current?.(conversation);
488
+ };
489
+
490
+ useEffect(() => {
491
+ let current = true;
492
+ const start = () =>
493
+ client.conversations.start(agentId).then((conversation) => {
494
+ started(conversation.id);
495
+ return conversation.id;
496
+ });
497
+ const open = (): Promise<string> => {
498
+ const known = kept.current;
499
+ if (known === undefined) return start();
500
+ return client.conversations.get(known).then(
501
+ (conversation) => conversation.id,
502
+ (error: unknown) => (isGone(error) ? start() : Promise.reject(error)),
503
+ );
504
+ };
505
+ const asked = asking.current;
506
+ const ask =
507
+ asked?.client === client && asked.attempt === attempt
508
+ ? asked
509
+ : { client, attempt, id: open() };
510
+ asking.current = ask;
511
+ ask.id.then(
512
+ (opened) => {
513
+ if (!current) return;
514
+ kept.current = opened;
515
+ setId(opened);
516
+ },
517
+ () => {
518
+ if (current) setFailed(true);
519
+ },
520
+ );
521
+ return () => {
522
+ current = false;
523
+ };
524
+ }, [client, agentId, attempt]);
525
+
526
+ return {
527
+ id,
528
+ failed,
529
+ retry: () => {
530
+ setFailed(false);
531
+ setAttempt((count) => count + 1);
532
+ },
533
+ go: (conversation) => {
534
+ if (conversation === kept.current) return;
535
+ kept.current = conversation;
536
+ setId(conversation);
537
+ started(conversation);
538
+ },
539
+ };
540
+ }
@@ -0,0 +1,163 @@
1
+ import { ArrowLeftIcon, TrashIcon } from "@phosphor-icons/react";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+
4
+ import { Automation } from "./automation/Automation";
5
+ import type { Task } from "./automation/types";
6
+ import { classes } from "./classes";
7
+ import type { Client } from "./client";
8
+ import { Button } from "./kit/Button";
9
+
10
+ /** What the person's tasks say, in the space; a host gives its own, in its language. */
11
+ export interface TaskMessages {
12
+ /** Over the chat, when the agent runs any for them: how many, to open them. */
13
+ open: (count: number) => string;
14
+ /** Over the list. */
15
+ title: string;
16
+ back: string;
17
+ /** Taking one away. */
18
+ remove: string;
19
+ /** None left. */
20
+ empty: string;
21
+ /** A change that didn't go through. */
22
+ failed: string;
23
+ }
24
+
25
+ export const TASK_MESSAGES: TaskMessages = {
26
+ open: (count) => (count === 1 ? "1 task set up for you" : `${count} tasks set up for you`),
27
+ title: "Your tasks",
28
+ back: "Back to the conversation",
29
+ remove: "Remove",
30
+ empty: "Nothing set up. Ask the agent to remind you of something, or to check back later.",
31
+ failed: "That didn't go through. Try again.",
32
+ };
33
+
34
+ export type TaskPart =
35
+ | "sc-tasks"
36
+ | "sc-tasks__head"
37
+ | "sc-tasks__title"
38
+ | "sc-tasks__list"
39
+ | "sc-tasks__empty"
40
+ | "sc-tasks__problem";
41
+
42
+ /** How often the person's tasks are read again while the space is open. */
43
+ export const TASKS_POLL_MS = 20_000;
44
+
45
+ /**
46
+ * The tasks the agent runs for the person the client speaks for, read when the space opens,
47
+ * again every `TASKS_POLL_MS` and on `refresh`. Null until read, and whenever it can't be (an API
48
+ * without tasks, the business's own client): the space then shows none.
49
+ */
50
+ export function useTasks(
51
+ client: Client,
52
+ agentId: string,
53
+ enabled: boolean,
54
+ ): { tasks: Task[] | null; refresh: () => Promise<void> } {
55
+ const [tasks, setTasks] = useState<Task[] | null>(null);
56
+ const live = useRef(true);
57
+ const refresh = useCallback(async () => {
58
+ try {
59
+ const read = await client.tasks.list(agentId);
60
+ if (live.current) setTasks(read);
61
+ } catch {
62
+ if (live.current) setTasks(null);
63
+ }
64
+ }, [client, agentId]);
65
+ useEffect(() => {
66
+ live.current = true;
67
+ if (!enabled) return;
68
+ void refresh();
69
+ const timer = setInterval(() => void refresh(), TASKS_POLL_MS);
70
+ return () => {
71
+ live.current = false;
72
+ clearInterval(timer);
73
+ };
74
+ }, [enabled, refresh]);
75
+ return { tasks: enabled ? tasks : null, refresh };
76
+ }
77
+
78
+ export interface AgentTasksProps {
79
+ client: Client;
80
+ agentId: string;
81
+ tasks: readonly Task[];
82
+ /** Read them again, after a change. */
83
+ onChange: () => Promise<void>;
84
+ onBack: () => void;
85
+ words: TaskMessages;
86
+ classNames?: Partial<Record<TaskPart, string>> | undefined;
87
+ }
88
+
89
+ /**
90
+ * The person's tasks, as they asked the agent for them: each as an automation reads (when, its
91
+ * words, its last runs and how each went), with their switch to pause it and the way to take it
92
+ * away; the way back to the conversation over them.
93
+ */
94
+ export function AgentTasks({
95
+ client,
96
+ agentId,
97
+ tasks,
98
+ onChange,
99
+ onBack,
100
+ words,
101
+ classNames,
102
+ }: AgentTasksProps) {
103
+ const [busy, setBusy] = useState<string | null>(null);
104
+ const [failed, setFailed] = useState(false);
105
+ const change = async (task: Task, doing: () => Promise<unknown>) => {
106
+ setBusy(task.id);
107
+ setFailed(false);
108
+ try {
109
+ await doing();
110
+ await onChange();
111
+ } catch {
112
+ setFailed(true);
113
+ } finally {
114
+ setBusy(null);
115
+ }
116
+ };
117
+ return (
118
+ <section aria-label={words.title} part="tasks" className={classes(classNames, "sc-tasks")}>
119
+ <header className={classes(classNames, "sc-tasks__head")}>
120
+ <Button
121
+ tone="ghost"
122
+ size="sm"
123
+ icon={ArrowLeftIcon}
124
+ aria-label={words.back}
125
+ title={words.back}
126
+ onClick={onBack}
127
+ />
128
+ <h3 className={classes(classNames, "sc-tasks__title")}>{words.title}</h3>
129
+ </header>
130
+ {failed && (
131
+ <p role="alert" className={classes(classNames, "sc-tasks__problem")}>
132
+ {words.failed}
133
+ </p>
134
+ )}
135
+ {tasks.length === 0 ? (
136
+ <p className={classes(classNames, "sc-tasks__empty")}>{words.empty}</p>
137
+ ) : (
138
+ <div className={classes(classNames, "sc-tasks__list")}>
139
+ {tasks.map((task) => (
140
+ <Automation
141
+ key={task.id}
142
+ automation={task}
143
+ runs={task.runs}
144
+ switching={busy === task.id}
145
+ onSwitch={(on) => void change(task, () => client.tasks.switch(agentId, task.id, on))}
146
+ actions={
147
+ <Button
148
+ tone="ghost"
149
+ size="sm"
150
+ icon={TrashIcon}
151
+ aria-label={words.remove}
152
+ title={words.remove}
153
+ disabled={busy === task.id}
154
+ onClick={() => void change(task, () => client.tasks.remove(agentId, task.id))}
155
+ />
156
+ }
157
+ />
158
+ ))}
159
+ </div>
160
+ )}
161
+ </section>
162
+ );
163
+ }