@red-hat-developer-hub/backstage-plugin-lightspeed 2.4.0 → 2.5.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 (61) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +5 -1
  3. package/dist/alpha.d.ts +6 -0
  4. package/dist/api/NotebooksApiClient.esm.js +36 -0
  5. package/dist/api/NotebooksApiClient.esm.js.map +1 -1
  6. package/dist/api/notebooksApi.esm.js.map +1 -1
  7. package/dist/components/LightSpeedChat.esm.js +143 -26
  8. package/dist/components/LightSpeedChat.esm.js.map +1 -1
  9. package/dist/components/LightspeedChatBoxHeader.esm.js +2 -1
  10. package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
  11. package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
  12. package/dist/components/Router.esm.js +2 -1
  13. package/dist/components/Router.esm.js.map +1 -1
  14. package/dist/components/notebooks/AddDocumentModal.esm.js +122 -23
  15. package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -1
  16. package/dist/components/notebooks/DocumentSidebar.esm.js +85 -5
  17. package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -1
  18. package/dist/components/notebooks/FileListItem.esm.js +94 -0
  19. package/dist/components/notebooks/FileListItem.esm.js.map +1 -0
  20. package/dist/components/notebooks/NotebookView.esm.js +249 -45
  21. package/dist/components/notebooks/NotebookView.esm.js.map +1 -1
  22. package/dist/components/notebooks/OverwriteConfirmModal.esm.js +2 -1
  23. package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -1
  24. package/dist/components/notebooks/SidebarCollapseIcon.esm.js +5 -2
  25. package/dist/components/notebooks/SidebarCollapseIcon.esm.js.map +1 -1
  26. package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js +24 -0
  27. package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js.map +1 -0
  28. package/dist/hooks/notebooks/useNotebookDocuments.esm.js +1 -1
  29. package/dist/hooks/notebooks/useNotebookDocuments.esm.js.map +1 -1
  30. package/dist/hooks/notebooks/useNotebookSession.esm.js +18 -0
  31. package/dist/hooks/notebooks/useNotebookSession.esm.js.map +1 -0
  32. package/dist/hooks/toolCallsCacheStore.esm.js +61 -0
  33. package/dist/hooks/toolCallsCacheStore.esm.js.map +1 -0
  34. package/dist/hooks/useConversationMessages.esm.js +21 -16
  35. package/dist/hooks/useConversationMessages.esm.js.map +1 -1
  36. package/dist/hooks/useCreateCoversationMessage.esm.js.map +1 -1
  37. package/dist/hooks/useDeleteConversation.esm.js +2 -0
  38. package/dist/hooks/useDeleteConversation.esm.js.map +1 -1
  39. package/dist/hooks/useLightspeedProviderState.esm.js +35 -8
  40. package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -1
  41. package/dist/index.d.ts +1 -0
  42. package/dist/plugin.esm.js +3 -2
  43. package/dist/plugin.esm.js.map +1 -1
  44. package/dist/routes.esm.js +6 -1
  45. package/dist/routes.esm.js.map +1 -1
  46. package/dist/translations/de.esm.js +6 -0
  47. package/dist/translations/de.esm.js.map +1 -1
  48. package/dist/translations/es.esm.js +6 -0
  49. package/dist/translations/es.esm.js.map +1 -1
  50. package/dist/translations/fr.esm.js +6 -0
  51. package/dist/translations/fr.esm.js.map +1 -1
  52. package/dist/translations/it.esm.js +6 -0
  53. package/dist/translations/it.esm.js.map +1 -1
  54. package/dist/translations/ja.esm.js +6 -0
  55. package/dist/translations/ja.esm.js.map +1 -1
  56. package/dist/translations/ref.esm.js +6 -0
  57. package/dist/translations/ref.esm.js.map +1 -1
  58. package/dist/types.esm.js.map +1 -1
  59. package/dist/utils/lightspeed-chatbox-utils.esm.js +1 -1
  60. package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -1
  61. package/package.json +2 -2
@@ -24,7 +24,10 @@ const SidebarExpandIcon = ({ className }) => /* @__PURE__ */ jsx(
24
24
  children: /* @__PURE__ */ jsx("path", { d: "M9 21V3H11V21H9ZM13 17V7L18 12L13 17Z", fill: "currentColor" })
25
25
  }
26
26
  );
27
- const AddCircleFilledIcon = ({ className }) => /* @__PURE__ */ jsx(
27
+ const AddCircleFilledIcon = ({
28
+ className,
29
+ disabled
30
+ }) => /* @__PURE__ */ jsx(
28
31
  "svg",
29
32
  {
30
33
  className,
@@ -37,7 +40,7 @@ const AddCircleFilledIcon = ({ className }) => /* @__PURE__ */ jsx(
37
40
  "path",
38
41
  {
39
42
  d: "M7.75 0C12.0312 1.02089e-05 15.5 3.46877 15.5 7.75C15.5 12.0312 12.0312 15.5 7.75 15.5C3.46877 15.5 1.02086e-05 12.0312 0 7.75C0 3.46876 3.46876 0 7.75 0ZM6.875 3.25C6.66876 3.25 6.5 3.41876 6.5 3.625V6.5H3.625C3.41876 6.5 3.25 6.66876 3.25 6.875V8.625C3.25001 8.83123 3.41877 9 3.625 9H6.5V11.875C6.50002 12.0812 6.66877 12.25 6.875 12.25H8.625C8.83122 12.25 8.99998 12.0812 9 11.875V9H11.875C12.0812 8.99998 12.25 8.83122 12.25 8.625V6.875C12.25 6.66877 12.0812 6.50002 11.875 6.5H9V3.625C9 3.41877 8.83123 3.25001 8.625 3.25H6.875Z",
40
- fill: "#0066CC"
43
+ fill: disabled ? "#8a8d90" : "#0066CC"
41
44
  }
42
45
  )
43
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SidebarCollapseIcon.esm.js","sources":["../../../src/components/notebooks/SidebarCollapseIcon.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ntype IconProps = {\n className?: string;\n};\n\nexport const SidebarCollapseIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M16 21V3H14V21H16ZM12 17V7L7 12L12 17Z\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const SidebarExpandIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M9 21V3H11V21H9ZM13 17V7L18 12L13 17Z\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const AddCircleFilledIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7.75 0C12.0312 1.02089e-05 15.5 3.46877 15.5 7.75C15.5 12.0312 12.0312 15.5 7.75 15.5C3.46877 15.5 1.02086e-05 12.0312 0 7.75C0 3.46876 3.46876 0 7.75 0ZM6.875 3.25C6.66876 3.25 6.5 3.41876 6.5 3.625V6.5H3.625C3.41876 6.5 3.25 6.66876 3.25 6.875V8.625C3.25001 8.83123 3.41877 9 3.625 9H6.5V11.875C6.50002 12.0812 6.66877 12.25 6.875 12.25H8.625C8.83122 12.25 8.99998 12.0812 9 11.875V9H11.875C12.0812 8.99998 12.25 8.83122 12.25 8.625V6.875C12.25 6.66877 12.0812 6.50002 11.875 6.5H9V3.625C9 3.41877 8.83123 3.25001 8.625 3.25H6.875Z\"\n fill=\"#0066CC\"\n />\n </svg>\n);\n"],"names":[],"mappings":";;AAoBO,MAAM,mBAAsB,GAAA,CAAC,EAAE,SAAA,EACpC,qBAAA,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,SAAA;AAAA,IACA,KAAM,EAAA,IAAA;AAAA,IACN,MAAO,EAAA,IAAA;AAAA,IACP,OAAQ,EAAA,WAAA;AAAA,IACR,IAAK,EAAA,MAAA;AAAA,IACL,KAAM,EAAA,4BAAA;AAAA,IAEN,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,wCAAA,EAAyC,MAAK,cAAe,EAAA;AAAA;AACvE;AAGK,MAAM,iBAAoB,GAAA,CAAC,EAAE,SAAA,EAClC,qBAAA,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,SAAA;AAAA,IACA,KAAM,EAAA,IAAA;AAAA,IACN,MAAO,EAAA,IAAA;AAAA,IACP,OAAQ,EAAA,WAAA;AAAA,IACR,IAAK,EAAA,MAAA;AAAA,IACL,KAAM,EAAA,4BAAA;AAAA,IAEN,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,uCAAA,EAAwC,MAAK,cAAe,EAAA;AAAA;AACtE;AAGK,MAAM,mBAAsB,GAAA,CAAC,EAAE,SAAA,EACpC,qBAAA,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,SAAA;AAAA,IACA,KAAM,EAAA,IAAA;AAAA,IACN,MAAO,EAAA,IAAA;AAAA,IACP,OAAQ,EAAA,WAAA;AAAA,IACR,IAAK,EAAA,MAAA;AAAA,IACL,KAAM,EAAA,4BAAA;AAAA,IAEN,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAE,EAAA,whBAAA;AAAA,QACF,IAAK,EAAA;AAAA;AAAA;AACP;AACF;;;;"}
1
+ {"version":3,"file":"SidebarCollapseIcon.esm.js","sources":["../../../src/components/notebooks/SidebarCollapseIcon.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ntype IconProps = {\n className?: string;\n};\n\nexport const SidebarCollapseIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M16 21V3H14V21H16ZM12 17V7L7 12L12 17Z\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const SidebarExpandIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M9 21V3H11V21H9ZM13 17V7L18 12L13 17Z\" fill=\"currentColor\" />\n </svg>\n);\n\ntype AddCircleFilledIconProps = IconProps & {\n disabled?: boolean;\n};\n\nexport const AddCircleFilledIcon = ({\n className,\n disabled,\n}: AddCircleFilledIconProps) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7.75 0C12.0312 1.02089e-05 15.5 3.46877 15.5 7.75C15.5 12.0312 12.0312 15.5 7.75 15.5C3.46877 15.5 1.02086e-05 12.0312 0 7.75C0 3.46876 3.46876 0 7.75 0ZM6.875 3.25C6.66876 3.25 6.5 3.41876 6.5 3.625V6.5H3.625C3.41876 6.5 3.25 6.66876 3.25 6.875V8.625C3.25001 8.83123 3.41877 9 3.625 9H6.5V11.875C6.50002 12.0812 6.66877 12.25 6.875 12.25H8.625C8.83122 12.25 8.99998 12.0812 9 11.875V9H11.875C12.0812 8.99998 12.25 8.83122 12.25 8.625V6.875C12.25 6.66877 12.0812 6.50002 11.875 6.5H9V3.625C9 3.41877 8.83123 3.25001 8.625 3.25H6.875Z\"\n fill={disabled ? '#8a8d90' : '#0066CC'}\n />\n </svg>\n);\n"],"names":[],"mappings":";;AAoBO,MAAM,mBAAsB,GAAA,CAAC,EAAE,SAAA,EACpC,qBAAA,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,SAAA;AAAA,IACA,KAAM,EAAA,IAAA;AAAA,IACN,MAAO,EAAA,IAAA;AAAA,IACP,OAAQ,EAAA,WAAA;AAAA,IACR,IAAK,EAAA,MAAA;AAAA,IACL,KAAM,EAAA,4BAAA;AAAA,IAEN,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,wCAAA,EAAyC,MAAK,cAAe,EAAA;AAAA;AACvE;AAGK,MAAM,iBAAoB,GAAA,CAAC,EAAE,SAAA,EAClC,qBAAA,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,SAAA;AAAA,IACA,KAAM,EAAA,IAAA;AAAA,IACN,MAAO,EAAA,IAAA;AAAA,IACP,OAAQ,EAAA,WAAA;AAAA,IACR,IAAK,EAAA,MAAA;AAAA,IACL,KAAM,EAAA,4BAAA;AAAA,IAEN,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,uCAAA,EAAwC,MAAK,cAAe,EAAA;AAAA;AACtE;AAOK,MAAM,sBAAsB,CAAC;AAAA,EAClC,SAAA;AAAA,EACA;AACF,CACE,qBAAA,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,SAAA;AAAA,IACA,KAAM,EAAA,IAAA;AAAA,IACN,MAAO,EAAA,IAAA;AAAA,IACP,OAAQ,EAAA,WAAA;AAAA,IACR,IAAK,EAAA,MAAA;AAAA,IACL,KAAM,EAAA,4BAAA;AAAA,IAEN,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAE,EAAA,whBAAA;AAAA,QACF,IAAA,EAAM,WAAW,SAAY,GAAA;AAAA;AAAA;AAC/B;AACF;;;;"}
@@ -0,0 +1,24 @@
1
+ import { useApi } from '@backstage/core-plugin-api';
2
+ import { useMutation } from '@tanstack/react-query';
3
+ import { notebooksApiRef } from '../../api/notebooksApi.esm.js';
4
+
5
+ const useCreateNotebookMessage = () => {
6
+ const notebooksApi = useApi(notebooksApiRef);
7
+ return useMutation({
8
+ mutationFn: async ({
9
+ prompt,
10
+ sessionId
11
+ }) => {
12
+ if (!sessionId) {
13
+ throw new Error("Failed to generate AI response");
14
+ }
15
+ return await notebooksApi.querySession(sessionId, prompt);
16
+ },
17
+ onError: (error) => {
18
+ console.warn(error);
19
+ }
20
+ });
21
+ };
22
+
23
+ export { useCreateNotebookMessage };
24
+ //# sourceMappingURL=useCreateNotebookMessage.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCreateNotebookMessage.esm.js","sources":["../../../src/hooks/notebooks/useCreateNotebookMessage.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useMutation, type UseMutationResult } from '@tanstack/react-query';\n\nimport { notebooksApiRef } from '../../api/notebooksApi';\n\nexport type CreateNotebookMessageVariables = {\n prompt: string;\n sessionId: string;\n};\n\nexport const useCreateNotebookMessage = (): UseMutationResult<\n ReadableStreamDefaultReader<Uint8Array>,\n Error,\n CreateNotebookMessageVariables\n> => {\n const notebooksApi = useApi(notebooksApiRef);\n\n return useMutation({\n mutationFn: async ({\n prompt,\n sessionId,\n }: CreateNotebookMessageVariables) => {\n if (!sessionId) {\n throw new Error('Failed to generate AI response');\n }\n\n return await notebooksApi.querySession(sessionId, prompt);\n },\n onError: error => {\n // eslint-disable-next-line\n console.warn(error);\n },\n });\n};\n"],"names":[],"mappings":";;;;AA2BO,MAAM,2BAA2B,MAInC;AACH,EAAM,MAAA,YAAA,GAAe,OAAO,eAAe,CAAA;AAE3C,EAAA,OAAO,WAAY,CAAA;AAAA,IACjB,YAAY,OAAO;AAAA,MACjB,MAAA;AAAA,MACA;AAAA,KACoC,KAAA;AACpC,MAAA,IAAI,CAAC,SAAW,EAAA;AACd,QAAM,MAAA,IAAI,MAAM,gCAAgC,CAAA;AAAA;AAGlD,MAAA,OAAO,MAAM,YAAA,CAAa,YAAa,CAAA,SAAA,EAAW,MAAM,CAAA;AAAA,KAC1D;AAAA,IACA,SAAS,CAAS,KAAA,KAAA;AAEhB,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA;AACpB,GACD,CAAA;AACH;;;;"}
@@ -10,7 +10,7 @@ const useNotebookDocuments = (sessionId) => {
10
10
  return await notebooksApi.listDocuments(sessionId);
11
11
  },
12
12
  enabled: Boolean(sessionId),
13
- staleTime: 1e3 * 60
13
+ staleTime: 0
14
14
  });
15
15
  };
16
16
 
@@ -1 +1 @@
1
- {"version":3,"file":"useNotebookDocuments.esm.js","sources":["../../../src/hooks/notebooks/useNotebookDocuments.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { notebooksApiRef } from '../../api/notebooksApi';\nimport { SessionDocument } from '../../types';\n\nexport const useNotebookDocuments = (\n sessionId?: string,\n): UseQueryResult<SessionDocument[], Error> => {\n const notebooksApi = useApi(notebooksApiRef);\n return useQuery({\n queryKey: ['notebooks', 'documents', sessionId],\n queryFn: async () => {\n return await notebooksApi.listDocuments(sessionId!);\n },\n enabled: Boolean(sessionId),\n staleTime: 1000 * 60,\n });\n};\n"],"names":[],"mappings":";;;;AAuBa,MAAA,oBAAA,GAAuB,CAClC,SAC6C,KAAA;AAC7C,EAAM,MAAA,YAAA,GAAe,OAAO,eAAe,CAAA;AAC3C,EAAA,OAAO,QAAS,CAAA;AAAA,IACd,QAAU,EAAA,CAAC,WAAa,EAAA,WAAA,EAAa,SAAS,CAAA;AAAA,IAC9C,SAAS,YAAY;AACnB,MAAO,OAAA,MAAM,YAAa,CAAA,aAAA,CAAc,SAAU,CAAA;AAAA,KACpD;AAAA,IACA,OAAA,EAAS,QAAQ,SAAS,CAAA;AAAA,IAC1B,WAAW,GAAO,GAAA;AAAA,GACnB,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"useNotebookDocuments.esm.js","sources":["../../../src/hooks/notebooks/useNotebookDocuments.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { notebooksApiRef } from '../../api/notebooksApi';\nimport { SessionDocument } from '../../types';\n\nexport const useNotebookDocuments = (\n sessionId?: string,\n): UseQueryResult<SessionDocument[], Error> => {\n const notebooksApi = useApi(notebooksApiRef);\n return useQuery({\n queryKey: ['notebooks', 'documents', sessionId],\n queryFn: async () => {\n return await notebooksApi.listDocuments(sessionId!);\n },\n enabled: Boolean(sessionId),\n staleTime: 0,\n });\n};\n"],"names":[],"mappings":";;;;AAuBa,MAAA,oBAAA,GAAuB,CAClC,SAC6C,KAAA;AAC7C,EAAM,MAAA,YAAA,GAAe,OAAO,eAAe,CAAA;AAC3C,EAAA,OAAO,QAAS,CAAA;AAAA,IACd,QAAU,EAAA,CAAC,WAAa,EAAA,WAAA,EAAa,SAAS,CAAA;AAAA,IAC9C,SAAS,YAAY;AACnB,MAAO,OAAA,MAAM,YAAa,CAAA,aAAA,CAAc,SAAU,CAAA;AAAA,KACpD;AAAA,IACA,OAAA,EAAS,QAAQ,SAAS,CAAA;AAAA,IAC1B,SAAW,EAAA;AAAA,GACZ,CAAA;AACH;;;;"}
@@ -0,0 +1,18 @@
1
+ import { useApi } from '@backstage/core-plugin-api';
2
+ import { useQuery } from '@tanstack/react-query';
3
+ import { notebooksApiRef } from '../../api/notebooksApi.esm.js';
4
+
5
+ const useNotebookSession = (sessionId) => {
6
+ const notebooksApi = useApi(notebooksApiRef);
7
+ return useQuery({
8
+ queryKey: ["notebooks", "session", sessionId],
9
+ queryFn: async () => {
10
+ return await notebooksApi.getSession(sessionId);
11
+ },
12
+ enabled: Boolean(sessionId),
13
+ staleTime: 1e3 * 60
14
+ });
15
+ };
16
+
17
+ export { useNotebookSession };
18
+ //# sourceMappingURL=useNotebookSession.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNotebookSession.esm.js","sources":["../../../src/hooks/notebooks/useNotebookSession.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { notebooksApiRef } from '../../api/notebooksApi';\nimport { NotebookSession } from '../../types';\n\nexport const useNotebookSession = (\n sessionId?: string,\n): UseQueryResult<NotebookSession, Error> => {\n const notebooksApi = useApi(notebooksApiRef);\n return useQuery({\n queryKey: ['notebooks', 'session', sessionId],\n queryFn: async () => {\n return await notebooksApi.getSession(sessionId!);\n },\n enabled: Boolean(sessionId),\n staleTime: 1000 * 60,\n });\n};\n"],"names":[],"mappings":";;;;AAuBa,MAAA,kBAAA,GAAqB,CAChC,SAC2C,KAAA;AAC3C,EAAM,MAAA,YAAA,GAAe,OAAO,eAAe,CAAA;AAC3C,EAAA,OAAO,QAAS,CAAA;AAAA,IACd,QAAU,EAAA,CAAC,WAAa,EAAA,SAAA,EAAW,SAAS,CAAA;AAAA,IAC5C,SAAS,YAAY;AACnB,MAAO,OAAA,MAAM,YAAa,CAAA,UAAA,CAAW,SAAU,CAAA;AAAA,KACjD;AAAA,IACA,OAAA,EAAS,QAAQ,SAAS,CAAA;AAAA,IAC1B,WAAW,GAAO,GAAA;AAAA,GACnB,CAAA;AACH;;;;"}
@@ -0,0 +1,61 @@
1
+ const MAX_TOOL_CALLS_CACHE_KEYS = 256;
2
+ const sharedToolCallsCache = {};
3
+ const keyOrder = [];
4
+ function removeKeyFromOrder(key) {
5
+ const i = keyOrder.indexOf(key);
6
+ if (i >= 0) {
7
+ keyOrder.splice(i, 1);
8
+ }
9
+ }
10
+ function touchCacheKey(key) {
11
+ removeKeyFromOrder(key);
12
+ keyOrder.push(key);
13
+ while (keyOrder.length > MAX_TOOL_CALLS_CACHE_KEYS) {
14
+ const oldest = keyOrder.shift();
15
+ if (oldest) {
16
+ delete sharedToolCallsCache[oldest];
17
+ }
18
+ }
19
+ }
20
+ function getSharedToolCallsCache(key) {
21
+ const v = sharedToolCallsCache[key];
22
+ return v?.length ? v : undefined;
23
+ }
24
+ function setSharedToolCallsCache(key, toolCalls) {
25
+ sharedToolCallsCache[key] = toolCalls;
26
+ touchCacheKey(key);
27
+ }
28
+ function clearSharedToolCallsCacheForConversation(conversationId) {
29
+ const prefix = `${conversationId}-`;
30
+ for (const key of [...Object.keys(sharedToolCallsCache)]) {
31
+ if (key.startsWith(prefix)) {
32
+ delete sharedToolCallsCache[key];
33
+ removeKeyFromOrder(key);
34
+ }
35
+ }
36
+ }
37
+ function migrateSharedToolCallsCacheSessionPrefixToConversation(sessionPrefix, newConversationId) {
38
+ const keyPrefix = `${sessionPrefix}-`;
39
+ for (const key of [...Object.keys(sharedToolCallsCache)]) {
40
+ if (key.startsWith(keyPrefix)) {
41
+ const messageIndex = key.slice(keyPrefix.length);
42
+ const newKey = `${newConversationId}-${messageIndex}`;
43
+ sharedToolCallsCache[newKey] = sharedToolCallsCache[key];
44
+ delete sharedToolCallsCache[key];
45
+ removeKeyFromOrder(key);
46
+ touchCacheKey(newKey);
47
+ }
48
+ }
49
+ }
50
+ function clearSharedToolCallsCacheSessionPrefix(sessionPrefix) {
51
+ const keyPrefix = `${sessionPrefix}-`;
52
+ for (const key of [...Object.keys(sharedToolCallsCache)]) {
53
+ if (key.startsWith(keyPrefix)) {
54
+ delete sharedToolCallsCache[key];
55
+ removeKeyFromOrder(key);
56
+ }
57
+ }
58
+ }
59
+
60
+ export { clearSharedToolCallsCacheForConversation, clearSharedToolCallsCacheSessionPrefix, getSharedToolCallsCache, migrateSharedToolCallsCacheSessionPrefixToConversation, setSharedToolCallsCache };
61
+ //# sourceMappingURL=toolCallsCacheStore.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolCallsCacheStore.esm.js","sources":["../../src/hooks/toolCallsCacheStore.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ToolCall } from '../types';\n\n/**\n * Caps how many conversation/message-index entries we retain. Oldest touched\n * entries are evicted first (approximate LRU via insertion order in keyOrder).\n */\nconst MAX_TOOL_CALLS_CACHE_KEYS = 256;\n\nconst sharedToolCallsCache: Record<string, ToolCall[]> = {};\nconst keyOrder: string[] = [];\n\nfunction removeKeyFromOrder(key: string) {\n const i = keyOrder.indexOf(key);\n if (i >= 0) {\n keyOrder.splice(i, 1);\n }\n}\n\nfunction touchCacheKey(key: string) {\n removeKeyFromOrder(key);\n keyOrder.push(key);\n while (keyOrder.length > MAX_TOOL_CALLS_CACHE_KEYS) {\n const oldest = keyOrder.shift();\n if (oldest) {\n delete sharedToolCallsCache[oldest];\n }\n }\n}\n\nexport function getSharedToolCallsCache(key: string): ToolCall[] | undefined {\n const v = sharedToolCallsCache[key];\n return v?.length ? v : undefined;\n}\n\nexport function setSharedToolCallsCache(key: string, toolCalls: ToolCall[]) {\n sharedToolCallsCache[key] = toolCalls;\n touchCacheKey(key);\n}\n\n/**\n * Drop all cached tool rows for a conversation (e.g. after server delete).\n */\nexport function clearSharedToolCallsCacheForConversation(\n conversationId: string,\n) {\n const prefix = `${conversationId}-`;\n for (const key of [...Object.keys(sharedToolCallsCache)]) {\n if (key.startsWith(prefix)) {\n delete sharedToolCallsCache[key];\n removeKeyFromOrder(key);\n }\n }\n}\n\n/**\n * Moves tool-call cache entries from a per-stream session prefix (used while\n * conversation id is still temp) to the persisted conversation id. Only keys\n * for this prefix are migrated so a late stream cannot clobber another temp\n * session.\n */\nexport function migrateSharedToolCallsCacheSessionPrefixToConversation(\n sessionPrefix: string,\n newConversationId: string,\n) {\n const keyPrefix = `${sessionPrefix}-`;\n for (const key of [...Object.keys(sharedToolCallsCache)]) {\n if (key.startsWith(keyPrefix)) {\n const messageIndex = key.slice(keyPrefix.length);\n const newKey = `${newConversationId}-${messageIndex}`;\n sharedToolCallsCache[newKey] = sharedToolCallsCache[key];\n delete sharedToolCallsCache[key];\n removeKeyFromOrder(key);\n touchCacheKey(newKey);\n }\n }\n}\n\n/** Removes cache entries written under a per-temp-stream session prefix. */\nexport function clearSharedToolCallsCacheSessionPrefix(sessionPrefix: string) {\n const keyPrefix = `${sessionPrefix}-`;\n for (const key of [...Object.keys(sharedToolCallsCache)]) {\n if (key.startsWith(keyPrefix)) {\n delete sharedToolCallsCache[key];\n removeKeyFromOrder(key);\n }\n }\n}\n\n/** Clears the store; only used from unit tests. */\nexport function resetSharedToolCallsCacheStoreForTests() {\n for (const key of Object.keys(sharedToolCallsCache)) {\n delete sharedToolCallsCache[key];\n }\n keyOrder.length = 0;\n}\n"],"names":[],"mappings":"AAsBA,MAAM,yBAA4B,GAAA,GAAA;AAElC,MAAM,uBAAmD,EAAC;AAC1D,MAAM,WAAqB,EAAC;AAE5B,SAAS,mBAAmB,GAAa,EAAA;AACvC,EAAM,MAAA,CAAA,GAAI,QAAS,CAAA,OAAA,CAAQ,GAAG,CAAA;AAC9B,EAAA,IAAI,KAAK,CAAG,EAAA;AACV,IAAS,QAAA,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AAExB;AAEA,SAAS,cAAc,GAAa,EAAA;AAClC,EAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,EAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,EAAO,OAAA,QAAA,CAAS,SAAS,yBAA2B,EAAA;AAClD,IAAM,MAAA,MAAA,GAAS,SAAS,KAAM,EAAA;AAC9B,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,OAAO,qBAAqB,MAAM,CAAA;AAAA;AACpC;AAEJ;AAEO,SAAS,wBAAwB,GAAqC,EAAA;AAC3E,EAAM,MAAA,CAAA,GAAI,qBAAqB,GAAG,CAAA;AAClC,EAAO,OAAA,CAAA,EAAG,SAAS,CAAI,GAAA,SAAA;AACzB;AAEgB,SAAA,uBAAA,CAAwB,KAAa,SAAuB,EAAA;AAC1E,EAAA,oBAAA,CAAqB,GAAG,CAAI,GAAA,SAAA;AAC5B,EAAA,aAAA,CAAc,GAAG,CAAA;AACnB;AAKO,SAAS,yCACd,cACA,EAAA;AACA,EAAM,MAAA,MAAA,GAAS,GAAG,cAAc,CAAA,CAAA,CAAA;AAChC,EAAA,KAAA,MAAW,OAAO,CAAC,GAAG,OAAO,IAAK,CAAA,oBAAoB,CAAC,CAAG,EAAA;AACxD,IAAI,IAAA,GAAA,CAAI,UAAW,CAAA,MAAM,CAAG,EAAA;AAC1B,MAAA,OAAO,qBAAqB,GAAG,CAAA;AAC/B,MAAA,kBAAA,CAAmB,GAAG,CAAA;AAAA;AACxB;AAEJ;AAQgB,SAAA,sDAAA,CACd,eACA,iBACA,EAAA;AACA,EAAM,MAAA,SAAA,GAAY,GAAG,aAAa,CAAA,CAAA,CAAA;AAClC,EAAA,KAAA,MAAW,OAAO,CAAC,GAAG,OAAO,IAAK,CAAA,oBAAoB,CAAC,CAAG,EAAA;AACxD,IAAI,IAAA,GAAA,CAAI,UAAW,CAAA,SAAS,CAAG,EAAA;AAC7B,MAAA,MAAM,YAAe,GAAA,GAAA,CAAI,KAAM,CAAA,SAAA,CAAU,MAAM,CAAA;AAC/C,MAAA,MAAM,MAAS,GAAA,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AACnD,MAAqB,oBAAA,CAAA,MAAM,CAAI,GAAA,oBAAA,CAAqB,GAAG,CAAA;AACvD,MAAA,OAAO,qBAAqB,GAAG,CAAA;AAC/B,MAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,MAAA,aAAA,CAAc,MAAM,CAAA;AAAA;AACtB;AAEJ;AAGO,SAAS,uCAAuC,aAAuB,EAAA;AAC5E,EAAM,MAAA,SAAA,GAAY,GAAG,aAAa,CAAA,CAAA,CAAA;AAClC,EAAA,KAAA,MAAW,OAAO,CAAC,GAAG,OAAO,IAAK,CAAA,oBAAoB,CAAC,CAAG,EAAA;AACxD,IAAI,IAAA,GAAA,CAAI,UAAW,CAAA,SAAS,CAAG,EAAA;AAC7B,MAAA,OAAO,qBAAqB,GAAG,CAAA;AAC/B,MAAA,kBAAA,CAAmB,GAAG,CAAA;AAAA;AACxB;AAEJ;;;;"}
@@ -6,6 +6,7 @@ import { TEMP_CONVERSATION_ID } from '../const.esm.js';
6
6
  import botAvatar from '../images/bot-avatar.svg';
7
7
  import userAvatar from '../images/user-avatar.svg';
8
8
  import { getConversationsData, createUserMessage, createBotMessage, transformDocumentsToSources, getTimestamp } from '../utils/lightspeed-chatbox-utils.esm.js';
9
+ import { getSharedToolCallsCache, setSharedToolCallsCache, migrateSharedToolCallsCacheSessionPrefixToConversation, clearSharedToolCallsCacheSessionPrefix } from './toolCallsCacheStore.esm.js';
9
10
  import { useCreateConversationMessage } from './useCreateCoversationMessage.esm.js';
10
11
 
11
12
  const toolCallIdKey = (id) => {
@@ -18,6 +19,11 @@ const isMcpStyleToolCallPayload = (data) => {
18
19
  const isLegacyToolResultToken = (token) => {
19
20
  return !!token && typeof token === "object" && !Array.isArray(token) && typeof token.tool_name === "string" && token.tool_name.length > 0;
20
21
  };
22
+ let tempToolCallsCachePrefixFallbackSeq = 0;
23
+ function createTempToolCallsCacheSessionPrefix() {
24
+ const suffix = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${++tempToolCallsCachePrefixFallbackSeq}`;
25
+ return `lightspeed-temp:${suffix}`;
26
+ }
21
27
  const legacyToolResultToString = (response) => {
22
28
  if (!response) return "";
23
29
  if (typeof response === "string") return response;
@@ -38,8 +44,9 @@ const useFetchConversationMessages = (currentConversation) => {
38
44
  retry: false
39
45
  });
40
46
  };
41
- const useConversationMessages = (conversationId, userName, selectedModel, selectedProvider, avatar = userAvatar, onComplete, onStart, onRequestIdReady) => {
42
- const { mutateAsync: createMessage } = useCreateConversationMessage();
47
+ const useConversationMessages = (conversationId, userName, selectedModel, selectedProvider, avatar = userAvatar, onComplete, onStart, createMessageOverride, onRequestIdReady) => {
48
+ const { mutateAsync: defaultCreateMessage } = useCreateConversationMessage();
49
+ const createMessage = createMessageOverride ?? defaultCreateMessage;
43
50
  const scrollToBottomRef = useRef(null);
44
51
  const [currentConversation, setCurrentConversation] = useState(conversationId);
45
52
  const [conversations, setConversations] = useState({
@@ -49,7 +56,6 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
49
56
  [currentConversation]: []
50
57
  });
51
58
  const pendingToolCalls = useRef({});
52
- const toolCallsCache = useRef({});
53
59
  useEffect(() => {
54
60
  if (currentConversation !== conversationId) {
55
61
  setCurrentConversation(conversationId);
@@ -94,7 +100,7 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
94
100
  )
95
101
  });
96
102
  const cacheKey = `${currentConversation}-${i}`;
97
- const cachedToolCalls = toolCallsCache.current[cacheKey];
103
+ const cachedToolCalls = getSharedToolCallsCache(cacheKey);
98
104
  if (cachedToolCalls && cachedToolCalls.length > 0) {
99
105
  botMsg.toolCalls = cachedToolCalls;
100
106
  }
@@ -119,6 +125,7 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
119
125
  async (prompt, attachments = []) => {
120
126
  let newConversationId = "";
121
127
  let requestId = "";
128
+ const toolCallsCacheKeyPrefix = currentConversation === TEMP_CONVERSATION_ID ? createTempToolCallsCacheSessionPrefix() : currentConversation;
122
129
  const conversationTuple = [
123
130
  createUserMessage({
124
131
  avatar,
@@ -225,8 +232,8 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
225
232
  ];
226
233
  lastMessage.toolCalls = nextToolCalls;
227
234
  const messageIndex = Math.floor(lastMessageIndex / 2);
228
- const cacheKey = `${currentConversation}-${messageIndex}`;
229
- toolCallsCache.current[cacheKey] = nextToolCalls;
235
+ const cacheKey = `${toolCallsCacheKeyPrefix}-${messageIndex}`;
236
+ setSharedToolCallsCache(cacheKey, nextToolCalls);
230
237
  const updatedConversation = [
231
238
  ...conversation.slice(0, lastMessageIndex),
232
239
  lastMessage
@@ -296,8 +303,8 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
296
303
  });
297
304
  lastMessage.toolCalls = updatedToolCalls;
298
305
  const messageIndex = Math.floor(lastMessageIndex / 2);
299
- const cacheKey = `${currentConversation}-${messageIndex}`;
300
- toolCallsCache.current[cacheKey] = updatedToolCalls;
306
+ const cacheKey = `${toolCallsCacheKeyPrefix}-${messageIndex}`;
307
+ setSharedToolCallsCache(cacheKey, updatedToolCalls);
301
308
  const updatedConversation = [
302
309
  ...conversation.slice(0, lastMessageIndex),
303
310
  lastMessage
@@ -457,14 +464,10 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
457
464
  onComplete(finalMessages.join(""));
458
465
  }
459
466
  if (currentConversation === TEMP_CONVERSATION_ID && newConversationId) {
460
- Object.keys(toolCallsCache.current).forEach((key) => {
461
- if (key.startsWith(`${TEMP_CONVERSATION_ID}-`)) {
462
- const messageIndex = key.replace(`${TEMP_CONVERSATION_ID}-`, "");
463
- const newKey = `${newConversationId}-${messageIndex}`;
464
- toolCallsCache.current[newKey] = toolCallsCache.current[key];
465
- delete toolCallsCache.current[key];
466
- }
467
- });
467
+ migrateSharedToolCallsCacheSessionPrefixToConversation(
468
+ toolCallsCacheKeyPrefix,
469
+ newConversationId
470
+ );
468
471
  setConversations((prevConversations) => {
469
472
  return {
470
473
  ...prevConversations,
@@ -478,6 +481,8 @@ const useConversationMessages = (conversationId, userName, selectedModel, select
478
481
  return rest;
479
482
  });
480
483
  }, 0);
484
+ } else if (currentConversation === TEMP_CONVERSATION_ID) {
485
+ clearSharedToolCallsCacheSessionPrefix(toolCallsCacheKeyPrefix);
481
486
  }
482
487
  },
483
488
  [
@@ -1 +1 @@
1
- {"version":3,"file":"useConversationMessages.esm.js","sources":["../../src/hooks/useConversationMessages.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { MessageProps } from '@patternfly/chatbot';\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ScrollContainerHandle } from '../components/LightspeedChatBox';\nimport { TEMP_CONVERSATION_ID } from '../const';\nimport botAvatar from '../images/bot-avatar.svg';\nimport userAvatar from '../images/user-avatar.svg';\nimport {\n Attachment,\n BaseMessage,\n LCSConversation,\n ReferencedDocument,\n ToolCall,\n} from '../types';\nimport {\n createBotMessage,\n createUserMessage,\n getConversationsData,\n getTimestamp,\n transformDocumentsToSources,\n} from '../utils/lightspeed-chatbox-utils';\nimport { useCreateConversationMessage } from './useCreateCoversationMessage';\n\nconst toolCallIdKey = (id: string | number): string => {\n return String(id);\n};\n\nconst normalizeToolCalls = (\n calls: (ToolCall | undefined)[] | undefined,\n): ToolCall[] => (calls ?? []).filter((tc): tc is ToolCall => tc !== null);\n\nconst isMcpStyleToolCallPayload = (\n data: Record<string, any> | undefined,\n): boolean => {\n return (\n !!data &&\n typeof data.name === 'string' &&\n data.name.trim().length > 0 &&\n data.id !== null\n );\n};\n\n/** Legacy tool_result uses data.token with at least tool_name and response. */\nconst isLegacyToolResultToken = (\n token: unknown,\n): token is { tool_name: string; response?: unknown } => {\n return (\n !!token &&\n typeof token === 'object' &&\n !Array.isArray(token) &&\n typeof (token as { tool_name?: string }).tool_name === 'string' &&\n (token as { tool_name: string }).tool_name.length > 0\n );\n};\n\nconst legacyToolResultToString = (response: unknown): string => {\n if (!response) return '';\n if (typeof response === 'string') return response;\n try {\n return JSON.stringify(response);\n } catch {\n return String(response);\n }\n};\n\n// Fetch all conversation messages\nexport const useFetchConversationMessages = (\n currentConversation: string,\n): UseQueryResult<BaseMessage[] | undefined, Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['conversationMessages', currentConversation],\n queryFn: currentConversation\n ? async () => {\n const response =\n await lightspeedApi.getConversationMessages(currentConversation);\n\n return response;\n }\n : undefined,\n retry: false,\n });\n};\n\n// Extended message type to include tool calls\ninterface ExtendedMessageProps extends MessageProps {\n toolCalls?: ToolCall[];\n}\n\ntype Conversations = { [_key: string]: ExtendedMessageProps[] };\n\nexport type UseConversationMessagesReturn = {\n conversationMessages: ExtendedMessageProps[];\n handleInputPrompt: (\n prompt: string,\n attachments?: Attachment[],\n ) => Promise<void>;\n conversations: Conversations;\n scrollToBottomRef: RefObject<ScrollContainerHandle | null>;\n data?: BaseMessage[] | undefined;\n error: Error | null;\n isPending: boolean;\n isFetching: boolean;\n isSuccess: boolean;\n isError: boolean;\n status: 'pending' | 'error' | 'success';\n refetch: () => void;\n};\n\n/**\n * Fetches all the messages for given conversation_id\n * @param conversationId\n * @param userName\n * @param selectedModel\n * @param selectedProvider\n * @param avatar\n *\n */\nexport const useConversationMessages = (\n conversationId: string,\n userName: string | undefined,\n selectedModel: string,\n selectedProvider: string,\n avatar: string = userAvatar,\n onComplete?: (message: string) => void,\n onStart?: (conversation_id: string) => void,\n onRequestIdReady?: (request_id: string) => void,\n): UseConversationMessagesReturn => {\n const { mutateAsync: createMessage } = useCreateConversationMessage();\n const scrollToBottomRef = useRef<ScrollContainerHandle>(null);\n\n const [currentConversation, setCurrentConversation] =\n useState(conversationId);\n const [conversations, setConversations] = useState<Conversations>({\n [currentConversation]: [],\n });\n const streamingConversations = useRef<Conversations>({\n [currentConversation]: [],\n });\n\n // Track pending tool calls during streaming\n const pendingToolCalls = useRef<Record<string, ToolCall>>({});\n\n // Cache tool calls by conversation ID and message index to persist across refetches\n // Key format: `${conversationId}-${messageIndex}`\n const toolCallsCache = useRef<{ [key: string]: ToolCall[] }>({});\n\n useEffect(() => {\n if (currentConversation !== conversationId) {\n setCurrentConversation(conversationId);\n setConversations(prev => {\n // Always clear TEMP when switching to it so \"New chat\" again gets empty messages and correct scroll.\n if (conversationId === TEMP_CONVERSATION_ID) {\n return { ...prev, [TEMP_CONVERSATION_ID]: [] };\n }\n if (prev[conversationId]) return prev;\n return {\n ...prev,\n [conversationId]: [],\n };\n });\n }\n }, [currentConversation, conversationId]);\n\n const { data: conversationsData = [], ...queryProps } =\n useFetchConversationMessages(currentConversation);\n\n useEffect(() => {\n if (!Array.isArray(conversationsData) || conversationsData.length === 0)\n return;\n\n const newConvoIndex: number[] = [];\n\n if (conversations) {\n const _conversations: { [key: string]: any[] } = {\n [currentConversation]: [],\n };\n\n let index = 0;\n for (let i = 0; i < conversationsData.length; i++) {\n const [userMessage, aiMessage] = getConversationsData(\n conversationsData[i] as unknown as LCSConversation,\n );\n\n // Create user message\n const userMsg = createUserMessage({\n avatar,\n name: userName,\n content: userMessage.content,\n timestamp: userMessage.timestamp,\n });\n\n // Create bot message\n const botMsg = createBotMessage({\n avatar: botAvatar,\n isLoading: false,\n name: conversationsData[i].model ?? selectedModel,\n content: aiMessage.content,\n timestamp: aiMessage.timestamp,\n sources: transformDocumentsToSources(\n aiMessage?.referenced_documents ?? [],\n ),\n });\n\n // Merge cached tool calls if available\n const cacheKey = `${currentConversation}-${i}`;\n const cachedToolCalls = toolCallsCache.current[cacheKey];\n if (cachedToolCalls && cachedToolCalls.length > 0) {\n botMsg.toolCalls = cachedToolCalls;\n }\n\n _conversations[currentConversation].push(userMsg, botMsg);\n\n newConvoIndex.push(index);\n index++;\n }\n\n if (streamingConversations.current[currentConversation]) {\n _conversations[currentConversation].push(\n ...streamingConversations.current[currentConversation],\n );\n }\n\n setConversations(_conversations);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n conversationsData,\n userName,\n avatar,\n currentConversation,\n selectedModel,\n streamingConversations,\n ]);\n\n const handleInputPrompt = useCallback(\n async (prompt: string, attachments: Attachment[] = []) => {\n let newConversationId = '';\n let requestId = '';\n\n const conversationTuple = [\n createUserMessage({\n avatar,\n name: userName,\n content: prompt,\n timestamp: getTimestamp(Date.now()) ?? '',\n }),\n createBotMessage({\n avatar: botAvatar,\n isLoading: true,\n name: selectedModel,\n content: '',\n timestamp: '',\n }),\n ];\n\n streamingConversations.current = {\n ...streamingConversations.current,\n [currentConversation]: conversationTuple,\n };\n\n setConversations((prevConv: Conversations) => {\n return {\n ...prevConv,\n [currentConversation]: [\n ...(prevConv?.[currentConversation] ?? []),\n ...conversationTuple,\n ],\n };\n });\n\n setTimeout(() => {\n scrollToBottomRef.current?.scrollToBottom();\n }, 0);\n const finalMessages: string[] = [];\n let buffer = '';\n\n try {\n const reader = await createMessage({\n prompt,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n });\n\n const decoder = new TextDecoder('utf-8');\n let streamEnded = false;\n\n while (!streamEnded) {\n const { value, done } = await reader.read();\n if (done) {\n streamEnded = true;\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process all complete messages separated by double newlines\n const parts = buffer.split('\\n\\n');\n buffer = parts.pop()!;\n\n for (const part of parts) {\n const lines = part\n .split('\\n')\n .filter(line => line.startsWith('data:'));\n\n const jsonString = lines\n .map(line => line.trim().slice(5).trim())\n .join('');\n try {\n const { event, data } = JSON.parse(jsonString);\n if (event === 'start') {\n requestId = data?.request_id;\n onRequestIdReady?.(requestId);\n\n if (currentConversation === TEMP_CONVERSATION_ID) {\n // If the conversation is temp, we need to set the new conversation id\n newConversationId = data?.conversation_id;\n }\n }\n\n // Handle tool_call event\n if (event === 'tool_call') {\n const toolCallData = data?.token;\n const legacyObjectCall =\n typeof toolCallData === 'object' &&\n toolCallData !== null &&\n !Array.isArray(toolCallData) &&\n (toolCallData as { tool_name?: string }).tool_name;\n\n const mcpStyle = isMcpStyleToolCallPayload(data);\n const rawArgs = data?.args ?? data?.arguments;\n const mcpArgs: Record<string, any> =\n rawArgs &&\n typeof rawArgs === 'object' &&\n !Array.isArray(rawArgs)\n ? rawArgs\n : {};\n\n let toolCall: ToolCall | undefined;\n // Prefer legacy token object when present (backward compatible)\n if (legacyObjectCall && data.id !== null) {\n toolCall = {\n id: data.id,\n toolName: (toolCallData as { tool_name: string }).tool_name,\n arguments:\n (toolCallData as { arguments?: Record<string, any> })\n .arguments || {},\n startTime: Date.now(),\n isLoading: true,\n };\n } else if (mcpStyle) {\n toolCall = {\n id: data.id,\n toolName: data.name.trim(),\n description:\n typeof data.type === 'string' && data.type !== data.name\n ? data.type\n : undefined,\n arguments: mcpArgs,\n startTime: Date.now(),\n isLoading: true,\n };\n }\n\n if (toolCall && data.id !== null) {\n const newToolCall: ToolCall = toolCall;\n pendingToolCalls.current[toolCallIdKey(data.id)] =\n newToolCall;\n\n // Update the bot message with the pending tool call\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n\n if (lastMessageIndex < 0) return prevConversations;\n\n const lastMessage = { ...conversation[lastMessageIndex] };\n const existingToolCalls = normalizeToolCalls(\n lastMessage.toolCalls,\n );\n const nextToolCalls: ToolCall[] = [\n ...existingToolCalls,\n newToolCall,\n ];\n lastMessage.toolCalls = nextToolCalls;\n\n // Cache tool calls for this message (message pair index)\n const messageIndex = Math.floor(lastMessageIndex / 2);\n const cacheKey = `${currentConversation}-${messageIndex}`;\n toolCallsCache.current[cacheKey] = nextToolCalls;\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n\n // Also update streaming ref\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation] || [];\n if (aiMessage) {\n const existingStreamingToolCalls = normalizeToolCalls(\n aiMessage.toolCalls,\n );\n streamingConversations.current[currentConversation] = [\n humanMessage,\n {\n ...aiMessage,\n toolCalls: [...existingStreamingToolCalls, newToolCall],\n },\n ];\n }\n }\n }\n\n // Handle tool_result event\n if (event === 'tool_result') {\n const tokenResult = data?.token;\n const legacyResult = isLegacyToolResultToken(tokenResult);\n\n const mcpHasContent =\n data?.id !== null &&\n data.content !== undefined &&\n !legacyResult;\n\n let responsePayload: string | undefined;\n let matchToolName: string | undefined;\n let toolIdKey: string | undefined;\n\n if (legacyResult) {\n responsePayload = legacyToolResultToString(\n tokenResult.response,\n );\n matchToolName = tokenResult.tool_name;\n toolIdKey =\n data?.id !== null ? toolCallIdKey(data.id) : undefined;\n } else if (mcpHasContent) {\n toolIdKey = toolCallIdKey(data.id);\n responsePayload =\n typeof data.content === 'string'\n ? data.content\n : JSON.stringify(data.content);\n if (\n typeof data.status === 'string' &&\n data.status !== 'success'\n ) {\n responsePayload = `[${data.status}] ${responsePayload}`;\n }\n }\n\n if (responsePayload !== undefined && toolIdKey !== undefined) {\n const pendingCall = pendingToolCalls.current[toolIdKey];\n const endTime = Date.now();\n const executionTime = pendingCall\n ? (endTime - pendingCall.startTime) / 1000\n : 0;\n\n // Update the tool call with result\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n\n if (lastMessageIndex < 0) return prevConversations;\n\n const lastMessage = { ...conversation[lastMessageIndex] };\n const toolCalls = lastMessage.toolCalls || [];\n\n // Find and update the matching tool call\n const updatedToolCalls = toolCalls.map(tc => {\n const idMatches =\n toolCallIdKey(tc.id) === toolIdKey ||\n (matchToolName !== undefined &&\n tc.toolName === matchToolName);\n if (idMatches) {\n return {\n ...tc,\n response: responsePayload,\n endTime,\n executionTime,\n isLoading: false,\n };\n }\n return tc;\n });\n\n lastMessage.toolCalls = updatedToolCalls;\n\n // Update cache with completed tool call\n const messageIndex = Math.floor(lastMessageIndex / 2);\n const cacheKey = `${currentConversation}-${messageIndex}`;\n toolCallsCache.current[cacheKey] = updatedToolCalls;\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n\n // Also update streaming ref\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation] || [];\n if (aiMessage) {\n const toolCalls = aiMessage.toolCalls || [];\n const updatedToolCalls = toolCalls.map(tc => {\n const idMatches =\n toolCallIdKey(tc.id) === toolIdKey ||\n (matchToolName !== undefined &&\n tc.toolName === matchToolName);\n if (idMatches) {\n return {\n ...tc,\n response: responsePayload,\n endTime,\n executionTime,\n isLoading: false,\n };\n }\n return tc;\n });\n streamingConversations.current[currentConversation] = [\n humanMessage,\n { ...aiMessage, toolCalls: updatedToolCalls },\n ];\n }\n\n // Clean up pending tool call\n delete pendingToolCalls.current[toolIdKey];\n }\n }\n\n if (event === 'token') {\n const content = data?.token || '';\n\n finalMessages.push(content);\n\n // Store streaming message\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation];\n streamingConversations.current[currentConversation] = [\n humanMessage,\n { ...aiMessage, content: aiMessage.content + content },\n ];\n\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex] };\n\n if ((lastMessage?.content ?? '').trim().length > 0) {\n lastMessage.isLoading = false;\n }\n lastMessage.content += content;\n lastMessage.name =\n data?.response_metadata?.model || selectedModel;\n lastMessage.timestamp = getTimestamp(\n // TODO: To be fixed in the query response\n data?.response_metadata?.created_at || Date.now(),\n );\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n }\n\n if (event === 'interrupted') {\n if (\n currentConversation === TEMP_CONVERSATION_ID &&\n data?.conversation_id\n ) {\n newConversationId = data.conversation_id;\n }\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n isLoading: false,\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex], isLoading: false };\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n streamEnded = true;\n break;\n }\n\n if (event === 'end') {\n const documents = data?.referenced_documents || [];\n\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n isLoading: false,\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex], isLoading: false };\n\n if (documents.length) {\n lastMessage.sources = {\n sources: documents.map((doc: ReferencedDocument) => ({\n title: doc.doc_title,\n link: doc.doc_url,\n body: doc.doc_description,\n })),\n };\n }\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Error parsing JSON:', error);\n if (typeof onComplete === 'function') {\n onComplete('Invalid JSON received');\n }\n }\n }\n if (streamEnded) break;\n }\n } catch (e) {\n setConversations(prevConversations => {\n const conversation = prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex] };\n\n lastMessage.isLoading = false;\n lastMessage.content += e;\n lastMessage.error = {\n title: e.message,\n };\n lastMessage.timestamp = getTimestamp(Date.now());\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n finalMessages.push(`${e}`);\n\n return {\n ...prevConversations,\n [newConversationId.length > 0\n ? newConversationId\n : currentConversation]: updatedConversation,\n };\n });\n }\n // reset current streaming\n streamingConversations.current[currentConversation] = [];\n if (typeof onComplete === 'function') {\n onComplete(finalMessages.join(''));\n }\n // Swap temp conversation messages with new conversation\n\n if (currentConversation === TEMP_CONVERSATION_ID && newConversationId) {\n // Migrate tool calls cache from temp to new conversation ID\n Object.keys(toolCallsCache.current).forEach(key => {\n if (key.startsWith(`${TEMP_CONVERSATION_ID}-`)) {\n const messageIndex = key.replace(`${TEMP_CONVERSATION_ID}-`, '');\n const newKey = `${newConversationId}-${messageIndex}`;\n toolCallsCache.current[newKey] = toolCallsCache.current[key];\n delete toolCallsCache.current[key];\n }\n });\n\n setConversations(prevConversations => {\n return {\n ...prevConversations,\n [newConversationId]: prevConversations[TEMP_CONVERSATION_ID],\n };\n });\n\n onStart?.(newConversationId);\n\n // Defer removal so it runs after the sync useEffect updates currentConversation.\n setTimeout(() => {\n setConversations(prev => {\n const { [TEMP_CONVERSATION_ID]: _, ...rest } = prev;\n return rest;\n });\n }, 0);\n }\n },\n\n [\n avatar,\n userName,\n onComplete,\n onStart,\n onRequestIdReady,\n selectedModel,\n selectedProvider,\n createMessage,\n currentConversation,\n ],\n );\n\n return {\n conversationMessages: conversations[currentConversation] ?? [],\n handleInputPrompt,\n conversations,\n scrollToBottomRef,\n ...queryProps,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useConversationMessages.esm.js","sources":["../../src/hooks/useConversationMessages.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { MessageProps } from '@patternfly/chatbot';\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ScrollContainerHandle } from '../components/LightspeedChatBox';\nimport { TEMP_CONVERSATION_ID } from '../const';\nimport botAvatar from '../images/bot-avatar.svg';\nimport userAvatar from '../images/user-avatar.svg';\nimport {\n Attachment,\n BaseMessage,\n LCSConversation,\n ReferencedDocument,\n ToolCall,\n} from '../types';\nimport {\n createBotMessage,\n createUserMessage,\n getConversationsData,\n getTimestamp,\n transformDocumentsToSources,\n} from '../utils/lightspeed-chatbox-utils';\nimport {\n clearSharedToolCallsCacheSessionPrefix,\n getSharedToolCallsCache,\n migrateSharedToolCallsCacheSessionPrefixToConversation,\n setSharedToolCallsCache,\n} from './toolCallsCacheStore';\nimport {\n CreateMessageVariables,\n useCreateConversationMessage,\n} from './useCreateCoversationMessage';\n\nconst toolCallIdKey = (id: string | number): string => {\n return String(id);\n};\n\nconst normalizeToolCalls = (\n calls: (ToolCall | undefined)[] | undefined,\n): ToolCall[] => (calls ?? []).filter((tc): tc is ToolCall => tc !== null);\n\nconst isMcpStyleToolCallPayload = (\n data: Record<string, any> | undefined,\n): boolean => {\n return (\n !!data &&\n typeof data.name === 'string' &&\n data.name.trim().length > 0 &&\n data.id !== null\n );\n};\n\n/** Legacy tool_result uses data.token with at least tool_name and response. */\nconst isLegacyToolResultToken = (\n token: unknown,\n): token is { tool_name: string; response?: unknown } => {\n return (\n !!token &&\n typeof token === 'object' &&\n !Array.isArray(token) &&\n typeof (token as { tool_name?: string }).tool_name === 'string' &&\n (token as { tool_name: string }).tool_name.length > 0\n );\n};\n\nlet tempToolCallsCachePrefixFallbackSeq = 0;\n\n/** Unique prefix per temp send so late streams cannot migrate another session's tool cache. */\nfunction createTempToolCallsCacheSessionPrefix(): string {\n const suffix =\n globalThis.crypto?.randomUUID?.() ??\n `${Date.now()}-${++tempToolCallsCachePrefixFallbackSeq}`;\n return `lightspeed-temp:${suffix}`;\n}\n\nconst legacyToolResultToString = (response: unknown): string => {\n if (!response) return '';\n if (typeof response === 'string') return response;\n try {\n return JSON.stringify(response);\n } catch {\n return String(response);\n }\n};\n\n// Fetch all conversation messages\nexport const useFetchConversationMessages = (\n currentConversation: string,\n): UseQueryResult<BaseMessage[] | undefined, Error> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n return useQuery({\n queryKey: ['conversationMessages', currentConversation],\n queryFn: currentConversation\n ? async () => {\n const response =\n await lightspeedApi.getConversationMessages(currentConversation);\n\n return response;\n }\n : undefined,\n retry: false,\n });\n};\n\n// Extended message type to include tool calls\ninterface ExtendedMessageProps extends MessageProps {\n toolCalls?: ToolCall[];\n}\n\ntype Conversations = { [_key: string]: ExtendedMessageProps[] };\n\nexport type UseConversationMessagesReturn = {\n conversationMessages: ExtendedMessageProps[];\n handleInputPrompt: (\n prompt: string,\n attachments?: Attachment[],\n ) => Promise<void>;\n conversations: Conversations;\n scrollToBottomRef: RefObject<ScrollContainerHandle | null>;\n data?: BaseMessage[] | undefined;\n error: Error | null;\n isPending: boolean;\n isFetching: boolean;\n isSuccess: boolean;\n isError: boolean;\n status: 'pending' | 'error' | 'success';\n refetch: () => void;\n};\n\n/**\n * Fetches all the messages for given conversation_id\n * @param conversationId\n * @param userName\n * @param selectedModel\n * @param selectedProvider\n * @param avatar\n *\n */\nexport const useConversationMessages = (\n conversationId: string,\n userName: string | undefined,\n selectedModel: string,\n selectedProvider: string,\n avatar: string = userAvatar,\n onComplete?: (message: string) => void,\n onStart?: (conversation_id: string) => void,\n createMessageOverride?: (\n vars: CreateMessageVariables,\n ) => Promise<ReadableStreamDefaultReader<Uint8Array>>,\n onRequestIdReady?: (request_id: string) => void,\n): UseConversationMessagesReturn => {\n const { mutateAsync: defaultCreateMessage } = useCreateConversationMessage();\n const createMessage = createMessageOverride ?? defaultCreateMessage;\n const scrollToBottomRef = useRef<ScrollContainerHandle>(null);\n\n const [currentConversation, setCurrentConversation] =\n useState(conversationId);\n const [conversations, setConversations] = useState<Conversations>({\n [currentConversation]: [],\n });\n const streamingConversations = useRef<Conversations>({\n [currentConversation]: [],\n });\n\n // Track pending tool calls during streaming\n const pendingToolCalls = useRef<Record<string, ToolCall>>({});\n\n useEffect(() => {\n if (currentConversation !== conversationId) {\n setCurrentConversation(conversationId);\n setConversations(prev => {\n // Always clear TEMP when switching to it so \"New chat\" again gets empty messages and correct scroll.\n if (conversationId === TEMP_CONVERSATION_ID) {\n return { ...prev, [TEMP_CONVERSATION_ID]: [] };\n }\n if (prev[conversationId]) return prev;\n return {\n ...prev,\n [conversationId]: [],\n };\n });\n }\n }, [currentConversation, conversationId]);\n\n const { data: conversationsData = [], ...queryProps } =\n useFetchConversationMessages(currentConversation);\n\n useEffect(() => {\n if (!Array.isArray(conversationsData) || conversationsData.length === 0)\n return;\n\n const newConvoIndex: number[] = [];\n\n if (conversations) {\n const _conversations: { [key: string]: any[] } = {\n [currentConversation]: [],\n };\n\n let index = 0;\n for (let i = 0; i < conversationsData.length; i++) {\n const [userMessage, aiMessage] = getConversationsData(\n conversationsData[i] as unknown as LCSConversation,\n );\n\n // Create user message\n const userMsg = createUserMessage({\n avatar,\n name: userName,\n content: userMessage.content,\n timestamp: userMessage.timestamp,\n });\n\n // Create bot message\n const botMsg = createBotMessage({\n avatar: botAvatar,\n isLoading: false,\n name: conversationsData[i].model ?? selectedModel,\n content: aiMessage.content,\n timestamp: aiMessage.timestamp,\n sources: transformDocumentsToSources(\n aiMessage?.referenced_documents ?? [],\n ),\n });\n\n // Merge cached tool calls if available\n const cacheKey = `${currentConversation}-${i}`;\n const cachedToolCalls = getSharedToolCallsCache(cacheKey);\n if (cachedToolCalls && cachedToolCalls.length > 0) {\n botMsg.toolCalls = cachedToolCalls;\n }\n\n _conversations[currentConversation].push(userMsg, botMsg);\n\n newConvoIndex.push(index);\n index++;\n }\n\n if (streamingConversations.current[currentConversation]) {\n _conversations[currentConversation].push(\n ...streamingConversations.current[currentConversation],\n );\n }\n\n setConversations(_conversations);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n conversationsData,\n userName,\n avatar,\n currentConversation,\n selectedModel,\n streamingConversations,\n ]);\n\n const handleInputPrompt = useCallback(\n async (prompt: string, attachments: Attachment[] = []) => {\n let newConversationId = '';\n let requestId = '';\n const toolCallsCacheKeyPrefix =\n currentConversation === TEMP_CONVERSATION_ID\n ? createTempToolCallsCacheSessionPrefix()\n : currentConversation;\n\n const conversationTuple = [\n createUserMessage({\n avatar,\n name: userName,\n content: prompt,\n timestamp: getTimestamp(Date.now()) ?? '',\n }),\n createBotMessage({\n avatar: botAvatar,\n isLoading: true,\n name: selectedModel,\n content: '',\n timestamp: '',\n }),\n ];\n\n streamingConversations.current = {\n ...streamingConversations.current,\n [currentConversation]: conversationTuple,\n };\n\n setConversations((prevConv: Conversations) => {\n return {\n ...prevConv,\n [currentConversation]: [\n ...(prevConv?.[currentConversation] ?? []),\n ...conversationTuple,\n ],\n };\n });\n\n setTimeout(() => {\n scrollToBottomRef.current?.scrollToBottom();\n }, 0);\n const finalMessages: string[] = [];\n let buffer = '';\n\n try {\n const reader = await createMessage({\n prompt,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n });\n\n const decoder = new TextDecoder('utf-8');\n let streamEnded = false;\n\n while (!streamEnded) {\n const { value, done } = await reader.read();\n if (done) {\n streamEnded = true;\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process all complete messages separated by double newlines\n const parts = buffer.split('\\n\\n');\n buffer = parts.pop()!;\n\n for (const part of parts) {\n const lines = part\n .split('\\n')\n .filter(line => line.startsWith('data:'));\n\n const jsonString = lines\n .map(line => line.trim().slice(5).trim())\n .join('');\n try {\n const { event, data } = JSON.parse(jsonString);\n if (event === 'start') {\n requestId = data?.request_id;\n onRequestIdReady?.(requestId);\n\n if (currentConversation === TEMP_CONVERSATION_ID) {\n // If the conversation is temp, we need to set the new conversation id\n newConversationId = data?.conversation_id;\n }\n }\n\n // Handle tool_call event\n if (event === 'tool_call') {\n const toolCallData = data?.token;\n const legacyObjectCall =\n typeof toolCallData === 'object' &&\n toolCallData !== null &&\n !Array.isArray(toolCallData) &&\n (toolCallData as { tool_name?: string }).tool_name;\n\n const mcpStyle = isMcpStyleToolCallPayload(data);\n const rawArgs = data?.args ?? data?.arguments;\n const mcpArgs: Record<string, any> =\n rawArgs &&\n typeof rawArgs === 'object' &&\n !Array.isArray(rawArgs)\n ? rawArgs\n : {};\n\n let toolCall: ToolCall | undefined;\n // Prefer legacy token object when present (backward compatible)\n if (legacyObjectCall && data.id !== null) {\n toolCall = {\n id: data.id,\n toolName: (toolCallData as { tool_name: string }).tool_name,\n arguments:\n (toolCallData as { arguments?: Record<string, any> })\n .arguments || {},\n startTime: Date.now(),\n isLoading: true,\n };\n } else if (mcpStyle) {\n toolCall = {\n id: data.id,\n toolName: data.name.trim(),\n description:\n typeof data.type === 'string' && data.type !== data.name\n ? data.type\n : undefined,\n arguments: mcpArgs,\n startTime: Date.now(),\n isLoading: true,\n };\n }\n\n if (toolCall && data.id !== null) {\n const newToolCall: ToolCall = toolCall;\n pendingToolCalls.current[toolCallIdKey(data.id)] =\n newToolCall;\n\n // Update the bot message with the pending tool call\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n\n if (lastMessageIndex < 0) return prevConversations;\n\n const lastMessage = { ...conversation[lastMessageIndex] };\n const existingToolCalls = normalizeToolCalls(\n lastMessage.toolCalls,\n );\n const nextToolCalls: ToolCall[] = [\n ...existingToolCalls,\n newToolCall,\n ];\n lastMessage.toolCalls = nextToolCalls;\n\n // Cache tool calls for this message (message pair index)\n const messageIndex = Math.floor(lastMessageIndex / 2);\n const cacheKey = `${toolCallsCacheKeyPrefix}-${messageIndex}`;\n setSharedToolCallsCache(cacheKey, nextToolCalls);\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n\n // Also update streaming ref\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation] || [];\n if (aiMessage) {\n const existingStreamingToolCalls = normalizeToolCalls(\n aiMessage.toolCalls,\n );\n streamingConversations.current[currentConversation] = [\n humanMessage,\n {\n ...aiMessage,\n toolCalls: [...existingStreamingToolCalls, newToolCall],\n },\n ];\n }\n }\n }\n\n // Handle tool_result event\n if (event === 'tool_result') {\n const tokenResult = data?.token;\n const legacyResult = isLegacyToolResultToken(tokenResult);\n\n const mcpHasContent =\n data?.id !== null &&\n data.content !== undefined &&\n !legacyResult;\n\n let responsePayload: string | undefined;\n let matchToolName: string | undefined;\n let toolIdKey: string | undefined;\n\n if (legacyResult) {\n responsePayload = legacyToolResultToString(\n tokenResult.response,\n );\n matchToolName = tokenResult.tool_name;\n toolIdKey =\n data?.id !== null ? toolCallIdKey(data.id) : undefined;\n } else if (mcpHasContent) {\n toolIdKey = toolCallIdKey(data.id);\n responsePayload =\n typeof data.content === 'string'\n ? data.content\n : JSON.stringify(data.content);\n if (\n typeof data.status === 'string' &&\n data.status !== 'success'\n ) {\n responsePayload = `[${data.status}] ${responsePayload}`;\n }\n }\n\n if (responsePayload !== undefined && toolIdKey !== undefined) {\n const pendingCall = pendingToolCalls.current[toolIdKey];\n const endTime = Date.now();\n const executionTime = pendingCall\n ? (endTime - pendingCall.startTime) / 1000\n : 0;\n\n // Update the tool call with result\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n\n if (lastMessageIndex < 0) return prevConversations;\n\n const lastMessage = { ...conversation[lastMessageIndex] };\n const toolCalls = lastMessage.toolCalls || [];\n\n // Find and update the matching tool call\n const updatedToolCalls = toolCalls.map(tc => {\n const idMatches =\n toolCallIdKey(tc.id) === toolIdKey ||\n (matchToolName !== undefined &&\n tc.toolName === matchToolName);\n if (idMatches) {\n return {\n ...tc,\n response: responsePayload,\n endTime,\n executionTime,\n isLoading: false,\n };\n }\n return tc;\n });\n\n lastMessage.toolCalls = updatedToolCalls;\n\n // Update cache with completed tool call\n const messageIndex = Math.floor(lastMessageIndex / 2);\n const cacheKey = `${toolCallsCacheKeyPrefix}-${messageIndex}`;\n setSharedToolCallsCache(cacheKey, updatedToolCalls);\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n\n // Also update streaming ref\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation] || [];\n if (aiMessage) {\n const toolCalls = aiMessage.toolCalls || [];\n const updatedToolCalls = toolCalls.map(tc => {\n const idMatches =\n toolCallIdKey(tc.id) === toolIdKey ||\n (matchToolName !== undefined &&\n tc.toolName === matchToolName);\n if (idMatches) {\n return {\n ...tc,\n response: responsePayload,\n endTime,\n executionTime,\n isLoading: false,\n };\n }\n return tc;\n });\n streamingConversations.current[currentConversation] = [\n humanMessage,\n { ...aiMessage, toolCalls: updatedToolCalls },\n ];\n }\n\n // Clean up pending tool call\n delete pendingToolCalls.current[toolIdKey];\n }\n }\n\n if (event === 'token') {\n const content = data?.token || '';\n\n finalMessages.push(content);\n\n // Store streaming message\n const [humanMessage, aiMessage] =\n streamingConversations.current[currentConversation];\n streamingConversations.current[currentConversation] = [\n humanMessage,\n { ...aiMessage, content: aiMessage.content + content },\n ];\n\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex] };\n\n if ((lastMessage?.content ?? '').trim().length > 0) {\n lastMessage.isLoading = false;\n }\n lastMessage.content += content;\n lastMessage.name =\n data?.response_metadata?.model || selectedModel;\n lastMessage.timestamp = getTimestamp(\n // TODO: To be fixed in the query response\n data?.response_metadata?.created_at || Date.now(),\n );\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n }\n\n if (event === 'interrupted') {\n if (\n currentConversation === TEMP_CONVERSATION_ID &&\n data?.conversation_id\n ) {\n newConversationId = data.conversation_id;\n }\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n isLoading: false,\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex], isLoading: false };\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n streamEnded = true;\n break;\n }\n\n if (event === 'end') {\n const documents = data?.referenced_documents || [];\n\n setConversations(prevConversations => {\n const conversation =\n prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n isLoading: false,\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex], isLoading: false };\n\n if (documents.length) {\n lastMessage.sources = {\n sources: documents.map((doc: ReferencedDocument) => ({\n title: doc.doc_title,\n link: doc.doc_url,\n body: doc.doc_description,\n })),\n };\n }\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n return {\n ...prevConversations,\n [currentConversation]: updatedConversation,\n };\n });\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Error parsing JSON:', error);\n if (typeof onComplete === 'function') {\n onComplete('Invalid JSON received');\n }\n }\n }\n if (streamEnded) break;\n }\n } catch (e) {\n setConversations(prevConversations => {\n const conversation = prevConversations[currentConversation] ?? [];\n\n const lastMessageIndex = conversation.length - 1;\n const lastMessage =\n conversation.length === 0\n ? createBotMessage({\n content: '',\n timestamp: getTimestamp(Date.now()),\n })\n : { ...conversation[lastMessageIndex] };\n\n lastMessage.isLoading = false;\n lastMessage.content += e;\n lastMessage.error = {\n title: e.message,\n };\n lastMessage.timestamp = getTimestamp(Date.now());\n\n const updatedConversation = [\n ...conversation.slice(0, lastMessageIndex),\n lastMessage,\n ];\n\n finalMessages.push(`${e}`);\n\n return {\n ...prevConversations,\n [newConversationId.length > 0\n ? newConversationId\n : currentConversation]: updatedConversation,\n };\n });\n }\n // reset current streaming\n streamingConversations.current[currentConversation] = [];\n if (typeof onComplete === 'function') {\n onComplete(finalMessages.join(''));\n }\n // Swap temp conversation messages with new conversation\n\n if (currentConversation === TEMP_CONVERSATION_ID && newConversationId) {\n migrateSharedToolCallsCacheSessionPrefixToConversation(\n toolCallsCacheKeyPrefix,\n newConversationId,\n );\n\n setConversations(prevConversations => {\n return {\n ...prevConversations,\n [newConversationId]: prevConversations[TEMP_CONVERSATION_ID],\n };\n });\n\n onStart?.(newConversationId);\n\n // Defer removal so it runs after the sync useEffect updates currentConversation.\n setTimeout(() => {\n setConversations(prev => {\n const { [TEMP_CONVERSATION_ID]: _, ...rest } = prev;\n return rest;\n });\n }, 0);\n } else if (currentConversation === TEMP_CONVERSATION_ID) {\n clearSharedToolCallsCacheSessionPrefix(toolCallsCacheKeyPrefix);\n }\n },\n\n [\n avatar,\n userName,\n onComplete,\n onStart,\n onRequestIdReady,\n selectedModel,\n selectedProvider,\n createMessage,\n currentConversation,\n ],\n );\n\n return {\n conversationMessages: conversations[currentConversation] ?? [],\n handleInputPrompt,\n conversations,\n scrollToBottomRef,\n ...queryProps,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCreateCoversationMessage.esm.js","sources":["../../src/hooks/useCreateCoversationMessage.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useMutation, type UseMutationResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { Attachment } from '../types';\n\ntype CreateMessageVariables = {\n prompt: string;\n selectedModel: string;\n selectedProvider: string;\n currentConversation: string;\n attachments: Attachment[];\n};\n\nexport const useCreateConversationMessage = (): UseMutationResult<\n ReadableStreamDefaultReader<Uint8Array>,\n Error,\n CreateMessageVariables\n> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n\n return useMutation({\n mutationFn: async ({\n prompt,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n }: CreateMessageVariables) => {\n if (!currentConversation) {\n throw new Error('Failed to generate AI response');\n }\n\n return await lightspeedApi.createMessage(\n `${prompt}`,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n );\n },\n onError: error => {\n // eslint-disable-next-line\n console.warn(error);\n },\n });\n};\n"],"names":[],"mappings":";;;;AA+BO,MAAM,+BAA+B,MAIvC;AACH,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAE7C,EAAA,OAAO,WAAY,CAAA;AAAA,IACjB,YAAY,OAAO;AAAA,MACjB,MAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KAC4B,KAAA;AAC5B,MAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,QAAM,MAAA,IAAI,MAAM,gCAAgC,CAAA;AAAA;AAGlD,MAAA,OAAO,MAAM,aAAc,CAAA,aAAA;AAAA,QACzB,GAAG,MAAM,CAAA,CAAA;AAAA,QACT,aAAA;AAAA,QACA,gBAAA;AAAA,QACA,mBAAA;AAAA,QACA;AAAA,OACF;AAAA,KACF;AAAA,IACA,SAAS,CAAS,KAAA,KAAA;AAEhB,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA;AACpB,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"useCreateCoversationMessage.esm.js","sources":["../../src/hooks/useCreateCoversationMessage.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport { useMutation, type UseMutationResult } from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { Attachment } from '../types';\n\nexport type CreateMessageVariables = {\n prompt: string;\n selectedModel: string;\n selectedProvider: string;\n currentConversation: string;\n attachments: Attachment[];\n};\n\nexport const useCreateConversationMessage = (): UseMutationResult<\n ReadableStreamDefaultReader<Uint8Array>,\n Error,\n CreateMessageVariables\n> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n\n return useMutation({\n mutationFn: async ({\n prompt,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n }: CreateMessageVariables) => {\n if (!currentConversation) {\n throw new Error('Failed to generate AI response');\n }\n\n return await lightspeedApi.createMessage(\n `${prompt}`,\n selectedModel,\n selectedProvider,\n currentConversation,\n attachments,\n );\n },\n onError: error => {\n // eslint-disable-next-line\n console.warn(error);\n },\n });\n};\n"],"names":[],"mappings":";;;;AA+BO,MAAM,+BAA+B,MAIvC;AACH,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAE7C,EAAA,OAAO,WAAY,CAAA;AAAA,IACjB,YAAY,OAAO;AAAA,MACjB,MAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KAC4B,KAAA;AAC5B,MAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,QAAM,MAAA,IAAI,MAAM,gCAAgC,CAAA;AAAA;AAGlD,MAAA,OAAO,MAAM,aAAc,CAAA,aAAA;AAAA,QACzB,GAAG,MAAM,CAAA,CAAA;AAAA,QACT,aAAA;AAAA,QACA,gBAAA;AAAA,QACA,mBAAA;AAAA,QACA;AAAA,OACF;AAAA,KACF;AAAA,IACA,SAAS,CAAS,KAAA,KAAA;AAEhB,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA;AACpB,GACD,CAAA;AACH;;;;"}
@@ -1,6 +1,7 @@
1
1
  import { useApi } from '@backstage/core-plugin-api';
2
2
  import { useQueryClient, useMutation } from '@tanstack/react-query';
3
3
  import { lightspeedApiRef } from '../api/api.esm.js';
4
+ import { clearSharedToolCallsCacheForConversation } from './toolCallsCacheStore.esm.js';
4
5
 
5
6
  const useDeleteConversation = () => {
6
7
  const lightspeedApi = useApi(lightspeedApiRef);
@@ -19,6 +20,7 @@ const useDeleteConversation = () => {
19
20
  return { previousConversations };
20
21
  },
21
22
  onSuccess: (_, props) => {
23
+ clearSharedToolCallsCacheForConversation(props.conversation_id);
22
24
  if (props.invalidateCache) {
23
25
  queryClient.invalidateQueries({ queryKey: ["conversations"] });
24
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useDeleteConversation.esm.js","sources":["../../src/hooks/useDeleteConversation.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ConversationList } from '../types';\n\ntype DeleteVariables = {\n conversation_id: string;\n invalidateCache?: boolean;\n};\n\ntype DeleteContext = {\n previousConversations?: ConversationList;\n};\n\nexport const useDeleteConversation = (): UseMutationResult<\n void,\n Error,\n DeleteVariables,\n DeleteContext\n> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (props: {\n conversation_id: string;\n invalidateCache?: boolean;\n }) => {\n await lightspeedApi.deleteConversation(props.conversation_id);\n },\n onMutate: async props => {\n await queryClient.cancelQueries({ queryKey: ['conversations'] });\n\n const previousConversations: ConversationList | undefined =\n queryClient.getQueryData(['conversations']);\n\n queryClient.setQueryData(['conversations'], (old: ConversationList) =>\n old.filter(c => c.conversation_id !== props.conversation_id),\n );\n\n return { previousConversations };\n },\n onSuccess: (_, props) => {\n if (props.invalidateCache) {\n queryClient.invalidateQueries({ queryKey: ['conversations'] });\n }\n },\n onError: (_, __, context) => {\n queryClient.setQueryData(\n ['conversations'],\n context?.previousConversations,\n );\n return { success: false };\n },\n });\n};\n"],"names":[],"mappings":";;;;AAoCO,MAAM,wBAAwB,MAKhC;AACH,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,cAAc,cAAe,EAAA;AAEnC,EAAA,OAAO,WAAY,CAAA;AAAA,IACjB,UAAA,EAAY,OAAO,KAGb,KAAA;AACJ,MAAM,MAAA,aAAA,CAAc,kBAAmB,CAAA,KAAA,CAAM,eAAe,CAAA;AAAA,KAC9D;AAAA,IACA,QAAA,EAAU,OAAM,KAAS,KAAA;AACvB,MAAA,MAAM,YAAY,aAAc,CAAA,EAAE,UAAU,CAAC,eAAe,GAAG,CAAA;AAE/D,MAAA,MAAM,qBACJ,GAAA,WAAA,CAAY,YAAa,CAAA,CAAC,eAAe,CAAC,CAAA;AAE5C,MAAY,WAAA,CAAA,YAAA;AAAA,QAAa,CAAC,eAAe,CAAA;AAAA,QAAG,CAAC,QAC3C,GAAI,CAAA,MAAA,CAAO,OAAK,CAAE,CAAA,eAAA,KAAoB,MAAM,eAAe;AAAA,OAC7D;AAEA,MAAA,OAAO,EAAE,qBAAsB,EAAA;AAAA,KACjC;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,KAAU,KAAA;AACvB,MAAA,IAAI,MAAM,eAAiB,EAAA;AACzB,QAAA,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,CAAC,eAAe,GAAG,CAAA;AAAA;AAC/D,KACF;AAAA,IACA,OAAS,EAAA,CAAC,CAAG,EAAA,EAAA,EAAI,OAAY,KAAA;AAC3B,MAAY,WAAA,CAAA,YAAA;AAAA,QACV,CAAC,eAAe,CAAA;AAAA,QAChB,OAAS,EAAA;AAAA,OACX;AACA,MAAO,OAAA,EAAE,SAAS,KAAM,EAAA;AAAA;AAC1B,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"useDeleteConversation.esm.js","sources":["../../src/hooks/useDeleteConversation.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\n\nimport { lightspeedApiRef } from '../api/api';\nimport { ConversationList } from '../types';\nimport { clearSharedToolCallsCacheForConversation } from './toolCallsCacheStore';\n\ntype DeleteVariables = {\n conversation_id: string;\n invalidateCache?: boolean;\n};\n\ntype DeleteContext = {\n previousConversations?: ConversationList;\n};\n\nexport const useDeleteConversation = (): UseMutationResult<\n void,\n Error,\n DeleteVariables,\n DeleteContext\n> => {\n const lightspeedApi = useApi(lightspeedApiRef);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (props: {\n conversation_id: string;\n invalidateCache?: boolean;\n }) => {\n await lightspeedApi.deleteConversation(props.conversation_id);\n },\n onMutate: async props => {\n await queryClient.cancelQueries({ queryKey: ['conversations'] });\n\n const previousConversations: ConversationList | undefined =\n queryClient.getQueryData(['conversations']);\n\n queryClient.setQueryData(['conversations'], (old: ConversationList) =>\n old.filter(c => c.conversation_id !== props.conversation_id),\n );\n\n return { previousConversations };\n },\n onSuccess: (_, props) => {\n clearSharedToolCallsCacheForConversation(props.conversation_id);\n if (props.invalidateCache) {\n queryClient.invalidateQueries({ queryKey: ['conversations'] });\n }\n },\n onError: (_, __, context) => {\n queryClient.setQueryData(\n ['conversations'],\n context?.previousConversations,\n );\n return { success: false };\n },\n });\n};\n"],"names":[],"mappings":";;;;;AAqCO,MAAM,wBAAwB,MAKhC;AACH,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,cAAc,cAAe,EAAA;AAEnC,EAAA,OAAO,WAAY,CAAA;AAAA,IACjB,UAAA,EAAY,OAAO,KAGb,KAAA;AACJ,MAAM,MAAA,aAAA,CAAc,kBAAmB,CAAA,KAAA,CAAM,eAAe,CAAA;AAAA,KAC9D;AAAA,IACA,QAAA,EAAU,OAAM,KAAS,KAAA;AACvB,MAAA,MAAM,YAAY,aAAc,CAAA,EAAE,UAAU,CAAC,eAAe,GAAG,CAAA;AAE/D,MAAA,MAAM,qBACJ,GAAA,WAAA,CAAY,YAAa,CAAA,CAAC,eAAe,CAAC,CAAA;AAE5C,MAAY,WAAA,CAAA,YAAA;AAAA,QAAa,CAAC,eAAe,CAAA;AAAA,QAAG,CAAC,QAC3C,GAAI,CAAA,MAAA,CAAO,OAAK,CAAE,CAAA,eAAA,KAAoB,MAAM,eAAe;AAAA,OAC7D;AAEA,MAAA,OAAO,EAAE,qBAAsB,EAAA;AAAA,KACjC;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,KAAU,KAAA;AACvB,MAAA,wCAAA,CAAyC,MAAM,eAAe,CAAA;AAC9D,MAAA,IAAI,MAAM,eAAiB,EAAA;AACzB,QAAA,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,CAAC,eAAe,GAAG,CAAA;AAAA;AAC/D,KACF;AAAA,IACA,OAAS,EAAA,CAAC,CAAG,EAAA,EAAA,EAAI,OAAY,KAAA;AAC3B,MAAY,WAAA,CAAA,YAAA;AAAA,QACV,CAAC,eAAe,CAAA;AAAA,QAChB,OAAS,EAAA;AAAA,OACX;AACA,MAAO,OAAA,EAAE,SAAS,KAAM,EAAA;AAAA;AAC1B,GACD,CAAA;AACH;;;;"}