@factorialco/f0-react 2.38.0 → 2.39.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.
package/dist/ai.d.ts CHANGED
@@ -223,6 +223,13 @@ export declare type AiChatProviderProps = {
223
223
  * File attachment configuration. When provided, enables file uploads in the chat.
224
224
  */
225
225
  fileAttachments?: AiChatFileAttachmentConfig;
226
+ /**
227
+ * Voice dictation. When provided, a microphone button is shown in the
228
+ * composer: recorded audio is transcribed and the result fills the textarea
229
+ * (the user reviews and sends it as a normal text message). When omitted,
230
+ * the microphone is hidden.
231
+ */
232
+ onTranscribe?: TranscribeFn;
226
233
  onThumbsUp?: (message: F0AIMessage, { threadId, feedback }: {
227
234
  threadId: string;
228
235
  feedback: string;
@@ -358,7 +365,7 @@ declare type AiChatProviderReturnValue = {
358
365
  pendingQuote: PendingQuote | null;
359
366
  /** Set the pending quote (pass null to clear). */
360
367
  setPendingQuote: React.Dispatch<React.SetStateAction<PendingQuote | null>>;
361
- } & Pick<AiChatState, "agent" | "chatHeader" | "chatMessages" | "chatInput" | "disclaimer" | "resizable" | "entityRefs" | "canvasActions" | "canvasEntities" | "credits" | "employeeCredits" | "creditWarning" | "fileAttachments"> & {
368
+ } & Pick<AiChatState, "agent" | "chatHeader" | "chatMessages" | "chatInput" | "disclaimer" | "resizable" | "entityRefs" | "canvasActions" | "canvasEntities" | "credits" | "employeeCredits" | "creditWarning" | "fileAttachments" | "onTranscribe"> & {
362
369
  /** The current canvas content, or null when canvas is closed */
363
370
  canvasContent: CanvasContent | null;
364
371
  /** Open the canvas panel with the given content */
@@ -400,6 +407,7 @@ declare interface AiChatState {
400
407
  employeeCredits?: AiChatEmployeeCredits;
401
408
  creditWarning?: AiChatCreditWarning;
402
409
  fileAttachments?: AiChatFileAttachmentConfig;
410
+ onTranscribe?: TranscribeFn;
403
411
  placeholders?: string[];
404
412
  setPlaceholders?: React.Dispatch<React.SetStateAction<string[]>>;
405
413
  onThumbsUp?: (message: F0AIMessage, { threadId, feedback }: {
@@ -574,6 +582,14 @@ export declare const aiTranslations: {
574
582
  readonly dismiss: "Dismiss";
575
583
  };
576
584
  readonly attachFile: "Attach file";
585
+ readonly recordAudio: "Record audio";
586
+ readonly listening: "Listening…";
587
+ readonly stopRecording: "Stop and transcribe";
588
+ readonly cancelRecording: "Cancel recording";
589
+ readonly transcribing: "Transcribing…";
590
+ readonly micPermissionDenied: "Microphone access is blocked. Allow it in your browser settings to dictate.";
591
+ readonly micError: "Couldn't access the microphone.";
592
+ readonly transcriptionError: "Couldn't transcribe the audio. Try again.";
577
593
  readonly removeFile: "Remove";
578
594
  readonly fileUploadError: "Upload failed";
579
595
  readonly fileUploadBlockedSubmit: "Your message wasn't sent because one of the attachments failed to upload. Remove it or retry.";
@@ -1870,6 +1886,14 @@ export declare const defaultTranslations: {
1870
1886
  readonly dismiss: "Dismiss";
1871
1887
  };
1872
1888
  readonly attachFile: "Attach file";
1889
+ readonly recordAudio: "Record audio";
1890
+ readonly listening: "Listening…";
1891
+ readonly stopRecording: "Stop and transcribe";
1892
+ readonly cancelRecording: "Cancel recording";
1893
+ readonly transcribing: "Transcribing…";
1894
+ readonly micPermissionDenied: "Microphone access is blocked. Allow it in your browser settings to dictate.";
1895
+ readonly micError: "Couldn't access the microphone.";
1896
+ readonly transcriptionError: "Couldn't transcribe the audio. Try again.";
1873
1897
  readonly removeFile: "Remove";
1874
1898
  readonly fileUploadError: "Upload failed";
1875
1899
  readonly fileUploadBlockedSubmit: "Your message wasn't sent because one of the attachments failed to upload. Remove it or retry.";
@@ -2439,7 +2463,7 @@ export declare interface F0AiChatProps {
2439
2463
  /**
2440
2464
  * @experimental This is an experimental component use it at your own risk
2441
2465
  */
2442
- export declare const F0AiChatProvider: ({ enabled, initialMessage, chatHeader, chatMessages, chatInput, welcomeScreenSuggestions, disclaimer, resizable, defaultVisualizationMode, lockVisualizationMode, historyEnabled, footer, VoiceMode, entityRefs, canvasActions, canvasEntities, credits, employeeCredits, creditWarning, fileAttachments, onThumbsUp, onThumbsDown, children, agent, tracking, }: AiChatProviderProps) => JSX_2.Element;
2466
+ export declare const F0AiChatProvider: ({ enabled, initialMessage, chatHeader, chatMessages, chatInput, welcomeScreenSuggestions, disclaimer, resizable, defaultVisualizationMode, lockVisualizationMode, historyEnabled, footer, VoiceMode, entityRefs, canvasActions, canvasEntities, credits, employeeCredits, creditWarning, fileAttachments, onTranscribe, onThumbsUp, onThumbsDown, children, agent, tracking, }: AiChatProviderProps) => JSX_2.Element;
2443
2467
 
2444
2468
  /**
2445
2469
  * Headless chat composer.
@@ -2450,7 +2474,7 @@ export declare const F0AiChatProvider: ({ enabled, initialMessage, chatHeader, c
2450
2474
  * coupling to `useAiChat()` or CopilotKit — wrappers like F0AiChat
2451
2475
  * provide the wiring.
2452
2476
  */
2453
- export declare const F0AiChatTextArea: ({ onSubmit, onStop, inProgress, onBeforeSubmit, placeholders, creditWarning, clarifyingUI, pendingContext, onPendingContextChange, pendingQuote, onPendingQuoteChange, fileAttachments, searchPersons, onProcessFilesRef, disclaimer, footer, isWelcomeScreen, fullscreen, welcomeScreenSuggestions, onSuggestionClick, ref, }: F0AiChatTextAreaProps) => JSX_2.Element;
2477
+ export declare const F0AiChatTextArea: ({ onSubmit, onStop, inProgress, onBeforeSubmit, placeholders, creditWarning, clarifyingUI, pendingContext, onPendingContextChange, pendingQuote, onPendingQuoteChange, fileAttachments, onTranscribe, searchPersons, onProcessFilesRef, disclaimer, footer, isWelcomeScreen, fullscreen, welcomeScreenSuggestions, onSuggestionClick, ref, }: F0AiChatTextAreaProps) => JSX_2.Element;
2454
2478
 
2455
2479
  export declare type F0AiChatTextAreaProps = {
2456
2480
  ref: RefObject<HTMLDivElement>;
@@ -2488,6 +2512,12 @@ export declare type F0AiChatTextAreaProps = {
2488
2512
  onPendingQuoteChange?: (quote: PendingQuote | null) => void;
2489
2513
  /** File attachment configuration. When omitted, attachments are disabled. */
2490
2514
  fileAttachments?: AiChatFileAttachmentConfig;
2515
+ /**
2516
+ * Voice dictation. When provided, a microphone button is shown: recorded
2517
+ * audio is transcribed and the transcript fills the textarea (the user
2518
+ * reviews and sends it manually). When omitted, the microphone is hidden.
2519
+ */
2520
+ onTranscribe?: TranscribeFn;
2491
2521
  /** Async search used by the @-mention popover. When omitted, mentions are disabled. */
2492
2522
  searchPersons?: (query: string) => Promise<PersonProfile[]>;
2493
2523
  /**
@@ -3979,6 +4009,25 @@ export declare interface ThreadGroup {
3979
4009
  threads: ChatThread[];
3980
4010
  }
3981
4011
 
4012
+ /**
4013
+ * Transcribes a recorded audio blob to text (voice dictation). The returned
4014
+ * promise resolves with the final transcript; `onPartial` delivers
4015
+ * intermediate results for live textarea fill. When omitted from the chat
4016
+ * config, the microphone button is not rendered.
4017
+ */
4018
+ declare type TranscribeFn = (audio: Blob, options: TranscribeOptions) => Promise<string>;
4019
+
4020
+ declare type TranscribeOptions = {
4021
+ /**
4022
+ * Primary channel for live dictation: fires with the cumulative transcript
4023
+ * as it streams in, so the composer can fill the textarea while the user
4024
+ * speaks. Implementations that don't stream may call it once at the end.
4025
+ */
4026
+ onPartial: (text: string) => void;
4027
+ /** Aborted when the user cancels an in-flight transcription. */
4028
+ signal?: AbortSignal;
4029
+ };
4030
+
3982
4031
  declare type TranslationKey = Join<PathsToStringProps<typeof defaultTranslations>, ".">;
3983
4032
 
3984
4033
  declare type TranslationShape<T> = {
package/dist/ai.js CHANGED
@@ -1,6 +1,6 @@
1
- import { D as e, F as r, a as t, e as o, f as i, c as n, d as F, I as C, P as A, b as l, u as d } from "./F0CanvasPanel-BErabj-B.js";
1
+ import { D as e, F as r, a as t, e as o, f as i, c as n, d as F, I as C, P as A, b as l, u as d } from "./F0CanvasPanel-C_tqaABp.js";
2
2
  import { defaultTranslations as m } from "./i18n-provider-defaults.js";
3
- import { A as c, C as I, h as P, t as v, v as f, x as p, n as T, j as g, r as y, y as S, q as x, s as H, k as V, e as b, g as k, l as w, F as M, i as O, a as D, p as j, m as q, o as z, b as B, f as E, w as L, c as R, d as G, u as J } from "./useChatHistory-DBzFU3JU.js";
3
+ import { A as c, C as I, h as P, t as v, v as f, x as p, n as T, j as g, r as y, y as S, q as x, s as H, k as V, e as b, g as k, l as w, F as M, i as O, a as D, p as j, m as q, o as z, b as B, f as E, w as L, c as R, d as G, u as J } from "./useChatHistory-Bubo_nNb.js";
4
4
  export {
5
5
  c as AiChatTranslationsProvider,
6
6
  I as ChatSpinner,
@@ -589,6 +589,13 @@ declare type AiChatProviderProps = {
589
589
  * File attachment configuration. When provided, enables file uploads in the chat.
590
590
  */
591
591
  fileAttachments?: AiChatFileAttachmentConfig;
592
+ /**
593
+ * Voice dictation. When provided, a microphone button is shown in the
594
+ * composer: recorded audio is transcribed and the result fills the textarea
595
+ * (the user reviews and sends it as a normal text message). When omitted,
596
+ * the microphone is hidden.
597
+ */
598
+ onTranscribe?: TranscribeFn;
592
599
  onThumbsUp?: (message: F0AIMessage, { threadId, feedback }: {
593
600
  threadId: string;
594
601
  feedback: string;
@@ -3280,6 +3287,14 @@ declare const defaultTranslations: {
3280
3287
  readonly dismiss: "Dismiss";
3281
3288
  };
3282
3289
  readonly attachFile: "Attach file";
3290
+ readonly recordAudio: "Record audio";
3291
+ readonly listening: "Listening…";
3292
+ readonly stopRecording: "Stop and transcribe";
3293
+ readonly cancelRecording: "Cancel recording";
3294
+ readonly transcribing: "Transcribing…";
3295
+ readonly micPermissionDenied: "Microphone access is blocked. Allow it in your browser settings to dictate.";
3296
+ readonly micError: "Couldn't access the microphone.";
3297
+ readonly transcriptionError: "Couldn't transcribe the audio. Try again.";
3283
3298
  readonly removeFile: "Remove";
3284
3299
  readonly fileUploadError: "Upload failed";
3285
3300
  readonly fileUploadBlockedSubmit: "Your message wasn't sent because one of the attachments failed to upload. Remove it or retry.";
@@ -8124,6 +8139,25 @@ declare interface TopLevelPrependNotesTextEditorPageDocumentPatch {
8124
8139
  blocks: JSONContent[];
8125
8140
  }
8126
8141
 
8142
+ /**
8143
+ * Transcribes a recorded audio blob to text (voice dictation). The returned
8144
+ * promise resolves with the final transcript; `onPartial` delivers
8145
+ * intermediate results for live textarea fill. When omitted from the chat
8146
+ * config, the microphone button is not rendered.
8147
+ */
8148
+ declare type TranscribeFn = (audio: Blob, options: TranscribeOptions) => Promise<string>;
8149
+
8150
+ declare type TranscribeOptions = {
8151
+ /**
8152
+ * Primary channel for live dictation: fires with the cumulative transcript
8153
+ * as it streams in, so the composer can fill the textarea while the user
8154
+ * speaks. Implementations that don't stream may call it once at the end.
8155
+ */
8156
+ onPartial: (text: string) => void;
8157
+ /** Aborted when the user cancels an in-flight transcription. */
8158
+ signal?: AbortSignal;
8159
+ };
8160
+
8127
8161
  declare type TranslationKey = Join<PathsToStringProps<typeof defaultTranslations>, ".">;
8128
8162
 
8129
8163
  declare type TranslationShape<T> = {
@@ -1,9 +1,9 @@
1
- import { g as da, B as ua, h as fa, i as ma, j as At, k as De, l as ha, m as p, n as X, o as be, u as ie, T as pa, p as ba, q as ga, R as xa, r as va, s as re, t as wa, v as pt, w as rt, x as Re, A as _e, y as ya, z as Na, C as M, E as Ca, G as ka, H as ve, J as sn, K as Sa, L as Ia, M as W, N as on, S as O, O as we, Q as Fa, U as Aa, V as La, W as Ea, X as _a, Y as ke, Z as cn, _ as Oa, $ as ge, a0 as $e, a1 as Da, a2 as bt, d as dn, a3 as Ce, a4 as Ta, a5 as un, a6 as ne, a7 as K, a8 as fn, a9 as mn, aa as za, ab as hn, ac as me, ad as ee, ae as Pa, af as Ba, ag as Ra, ah as $a, ai as pe, aj as Ge, ak as Wa, al as Ma, am as ja, an as Va, ao as He, ap as pn, aq as Ga, ar as Ha, as as Ua, at as We, au as Ka, av as qa, aw as Ya, ax as Za, ay as Xa, az as Ja, aA as Qa, aB as er, aC as tr, aD as nr, aE as lt, aF as it, aG as bn, aH as ar, aI as rr, aJ as lr, aK as ir, aL as Ue, aM as gt, aN as gn, aO as sr, aP as xn, aQ as or, aR as cr, aS as dr, aT as Ee, aU as ur, aV as Te, aW as Lt, aX as st, aY as fr, aZ as mr, a as hr, b as pr, a_ as vn, a$ as br, f as gr, F as xr, b0 as wn, b1 as vr, b2 as yn, b3 as wr, b4 as yr, b5 as Nr, b6 as Cr, b7 as kr, b8 as Sr, b9 as Ir, ba as Fr, bb as Ar, bc as Nn, bd as ue, be as xt, bf as vt, bg as wt, bh as Cn, bi as yt, bj as kn, bk as Sn, bl as Lr, bm as Er, bn as _r, bo as Or, bp as Dr, bq as Tr, br as zr, bs as Pr, bt as Br, bu as Rr, bv as Et, bw as _t, bx as Ot, by as $r, bz as Wr, bA as Mr, bB as jr, bC as In, bD as Vr, bE as Gr } from "./F0CanvasPanel-BErabj-B.js";
2
- import { bQ as Lc, bP as Ec, c0 as _c, bM as Oc, bN as Dc, bF as Tc, bG as zc, bH as Pc, c1 as Bc, bO as Rc, bY as $c, bZ as Wc, bI as Mc, bS as jc, bR as Vc, bJ as Gc, bK as Hc, b_ as Uc, c2 as Kc, b$ as qc, bX as Yc, bU as Zc, bW as Xc, bT as Jc, bL as Qc, bV as ed } from "./F0CanvasPanel-BErabj-B.js";
1
+ import { g as da, B as ua, h as fa, i as ma, j as At, k as De, l as ha, m as p, n as X, o as be, u as ie, T as pa, p as ba, q as ga, R as xa, r as va, s as re, t as wa, v as pt, w as rt, x as Re, A as _e, y as ya, z as Na, C as M, E as Ca, G as ka, H as ve, J as sn, K as Sa, L as Ia, M as W, N as on, S as O, O as we, Q as Fa, U as Aa, V as La, W as Ea, X as _a, Y as ke, Z as cn, _ as Oa, $ as ge, a0 as $e, a1 as Da, a2 as bt, d as dn, a3 as Ce, a4 as Ta, a5 as un, a6 as ne, a7 as K, a8 as fn, a9 as mn, aa as za, ab as hn, ac as me, ad as ee, ae as Pa, af as Ba, ag as Ra, ah as $a, ai as pe, aj as Ge, ak as Wa, al as Ma, am as ja, an as Va, ao as He, ap as pn, aq as Ga, ar as Ha, as as Ua, at as We, au as Ka, av as qa, aw as Ya, ax as Za, ay as Xa, az as Ja, aA as Qa, aB as er, aC as tr, aD as nr, aE as lt, aF as it, aG as bn, aH as ar, aI as rr, aJ as lr, aK as ir, aL as Ue, aM as gt, aN as gn, aO as sr, aP as xn, aQ as or, aR as cr, aS as dr, aT as Ee, aU as ur, aV as Te, aW as Lt, aX as st, aY as fr, aZ as mr, a as hr, b as pr, a_ as vn, a$ as br, f as gr, F as xr, b0 as wn, b1 as vr, b2 as yn, b3 as wr, b4 as yr, b5 as Nr, b6 as Cr, b7 as kr, b8 as Sr, b9 as Ir, ba as Fr, bb as Ar, bc as Nn, bd as ue, be as xt, bf as vt, bg as wt, bh as Cn, bi as yt, bj as kn, bk as Sn, bl as Lr, bm as Er, bn as _r, bo as Or, bp as Dr, bq as Tr, br as zr, bs as Pr, bt as Br, bu as Rr, bv as Et, bw as _t, bx as Ot, by as $r, bz as Wr, bA as Mr, bB as jr, bC as In, bD as Vr, bE as Gr } from "./F0CanvasPanel-C_tqaABp.js";
2
+ import { bQ as Lc, bP as Ec, c0 as _c, bM as Oc, bN as Dc, bF as Tc, bG as zc, bH as Pc, c1 as Bc, bO as Rc, bY as $c, bZ as Wc, bI as Mc, bS as jc, bR as Vc, bJ as Gc, bK as Hc, b_ as Uc, c2 as Kc, b$ as qc, bX as Yc, bU as Zc, bW as Xc, bT as Jc, bL as Qc, bV as ed } from "./F0CanvasPanel-C_tqaABp.js";
3
3
  import { jsx as e, jsxs as o, Fragment as U } from "react/jsx-runtime";
4
4
  import se, { forwardRef as j, useRef as G, useTransition as Hr, useState as _, useLayoutEffect as Fn, useId as ot, useContext as Ke, createContext as Nt, useEffect as $, useCallback as Q, useMemo as q, Fragment as Ur, isValidElement as Kr, cloneElement as An, Children as Ln } from "react";
5
- import { C as qr, P as Yr, g as En, c as Zr, a as _n, F as ct, f as Xr, M as Jr, b as Qr, R as Dt, d as On, u as el, e as Dn, S as tl, A as nl, B as al, L as rl, h as ll, V as il, i as sl, j as Tt, k as ol, l as cl, O as dl } from "./useDataCollectionSource-ZgUdpWim.js";
6
- import { r as nd, s as ad, p as rd, H as ld, t as id, z as sd, a9 as od, G as cd, q as dd, Q as ud, o as fd, Y as md, U as hd, J as pd, af as bd, K as gd, Z as xd, _ as vd, v as wd, ab as yd, ac as Nd, aa as Cd, ad as kd, N as Sd, $ as Id, a6 as Fd, a8 as Ad, w as Ld, y as Ed, D as _d, W as Od, ae as Dd, X as Td, T as zd, x as Pd, E as Bd, m as Rd, n as $d, a1 as Wd, a2 as Md, a7 as jd, I as Vd, a3 as Gd, a4 as Hd, a0 as Ud, a5 as Kd } from "./useDataCollectionSource-ZgUdpWim.js";
5
+ import { C as qr, P as Yr, g as En, c as Zr, a as _n, F as ct, f as Xr, M as Jr, b as Qr, R as Dt, d as On, u as el, e as Dn, S as tl, A as nl, B as al, L as rl, h as ll, V as il, i as sl, j as Tt, k as ol, l as cl, O as dl } from "./useDataCollectionSource-BA6BeGvi.js";
6
+ import { r as nd, s as ad, p as rd, H as ld, t as id, z as sd, a9 as od, G as cd, q as dd, Q as ud, o as fd, Y as md, U as hd, J as pd, af as bd, K as gd, Z as xd, _ as vd, v as wd, ab as yd, ac as Nd, aa as Cd, ad as kd, N as Sd, $ as Id, a6 as Fd, a8 as Ad, w as Ld, y as Ed, D as _d, W as Od, ae as Dd, X as Td, T as zd, x as Pd, E as Bd, m as Rd, n as $d, a1 as Wd, a2 as Md, a7 as jd, I as Vd, a3 as Gd, a4 as Hd, a0 as Ud, a5 as Kd } from "./useDataCollectionSource-BA6BeGvi.js";
7
7
  const ul = da("Search", [
8
8
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }],
9
9
  ["path", { d: "m21 21-4.3-4.3", key: "1qie3q" }]
package/dist/f0.d.ts CHANGED
@@ -601,6 +601,13 @@ export declare type AiChatProviderProps = {
601
601
  * File attachment configuration. When provided, enables file uploads in the chat.
602
602
  */
603
603
  fileAttachments?: AiChatFileAttachmentConfig;
604
+ /**
605
+ * Voice dictation. When provided, a microphone button is shown in the
606
+ * composer: recorded audio is transcribed and the result fills the textarea
607
+ * (the user reviews and sends it as a normal text message). When omitted,
608
+ * the microphone is hidden.
609
+ */
610
+ onTranscribe?: TranscribeFn;
604
611
  onThumbsUp?: (message: F0AIMessage, { threadId, feedback }: {
605
612
  threadId: string;
606
613
  feedback: string;
@@ -736,7 +743,7 @@ declare type AiChatProviderReturnValue = {
736
743
  pendingQuote: PendingQuote | null;
737
744
  /** Set the pending quote (pass null to clear). */
738
745
  setPendingQuote: React.Dispatch<React.SetStateAction<PendingQuote | null>>;
739
- } & Pick<AiChatState, "agent" | "chatHeader" | "chatMessages" | "chatInput" | "disclaimer" | "resizable" | "entityRefs" | "canvasActions" | "canvasEntities" | "credits" | "employeeCredits" | "creditWarning" | "fileAttachments"> & {
746
+ } & Pick<AiChatState, "agent" | "chatHeader" | "chatMessages" | "chatInput" | "disclaimer" | "resizable" | "entityRefs" | "canvasActions" | "canvasEntities" | "credits" | "employeeCredits" | "creditWarning" | "fileAttachments" | "onTranscribe"> & {
740
747
  /** The current canvas content, or null when canvas is closed */
741
748
  canvasContent: CanvasContent | null;
742
749
  /** Open the canvas panel with the given content */
@@ -778,6 +785,7 @@ declare interface AiChatState {
778
785
  employeeCredits?: AiChatEmployeeCredits;
779
786
  creditWarning?: AiChatCreditWarning;
780
787
  fileAttachments?: AiChatFileAttachmentConfig;
788
+ onTranscribe?: TranscribeFn;
781
789
  placeholders?: string[];
782
790
  setPlaceholders?: React.Dispatch<React.SetStateAction<string[]>>;
783
791
  onThumbsUp?: (message: F0AIMessage, { threadId, feedback }: {
@@ -952,6 +960,14 @@ export declare const aiTranslations: {
952
960
  readonly dismiss: "Dismiss";
953
961
  };
954
962
  readonly attachFile: "Attach file";
963
+ readonly recordAudio: "Record audio";
964
+ readonly listening: "Listening…";
965
+ readonly stopRecording: "Stop and transcribe";
966
+ readonly cancelRecording: "Cancel recording";
967
+ readonly transcribing: "Transcribing…";
968
+ readonly micPermissionDenied: "Microphone access is blocked. Allow it in your browser settings to dictate.";
969
+ readonly micError: "Couldn't access the microphone.";
970
+ readonly transcriptionError: "Couldn't transcribe the audio. Try again.";
955
971
  readonly removeFile: "Remove";
956
972
  readonly fileUploadError: "Upload failed";
957
973
  readonly fileUploadBlockedSubmit: "Your message wasn't sent because one of the attachments failed to upload. Remove it or retry.";
@@ -4540,6 +4556,14 @@ export declare const defaultTranslations: {
4540
4556
  readonly dismiss: "Dismiss";
4541
4557
  };
4542
4558
  readonly attachFile: "Attach file";
4559
+ readonly recordAudio: "Record audio";
4560
+ readonly listening: "Listening…";
4561
+ readonly stopRecording: "Stop and transcribe";
4562
+ readonly cancelRecording: "Cancel recording";
4563
+ readonly transcribing: "Transcribing…";
4564
+ readonly micPermissionDenied: "Microphone access is blocked. Allow it in your browser settings to dictate.";
4565
+ readonly micError: "Couldn't access the microphone.";
4566
+ readonly transcriptionError: "Couldn't transcribe the audio. Try again.";
4543
4567
  readonly removeFile: "Remove";
4544
4568
  readonly fileUploadError: "Upload failed";
4545
4569
  readonly fileUploadBlockedSubmit: "Your message wasn't sent because one of the attachments failed to upload. Remove it or retry.";
@@ -5606,7 +5630,7 @@ export declare interface F0AiChatProps {
5606
5630
  /**
5607
5631
  * @experimental This is an experimental component use it at your own risk
5608
5632
  */
5609
- export declare const F0AiChatProvider: ({ enabled, initialMessage, chatHeader, chatMessages, chatInput, welcomeScreenSuggestions, disclaimer, resizable, defaultVisualizationMode, lockVisualizationMode, historyEnabled, footer, VoiceMode, entityRefs, canvasActions, canvasEntities, credits, employeeCredits, creditWarning, fileAttachments, onThumbsUp, onThumbsDown, children, agent, tracking, }: AiChatProviderProps) => JSX_2.Element;
5633
+ export declare const F0AiChatProvider: ({ enabled, initialMessage, chatHeader, chatMessages, chatInput, welcomeScreenSuggestions, disclaimer, resizable, defaultVisualizationMode, lockVisualizationMode, historyEnabled, footer, VoiceMode, entityRefs, canvasActions, canvasEntities, credits, employeeCredits, creditWarning, fileAttachments, onTranscribe, onThumbsUp, onThumbsDown, children, agent, tracking, }: AiChatProviderProps) => JSX_2.Element;
5610
5634
 
5611
5635
  /**
5612
5636
  * Headless chat composer.
@@ -5617,7 +5641,7 @@ export declare const F0AiChatProvider: ({ enabled, initialMessage, chatHeader, c
5617
5641
  * coupling to `useAiChat()` or CopilotKit — wrappers like F0AiChat
5618
5642
  * provide the wiring.
5619
5643
  */
5620
- export declare const F0AiChatTextArea: ({ onSubmit, onStop, inProgress, onBeforeSubmit, placeholders, creditWarning, clarifyingUI, pendingContext, onPendingContextChange, pendingQuote, onPendingQuoteChange, fileAttachments, searchPersons, onProcessFilesRef, disclaimer, footer, isWelcomeScreen, fullscreen, welcomeScreenSuggestions, onSuggestionClick, ref, }: F0AiChatTextAreaProps) => JSX_2.Element;
5644
+ export declare const F0AiChatTextArea: ({ onSubmit, onStop, inProgress, onBeforeSubmit, placeholders, creditWarning, clarifyingUI, pendingContext, onPendingContextChange, pendingQuote, onPendingQuoteChange, fileAttachments, onTranscribe, searchPersons, onProcessFilesRef, disclaimer, footer, isWelcomeScreen, fullscreen, welcomeScreenSuggestions, onSuggestionClick, ref, }: F0AiChatTextAreaProps) => JSX_2.Element;
5621
5645
 
5622
5646
  export declare type F0AiChatTextAreaProps = {
5623
5647
  ref: RefObject<HTMLDivElement>;
@@ -5655,6 +5679,12 @@ export declare type F0AiChatTextAreaProps = {
5655
5679
  onPendingQuoteChange?: (quote: PendingQuote | null) => void;
5656
5680
  /** File attachment configuration. When omitted, attachments are disabled. */
5657
5681
  fileAttachments?: AiChatFileAttachmentConfig;
5682
+ /**
5683
+ * Voice dictation. When provided, a microphone button is shown: recorded
5684
+ * audio is transcribed and the transcript fills the textarea (the user
5685
+ * reviews and sends it manually). When omitted, the microphone is hidden.
5686
+ */
5687
+ onTranscribe?: TranscribeFn;
5658
5688
  /** Async search used by the @-mention popover. When omitted, mentions are disabled. */
5659
5689
  searchPersons?: (query: string) => Promise<PersonProfile[]>;
5660
5690
  /**
@@ -14442,6 +14472,25 @@ declare interface TopLevelPrependNotesTextEditorPageDocumentPatch {
14442
14472
  blocks: JSONContent[];
14443
14473
  }
14444
14474
 
14475
+ /**
14476
+ * Transcribes a recorded audio blob to text (voice dictation). The returned
14477
+ * promise resolves with the final transcript; `onPartial` delivers
14478
+ * intermediate results for live textarea fill. When omitted from the chat
14479
+ * config, the microphone button is not rendered.
14480
+ */
14481
+ declare type TranscribeFn = (audio: Blob, options: TranscribeOptions) => Promise<string>;
14482
+
14483
+ declare type TranscribeOptions = {
14484
+ /**
14485
+ * Primary channel for live dictation: fires with the cumulative transcript
14486
+ * as it streams in, so the composer can fill the textarea while the user
14487
+ * speaks. Implementations that don't stream may call it once at the end.
14488
+ */
14489
+ onPartial: (text: string) => void;
14490
+ /** Aborted when the user cancels an in-flight transcription. */
14491
+ signal?: AbortSignal;
14492
+ };
14493
+
14445
14494
  declare type TranslationKey = Join<PathsToStringProps<typeof defaultTranslations>, ".">;
14446
14495
 
14447
14496
  declare type TranslationShape<T> = {
package/dist/f0.js CHANGED
@@ -1,13 +1,13 @@
1
- import { du as dk, a6 as yt, bd as Dg, m as ce, o as Pa, fZ as hk, n as Hs, eH as C3, ac as go, g2 as T3, ad as Ew, S as oe, u as tt, C as dt, cY as Vu, A as vk, i as D3, H as Wv, cK as yu, a7 as kr, a3 as gd, g3 as A3, g4 as Xb, g5 as M3, g6 as E3, g7 as eT, dQ as L3, g8 as N3, g9 as pk, ga as I3, M as pt, aX as k3, aL as R3, b8 as P3, dM as tT, s as Fu, a1 as Lw, a2 as Ws, b9 as O3, fh as B3, aB as Nw, aC as Iw, aD as kw, aj as gk, c0 as Uv, dv as mk, gb as V3, fl as F3, aF as yk, de as z3, br as G3, aV as bk, Y as zu, gc as H3, ae as W3, gd as Rw, ge as rT, ff as U3, gf as $3, gg as Y3, gh as X3, W as Pw, dN as bu, bH as Ow, dK as q3, dp as Bw, at as ou, bI as xk, d5 as Vw, b6 as Us, a8 as Bn, ao as Z3, cz as qb, cy as _k, gi as Ag, d6 as Fw, fR as j3, a0 as wk, fe as K3, by as Q3, ab as Mg, dG as J3, dH as eH, dI as tH, c as rH, er as nH, z as Sk, cF as rl, dm as Ck, bB as zw, E as Eg, G as Lg, cp as Gw, L as Ng, V as Ar, X as xu, fx as su, fy as lu, K as uu, fz as cu, fv as iH, fw as io, cs as Tk, aq as aH, d3 as $v, gj as on, aA as oH, d9 as Dk, d8 as Ak, gk as sH, aN as Mk, aT as lH, dC as uH, dD as cH, dw as fH, be as Gu, bi as Hu, bp as md, dq as dH, bf as hH, b0 as vH, N as Ek, b7 as pH, _ as gH, d0 as nT, dl as Pf, fi as mH, fj as yH, gl as bH, aS as xH, bj as _H, cI as Lk, a4 as wH, cx as SH, g0 as CH, gm as TH, gn as DH, I as AH, go as MH, gp as EH, gq as LH, gr as NH } from "./F0CanvasPanel-BErabj-B.js";
2
- import { gA as Dme, D as Ame, aM as Mme, F as Eme, a as Lme, e as Nme, b1 as Ime, bs as kme, bc as Rme, ai as Pme, dP as Ome, ar as Bme, bF as Vme, f as Fme, dJ as zme, dy as Gme, gE as Hme, d as Wme, bG as Ume, bk as $me, gv as Yme, aZ as Xme, gw as qme, gy as Zme, gz as jme, c1 as Kme, gB as Qme, bY as Jme, bZ as eye, P as tye, gx as rye, b_ as nye, gF as iye, gs as aye, gt as oye, gu as sye, b$ as lye, gD as uye, fS as cye, gC as fye, aQ as dye, bX as hye, bU as vye, bW as pye, bT as gye, fU as mye, fO as yye, bL as bye, bV as xye, b as _ye, fN as wye, g1 as Sye, aO as Cye, dt as Tye, fQ as Dye, fP as Aye, gG as Mye } from "./F0CanvasPanel-BErabj-B.js";
1
+ import { du as dk, a6 as yt, bd as Dg, m as ce, o as Pa, fZ as hk, n as Hs, eH as C3, ac as go, g2 as T3, ad as Ew, S as oe, u as tt, C as dt, cY as Vu, A as vk, i as D3, H as Wv, cK as yu, a7 as kr, a3 as gd, g3 as A3, g4 as Xb, g5 as M3, g6 as E3, g7 as eT, dQ as L3, g8 as N3, g9 as pk, ga as I3, M as pt, aX as k3, aL as R3, b8 as P3, dM as tT, s as Fu, a1 as Lw, a2 as Ws, b9 as O3, fh as B3, aB as Nw, aC as Iw, aD as kw, aj as gk, c0 as Uv, dv as mk, gb as V3, fl as F3, aF as yk, de as z3, br as G3, aV as bk, Y as zu, gc as H3, ae as W3, gd as Rw, ge as rT, ff as U3, gf as $3, gg as Y3, gh as X3, W as Pw, dN as bu, bH as Ow, dK as q3, dp as Bw, at as ou, bI as xk, d5 as Vw, b6 as Us, a8 as Bn, ao as Z3, cz as qb, cy as _k, gi as Ag, d6 as Fw, fR as j3, a0 as wk, fe as K3, by as Q3, ab as Mg, dG as J3, dH as eH, dI as tH, c as rH, er as nH, z as Sk, cF as rl, dm as Ck, bB as zw, E as Eg, G as Lg, cp as Gw, L as Ng, V as Ar, X as xu, fx as su, fy as lu, K as uu, fz as cu, fv as iH, fw as io, cs as Tk, aq as aH, d3 as $v, gj as on, aA as oH, d9 as Dk, d8 as Ak, gk as sH, aN as Mk, aT as lH, dC as uH, dD as cH, dw as fH, be as Gu, bi as Hu, bp as md, dq as dH, bf as hH, b0 as vH, N as Ek, b7 as pH, _ as gH, d0 as nT, dl as Pf, fi as mH, fj as yH, gl as bH, aS as xH, bj as _H, cI as Lk, a4 as wH, cx as SH, g0 as CH, gm as TH, gn as DH, I as AH, go as MH, gp as EH, gq as LH, gr as NH } from "./F0CanvasPanel-C_tqaABp.js";
2
+ import { gA as Dme, D as Ame, aM as Mme, F as Eme, a as Lme, e as Nme, b1 as Ime, bs as kme, bc as Rme, ai as Pme, dP as Ome, ar as Bme, bF as Vme, f as Fme, dJ as zme, dy as Gme, gE as Hme, d as Wme, bG as Ume, bk as $me, gv as Yme, aZ as Xme, gw as qme, gy as Zme, gz as jme, c1 as Kme, gB as Qme, bY as Jme, bZ as eye, P as tye, gx as rye, b_ as nye, gF as iye, gs as aye, gt as oye, gu as sye, b$ as lye, gD as uye, fS as cye, gC as fye, aQ as dye, bX as hye, bU as vye, bW as pye, bT as gye, fU as mye, fO as yye, bL as bye, bV as xye, b as _ye, fN as wye, g1 as Sye, aO as Cye, dt as Tye, fQ as Dye, fP as Aye, gG as Mye } from "./F0CanvasPanel-C_tqaABp.js";
3
3
  import { jsx as w, jsxs as B, Fragment as kt } from "react/jsx-runtime";
4
4
  import * as Yn from "react";
5
5
  import He, { forwardRef as Jr, useRef as se, useImperativeHandle as IH, Children as Yv, createContext as en, useContext as _r, useState as ye, useMemo as ae, useEffect as _e, useCallback as te, useLayoutEffect as Zb, createElement as Xd, isValidElement as Nk, Fragment as Ig, memo as Ik, useReducer as kH, cloneElement as RH, useId as kg } from "react";
6
- import { z as PH, B as OH, U as iT, D as aT, E as $m, G as oT, H as BH, I as Oa, J as nl, K as VH, L as Hw, M as Rr, N as fi, O as FH, P as zH, Q as kk, Z as Ho, R as GH, S as HH, T as WH, V as Rk, W as Xv, X as Ww, Y as Pk, _ as Ok, $ as pn, a0 as UH, a1 as $H, a2 as Bk, a3 as Rg, a4 as YH, a5 as XH, a6 as Vk, a7 as qH, a8 as ZH, a9 as jH, aa as KH, ab as QH, ac as JH, F as eW } from "./useChatHistory-DBzFU3JU.js";
7
- import { A as Lye, C as Nye, h as Iye, t as kye, v as Rye, x as Pye, ah as Oye, n as Bye, j as Vye, r as Fye, y as zye, q as Gye, s as Hye, k as Wye, e as Uye, g as $ye, l as Yye, i as Xye, a as qye, p as Zye, ai as jye, af as Kye, ae as Qye, ag as Jye, m as e0e, o as t0e, ad as r0e, b as n0e, f as i0e, w as a0e, c as o0e, d as s0e, u as l0e } from "./useChatHistory-DBzFU3JU.js";
6
+ import { z as PH, B as OH, U as iT, D as aT, E as $m, G as oT, H as BH, I as Oa, J as nl, K as VH, L as Hw, M as Rr, N as fi, O as FH, P as zH, Q as kk, Z as Ho, R as GH, S as HH, T as WH, V as Rk, W as Xv, X as Ww, Y as Pk, _ as Ok, $ as pn, a0 as UH, a1 as $H, a2 as Bk, a3 as Rg, a4 as YH, a5 as XH, a6 as Vk, a7 as qH, a8 as ZH, a9 as jH, aa as KH, ab as QH, ac as JH, F as eW } from "./useChatHistory-Bubo_nNb.js";
7
+ import { A as Lye, C as Nye, h as Iye, t as kye, v as Rye, x as Pye, ah as Oye, n as Bye, j as Vye, r as Fye, y as zye, q as Gye, s as Hye, k as Wye, e as Uye, g as $ye, l as Yye, i as Xye, a as qye, p as Zye, ai as jye, af as Kye, ae as Qye, ag as Jye, m as e0e, o as t0e, ad as r0e, b as n0e, f as i0e, w as a0e, c as o0e, d as s0e, u as l0e } from "./useChatHistory-Bubo_nNb.js";
8
8
  import { createPortal as Fk, unstable_batchedUpdates as qd, flushSync as tW } from "react-dom";
9
- import { C as rW, o as nW, G as jb, H as zk, ag as Gk, Q as Hk, ae as iW, U as aW, X as Wk, Y as Uw, ah as $w, a9 as oW, ai as sW, aj as lW, d as Pg, ak as uW, R as Yw, u as Xw, W as Uk, O as qw, al as $k, am as Zw, p as cW, a4 as Yk, $ as Xk, an as fW, ao as dW, ap as hW, aq as vW, ar as pW, M as gW, as as Kb } from "./useDataCollectionSource-ZgUdpWim.js";
10
- import { r as c0e, s as f0e, t as d0e, z as h0e, az as v0e, ay as p0e, au as g0e, F as m0e, J as y0e, af as b0e, K as x0e, v as _0e, aA as w0e, ab as S0e, ac as C0e, aa as T0e, ad as D0e, N as A0e, w as M0e, P as E0e, y as L0e, D as N0e, T as I0e, x as k0e, E as R0e, aC as P0e, m as O0e, n as B0e, at as V0e, aB as F0e, a7 as z0e, I as G0e, aD as H0e, aE as W0e, av as U0e, aw as $0e, ax as Y0e, e as X0e, aF as q0e } from "./useDataCollectionSource-ZgUdpWim.js";
9
+ import { C as rW, o as nW, G as jb, H as zk, ag as Gk, Q as Hk, ae as iW, U as aW, X as Wk, Y as Uw, ah as $w, a9 as oW, ai as sW, aj as lW, d as Pg, ak as uW, R as Yw, u as Xw, W as Uk, O as qw, al as $k, am as Zw, p as cW, a4 as Yk, $ as Xk, an as fW, ao as dW, ap as hW, aq as vW, ar as pW, M as gW, as as Kb } from "./useDataCollectionSource-BA6BeGvi.js";
10
+ import { r as c0e, s as f0e, t as d0e, z as h0e, az as v0e, ay as p0e, au as g0e, F as m0e, J as y0e, af as b0e, K as x0e, v as _0e, aA as w0e, ab as S0e, ac as C0e, aa as T0e, ad as D0e, N as A0e, w as M0e, P as E0e, y as L0e, D as N0e, T as I0e, x as k0e, E as R0e, aC as P0e, m as O0e, n as B0e, at as V0e, aB as F0e, a7 as z0e, I as G0e, aD as H0e, aE as W0e, av as U0e, aw as $0e, ax as Y0e, e as X0e, aF as q0e } from "./useDataCollectionSource-BA6BeGvi.js";
11
11
  import { utils as fu, write as qk } from "./xlsx-Bedf3nwD.js";
12
12
  import { defaultTranslations as j0e } from "./i18n-provider-defaults.js";
13
13
  import './f0.css';const mW = {
@@ -472,6 +472,14 @@ export declare const defaultTranslations: {
472
472
  readonly dismiss: "Dismiss";
473
473
  };
474
474
  readonly attachFile: "Attach file";
475
+ readonly recordAudio: "Record audio";
476
+ readonly listening: "Listening…";
477
+ readonly stopRecording: "Stop and transcribe";
478
+ readonly cancelRecording: "Cancel recording";
479
+ readonly transcribing: "Transcribing…";
480
+ readonly micPermissionDenied: "Microphone access is blocked. Allow it in your browser settings to dictate.";
481
+ readonly micError: "Couldn't access the microphone.";
482
+ readonly transcriptionError: "Couldn't transcribe the audio. Try again.";
475
483
  readonly removeFile: "Remove";
476
484
  readonly fileUploadError: "Upload failed";
477
485
  readonly fileUploadBlockedSubmit: "Your message wasn't sent because one of the attachments failed to upload. Remove it or retry.";
@@ -472,6 +472,14 @@ const e = {
472
472
  dismiss: "Dismiss"
473
473
  },
474
474
  attachFile: "Attach file",
475
+ recordAudio: "Record audio",
476
+ listening: "Listening…",
477
+ stopRecording: "Stop and transcribe",
478
+ cancelRecording: "Cancel recording",
479
+ transcribing: "Transcribing…",
480
+ micPermissionDenied: "Microphone access is blocked. Allow it in your browser settings to dictate.",
481
+ micError: "Couldn't access the microphone.",
482
+ transcriptionError: "Couldn't transcribe the audio. Try again.",
475
483
  removeFile: "Remove",
476
484
  fileUploadError: "Upload failed",
477
485
  fileUploadBlockedSubmit: "Your message wasn't sent because one of the attachments failed to upload. Remove it or retry.",