@scalar/agent-chat 0.12.23 → 0.12.25

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 (157) hide show
  1. package/dist/App.vue.d.ts.map +1 -1
  2. package/dist/App.vue.script.js +1 -1
  3. package/dist/App.vue.script.js.map +1 -1
  4. package/dist/Chat.vue.d.ts.map +1 -1
  5. package/dist/Chat.vue.script.js +1 -1
  6. package/dist/Chat.vue.script.js.map +1 -1
  7. package/dist/api.js.map +1 -1
  8. package/dist/client-tools/execute-request.js.map +1 -1
  9. package/dist/components/ActionsDropdown.vue.d.ts.map +1 -1
  10. package/dist/components/ActionsDropdown.vue.js +1 -1
  11. package/dist/components/ActionsDropdown.vue.script.js +1 -1
  12. package/dist/components/ActionsDropdown.vue.script.js.map +1 -1
  13. package/dist/components/ApprovalSection.vue.js +1 -1
  14. package/dist/components/ApprovalSection.vue.script.js +1 -1
  15. package/dist/components/ApprovalSection.vue.script.js.map +1 -1
  16. package/dist/components/AuthenticationProvided.vue.js +1 -1
  17. package/dist/components/AuthenticationProvided.vue.js.map +1 -1
  18. package/dist/components/AuthenticationRequired.vue.js +1 -1
  19. package/dist/components/AuthenticationRequired.vue.js.map +1 -1
  20. package/dist/components/AutosendPaused.vue.js +1 -1
  21. package/dist/components/AutosendPaused.vue.js.map +1 -1
  22. package/dist/components/BuildingRequest.vue.js +1 -1
  23. package/dist/components/BuildingRequest.vue.js.map +1 -1
  24. package/dist/components/ContextItem.vue.js +1 -1
  25. package/dist/components/ContextItem.vue.script.js +1 -1
  26. package/dist/components/ContextItem.vue.script.js.map +1 -1
  27. package/dist/components/ErrorMessage.vue.js +1 -1
  28. package/dist/components/ErrorMessage.vue.script.js +1 -1
  29. package/dist/components/ErrorMessage.vue.script.js.map +1 -1
  30. package/dist/components/FreeMessagesInfoSection.vue.js +1 -1
  31. package/dist/components/FreeMessagesInfoSection.vue.script.js +1 -1
  32. package/dist/components/FreeMessagesInfoSection.vue.script.js.map +1 -1
  33. package/dist/components/LoadingOpenAPISpecsSummary.vue.js +1 -1
  34. package/dist/components/LoadingOpenAPISpecsSummary.vue.js.map +1 -1
  35. package/dist/components/LoadingSearchOpenAPIOperations.vue.js +1 -1
  36. package/dist/components/LoadingSearchOpenAPIOperations.vue.js.map +1 -1
  37. package/dist/components/Logo.vue.js +1 -1
  38. package/dist/components/PaymentSection.vue.js +1 -1
  39. package/dist/components/PaymentSection.vue.script.js +1 -1
  40. package/dist/components/PaymentSection.vue.script.js.map +1 -1
  41. package/dist/components/RequestApproved.vue.js +1 -1
  42. package/dist/components/RequestApproved.vue.js.map +1 -1
  43. package/dist/components/RequestFailed.vue.js +1 -1
  44. package/dist/components/RequestFailed.vue.js.map +1 -1
  45. package/dist/components/RequestPreview.vue.d.ts.map +1 -1
  46. package/dist/components/RequestPreview.vue.js +1 -1
  47. package/dist/components/RequestPreview.vue.script.js +1 -1
  48. package/dist/components/RequestPreview.vue.script.js.map +1 -1
  49. package/dist/components/RequestRejected.vue.js +1 -1
  50. package/dist/components/RequestRejected.vue.js.map +1 -1
  51. package/dist/components/RequestSuccess.vue.js +1 -1
  52. package/dist/components/RequestSuccess.vue.js.map +1 -1
  53. package/dist/components/ResponseBody/ResponseBody.vue.d.ts.map +1 -1
  54. package/dist/components/ResponseBody/ResponseBody.vue.js.map +1 -1
  55. package/dist/components/ResponseBody/ResponseBody.vue.script.js +2 -3
  56. package/dist/components/ResponseBody/ResponseBody.vue.script.js.map +1 -1
  57. package/dist/components/ResponseBody/ResponseBodyInfo.vue.js +1 -1
  58. package/dist/components/ResponseBody/ResponseBodyInfo.vue.js.map +1 -1
  59. package/dist/components/ResponseBody/ResponseBodyPreview.vue.js +1 -1
  60. package/dist/components/ResponseBody/ResponseBodyPreview.vue.script.js +1 -1
  61. package/dist/components/ResponseBody/ResponseBodyPreview.vue.script.js.map +1 -1
  62. package/dist/components/ResponseBody/ResponseBodyRaw.vue.script.js +1 -1
  63. package/dist/components/ResponseBody/ResponseBodyRaw.vue.script.js.map +1 -1
  64. package/dist/components/ResponseBody/ResponseBodyToggle.vue.script.js +1 -1
  65. package/dist/components/ResponseBody/ResponseBodyToggle.vue.script.js.map +1 -1
  66. package/dist/components/ResponseBody/helpers/media-types.d.ts.map +1 -1
  67. package/dist/components/ResponseBody/helpers/media-types.js +10 -0
  68. package/dist/components/ResponseBody/helpers/media-types.js.map +1 -1
  69. package/dist/components/ResponseBody/helpers/process-response-body.js.map +1 -1
  70. package/dist/components/SearchPopover.vue.d.ts.map +1 -1
  71. package/dist/components/SearchPopover.vue.js +1 -1
  72. package/dist/components/SearchPopover.vue.script.js +1 -1
  73. package/dist/components/SearchPopover.vue.script.js.map +1 -1
  74. package/dist/components/Selector.vue.d.ts.map +1 -1
  75. package/dist/components/Selector.vue.script.js +1 -1
  76. package/dist/components/Selector.vue.script.js.map +1 -1
  77. package/dist/components/SendingRequest.vue.js +1 -1
  78. package/dist/components/SendingRequest.vue.js.map +1 -1
  79. package/dist/components/ServerSelector.vue.d.ts.map +1 -1
  80. package/dist/components/ServerSelector.vue.script.js +1 -1
  81. package/dist/components/ServerSelector.vue.script.js.map +1 -1
  82. package/dist/components/UploadSection.vue.js +1 -1
  83. package/dist/components/UploadSection.vue.script.js +1 -1
  84. package/dist/components/UploadSection.vue.script.js.map +1 -1
  85. package/dist/consts/urls.js.map +1 -1
  86. package/dist/entities/error/constants.js.map +1 -1
  87. package/dist/entities/error/helpers.js.map +1 -1
  88. package/dist/entities/registry/document.js.map +1 -1
  89. package/dist/entities/tools/ask-for-authentication.js.map +1 -1
  90. package/dist/entities/tools/execute-request.js.map +1 -1
  91. package/dist/entities/tools/search-openapi-operations.js.map +1 -1
  92. package/dist/helpers.d.ts +16 -0
  93. package/dist/helpers.d.ts.map +1 -1
  94. package/dist/helpers.js +7 -0
  95. package/dist/helpers.js.map +1 -1
  96. package/dist/hooks/use-agent-key-documents.js.map +1 -1
  97. package/dist/hooks/use-chat-approvals.js.map +1 -1
  98. package/dist/hooks/use-chat-error.js.map +1 -1
  99. package/dist/hooks/use-chat-pending-client-tool-parts.js.map +1 -1
  100. package/dist/hooks/use-chat-scroll.js.map +1 -1
  101. package/dist/hooks/use-curated-documents.js.map +1 -1
  102. package/dist/hooks/use-search.js.map +1 -1
  103. package/dist/hooks/use-signup-link.js.map +1 -1
  104. package/dist/hooks/use-term-and-conditions.js.map +1 -1
  105. package/dist/hooks/use-upload-tmp-document.js.map +1 -1
  106. package/dist/package.json +1 -1
  107. package/dist/plugins/persistance.js +6 -1
  108. package/dist/plugins/persistance.js.map +1 -1
  109. package/dist/registry/add-documents-to-store.js.map +1 -1
  110. package/dist/registry/create-document-name.js.map +1 -1
  111. package/dist/state/state.js.map +1 -1
  112. package/dist/style.css +318 -322
  113. package/dist/views/Catalog/Catalog.vue.d.ts.map +1 -1
  114. package/dist/views/Catalog/Catalog.vue.js +1 -1
  115. package/dist/views/Catalog/Catalog.vue.script.js +1 -1
  116. package/dist/views/Catalog/Catalog.vue.script.js.map +1 -1
  117. package/dist/views/Chat/Chat.vue.d.ts.map +1 -1
  118. package/dist/views/Chat/Chat.vue.js +1 -1
  119. package/dist/views/Chat/Chat.vue.script.js +1 -1
  120. package/dist/views/Chat/Chat.vue.script.js.map +1 -1
  121. package/dist/views/Chat/Messages/AskForAuthentication.vue.d.ts.map +1 -1
  122. package/dist/views/Chat/Messages/AskForAuthentication.vue.js +1 -1
  123. package/dist/views/Chat/Messages/AskForAuthentication.vue.script.js +1 -1
  124. package/dist/views/Chat/Messages/AskForAuthentication.vue.script.js.map +1 -1
  125. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.js +1 -1
  126. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.script.js +1 -1
  127. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.script.js.map +1 -1
  128. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.script.js +1 -1
  129. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.script.js.map +1 -1
  130. package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.js +1 -1
  131. package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.script.js +1 -1
  132. package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.script.js.map +1 -1
  133. package/dist/views/Chat/Messages/Text.vue.script.js +1 -1
  134. package/dist/views/Chat/Messages/Text.vue.script.js.map +1 -1
  135. package/dist/views/Layout.vue.d.ts.map +1 -1
  136. package/dist/views/Layout.vue.js +1 -1
  137. package/dist/views/Layout.vue.script.js +1 -1
  138. package/dist/views/Layout.vue.script.js.map +1 -1
  139. package/dist/views/PromptForm.vue.d.ts.map +1 -1
  140. package/dist/views/PromptForm.vue.js +1 -1
  141. package/dist/views/PromptForm.vue.js.map +1 -1
  142. package/dist/views/PromptForm.vue.script.js +3 -2
  143. package/dist/views/PromptForm.vue.script.js.map +1 -1
  144. package/dist/views/Settings/Auth.vue.script.js +1 -1
  145. package/dist/views/Settings/Auth.vue.script.js.map +1 -1
  146. package/dist/views/Settings/DocSettings.vue.js +1 -1
  147. package/dist/views/Settings/DocSettings.vue.script.js +1 -1
  148. package/dist/views/Settings/DocSettings.vue.script.js.map +1 -1
  149. package/dist/views/Settings/Settings.vue.js +1 -1
  150. package/dist/views/Settings/Settings.vue.script.js +1 -1
  151. package/dist/views/Settings/Settings.vue.script.js.map +1 -1
  152. package/dist/views/Start.vue.d.ts.map +1 -1
  153. package/dist/views/Start.vue.js +1 -1
  154. package/dist/views/Start.vue.script.js +1 -1
  155. package/dist/views/Start.vue.script.js.map +1 -1
  156. package/dist/vue-styles.css +39 -39
  157. package/package.json +17 -17
@@ -1 +1 @@
1
- {"version":3,"file":"Catalog.vue.d.ts","sourceRoot":"","sources":["../../../src/views/Catalog/Catalog.vue"],"names":[],"mappings":"AAmJA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAOvE,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,UAAU,CAAA;CAClB,CAAC;AA0KF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"Catalog.vue.d.ts","sourceRoot":"","sources":["../../../src/views/Catalog/Catalog.vue"],"names":[],"mappings":"AAmJA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAOvE,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,UAAU,CAAA;CAClB,CAAC;AA2KF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -3,7 +3,7 @@ import Catalog_vue_vue_type_script_setup_true_lang_default from "./Catalog.vue.s
3
3
  /* empty css */
4
4
  /* empty css */
5
5
  //#region src/views/Catalog/Catalog.vue
6
- var Catalog_default = /* @__PURE__ */ _plugin_vue_export_helper_default(Catalog_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-18b2aea2"]]);
6
+ var Catalog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(Catalog_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-18b2aea2"]]);
7
7
  //#endregion
8
8
  export { Catalog_default as default };
9
9
 
@@ -16,7 +16,7 @@ var _hoisted_5 = { class: "right" };
16
16
  var _hoisted_6 = { class: "item-top" };
17
17
  var _hoisted_7 = { class: "version" };
18
18
  var _hoisted_8 = { class: "description" };
19
- var Catalog_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
19
+ var Catalog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
20
20
  __name: "Catalog",
21
21
  props: { modal: {} },
22
22
  setup(__props) {
@@ -1 +1 @@
1
- {"version":3,"file":"Catalog.vue.script.js","names":[],"sources":["../../../src/views/Catalog/Catalog.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { ScalarModal, type ModalState } from '@scalar/components/modal'\nimport { ScalarSearchInput } from '@scalar/components/search-input'\nimport { computed } from 'vue'\n\nimport { useSearch } from '@/hooks/use-search'\nimport { useState } from '@/state/state'\n\ndefineProps<{\n modal: ModalState\n}>()\n\nconst search = useSearch()\n\nconst state = useState()\n\nconst searchOptions = computed(() =>\n search.results.value\n .filter((r) => {\n return !state.registryDocuments.value.some(\n (d) => d.namespace === r.namespace && d.slug === r.slug,\n )\n })\n .map((result) => ({\n ...result,\n label: result.title,\n id: result.id,\n })),\n)\n</script>\n\n<template>\n <ScalarModal\n class=\"catalogModal\"\n :state=\"modal\">\n <ScalarSearchInput\n autofocus\n class=\"searchInput\"\n :modelValue=\"search.query.value\"\n @update:modelValue=\"(v) => (search.query.value = v ?? '')\" />\n <template v-if=\"searchOptions.length\">\n <div class=\"catalog custom-scroll\">\n <button\n v-for=\"option in searchOptions\"\n :key=\"option.id\"\n class=\"item\"\n type=\"button\"\n @click=\"\n () => {\n state.addDocument(option)\n modal.hide()\n }\n \">\n <div class=\"left\">\n <img\n v-if=\"option.logoUrl\"\n class=\"logo\"\n :src=\"option.logoUrl\" />\n <ScalarIcon\n v-else\n class=\"logo\"\n logo=\"Openapi\" />\n </div>\n\n <div class=\"right\">\n <div class=\"item-top\">\n <span>{{ option.title }}</span>\n\n <span class=\"version\">v{{ option.currentVersion }}</span>\n </div>\n\n <span class=\"description\">\n @{{ option.namespace }}/{{ option.slug }}\n </span>\n </div>\n </button>\n </div>\n </template>\n </ScalarModal>\n</template>\n\n<style>\n.catalogModal .scalar-modal-body {\n display: flex;\n flex-direction: column;\n}\n</style>\n\n<style scoped>\n.searchInput {\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: var(--scalar-radius-lg);\n margin-bottom: 10px;\n}\n.catalog {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n overflow-y: scroll;\n font-size: var(--scalar-font-size-3);\n}\n.item {\n display: flex;\n padding: 15px;\n gap: 10px;\n align-items: center;\n background-color: var(--scalar-background-2);\n border-radius: var(--scalar-radius-lg);\n transition: background-color 160ms ease;\n}\n.item:hover {\n background-color: color-mix(\n in srgb,\n var(--scalar-background-3),\n transparent 40%\n ) !important;\n}\n.left {\n align-items: center;\n}\n.right {\n display: flex;\n flex-direction: column;\n}\n.logo {\n width: 25px;\n}\n.item-top {\n display: flex;\n gap: 10px;\n}\n.version {\n background: var(--scalar-background-3);\n padding: 2px 5px;\n border-radius: var(--scalar-radius);\n font-size: var(--scalar-font-size-5);\n color: var(--scalar-color-3);\n}\n.description {\n color: var(--scalar-color-2);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAaA,MAAM,SAAS,WAAU;EAEzB,MAAM,QAAQ,UAAS;EAEvB,MAAM,gBAAgB,eACpB,OAAO,QAAQ,MACZ,QAAQ,MAAM;AACb,UAAO,CAAC,MAAM,kBAAkB,MAAM,MACnC,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,KACrD;IACD,CACA,KAAK,YAAY;GAChB,GAAG;GACH,OAAO,OAAO;GACd,IAAI,OAAO;GACZ,EAAE,CACP;;uBAIE,YA8Cc,MAAA,YAAA,EAAA;IA7CZ,OAAM;IACL,OAAO,QAAA;;2BAKuD,CAJ/D,YAI+D,MAAA,kBAAA,EAAA;KAH7D,WAAA;KACA,OAAM;KACL,YAAY,MAAA,OAAM,CAAC,MAAM;KACzB,uBAAiB,OAAA,OAAA,OAAA,MAAG,MAAO,MAAA,OAAM,CAAC,MAAM,QAAQ,KAAC;iCACpC,cAAA,MAAc,UAAA,WAAA,EAC5B,mBAmCM,OAnCN,YAmCM,EAAA,UAAA,KAAA,EAlCJ,mBAiCS,UAAA,MAAA,WAhCU,cAAA,QAAV,WAAM;yBADf,mBAiCS,UAAA;MA/BN,KAAK,OAAO;MACb,OAAM;MACN,MAAK;MACJ,eAAA;AAA0C,aAAA,MAAK,CAAC,YAAY,OAAM;AAAgB,eAAA,MAAM,MAAI;;SAM7F,mBASM,OATN,YASM,CAPI,OAAO,WAAA,WAAA,EADf,mBAG0B,OAAA;;MADxB,OAAM;MACL,KAAK,OAAO;8CACf,YAGmB,MAAA,WAAA,EAAA;;MADjB,OAAM;MACN,MAAK;YAGT,mBAUM,OAVN,YAUM,CATJ,mBAIM,OAJN,YAIM,CAHJ,mBAA+B,QAAA,MAAA,gBAAtB,OAAO,MAAK,EAAA,EAAA,EAErB,mBAAyD,QAAzD,YAAsB,MAAC,gBAAG,OAAO,eAAc,EAAA,EAAA,CAAA,CAAA,EAGjD,mBAEO,QAFP,YAA0B,OACvB,gBAAG,OAAO,UAAS,GAAG,MAAC,gBAAG,OAAO,KAAI,EAAA,EAAA,CAAA,CAAA,CAAA,EAAA,GAAA,WAAA"}
1
+ {"version":3,"file":"Catalog.vue.script.js","names":[],"sources":["../../../src/views/Catalog/Catalog.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { ScalarModal, type ModalState } from '@scalar/components/modal'\nimport { ScalarSearchInput } from '@scalar/components/search-input'\nimport { computed } from 'vue'\n\nimport { useSearch } from '@/hooks/use-search'\nimport { useState } from '@/state/state'\n\ndefineProps<{\n modal: ModalState\n}>()\n\nconst search = useSearch()\n\nconst state = useState()\n\nconst searchOptions = computed(() =>\n search.results.value\n .filter((r) => {\n return !state.registryDocuments.value.some(\n (d) => d.namespace === r.namespace && d.slug === r.slug,\n )\n })\n .map((result) => ({\n ...result,\n label: result.title,\n id: result.id,\n })),\n)\n</script>\n\n<template>\n <ScalarModal\n class=\"catalogModal\"\n :state=\"modal\">\n <ScalarSearchInput\n autofocus\n class=\"searchInput\"\n :modelValue=\"search.query.value\"\n @update:modelValue=\"(v) => (search.query.value = v ?? '')\" />\n <template v-if=\"searchOptions.length\">\n <div class=\"catalog custom-scroll\">\n <button\n v-for=\"option in searchOptions\"\n :key=\"option.id\"\n class=\"item\"\n type=\"button\"\n @click=\"\n () => {\n state.addDocument(option)\n modal.hide()\n }\n \">\n <div class=\"left\">\n <img\n v-if=\"option.logoUrl\"\n class=\"logo\"\n :src=\"option.logoUrl\" />\n <ScalarIcon\n v-else\n class=\"logo\"\n logo=\"Openapi\" />\n </div>\n\n <div class=\"right\">\n <div class=\"item-top\">\n <span>{{ option.title }}</span>\n\n <span class=\"version\">v{{ option.currentVersion }}</span>\n </div>\n\n <span class=\"description\">\n @{{ option.namespace }}/{{ option.slug }}\n </span>\n </div>\n </button>\n </div>\n </template>\n </ScalarModal>\n</template>\n\n<style>\n.catalogModal .scalar-modal-body {\n display: flex;\n flex-direction: column;\n}\n</style>\n\n<style scoped>\n.searchInput {\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: var(--scalar-radius-lg);\n margin-bottom: 10px;\n}\n.catalog {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n overflow-y: scroll;\n font-size: var(--scalar-font-size-3);\n}\n.item {\n display: flex;\n padding: 15px;\n gap: 10px;\n align-items: center;\n background-color: var(--scalar-background-2);\n border-radius: var(--scalar-radius-lg);\n transition: background-color 160ms ease;\n}\n.item:hover {\n background-color: color-mix(\n in srgb,\n var(--scalar-background-3),\n transparent 40%\n ) !important;\n}\n.left {\n align-items: center;\n}\n.right {\n display: flex;\n flex-direction: column;\n}\n.logo {\n width: 25px;\n}\n.item-top {\n display: flex;\n gap: 10px;\n}\n.version {\n background: var(--scalar-background-3);\n padding: 2px 5px;\n border-radius: var(--scalar-radius);\n font-size: var(--scalar-font-size-5);\n color: var(--scalar-color-3);\n}\n.description {\n color: var(--scalar-color-2);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAaA,MAAM,SAAS,UAAU;EAEzB,MAAM,QAAQ,SAAS;EAEvB,MAAM,gBAAgB,eACpB,OAAO,QAAQ,MACZ,QAAQ,MAAM;GACb,OAAO,CAAC,MAAM,kBAAkB,MAAM,MACnC,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,IACrD;EACF,CAAC,CAAA,CACA,KAAK,YAAY;GAChB,GAAG;GACH,OAAO,OAAO;GACd,IAAI,OAAO;EACb,EAAE,CACN;;uBAIE,YA8Cc,MAAA,WAAA,GAAA;IA7CZ,OAAM;IACL,OAAO,QAAA;;2BAKuD,CAJ/D,YAI+D,MAAA,iBAAA,GAAA;KAH7D,WAAA;KACA,OAAM;KACL,YAAY,MAAA,MAAA,CAAM,CAAC,MAAM;KACzB,uBAAiB,OAAA,OAAA,OAAA,MAAG,MAAO,MAAA,MAAA,CAAM,CAAC,MAAM,QAAQ,KAAC;iCACpC,cAAA,MAAc,UAAA,UAAA,GAC5B,mBAmCM,OAnCN,YAmCM,EAAA,UAAA,IAAA,GAlCJ,mBAiCS,UAAA,MAAA,WAhCU,cAAA,QAAV,WAAM;yBADf,mBAiCS,UAAA;MA/BN,KAAK,OAAO;MACb,OAAM;MACN,MAAK;MACJ,eAAA;OAA0C,MAAA,KAAA,CAAK,CAAC,YAAY,MAAM;OAAgB,QAAA,MAAM,KAAI;;SAM7F,mBASM,OATN,YASM,CAPI,OAAO,WAAA,UAAA,GADf,mBAG0B,OAAA;;MADxB,OAAM;MACL,KAAK,OAAO;8CACf,YAGmB,MAAA,UAAA,GAAA;;MADjB,OAAM;MACN,MAAK;YAGT,mBAUM,OAVN,YAUM,CATJ,mBAIM,OAJN,YAIM,CAHJ,mBAA+B,QAAA,MAAA,gBAAtB,OAAO,KAAK,GAAA,CAAA,GAErB,mBAAyD,QAAzD,YAAsB,MAAC,gBAAG,OAAO,cAAc,GAAA,CAAA,CAAA,CAAA,GAGjD,mBAEO,QAFP,YAA0B,OACvB,gBAAG,OAAO,SAAS,IAAG,MAAC,gBAAG,OAAO,IAAI,GAAA,CAAA,CAAA,CAAA,CAAA,GAAA,GAAA,UAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.vue.d.ts","sourceRoot":"","sources":["../../../src/views/Chat/Chat.vue"],"names":[],"mappings":"AAwUA,QAAA,MAAM,YAAY;;;;;;iFAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"Chat.vue.d.ts","sourceRoot":"","sources":["../../../src/views/Chat/Chat.vue"],"names":[],"mappings":"AA4UA,QAAA,MAAM,YAAY;;;;;;iFAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import Chat_vue_vue_type_script_setup_true_lang_default from "./Chat.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/views/Chat/Chat.vue
5
- var Chat_default = /* @__PURE__ */ _plugin_vue_export_helper_default(Chat_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-6573ec87"]]);
5
+ var Chat_default = /*#__PURE__*/ _plugin_vue_export_helper_default(Chat_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-6573ec87"]]);
6
6
  //#endregion
7
7
  export { Chat_default as default };
8
8
 
@@ -14,7 +14,7 @@ import { Fragment, createBlock, createCommentVNode, createElementBlock, createEl
14
14
  var _hoisted_1 = { class: "chat" };
15
15
  var _hoisted_2 = { key: 0 };
16
16
  var _hoisted_3 = { class: "formContainer" };
17
- var Chat_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
17
+ var Chat_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
18
18
  __name: "Chat",
19
19
  emits: ["submit", "uploadApi"],
20
20
  setup(__props, { emit: __emit }) {
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.vue.script.js","names":[],"sources":["../../../src/views/Chat/Chat.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { reactive, toRef } from 'vue'\n\nimport { ASK_FOR_AUTHENTICATION_TOOL_NAME } from '@/entities/tools/ask-for-authentication'\nimport { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities/tools/execute-request'\nimport { SUMMARIZE_OPENAPI_SPECS_TOOL_NAME } from '@/entities/tools/get-openapi-specs-summary'\nimport { SEARCH_OPENAPI_OPERATIONS_TOOL_NAME } from '@/entities/tools/search-openapi-operations'\nimport { useState } from '@/state/state'\nimport AskForAuthentication from '@/views/Chat/Messages/AskForAuthentication.vue'\nimport ExecuteRequestTool from '@/views/Chat/Messages/ExecuteRequestTool.vue'\nimport GetOpenAPISpecsSummary from '@/views/Chat/Messages/GetOpenAPISpecsSummary.vue'\nimport SearchOpenAPIOperationsTool from '@/views/Chat/Messages/SearchOpenAPIOperationsTool.vue'\nimport Text from '@/views/Chat/Messages/Text.vue'\nimport PromptForm from '@/views/PromptForm.vue'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\nconst state = useState()\n</script>\n\n<template>\n <div class=\"chat\">\n <template\n v-for=\"message in state.chat.messages\"\n :key=\"message.id\">\n <template v-if=\"message.role === 'user'\">\n <div\n v-for=\"(part, index) in message.parts\"\n :key=\"`${message.id}-${index}`\"\n class=\"userMessage\">\n <p v-if=\"part.type === 'text'\">{{ part.text }}</p>\n </div>\n </template>\n <template v-if=\"message.role === 'assistant'\">\n <div\n v-for=\"(part, index) in message.parts\"\n :key=\"`${message.id}-${index}`\">\n <Text\n v-if=\"part.type === 'text'\"\n :messagePart=\"toRef(part)\" />\n <ExecuteRequestTool\n v-if=\"\n part.type ===\n (`tool-${EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME}` as const)\n \"\n :messagePart=\"toRef(part)\" />\n <SearchOpenAPIOperationsTool\n v-if=\"\n part.type ===\n (`tool-${SEARCH_OPENAPI_OPERATIONS_TOOL_NAME}` as const)\n \"\n :message=\"reactive(message)\"\n :messagePart=\"toRef(part)\" />\n <GetOpenAPISpecsSummary\n v-if=\"\n part.type ===\n (`tool-${SUMMARIZE_OPENAPI_SPECS_TOOL_NAME}` as const)\n \"\n :message=\"reactive(message)\"\n :messagePart=\"toRef(part)\" />\n <AskForAuthentication\n v-if=\"\n part.type ===\n (`tool-${ASK_FOR_AUTHENTICATION_TOOL_NAME}` as const)\n \"\n :message=\"reactive(message)\"\n :messagePart=\"toRef(part)\" />\n </div>\n </template>\n </template>\n <div class=\"spacer\"></div>\n </div>\n <div class=\"formContainer\">\n <PromptForm\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n </div>\n</template>\n\n<style scoped>\n.chat {\n flex: 1;\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: 24px 0;\n max-width: 744px;\n}\n\n.userMessage {\n padding-top: 6px;\n padding-bottom: 6px;\n padding-inline: 16px;\n border-radius: var(--scalar-radius-3xl);\n background: var(--scalar-background-2);\n width: fit-content;\n max-width: 80%;\n margin-left: auto;\n font-size: 16px;\n line-height: 24px;\n color: var(--scalar-color-1);\n margin-bottom: 12px;\n}\ndiv + .userMessage {\n margin-top: 64px;\n}\n.chat > :deep(div:has(.executeRequestTool)) + div:has(.executeRequestTool) {\n margin-top: -12px;\n}\n.spacer {\n min-height: 280px;\n width: 100%;\n}\n\n.formContainer {\n position: fixed;\n bottom: 20px;\n width: 100%;\n max-width: 744px;\n z-index: 1;\n}\n.chat :deep(.markdown) {\n margin-bottom: 12px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAeA,MAAM,OAAO;EAKb,MAAM,QAAQ,UAAS;;2DAIrB,mBAkDM,OAlDN,YAkDM,EAAA,UAAA,KAAA,EAjDJ,mBA+CW,UAAA,MAAA,WA9CS,MAAA,MAAK,CAAC,KAAK,WAAtB,YAAO;4DACR,QAAQ,IAAA,EAAA,CACE,QAAQ,SAAI,UAAA,UAAA,KAAA,EAC1B,mBAKM,UAAA,EAAA,KAAA,GAAA,EAAA,WAJoB,QAAQ,QAAxB,MAAM,UAAK;yBADrB,mBAKM,OAAA;MAHH,KAAG,GAAK,QAAQ,GAAE,GAAI;MACvB,OAAM;SACG,KAAK,SAAI,UAAA,WAAA,EAAlB,mBAAkD,KAAA,YAAA,gBAAhB,KAAK,KAAI,EAAA,EAAA,IAAA,mBAAA,IAAA,KAAA,CAAA,CAAA;8CAG/B,QAAQ,SAAI,eAAA,UAAA,KAAA,EAC1B,mBAiCM,UAAA,EAAA,KAAA,GAAA,EAAA,WAhCoB,QAAQ,QAAxB,MAAM,UAAK;yBADrB,mBAiCM,OAAA,EA/BH,KAAG,GAAK,QAAQ,GAAE,GAAI,SAAA,EAAA;MAEf,KAAK,SAAI,UAAA,WAAA,EADjB,YAE+B,cAAA;;OAA5B,aAAa,MAAM,KAAI;;MAEH,KAAK,SAAA,QAAgC,MAAA,kBAAqC,MAAA,WAAA,EADjG,YAK+B,4BAAA;;OAA5B,aAAa,MAAM,KAAI;;MAEH,KAAK,SAAA,QAAgC,MAAA,4BAAmC,MAAA,WAAA,EAD/F,YAM+B,qCAAA;;OAD5B,SAAS,SAAS,QAAO;OACzB,aAAa,MAAM,KAAI;;MAEH,KAAK,SAAA,QAAgC,MAAA,0BAAiC,MAAA,WAAA,EAD7F,YAM+B,gCAAA;;OAD5B,SAAS,SAAS,QAAO;OACzB,aAAa,MAAM,KAAI;;MAEH,KAAK,SAAA,QAAgC,MAAA,yBAAgC,MAAA,WAAA,EAD5F,YAM+B,8BAAA;;OAD5B,SAAS,SAAS,QAAO;OACzB,aAAa,MAAM,KAAI;;;;wCAIhC,mBAA0B,OAAA,EAArB,OAAM,UAAQ,EAAA,MAAA,GAAA,EAAA,CAAA,EAErB,mBAIM,OAJN,YAIM,CAHJ,YAEmC,oBAAA;IADhC,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;IACZ,aAAS,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,YAAA"}
1
+ {"version":3,"file":"Chat.vue.script.js","names":[],"sources":["../../../src/views/Chat/Chat.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { reactive, toRef } from 'vue'\n\nimport { ASK_FOR_AUTHENTICATION_TOOL_NAME } from '@/entities/tools/ask-for-authentication'\nimport { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities/tools/execute-request'\nimport { SUMMARIZE_OPENAPI_SPECS_TOOL_NAME } from '@/entities/tools/get-openapi-specs-summary'\nimport { SEARCH_OPENAPI_OPERATIONS_TOOL_NAME } from '@/entities/tools/search-openapi-operations'\nimport { useState } from '@/state/state'\nimport AskForAuthentication from '@/views/Chat/Messages/AskForAuthentication.vue'\nimport ExecuteRequestTool from '@/views/Chat/Messages/ExecuteRequestTool.vue'\nimport GetOpenAPISpecsSummary from '@/views/Chat/Messages/GetOpenAPISpecsSummary.vue'\nimport SearchOpenAPIOperationsTool from '@/views/Chat/Messages/SearchOpenAPIOperationsTool.vue'\nimport Text from '@/views/Chat/Messages/Text.vue'\nimport PromptForm from '@/views/PromptForm.vue'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\nconst state = useState()\n</script>\n\n<template>\n <div class=\"chat\">\n <template\n v-for=\"message in state.chat.messages\"\n :key=\"message.id\">\n <template v-if=\"message.role === 'user'\">\n <div\n v-for=\"(part, index) in message.parts\"\n :key=\"`${message.id}-${index}`\"\n class=\"userMessage\">\n <p v-if=\"part.type === 'text'\">{{ part.text }}</p>\n </div>\n </template>\n <template v-if=\"message.role === 'assistant'\">\n <div\n v-for=\"(part, index) in message.parts\"\n :key=\"`${message.id}-${index}`\">\n <Text\n v-if=\"part.type === 'text'\"\n :messagePart=\"toRef(part)\" />\n <ExecuteRequestTool\n v-if=\"\n part.type ===\n (`tool-${EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME}` as const)\n \"\n :messagePart=\"toRef(part)\" />\n <SearchOpenAPIOperationsTool\n v-if=\"\n part.type ===\n (`tool-${SEARCH_OPENAPI_OPERATIONS_TOOL_NAME}` as const)\n \"\n :message=\"reactive(message)\"\n :messagePart=\"toRef(part)\" />\n <GetOpenAPISpecsSummary\n v-if=\"\n part.type ===\n (`tool-${SUMMARIZE_OPENAPI_SPECS_TOOL_NAME}` as const)\n \"\n :message=\"reactive(message)\"\n :messagePart=\"toRef(part)\" />\n <AskForAuthentication\n v-if=\"\n part.type ===\n (`tool-${ASK_FOR_AUTHENTICATION_TOOL_NAME}` as const)\n \"\n :message=\"reactive(message)\"\n :messagePart=\"toRef(part)\" />\n </div>\n </template>\n </template>\n <div class=\"spacer\"></div>\n </div>\n <div class=\"formContainer\">\n <PromptForm\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n </div>\n</template>\n\n<style scoped>\n.chat {\n flex: 1;\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: 24px 0;\n max-width: 744px;\n}\n\n.userMessage {\n padding-top: 6px;\n padding-bottom: 6px;\n padding-inline: 16px;\n border-radius: var(--scalar-radius-3xl);\n background: var(--scalar-background-2);\n width: fit-content;\n max-width: 80%;\n margin-left: auto;\n font-size: 16px;\n line-height: 24px;\n color: var(--scalar-color-1);\n margin-bottom: 12px;\n}\ndiv + .userMessage {\n margin-top: 64px;\n}\n.chat > :deep(div:has(.executeRequestTool)) + div:has(.executeRequestTool) {\n margin-top: -12px;\n}\n.spacer {\n min-height: 280px;\n width: 100%;\n}\n\n.formContainer {\n position: fixed;\n bottom: 20px;\n width: 100%;\n max-width: 744px;\n z-index: 1;\n}\n.chat :deep(.markdown) {\n margin-bottom: 12px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAeA,MAAM,OAAO;EAKb,MAAM,QAAQ,SAAS;;2DAIrB,mBAkDM,OAlDN,YAkDM,EAAA,UAAA,IAAA,GAjDJ,mBA+CW,UAAA,MAAA,WA9CS,MAAA,KAAA,CAAK,CAAC,KAAK,WAAtB,YAAO;4DACR,QAAQ,GAAA,GAAA,CACE,QAAQ,SAAI,UAAA,UAAA,IAAA,GAC1B,mBAKM,UAAA,EAAA,KAAA,EAAA,GAAA,WAJoB,QAAQ,QAAxB,MAAM,UAAK;yBADrB,mBAKM,OAAA;MAHH,KAAG,GAAK,QAAQ,GAAE,GAAI;MACvB,OAAM;SACG,KAAK,SAAI,UAAA,UAAA,GAAlB,mBAAkD,KAAA,YAAA,gBAAhB,KAAK,IAAI,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA;8CAG/B,QAAQ,SAAI,eAAA,UAAA,IAAA,GAC1B,mBAiCM,UAAA,EAAA,KAAA,EAAA,GAAA,WAhCoB,QAAQ,QAAxB,MAAM,UAAK;yBADrB,mBAiCM,OAAA,EA/BH,KAAG,GAAK,QAAQ,GAAE,GAAI,QAAA,GAAA;MAEf,KAAK,SAAI,UAAA,UAAA,GADjB,YAE+B,cAAA;;OAA5B,aAAa,MAAM,IAAI;;MAEH,KAAK,SAAA,QAAgC,MAAA,iBAAA,OAAA,UAAA,GAD5D,YAK+B,4BAAA;;OAA5B,aAAa,MAAM,IAAI;;MAEH,KAAK,SAAA,QAAgC,MAAA,2BAAA,OAAA,UAAA,GAD5D,YAM+B,qCAAA;;OAD5B,SAAS,SAAS,OAAO;OACzB,aAAa,MAAM,IAAI;;MAEH,KAAK,SAAA,QAAgC,MAAA,yBAAA,OAAA,UAAA,GAD5D,YAM+B,gCAAA;;OAD5B,SAAS,SAAS,OAAO;OACzB,aAAa,MAAM,IAAI;;MAEH,KAAK,SAAA,QAAgC,MAAA,wBAAA,OAAA,UAAA,GAD5D,YAM+B,8BAAA;;OAD5B,SAAS,SAAS,OAAO;OACzB,aAAa,MAAM,IAAI;;;;wCAIhC,mBAA0B,OAAA,EAArB,OAAM,SAAQ,GAAA,MAAA,EAAA,EAAA,CAAA,GAErB,mBAIM,OAJN,YAIM,CAHJ,YAEmC,oBAAA;IADhC,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,QAAA;IACZ,aAAS,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,WAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"AskForAuthentication.vue.d.ts","sourceRoot":"","sources":["../../../../src/views/Chat/Messages/AskForAuthentication.vue"],"names":[],"mappings":"AAwLA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AACpC,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAIxC,OAAO,EAAE,gCAAgC,EAAE,MAAM,yCAAyC,CAAA;AAC1F,OAAO,EAAY,KAAK,KAAK,EAAE,MAAM,eAAe,CAAA;AAGpD,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,GAAG,CACd,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,gCAAgC,CAAC,CAAC,CACjE,CAAA;CACF,CAAC;AA4LF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"AskForAuthentication.vue.d.ts","sourceRoot":"","sources":["../../../../src/views/Chat/Messages/AskForAuthentication.vue"],"names":[],"mappings":"AAwLA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AACpC,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAIxC,OAAO,EAAE,gCAAgC,EAAE,MAAM,yCAAyC,CAAA;AAC1F,OAAO,EAAY,KAAK,KAAK,EAAE,MAAM,eAAe,CAAA;AAGpD,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,GAAG,CACd,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,gCAAgC,CAAC,CAAC,CACjE,CAAA;CACF,CAAC;AA6LF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
2
2
  import AskForAuthentication_vue_vue_type_script_setup_true_lang_default from "./AskForAuthentication.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/views/Chat/Messages/AskForAuthentication.vue
5
- var AskForAuthentication_default = /* @__PURE__ */ _plugin_vue_export_helper_default(AskForAuthentication_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-19cedfcd"]]);
5
+ var AskForAuthentication_default = /*#__PURE__*/ _plugin_vue_export_helper_default(AskForAuthentication_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-19cedfcd"]]);
6
6
  //#endregion
7
7
  export { AskForAuthentication_default as default };
8
8
 
@@ -12,7 +12,7 @@ import { ScalarIconArrowRight } from "@scalar/icons";
12
12
  var _hoisted_1 = { class: "toggleButton" };
13
13
  var _hoisted_2 = { class: "authContent" };
14
14
  var _hoisted_3 = { class: "authContentInner" };
15
- var AskForAuthentication_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
15
+ var AskForAuthentication_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
16
16
  __name: "AskForAuthentication",
17
17
  props: { messagePart: {} },
18
18
  setup(__props) {
@@ -1 +1 @@
1
- {"version":3,"file":"AskForAuthentication.vue.script.js","names":[],"sources":["../../../../src/views/Chat/Messages/AskForAuthentication.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarIconArrowRight } from '@scalar/icons'\nimport {\n getActiveEnvironment,\n getSelectedServer,\n getServers,\n} from '@scalar/workspace-store/request-example'\nimport { isOpenApiDocument } from '@scalar/workspace-store/schemas/type-guards'\nimport type { ToolUIPart } from 'ai'\nimport { computed, type Ref } from 'vue'\n\nimport AuthenticationProvided from '@/components/AuthenticationProvided.vue'\nimport AuthenticationRequired from '@/components/AuthenticationRequired.vue'\nimport { ASK_FOR_AUTHENTICATION_TOOL_NAME } from '@/entities/tools/ask-for-authentication'\nimport { useState, type Tools } from '@/state/state'\nimport Auth from '@/views/Settings/Auth.vue'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof ASK_FOR_AUTHENTICATION_TOOL_NAME>>\n >\n}>()\n\nconst { workspaceStore, eventBus, config, chat } = useState()\n\nconst documentName = computed(() => messagePart.value.input?.documentName)\n\nconst document = computed(() => {\n if (!documentName.value) {\n return\n }\n\n const doc = workspaceStore.workspace.documents[documentName.value]\n return isOpenApiDocument(doc) ? doc : undefined\n})\n\nconst environment = computed(() => {\n if (!document.value) {\n return\n }\n\n return getActiveEnvironment(workspaceStore, document.value).environment\n})\n\nconst selectedServer = computed(() => {\n if (!document.value) {\n return\n }\n\n const servers = getServers(document.value.servers, {\n documentUrl: document.value['x-scalar-original-source-url'],\n })\n\n return getSelectedServer(document.value, null, null, servers)\n})\n\nconst isAuthenticationExpanded = computed(\n () => documentName.value && environment.value && selectedServer.value,\n)\n\nasync function authorizeClicked() {\n await chat.addToolOutput({\n toolCallId: messagePart.value.toolCallId,\n output: 'Authentication provided.',\n tool: ASK_FOR_AUTHENTICATION_TOOL_NAME,\n state: 'output-available',\n })\n}\n</script>\n\n<template>\n <div\n class=\"askForAuthentication\"\n :class=\"{\n open: isAuthenticationExpanded,\n }\">\n <div class=\"toggleButton\">\n <AuthenticationProvided\n v-if=\"messagePart.value.state === 'output-available'\" />\n <AuthenticationRequired\n v-if=\"messagePart.value.state === 'input-available'\" />\n <ScalarButton\n v-if=\"messagePart.value.state === 'input-available'\"\n class=\"authorizeButton\"\n size=\"xs\"\n @click=\"authorizeClicked\">\n Authorize\n <ScalarIconArrowRight weight=\"bold\" />\n </ScalarButton>\n </div>\n <div class=\"authContent\">\n <div class=\"authContentInner\">\n <Auth\n v-if=\"documentName && document && environment && selectedServer\"\n :authStore=\"workspaceStore.auth\"\n :document\n :environment\n :eventBus\n :name=\"documentName\"\n :options=\"config\"\n :selectedServer />\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.askForAuthentication {\n display: flex;\n flex-direction: column;\n width: 100%;\n position: relative;\n border-top: var(--scalar-border-width) solid var(--scalar-border-color);\n border-bottom: var(--scalar-border-width) solid var(--scalar-border-color);\n margin-bottom: 12px;\n box-shadow:\n 0 var(--scalar-border-width) 0 var(--scalar-background-1),\n 0 calc(-1 * var(--scalar-border-width)) 0 var(--scalar-background-1);\n padding: 0;\n}\n\n.authContent {\n display: grid;\n grid-template-rows: 0fr;\n min-height: 0;\n overflow: hidden;\n transition: grid-template-rows 0.2s ease-out;\n max-width: 520px;\n margin: auto;\n width: 100%;\n}\n.authContentInner :deep(> div) {\n margin: 36px 0 48px 0;\n}\n.authContent :deep(.markdown) {\n margin-bottom: 0 !important;\n}\n.askForAuthentication.open .authContent {\n grid-template-rows: 1fr;\n}\n\n.continueButton {\n align-self: flex-end;\n}\n\n.toggleButton {\n background: none;\n border: none;\n cursor: pointer;\n text-align: left;\n position: relative;\n display: flex;\n align-items: center;\n color: var(--scalar-color-3);\n justify-content: space-between;\n border-radius: var(--scalar-radius-lg);\n}\n\n.authContentInner {\n min-height: 0;\n overflow: hidden;\n}\n\n.authorizeButton {\n background: var(--scalar-color-blue) !important;\n color: white !important;\n margin: 0 !important;\n z-index: 1;\n display: flex;\n gap: 5px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwBA,MAAM,EAAE,gBAAgB,UAAU,QAAQ,SAAS,UAAS;EAE5D,MAAM,eAAe,eAAe,QAAA,YAAY,MAAM,OAAO,aAAY;EAEzE,MAAM,WAAW,eAAe;AAC9B,OAAI,CAAC,aAAa,MAChB;GAGF,MAAM,MAAM,eAAe,UAAU,UAAU,aAAa;AAC5D,UAAO,kBAAkB,IAAI,GAAG,MAAM,KAAA;IACvC;EAED,MAAM,cAAc,eAAe;AACjC,OAAI,CAAC,SAAS,MACZ;AAGF,UAAO,qBAAqB,gBAAgB,SAAS,MAAM,CAAC;IAC7D;EAED,MAAM,iBAAiB,eAAe;AACpC,OAAI,CAAC,SAAS,MACZ;GAGF,MAAM,UAAU,WAAW,SAAS,MAAM,SAAS,EACjD,aAAa,SAAS,MAAM,iCAC7B,CAAA;AAED,UAAO,kBAAkB,SAAS,OAAO,MAAM,MAAM,QAAO;IAC7D;EAED,MAAM,2BAA2B,eACzB,aAAa,SAAS,YAAY,SAAS,eAAe,MAClE;EAEA,eAAe,mBAAmB;AAChC,SAAM,KAAK,cAAc;IACvB,YAAY,QAAA,YAAY,MAAM;IAC9B,QAAQ;IACR,MAAM;IACN,OAAO;IACR,CAAA;;;uBAKD,mBAgCM,OAAA,EA/BJ,OAAK,eAAA,CAAC,wBAAsB,EAAA,MACN,yBAAA,OAAA,CAAA,CAAA,EAAA,EAAA,CAGtB,mBAaM,OAbN,YAaM;IAXI,QAAA,YAAY,MAAM,UAAK,sBAAA,WAAA,EAD/B,YAC0D,gCAAA,EAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,IAAA,KAAA;IAElD,QAAA,YAAY,MAAM,UAAK,qBAAA,WAAA,EAD/B,YACyD,gCAAA,EAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,IAAA,KAAA;IAEjD,QAAA,YAAY,MAAM,UAAK,qBAAA,WAAA,EAD/B,YAOe,MAAA,aAAA,EAAA;;KALb,OAAM;KACN,MAAK;KACJ,SAAO;;4BAER,CAAA,OAAA,OAAA,OAAA,KAAA,gBAF0B,eAE1B,GAAA,GAAA,YAAsC,MAAA,qBAAA,EAAA,EAAhB,QAAO,QAAM,CAAA,CAAA,CAAA;;;OAGvC,mBAYM,OAZN,YAYM,CAXJ,mBAUM,OAVN,YAUM,CARI,aAAA,SAAgB,SAAA,SAAY,YAAA,SAAe,eAAA,SAAA,WAAA,EADnD,YAQoB,cAAA;;IANjB,WAAW,MAAA,eAAc,CAAC;IAC1B,UAAA,SAAA;IACA,aAAA,YAAA;IACA,UAAA,MAAA,SAAQ;IACR,MAAM,aAAA;IACN,SAAS,MAAA,OAAM;IACf,gBAAA,eAAA"}
1
+ {"version":3,"file":"AskForAuthentication.vue.script.js","names":[],"sources":["../../../../src/views/Chat/Messages/AskForAuthentication.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarIconArrowRight } from '@scalar/icons'\nimport {\n getActiveEnvironment,\n getSelectedServer,\n getServers,\n} from '@scalar/workspace-store/request-example'\nimport { isOpenApiDocument } from '@scalar/workspace-store/schemas/type-guards'\nimport type { ToolUIPart } from 'ai'\nimport { computed, type Ref } from 'vue'\n\nimport AuthenticationProvided from '@/components/AuthenticationProvided.vue'\nimport AuthenticationRequired from '@/components/AuthenticationRequired.vue'\nimport { ASK_FOR_AUTHENTICATION_TOOL_NAME } from '@/entities/tools/ask-for-authentication'\nimport { useState, type Tools } from '@/state/state'\nimport Auth from '@/views/Settings/Auth.vue'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof ASK_FOR_AUTHENTICATION_TOOL_NAME>>\n >\n}>()\n\nconst { workspaceStore, eventBus, config, chat } = useState()\n\nconst documentName = computed(() => messagePart.value.input?.documentName)\n\nconst document = computed(() => {\n if (!documentName.value) {\n return\n }\n\n const doc = workspaceStore.workspace.documents[documentName.value]\n return isOpenApiDocument(doc) ? doc : undefined\n})\n\nconst environment = computed(() => {\n if (!document.value) {\n return\n }\n\n return getActiveEnvironment(workspaceStore, document.value).environment\n})\n\nconst selectedServer = computed(() => {\n if (!document.value) {\n return\n }\n\n const servers = getServers(document.value.servers, {\n documentUrl: document.value['x-scalar-original-source-url'],\n })\n\n return getSelectedServer(document.value, null, null, servers)\n})\n\nconst isAuthenticationExpanded = computed(\n () => documentName.value && environment.value && selectedServer.value,\n)\n\nasync function authorizeClicked() {\n await chat.addToolOutput({\n toolCallId: messagePart.value.toolCallId,\n output: 'Authentication provided.',\n tool: ASK_FOR_AUTHENTICATION_TOOL_NAME,\n state: 'output-available',\n })\n}\n</script>\n\n<template>\n <div\n class=\"askForAuthentication\"\n :class=\"{\n open: isAuthenticationExpanded,\n }\">\n <div class=\"toggleButton\">\n <AuthenticationProvided\n v-if=\"messagePart.value.state === 'output-available'\" />\n <AuthenticationRequired\n v-if=\"messagePart.value.state === 'input-available'\" />\n <ScalarButton\n v-if=\"messagePart.value.state === 'input-available'\"\n class=\"authorizeButton\"\n size=\"xs\"\n @click=\"authorizeClicked\">\n Authorize\n <ScalarIconArrowRight weight=\"bold\" />\n </ScalarButton>\n </div>\n <div class=\"authContent\">\n <div class=\"authContentInner\">\n <Auth\n v-if=\"documentName && document && environment && selectedServer\"\n :authStore=\"workspaceStore.auth\"\n :document\n :environment\n :eventBus\n :name=\"documentName\"\n :options=\"config\"\n :selectedServer />\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.askForAuthentication {\n display: flex;\n flex-direction: column;\n width: 100%;\n position: relative;\n border-top: var(--scalar-border-width) solid var(--scalar-border-color);\n border-bottom: var(--scalar-border-width) solid var(--scalar-border-color);\n margin-bottom: 12px;\n box-shadow:\n 0 var(--scalar-border-width) 0 var(--scalar-background-1),\n 0 calc(-1 * var(--scalar-border-width)) 0 var(--scalar-background-1);\n padding: 0;\n}\n\n.authContent {\n display: grid;\n grid-template-rows: 0fr;\n min-height: 0;\n overflow: hidden;\n transition: grid-template-rows 0.2s ease-out;\n max-width: 520px;\n margin: auto;\n width: 100%;\n}\n.authContentInner :deep(> div) {\n margin: 36px 0 48px 0;\n}\n.authContent :deep(.markdown) {\n margin-bottom: 0 !important;\n}\n.askForAuthentication.open .authContent {\n grid-template-rows: 1fr;\n}\n\n.continueButton {\n align-self: flex-end;\n}\n\n.toggleButton {\n background: none;\n border: none;\n cursor: pointer;\n text-align: left;\n position: relative;\n display: flex;\n align-items: center;\n color: var(--scalar-color-3);\n justify-content: space-between;\n border-radius: var(--scalar-radius-lg);\n}\n\n.authContentInner {\n min-height: 0;\n overflow: hidden;\n}\n\n.authorizeButton {\n background: var(--scalar-color-blue) !important;\n color: white !important;\n margin: 0 !important;\n z-index: 1;\n display: flex;\n gap: 5px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwBA,MAAM,EAAE,gBAAgB,UAAU,QAAQ,SAAS,SAAS;EAE5D,MAAM,eAAe,eAAe,QAAA,YAAY,MAAM,OAAO,YAAY;EAEzE,MAAM,WAAW,eAAe;GAC9B,IAAI,CAAC,aAAa,OAChB;GAGF,MAAM,MAAM,eAAe,UAAU,UAAU,aAAa;GAC5D,OAAO,kBAAkB,GAAG,IAAI,MAAM,KAAA;EACxC,CAAC;EAED,MAAM,cAAc,eAAe;GACjC,IAAI,CAAC,SAAS,OACZ;GAGF,OAAO,qBAAqB,gBAAgB,SAAS,KAAK,CAAC,CAAC;EAC9D,CAAC;EAED,MAAM,iBAAiB,eAAe;GACpC,IAAI,CAAC,SAAS,OACZ;GAGF,MAAM,UAAU,WAAW,SAAS,MAAM,SAAS,EACjD,aAAa,SAAS,MAAM,gCAC9B,CAAC;GAED,OAAO,kBAAkB,SAAS,OAAO,MAAM,MAAM,OAAO;EAC9D,CAAC;EAED,MAAM,2BAA2B,eACzB,aAAa,SAAS,YAAY,SAAS,eAAe,KAClE;EAEA,eAAe,mBAAmB;GAChC,MAAM,KAAK,cAAc;IACvB,YAAY,QAAA,YAAY,MAAM;IAC9B,QAAQ;IACR,MAAM;IACN,OAAO;GACT,CAAC;EACH;;uBAIE,mBAgCM,OAAA,EA/BJ,OAAK,eAAA,CAAC,wBAAsB,EAAA,MACN,yBAAA,MAAA,CAAA,CAAA,EAAA,GAAA,CAGtB,mBAaM,OAbN,YAaM;IAXI,QAAA,YAAY,MAAM,UAAK,sBAAA,UAAA,GAD/B,YAC0D,gCAAA,EAAA,KAAA,EAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;IAElD,QAAA,YAAY,MAAM,UAAK,qBAAA,UAAA,GAD/B,YACyD,gCAAA,EAAA,KAAA,EAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;IAEjD,QAAA,YAAY,MAAM,UAAK,qBAAA,UAAA,GAD/B,YAOe,MAAA,YAAA,GAAA;;KALb,OAAM;KACN,MAAK;KACJ,SAAO;;4BAER,CAAA,OAAA,OAAA,OAAA,KAAA,gBAF0B,eAE1B,EAAA,IAAA,YAAsC,MAAA,oBAAA,GAAA,EAAhB,QAAO,OAAM,CAAA,CAAA,CAAA;;;OAGvC,mBAYM,OAZN,YAYM,CAXJ,mBAUM,OAVN,YAUM,CARI,aAAA,SAAgB,SAAA,SAAY,YAAA,SAAe,eAAA,SAAA,UAAA,GADnD,YAQoB,cAAA;;IANjB,WAAW,MAAA,cAAA,CAAc,CAAC;IAC1B,UAAA,SAAA;IACA,aAAA,YAAA;IACA,UAAA,MAAA,QAAA;IACA,MAAM,aAAA;IACN,SAAS,MAAA,MAAA;IACT,gBAAA,eAAA"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
2
2
  import ExecuteRequestTool_vue_vue_type_script_setup_true_lang_default from "./ExecuteRequestTool.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/views/Chat/Messages/ExecuteRequestTool.vue
5
- var ExecuteRequestTool_default = /* @__PURE__ */ _plugin_vue_export_helper_default(ExecuteRequestTool_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9025b7d4"]]);
5
+ var ExecuteRequestTool_default = /*#__PURE__*/ _plugin_vue_export_helper_default(ExecuteRequestTool_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9025b7d4"]]);
6
6
  //#endregion
7
7
  export { ExecuteRequestTool_default as default };
8
8
 
@@ -4,7 +4,7 @@ import { requestPartRequiresApproval } from "../../../hooks/use-chat-approvals.j
4
4
  import { computed, createBlock, createCommentVNode, createElementBlock, defineComponent, openBlock } from "vue";
5
5
  //#region src/views/Chat/Messages/ExecuteRequestTool.vue?vue&type=script&setup=true&lang.ts
6
6
  var _hoisted_1 = { class: "executeRequestTool" };
7
- var ExecuteRequestTool_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
7
+ var ExecuteRequestTool_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
8
8
  __name: "ExecuteRequestTool",
9
9
  props: { messagePart: {} },
10
10
  setup(__props) {
@@ -1 +1 @@
1
- {"version":3,"file":"ExecuteRequestTool.vue.script.js","names":[],"sources":["../../../../src/views/Chat/Messages/ExecuteRequestTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { type ToolUIPart } from 'ai'\nimport { computed, type Ref } from 'vue'\n\nimport RequestPreview from '@/components/RequestPreview.vue'\nimport type { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities/tools/execute-request'\nimport { requestPartRequiresApproval } from '@/hooks/use-chat-approvals'\nimport { useState, type Tools } from '@/state/state'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME>>\n >\n}>()\n\nconst state = useState()\n\nconst requestState = computed(() => {\n if (messagePart.value.state === 'input-streaming') {\n return 'buildingRequest'\n }\n\n if (\n messagePart.value.state === 'approval-responded' &&\n state.chat.status === 'submitted'\n ) {\n return 'sendingRequest'\n }\n\n if (requestPartRequiresApproval(messagePart.value)) {\n return 'requiresApproval'\n }\n\n if (messagePart.value.state === 'output-available') {\n return messagePart.value.output.success\n ? 'requestSucceeded'\n : 'requestFailed'\n }\n\n if (messagePart.value.state === 'output-error') {\n return 'rejected'\n }\n\n return null\n})\n</script>\n\n<template>\n <div class=\"executeRequestTool\">\n <RequestPreview\n v-if=\"requestState\"\n :request=\"messagePart.value.input\"\n :response=\"messagePart.value.output\"\n :state=\"requestState\" />\n </div>\n</template>\n\n<style scoped>\n.executeRequestTool {\n display: flex;\n flex-direction: column;\n gap: 10px;\n border-top: var(--scalar-border-width) solid var(--scalar-border-color);\n border-bottom: var(--scalar-border-width) solid var(--scalar-border-color);\n margin-bottom: 12px;\n /* ensures no overlapping border colors when there's two sibling execute request tools */\n box-shadow:\n 0 var(--scalar-border-width) 0 var(--scalar-background-1),\n 0 calc(-1 * var(--scalar-border-width)) 0 var(--scalar-background-1);\n}\n</style>\n"],"mappings":";;;;;;;;;;EAeA,MAAM,QAAQ,UAAS;EAEvB,MAAM,eAAe,eAAe;AAClC,OAAI,QAAA,YAAY,MAAM,UAAU,kBAC9B,QAAO;AAGT,OACE,QAAA,YAAY,MAAM,UAAU,wBAC5B,MAAM,KAAK,WAAW,YAEtB,QAAO;AAGT,OAAI,4BAA4B,QAAA,YAAY,MAAM,CAChD,QAAO;AAGT,OAAI,QAAA,YAAY,MAAM,UAAU,mBAC9B,QAAO,QAAA,YAAY,MAAM,OAAO,UAC5B,qBACA;AAGN,OAAI,QAAA,YAAY,MAAM,UAAU,eAC9B,QAAO;AAGT,UAAO;IACR;;uBAIC,mBAMM,OANN,YAMM,CAJI,aAAA,SAAA,WAAA,EADR,YAI0B,wBAAA;;IAFvB,SAAS,QAAA,YAAY,MAAM;IAC3B,UAAU,QAAA,YAAY,MAAM;IAC5B,OAAO,aAAA"}
1
+ {"version":3,"file":"ExecuteRequestTool.vue.script.js","names":[],"sources":["../../../../src/views/Chat/Messages/ExecuteRequestTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { type ToolUIPart } from 'ai'\nimport { computed, type Ref } from 'vue'\n\nimport RequestPreview from '@/components/RequestPreview.vue'\nimport type { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities/tools/execute-request'\nimport { requestPartRequiresApproval } from '@/hooks/use-chat-approvals'\nimport { useState, type Tools } from '@/state/state'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME>>\n >\n}>()\n\nconst state = useState()\n\nconst requestState = computed(() => {\n if (messagePart.value.state === 'input-streaming') {\n return 'buildingRequest'\n }\n\n if (\n messagePart.value.state === 'approval-responded' &&\n state.chat.status === 'submitted'\n ) {\n return 'sendingRequest'\n }\n\n if (requestPartRequiresApproval(messagePart.value)) {\n return 'requiresApproval'\n }\n\n if (messagePart.value.state === 'output-available') {\n return messagePart.value.output.success\n ? 'requestSucceeded'\n : 'requestFailed'\n }\n\n if (messagePart.value.state === 'output-error') {\n return 'rejected'\n }\n\n return null\n})\n</script>\n\n<template>\n <div class=\"executeRequestTool\">\n <RequestPreview\n v-if=\"requestState\"\n :request=\"messagePart.value.input\"\n :response=\"messagePart.value.output\"\n :state=\"requestState\" />\n </div>\n</template>\n\n<style scoped>\n.executeRequestTool {\n display: flex;\n flex-direction: column;\n gap: 10px;\n border-top: var(--scalar-border-width) solid var(--scalar-border-color);\n border-bottom: var(--scalar-border-width) solid var(--scalar-border-color);\n margin-bottom: 12px;\n /* ensures no overlapping border colors when there's two sibling execute request tools */\n box-shadow:\n 0 var(--scalar-border-width) 0 var(--scalar-background-1),\n 0 calc(-1 * var(--scalar-border-width)) 0 var(--scalar-background-1);\n}\n</style>\n"],"mappings":";;;;;;;;;;EAeA,MAAM,QAAQ,SAAS;EAEvB,MAAM,eAAe,eAAe;GAClC,IAAI,QAAA,YAAY,MAAM,UAAU,mBAC9B,OAAO;GAGT,IACE,QAAA,YAAY,MAAM,UAAU,wBAC5B,MAAM,KAAK,WAAW,aAEtB,OAAO;GAGT,IAAI,4BAA4B,QAAA,YAAY,KAAK,GAC/C,OAAO;GAGT,IAAI,QAAA,YAAY,MAAM,UAAU,oBAC9B,OAAO,QAAA,YAAY,MAAM,OAAO,UAC5B,qBACA;GAGN,IAAI,QAAA,YAAY,MAAM,UAAU,gBAC9B,OAAO;GAGT,OAAO;EACT,CAAC;;uBAIC,mBAMM,OANN,YAMM,CAJI,aAAA,SAAA,UAAA,GADR,YAI0B,wBAAA;;IAFvB,SAAS,QAAA,YAAY,MAAM;IAC3B,UAAU,QAAA,YAAY,MAAM;IAC5B,OAAO,aAAA"}
@@ -2,7 +2,7 @@ import LoadingOpenAPISpecsSummary_default from "../../../components/LoadingOpenA
2
2
  import { createCommentVNode, createElementBlock, createVNode, defineComponent, openBlock, ref, watch } from "vue";
3
3
  //#region src/views/Chat/Messages/GetOpenAPISpecsSummary.vue?vue&type=script&setup=true&lang.ts
4
4
  var _hoisted_1 = { key: 0 };
5
- var GetOpenAPISpecsSummary_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
5
+ var GetOpenAPISpecsSummary_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
6
  __name: "GetOpenAPISpecsSummary",
7
7
  props: {
8
8
  messagePart: {},
@@ -1 +1 @@
1
- {"version":3,"file":"GetOpenAPISpecsSummary.vue.script.js","names":[],"sources":["../../../../src/views/Chat/Messages/GetOpenAPISpecsSummary.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ToolUIPart, UIMessage } from 'ai'\nimport { ref, watch, type Reactive, type Ref } from 'vue'\n\nimport LoadingOpenAPISpecsSummary from '@/components/LoadingOpenAPISpecsSummary.vue'\nimport type { SUMMARIZE_OPENAPI_SPECS_TOOL_NAME } from '@/entities/tools/get-openapi-specs-summary'\nimport { type Tools } from '@/state/state'\n\nconst { messagePart, message } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof SUMMARIZE_OPENAPI_SPECS_TOOL_NAME>>\n >\n message: Reactive<UIMessage>\n}>()\n\nconst messageFinished = ref(false)\n\nwatch(\n () => message,\n () => {\n const parts = message.parts\n\n const index = parts.findIndex(\n (part) =>\n 'toolCallId' in part &&\n part.toolCallId === messagePart.value.toolCallId,\n )\n\n messageFinished.value = Boolean(parts[index + 1])\n },\n)\n</script>\n\n<template>\n <div v-if=\"!messageFinished\">\n <LoadingOpenAPISpecsSummary />\n </div>\n</template>\n\n<style scoped></style>\n"],"mappings":";;;;;;;;;;;EAeA,MAAM,kBAAkB,IAAI,MAAK;AAEjC,cACQ,QAAA,eACA;GACJ,MAAM,QAAQ,QAAA,QAAQ;GAEtB,MAAM,QAAQ,MAAM,WACjB,SACC,gBAAgB,QAChB,KAAK,eAAe,QAAA,YAAY,MAAM,WAC1C;AAEA,mBAAgB,QAAQ,QAAQ,MAAM,QAAQ,GAAE;IAEpD;;WAIc,gBAAA,SAAA,WAAA,EAAZ,mBAEM,OAAA,YAAA,CADJ,YAA8B,mCAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA"}
1
+ {"version":3,"file":"GetOpenAPISpecsSummary.vue.script.js","names":[],"sources":["../../../../src/views/Chat/Messages/GetOpenAPISpecsSummary.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ToolUIPart, UIMessage } from 'ai'\nimport { ref, watch, type Reactive, type Ref } from 'vue'\n\nimport LoadingOpenAPISpecsSummary from '@/components/LoadingOpenAPISpecsSummary.vue'\nimport type { SUMMARIZE_OPENAPI_SPECS_TOOL_NAME } from '@/entities/tools/get-openapi-specs-summary'\nimport { type Tools } from '@/state/state'\n\nconst { messagePart, message } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof SUMMARIZE_OPENAPI_SPECS_TOOL_NAME>>\n >\n message: Reactive<UIMessage>\n}>()\n\nconst messageFinished = ref(false)\n\nwatch(\n () => message,\n () => {\n const parts = message.parts\n\n const index = parts.findIndex(\n (part) =>\n 'toolCallId' in part &&\n part.toolCallId === messagePart.value.toolCallId,\n )\n\n messageFinished.value = Boolean(parts[index + 1])\n },\n)\n</script>\n\n<template>\n <div v-if=\"!messageFinished\">\n <LoadingOpenAPISpecsSummary />\n </div>\n</template>\n\n<style scoped></style>\n"],"mappings":";;;;;;;;;;;EAeA,MAAM,kBAAkB,IAAI,KAAK;EAEjC,YACQ,QAAA,eACA;GACJ,MAAM,QAAQ,QAAA,QAAQ;GAEtB,MAAM,QAAQ,MAAM,WACjB,SACC,gBAAgB,QAChB,KAAK,eAAe,QAAA,YAAY,MAAM,UAC1C;GAEA,gBAAgB,QAAQ,QAAQ,MAAM,QAAQ,EAAE;EAClD,CACF;;WAIc,gBAAA,SAAA,UAAA,GAAZ,mBAEM,OAAA,YAAA,CADJ,YAA8B,kCAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
2
2
  import SearchOpenAPIOperationsTool_vue_vue_type_script_setup_true_lang_default from "./SearchOpenAPIOperationsTool.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/views/Chat/Messages/SearchOpenAPIOperationsTool.vue
5
- var SearchOpenAPIOperationsTool_default = /* @__PURE__ */ _plugin_vue_export_helper_default(SearchOpenAPIOperationsTool_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-cbff70ed"]]);
5
+ var SearchOpenAPIOperationsTool_default = /*#__PURE__*/ _plugin_vue_export_helper_default(SearchOpenAPIOperationsTool_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-cbff70ed"]]);
6
6
  //#endregion
7
7
  export { SearchOpenAPIOperationsTool_default as default };
8
8
 
@@ -12,7 +12,7 @@ var _hoisted_2 = {
12
12
  };
13
13
  var _hoisted_3 = { class: "overflowPopover" };
14
14
  var MAX_VISIBLE = 5;
15
- var SearchOpenAPIOperationsTool_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
15
+ var SearchOpenAPIOperationsTool_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
16
16
  __name: "SearchOpenAPIOperationsTool",
17
17
  props: {
18
18
  messagePart: {},
@@ -1 +1 @@
1
- {"version":3,"file":"SearchOpenAPIOperationsTool.vue.script.js","names":[],"sources":["../../../../src/views/Chat/Messages/SearchOpenAPIOperationsTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarPopover } from '@scalar/components/popover'\nimport { type ToolUIPart, type UIMessage } from 'ai'\nimport { computed, ref, watch, type Reactive, type Ref } from 'vue'\n\nimport ContextItem from '@/components/ContextItem.vue'\nimport LoadingSearchOpenAPIOperations from '@/components/LoadingSearchOpenAPIOperations.vue'\nimport type { SEARCH_OPENAPI_OPERATIONS_TOOL_NAME } from '@/entities/tools/search-openapi-operations'\nimport { getOperations } from '@/helpers'\nimport { useState, type Tools } from '@/state/state'\n\nconst { messagePart, message } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof SEARCH_OPENAPI_OPERATIONS_TOOL_NAME>>\n >\n message: Reactive<UIMessage>\n}>()\n\nconst MAX_VISIBLE = 5\n\nconst messageFinished = ref(false)\n\nwatch(\n () => message,\n () => {\n const parts = message.parts\n\n const index = parts.findIndex(\n (part) =>\n 'toolCallId' in part &&\n part.toolCallId === messagePart.value.toolCallId,\n )\n\n messageFinished.value = Boolean(parts[index + 1])\n },\n)\n\nconst operations = computed(() => {\n if (!messagePart.value.output) {\n return\n }\n\n return messagePart.value.output.flatMap((spec) => {\n const title = spec.info?.title\n\n const documentOperations = getOperations(spec)\n\n return documentOperations\n .map(\n (operation) =>\n `${title ? `${title} - ` : ''}${operation.summary ?? ''}`,\n )\n .filter(Boolean)\n })\n})\n\nconst visibleOperations = computed(() =>\n operations.value?.slice(0, MAX_VISIBLE),\n)\nconst hiddenOperations = computed(\n () => operations.value?.slice(MAX_VISIBLE) ?? [],\n)\n\nconst state = useState()\n</script>\n\n<template>\n <div\n v-if=\"\n messagePart.value.state === 'input-available' &&\n state.chat.status === 'streaming'\n \">\n <LoadingSearchOpenAPIOperations />\n </div>\n <div\n v-if=\"operations\"\n class=\"operations\">\n <ContextItem\n v-for=\"operation of visibleOperations\"\n :key=\"operation\"\n :loading=\"!messageFinished\">\n {{ operation }}\n </ContextItem>\n <ScalarPopover\n v-if=\"hiddenOperations.length\"\n placement=\"bottom-start\">\n <ContextItem :loading=\"!messageFinished\">\n +{{ hiddenOperations.length }}\n </ContextItem>\n <template #popover>\n <div class=\"overflowPopover\">\n <ContextItem\n v-for=\"operation of hiddenOperations\"\n :key=\"operation\"\n :loading=\"!messageFinished\">\n {{ operation }}\n </ContextItem>\n </div>\n </template>\n </ScalarPopover>\n </div>\n</template>\n\n<style scoped>\n.operations {\n display: flex;\n gap: 5px;\n align-items: center;\n flex-wrap: wrap;\n margin-bottom: 12px;\n}\n.operations:empty {\n margin-bottom: -12px;\n}\n.overflowPopover {\n display: flex;\n flex-direction: column;\n gap: 5px;\n padding: 8px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;AAkBA,IAAM,cAAc;;;;;;;;EAEpB,MAAM,kBAAkB,IAAI,MAAK;AAEjC,cACQ,QAAA,eACA;GACJ,MAAM,QAAQ,QAAA,QAAQ;GAEtB,MAAM,QAAQ,MAAM,WACjB,SACC,gBAAgB,QAChB,KAAK,eAAe,QAAA,YAAY,MAAM,WAC1C;AAEA,mBAAgB,QAAQ,QAAQ,MAAM,QAAQ,GAAE;IAEpD;EAEA,MAAM,aAAa,eAAe;AAChC,OAAI,CAAC,QAAA,YAAY,MAAM,OACrB;AAGF,UAAO,QAAA,YAAY,MAAM,OAAO,SAAS,SAAS;IAChD,MAAM,QAAQ,KAAK,MAAM;AAIzB,WAF2B,cAAc,KAAI,CAG1C,KACE,cACC,GAAG,QAAQ,GAAG,MAAM,OAAO,KAAK,UAAU,WAAW,KACzD,CACC,OAAO,QAAO;KAClB;IACF;EAED,MAAM,oBAAoB,eACxB,WAAW,OAAO,MAAM,GAAG,YAAY,CACzC;EACA,MAAM,mBAAmB,eACjB,WAAW,OAAO,MAAM,YAAY,IAAI,EAAE,CAClD;EAEA,MAAM,QAAQ,UAAS;;2DAKN,QAAA,YAAY,MAAM,UAAK,qBAAgC,MAAA,MAAK,CAAC,KAAK,WAAM,eAAA,WAAA,EADvF,mBAMM,OAAA,YAAA,CADJ,YAAkC,uCAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA,EAG5B,WAAA,SAAA,WAAA,EADR,mBA0BM,OA1BN,YA0BM,EAAA,UAAA,KAAA,EAvBJ,mBAKc,UAAA,MAAA,WAJQ,kBAAA,QAAb,cAAS;wBADlB,YAKc,qBAAA;KAHX,KAAK;KACL,SAAO,CAAG,gBAAA;;4BACI,CAAA,gBAAA,gBAAZ,UAAS,EAAA,EAAA,CAAA,CAAA;;;cAGN,iBAAA,MAAiB,UAAA,WAAA,EADzB,YAgBgB,MAAA,cAAA,EAAA;;IAdd,WAAU;;IAIC,SAAO,cAQV,CAPN,mBAOM,OAPN,YAOM,EAAA,UAAA,KAAA,EANJ,mBAKc,UAAA,MAAA,WAJQ,iBAAA,QAAb,cAAS;yBADlB,YAKc,qBAAA;MAHX,KAAK;MACL,SAAO,CAAG,gBAAA;;6BACI,CAAA,gBAAA,gBAAZ,UAAS,EAAA,EAAA,CAAA,CAAA;;;;2BAPJ,CAFd,YAEc,qBAAA,EAFA,SAAO,CAAG,gBAAA,OAAA,EAAA;4BACrB,CAAA,gBADsC,OACtC,gBAAG,iBAAA,MAAiB,OAAM,EAAA,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"SearchOpenAPIOperationsTool.vue.script.js","names":[],"sources":["../../../../src/views/Chat/Messages/SearchOpenAPIOperationsTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarPopover } from '@scalar/components/popover'\nimport { type ToolUIPart, type UIMessage } from 'ai'\nimport { computed, ref, watch, type Reactive, type Ref } from 'vue'\n\nimport ContextItem from '@/components/ContextItem.vue'\nimport LoadingSearchOpenAPIOperations from '@/components/LoadingSearchOpenAPIOperations.vue'\nimport type { SEARCH_OPENAPI_OPERATIONS_TOOL_NAME } from '@/entities/tools/search-openapi-operations'\nimport { getOperations } from '@/helpers'\nimport { useState, type Tools } from '@/state/state'\n\nconst { messagePart, message } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof SEARCH_OPENAPI_OPERATIONS_TOOL_NAME>>\n >\n message: Reactive<UIMessage>\n}>()\n\nconst MAX_VISIBLE = 5\n\nconst messageFinished = ref(false)\n\nwatch(\n () => message,\n () => {\n const parts = message.parts\n\n const index = parts.findIndex(\n (part) =>\n 'toolCallId' in part &&\n part.toolCallId === messagePart.value.toolCallId,\n )\n\n messageFinished.value = Boolean(parts[index + 1])\n },\n)\n\nconst operations = computed(() => {\n if (!messagePart.value.output) {\n return\n }\n\n return messagePart.value.output.flatMap((spec) => {\n const title = spec.info?.title\n\n const documentOperations = getOperations(spec)\n\n return documentOperations\n .map(\n (operation) =>\n `${title ? `${title} - ` : ''}${operation.summary ?? ''}`,\n )\n .filter(Boolean)\n })\n})\n\nconst visibleOperations = computed(() =>\n operations.value?.slice(0, MAX_VISIBLE),\n)\nconst hiddenOperations = computed(\n () => operations.value?.slice(MAX_VISIBLE) ?? [],\n)\n\nconst state = useState()\n</script>\n\n<template>\n <div\n v-if=\"\n messagePart.value.state === 'input-available' &&\n state.chat.status === 'streaming'\n \">\n <LoadingSearchOpenAPIOperations />\n </div>\n <div\n v-if=\"operations\"\n class=\"operations\">\n <ContextItem\n v-for=\"operation of visibleOperations\"\n :key=\"operation\"\n :loading=\"!messageFinished\">\n {{ operation }}\n </ContextItem>\n <ScalarPopover\n v-if=\"hiddenOperations.length\"\n placement=\"bottom-start\">\n <ContextItem :loading=\"!messageFinished\">\n +{{ hiddenOperations.length }}\n </ContextItem>\n <template #popover>\n <div class=\"overflowPopover\">\n <ContextItem\n v-for=\"operation of hiddenOperations\"\n :key=\"operation\"\n :loading=\"!messageFinished\">\n {{ operation }}\n </ContextItem>\n </div>\n </template>\n </ScalarPopover>\n </div>\n</template>\n\n<style scoped>\n.operations {\n display: flex;\n gap: 5px;\n align-items: center;\n flex-wrap: wrap;\n margin-bottom: 12px;\n}\n.operations:empty {\n margin-bottom: -12px;\n}\n.overflowPopover {\n display: flex;\n flex-direction: column;\n gap: 5px;\n padding: 8px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;AAkBA,IAAM,cAAc;;;;;;;;EAEpB,MAAM,kBAAkB,IAAI,KAAK;EAEjC,YACQ,QAAA,eACA;GACJ,MAAM,QAAQ,QAAA,QAAQ;GAEtB,MAAM,QAAQ,MAAM,WACjB,SACC,gBAAgB,QAChB,KAAK,eAAe,QAAA,YAAY,MAAM,UAC1C;GAEA,gBAAgB,QAAQ,QAAQ,MAAM,QAAQ,EAAE;EAClD,CACF;EAEA,MAAM,aAAa,eAAe;GAChC,IAAI,CAAC,QAAA,YAAY,MAAM,QACrB;GAGF,OAAO,QAAA,YAAY,MAAM,OAAO,SAAS,SAAS;IAChD,MAAM,QAAQ,KAAK,MAAM;IAIzB,OAF2B,cAAc,IAElC,CAAA,CACJ,KACE,cACC,GAAG,QAAQ,GAAG,MAAM,OAAO,KAAK,UAAU,WAAW,IACzD,CAAA,CACC,OAAO,OAAO;GACnB,CAAC;EACH,CAAC;EAED,MAAM,oBAAoB,eACxB,WAAW,OAAO,MAAM,GAAG,WAAW,CACxC;EACA,MAAM,mBAAmB,eACjB,WAAW,OAAO,MAAM,WAAW,KAAK,CAAC,CACjD;EAEA,MAAM,QAAQ,SAAS;;2DAKN,QAAA,YAAY,MAAM,UAAK,qBAAgC,MAAA,KAAA,CAAK,CAAC,KAAK,WAAM,eAAA,UAAA,GADvF,mBAMM,OAAA,YAAA,CADJ,YAAkC,sCAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,GAG5B,WAAA,SAAA,UAAA,GADR,mBA0BM,OA1BN,YA0BM,EAAA,UAAA,IAAA,GAvBJ,mBAKc,UAAA,MAAA,WAJQ,kBAAA,QAAb,cAAS;wBADlB,YAKc,qBAAA;KAHX,KAAK;KACL,SAAO,CAAG,gBAAA;;4BACI,CAAA,gBAAA,gBAAZ,SAAS,GAAA,CAAA,CAAA,CAAA;;;cAGN,iBAAA,MAAiB,UAAA,UAAA,GADzB,YAgBgB,MAAA,aAAA,GAAA;;IAdd,WAAU;;IAIC,SAAO,cAQV,CAPN,mBAOM,OAPN,YAOM,EAAA,UAAA,IAAA,GANJ,mBAKc,UAAA,MAAA,WAJQ,iBAAA,QAAb,cAAS;yBADlB,YAKc,qBAAA;MAHX,KAAK;MACL,SAAO,CAAG,gBAAA;;6BACI,CAAA,gBAAA,gBAAZ,SAAS,GAAA,CAAA,CAAA,CAAA;;;;2BAPJ,CAFd,YAEc,qBAAA,EAFA,SAAO,CAAG,gBAAA,MAAA,GAAA;4BACrB,CAAA,gBADsC,OACtC,gBAAG,iBAAA,MAAiB,MAAM,GAAA,CAAA,CAAA,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { createBlock, defineComponent, openBlock, unref } from "vue";
2
2
  import { ScalarMarkdown } from "@scalar/components/markdown";
3
3
  //#region src/views/Chat/Messages/Text.vue?vue&type=script&setup=true&lang.ts
4
- var Text_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
4
+ var Text_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
5
5
  __name: "Text",
6
6
  props: { messagePart: {} },
7
7
  setup(__props) {
@@ -1 +1 @@
1
- {"version":3,"file":"Text.vue.script.js","names":[],"sources":["../../../../src/views/Chat/Messages/Text.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarMarkdown } from '@scalar/components/markdown'\nimport { type TextUIPart } from 'ai'\nimport { type Ref } from 'vue'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<TextUIPart>\n}>()\n</script>\n\n<template>\n <ScalarMarkdown :value=\"messagePart.value.text\" />\n</template>\n"],"mappings":";;;;;;;;uBAWE,YAAkD,MAAA,eAAA,EAAA,EAAjC,OAAO,QAAA,YAAY,MAAM,MAAA,EAAA,MAAA,GAAA,CAAA,QAAA,CAAA"}
1
+ {"version":3,"file":"Text.vue.script.js","names":[],"sources":["../../../../src/views/Chat/Messages/Text.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarMarkdown } from '@scalar/components/markdown'\nimport { type TextUIPart } from 'ai'\nimport { type Ref } from 'vue'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<TextUIPart>\n}>()\n</script>\n\n<template>\n <ScalarMarkdown :value=\"messagePart.value.text\" />\n</template>\n"],"mappings":";;;;;;;;uBAWE,YAAkD,MAAA,cAAA,GAAA,EAAjC,OAAO,QAAA,YAAY,MAAM,KAAA,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.vue.d.ts","sourceRoot":"","sources":["../../src/views/Layout.vue"],"names":[],"mappings":"AA+JA,QAAA,MAAM,YAAY;;;;;;iFAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"Layout.vue.d.ts","sourceRoot":"","sources":["../../src/views/Layout.vue"],"names":[],"mappings":"AAmKA,QAAA,MAAM,YAAY;;;;;;iFAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../_virtual/_plugin-vue_export-he
2
2
  import Layout_vue_vue_type_script_setup_true_lang_default from "./Layout.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/views/Layout.vue
5
- var Layout_default = /* @__PURE__ */ _plugin_vue_export_helper_default(Layout_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-f1eee0af"]]);
5
+ var Layout_default = /*#__PURE__*/ _plugin_vue_export_helper_default(Layout_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-f1eee0af"]]);
6
6
  //#endregion
7
7
  export { Layout_default as default };
8
8
 
@@ -4,7 +4,7 @@ import Start_default from "./Start.vue.js";
4
4
  import { createBlock, createElementBlock, defineComponent, openBlock, unref } from "vue";
5
5
  //#region src/views/Layout.vue?vue&type=script&setup=true&lang.ts
6
6
  var _hoisted_1 = { class: "wrapper" };
7
- var Layout_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
7
+ var Layout_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
8
8
  __name: "Layout",
9
9
  emits: ["submit", "uploadApi"],
10
10
  setup(__props, { emit: __emit }) {
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.vue.script.js","names":[],"sources":["../../src/views/Layout.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useState } from '@/state/state'\nimport Chat from '@/views/Chat/Chat.vue'\nimport Start from '@/views/Start.vue'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\nconst { chat } = useState()\n</script>\n\n<template>\n <div class=\"wrapper\">\n <Chat\n v-if=\"\n chat.messages.length &&\n (chat.messages.length > 1 || chat.status !== 'submitted')\n \"\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n <Start\n v-else\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n </div>\n</template>\n\n<style scoped>\n.wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n width: 100%;\n}\n</style>\n"],"mappings":";;;;;;;;;;EAKA,MAAM,OAAO;EAKb,MAAM,EAAE,SAAS,UAAS;;uBAIxB,mBAYM,OAZN,YAYM,CAVa,MAAA,KAAI,CAAC,SAAS,WAAmB,MAAA,KAAI,CAAC,SAAS,SAAM,KAAQ,MAAA,KAAI,CAAC,WAAM,gBAAA,WAAA,EADzF,YAMmC,cAAA;;IADhC,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;IACZ,aAAS,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,YAAA;uBAClB,YAGmC,eAAA;;IADhC,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;IACZ,aAAS,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,YAAA"}
1
+ {"version":3,"file":"Layout.vue.script.js","names":[],"sources":["../../src/views/Layout.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useState } from '@/state/state'\nimport Chat from '@/views/Chat/Chat.vue'\nimport Start from '@/views/Start.vue'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\nconst { chat } = useState()\n</script>\n\n<template>\n <div class=\"wrapper\">\n <Chat\n v-if=\"\n chat.messages.length &&\n (chat.messages.length > 1 || chat.status !== 'submitted')\n \"\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n <Start\n v-else\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n </div>\n</template>\n\n<style scoped>\n.wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n width: 100%;\n}\n</style>\n"],"mappings":";;;;;;;;;;EAKA,MAAM,OAAO;EAKb,MAAM,EAAE,SAAS,SAAS;;uBAIxB,mBAYM,OAZN,YAYM,CAVa,MAAA,IAAA,CAAI,CAAC,SAAS,WAAmB,MAAA,IAAA,CAAI,CAAC,SAAS,SAAM,KAAQ,MAAA,IAAA,CAAI,CAAC,WAAM,gBAAA,UAAA,GADzF,YAMmC,cAAA;;IADhC,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,QAAA;IACZ,aAAS,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,WAAA;uBAClB,YAGmC,eAAA;;IADhC,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,QAAA;IACZ,aAAS,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,WAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"PromptForm.vue.d.ts","sourceRoot":"","sources":["../../src/views/PromptForm.vue"],"names":[],"mappings":"AA+pBA,iBAAS,WAAW,SAEnB;AA4jBD,QAAA,MAAM,YAAY;;;;;;;;iFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"PromptForm.vue.d.ts","sourceRoot":"","sources":["../../src/views/PromptForm.vue"],"names":[],"mappings":"AA6qBA,iBAAS,WAAW,SAEnB;AAgkBD,QAAA,MAAM,YAAY;;;;;;;;iFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../_virtual/_plugin-vue_export-he
2
2
  import PromptForm_vue_vue_type_script_setup_true_lang_default from "./PromptForm.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/views/PromptForm.vue
5
- var PromptForm_default = /* @__PURE__ */ _plugin_vue_export_helper_default(PromptForm_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-5e4d9063"]]);
5
+ var PromptForm_default = /*#__PURE__*/ _plugin_vue_export_helper_default(PromptForm_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-ba1161a7"]]);
6
6
  //#endregion
7
7
  export { PromptForm_default as default };
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"PromptForm.vue.js","names":[],"sources":["../../src/views/PromptForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport { ScalarLoading } from '@scalar/components/loading'\nimport { ScalarTooltip } from '@scalar/components/tooltip'\nimport {\n ScalarIconArrowUp,\n ScalarIconCheck,\n ScalarIconLockSimple,\n ScalarIconPlus,\n ScalarIconX,\n} from '@scalar/icons'\nimport { computed, useTemplateRef, watch } from 'vue'\n\nimport ActionsDropdown from '@/components/ActionsDropdown.vue'\nimport ApprovalSection from '@/components/ApprovalSection.vue'\nimport ErrorMessageMessage from '@/components/ErrorMessage.vue'\nimport FreeMessagesInfoSection from '@/components/FreeMessagesInfoSection.vue'\nimport PaymentSection from '@/components/PaymentSection.vue'\nimport SearchPopover from '@/components/SearchPopover.vue'\nimport UploadSection from '@/components/UploadSection.vue'\nimport { AgentErrorCodes } from '@/entities/error/constants'\nimport { MAX_PROMPT_SIZE } from '@/entities/prompt/constants'\nimport { useRequestApprovals } from '@/hooks/use-chat-approvals'\nimport { useChatError } from '@/hooks/use-chat-error'\nimport { useChatPendingClientToolParts } from '@/hooks/use-chat-pending-client-tool-parts'\nimport { useUploadTmpDocument } from '@/hooks/use-upload-tmp-document'\nimport { useState } from '@/state/state'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\ndefineExpose({ focusPrompt })\n\nconst promptRef = useTemplateRef<HTMLTextAreaElement>('agentPrompt')\n\nconst state = useState()\n\nconst inputHasContent = computed(() => state.prompt.value.trim().length > 0)\nconst promptTooLarge = computed(\n () => state.prompt.value.trim().length > MAX_PROMPT_SIZE,\n)\n\n/** Show free messages info only after at least one message has been sent and when no API key is set. */\nconst showFreeMessagesInfo = computed(\n () =>\n state.chat.messages.length > 1 &&\n !state.getAgentKey?.() &&\n chatError?.value?.code !== AgentErrorCodes.LIMIT_REACHED,\n)\n\nwatch(state.prompt, () => {\n if (!promptRef?.value) {\n return\n }\n\n if (!state.prompt.value.length) {\n promptRef.value.style.height = '0px'\n return\n }\n\n promptRef.value.style.height = 'auto'\n promptRef.value.style.height = promptRef.value.scrollHeight + 'px'\n})\n\nfunction handlePromptKeydown(e: KeyboardEvent) {\n if (state.loading.value) {\n return\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit()\n window.scrollTo(0, document.body.scrollHeight)\n }\n}\n\nfunction focusPrompt() {\n promptRef.value?.focus()\n}\n\nwatch(\n () => state.chat.status,\n (status) => {\n if (status === 'ready' || status === 'error') {\n promptRef.value?.focus()\n }\n },\n)\n\nconst { approvalRequiredParts, respondToRequestApprovals } =\n useRequestApprovals()\n\nconst { pendingClientToolParts } = useChatPendingClientToolParts()\n\nconst uploadTmpDoc = useUploadTmpDocument()\n\nfunction acceptTerms() {\n state.terms.accept()\n\n if (state.mode === 'preview' && state.getActiveDocumentJson) {\n uploadTmpDoc.uploadTempDocument(state.getActiveDocumentJson(), true)\n }\n}\n\nconst isPending = computed(() =>\n Object.values(state.pendingDocuments).some(Boolean),\n)\n\nconst submitDisabled = computed(() => {\n const tooLarge = promptTooLarge.value\n const missingInput = !inputHasContent.value\n const awaitingApproval = approvalRequiredParts.value.length > 0\n const pendingToolParts = pendingClientToolParts.value.length > 0\n\n const isPreview = state.mode === 'preview'\n\n const termsNotAccepted = isPreview && !state.terms.accepted.value\n const uploadingTmpDoc = isPreview && !!uploadTmpDoc.uploadState.value\n const isLoading = isPending.value\n\n return (\n tooLarge ||\n missingInput ||\n awaitingApproval ||\n pendingToolParts ||\n termsNotAccepted ||\n uploadingTmpDoc ||\n isLoading\n )\n})\n\nfunction handleSubmit() {\n if (submitDisabled.value) {\n return\n }\n\n emit('submit')\n}\n\nconst chatError = useChatError()\n</script>\n\n<template>\n <div class=\"actionContainer\">\n <UploadSection\n v-if=\"uploadTmpDoc.uploadState.value || isPending\"\n :uploadState=\"uploadTmpDoc.uploadState.value ?? { type: 'loading' }\" />\n <ErrorMessageMessage\n v-if=\"chatError\"\n :error=\"chatError\" />\n <ApprovalSection\n v-if=\"approvalRequiredParts.length\"\n @approve=\"respondToRequestApprovals(true)\"\n @reject=\"respondToRequestApprovals(false)\" />\n <PaymentSection v-if=\"chatError?.code === AgentErrorCodes.LIMIT_REACHED\" />\n <FreeMessagesInfoSection v-if=\"showFreeMessagesInfo\" />\n <form\n class=\"promptForm\"\n @submit.prevent=\"handleSubmit\">\n <label\n class=\"agentLabel\"\n for=\"agentTextarea\">\n Type a Request To get Started\n </label>\n <textarea\n id=\"agentTextarea\"\n ref=\"agentPrompt\"\n v-model=\"state.prompt.value\"\n class=\"prompt custom-scroll\"\n :disabled=\"state.loading.value\"\n name=\"prompt\"\n placeholder=\"Ask me anything…\"\n @keydown=\"handlePromptKeydown\" />\n <div class=\"inputActionsContainer\">\n <div class=\"inputActionsLeft\">\n <template v-if=\"!state.hideAddApi\">\n <SearchPopover v-if=\"!state.isLoggedIn?.value\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </SearchPopover>\n <ActionsDropdown\n v-else\n @uploadApi=\"$emit('uploadApi')\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </ActionsDropdown>\n </template>\n <div\n v-for=\"document in state.registryDocuments.value\"\n :key=\"document.id\"\n class=\"apiPill\">\n <img\n v-if=\"document.logoUrl\"\n class=\"apiPillLogo\"\n :src=\"document.logoUrl\" />\n {{ document.title }}\n <button\n v-if=\"document.removable\"\n class=\"apiPillRemove\"\n type=\"button\"\n @click=\"state.removeDocument(document)\">\n <ScalarIconX\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </div>\n </div>\n\n <div class=\"inputActionsRight\">\n <template v-if=\"!state.loading.value\">\n <ScalarTooltip content=\"Settings\">\n <ScalarIconButton\n class=\"settingsButton h-7 w-7 p-1.5\"\n :icon=\"ScalarIconLockSimple\"\n label=\"Scalar\"\n size=\"md\"\n weight=\"bold\"\n @click=\"state.settingsModal.show()\" />\n </ScalarTooltip>\n </template>\n <div class=\"sendCheckboxContinue\">\n <div\n v-if=\"!state.terms.accepted.value && state.mode === 'preview'\"\n class=\"relative flex items-center gap-1.5\">\n <input\n id=\"agentTermsAgree\"\n class=\"sr-only\"\n type=\"checkbox\"\n @change=\"acceptTerms\" />\n <label\n class=\"termsAgree\"\n for=\"agentTermsAgree\">\n <ScalarIconCheck\n class=\"termsAgreeIcon\"\n weight=\"bold\" />\n Agree to Terms & Conditions\n </label>\n </div>\n <ScalarIconButton\n v-if=\"!state.loading.value\"\n class=\"sendButton h-7 w-7 p-1.5\"\n :disabled=\"submitDisabled\"\n :icon=\"ScalarIconArrowUp\"\n label=\"Scalar\"\n size=\"md\"\n type=\"submit\"\n weight=\"bold\" />\n <ScalarLoading\n v-else\n class=\"loader h-7 w-7\"\n :loader=\"{\n isLoading: state.loading.value,\n isValid: false,\n clear: async () => {},\n invalidate: async () => {},\n isInvalid: false,\n isActive: false,\n validate: async () => {},\n start: () => {},\n }\"\n size=\"2xl\" />\n </div>\n </div>\n </div>\n </form>\n\n <div\n v-if=\"state.chat.messages.length <= 1 && !state.hideAddApi\"\n class=\"addMoreContext\">\n <span>Load additional APIs</span>\n <div class=\"ml-auto flex items-center gap-1\">\n <button\n v-for=\"doc of state.curatedDocuments.value\"\n :key=\"doc.id\"\n class=\"addAPIContext\"\n type=\"button\"\n @click=\"state.addDocument(doc)\">\n <img\n v-if=\"doc.logoUrl\"\n :alt=\"doc.title\"\n class=\"size-4\"\n :src=\"doc.logoUrl\" />\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.actionContainer {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: var(--scalar-radius-3xl);\n width: 100%;\n position: relative;\n /* visually hides overflowing text below */\n box-shadow: 0 24px 0 2px var(--scalar-background-1);\n}\n.promptForm {\n width: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n background: var(--scalar-background-1);\n box-shadow:\n var(--scalar-shadow-1),\n 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n border-radius: var(--scalar-radius-3xl);\n}\n\n.inputActionsContainer {\n display: flex;\n justify-content: space-between;\n padding: 0 8px 8px 8px;\n}\n\n.inputActionsLeft {\n display: flex;\n flex-wrap: wrap; /* key: allows pills to go to next line */\n align-items: center;\n gap: 5px; /* spacing between pills */\n}\n\n.inputActionsRight {\n display: flex;\n gap: 5px;\n position: relative;\n}\n\n.apiPill {\n font-size: var(--scalar-font-size-3);\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n color: var(--scalar-color-2);\n font-weight: var(--scalar-semibold);\n height: 28px;\n align-items: center;\n display: flex;\n border-radius: var(--scalar-radius-3xl);\n padding: 0 8px;\n pointer-events: all;\n z-index: 1;\n gap: 4px;\n user-select: none;\n}\n.apiPillLogo {\n width: 15px;\n}\n\n.apiPillRemove {\n width: 24px;\n height: 24px;\n margin-right: -6px;\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.apiPill:hover .apiPillRemove {\n background: var(--scalar-background-2);\n}\n.dark-mode .apiPill:hover .apiPillRemove {\n background: var(--scalar-background-3);\n}\n\n.apiPillRemove:hover {\n color: var(--scalar-color-1);\n}\n\n.prompt {\n width: 100%;\n outline: none;\n border: none;\n resize: none;\n field-sizing: content;\n min-height: 64px;\n z-index: 1;\n max-height: 250px;\n max-width: 100%;\n overflow-y: auto;\n scrollbar-width: thin;\n word-wrap: break-word;\n font-family: var(--scalar-font);\n font-size: 16px;\n padding: 12px 12px 14px 12px;\n}\n.dark-mode .promptForm {\n background: var(--scalar-background-2);\n}\n\n.prompt:disabled {\n color: var(--scalar-color-3);\n}\n\n.addAPIButton {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n height: 28px;\n width: 28px;\n font-weight: var(--scalar-bold);\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n gap: 4px;\n pointer-events: all;\n z-index: 1;\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.addAPIButton:hover {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.dark-mode .addAPIButton:hover {\n background: var(--scalar-background-3);\n}\n\n.settingsButton {\n color: var(--scalar-color-3) !important;\n border-radius: var(--scalar-radius-full) !important;\n margin: 0 !important;\n z-index: 1;\n}\n.settingsButton[aria-disabled='true'] {\n background: var(--scalar-background-2);\n}\n.dark-mode .settingsButton:hover {\n background: var(--scalar-background-3);\n}\n\n.sendButton {\n background: var(--scalar-color-blue) !important;\n border-radius: var(--scalar-radius-full) !important;\n margin: 0 !important;\n z-index: 1;\n border: var(--scalar-border-width) solid var(--scalar-color-blue);\n}\n.sendButton:not([aria-disabled='true']) {\n color: white !important;\n}\n.sendButton:not([aria-disabled='true']):hover {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n transparent 10%\n ) !important;\n}\n.sendButton[aria-disabled='true'] {\n background: var(--scalar-background-2) !important;\n color: var(--scalar-color-3) !important;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.dark-mode .sendButton[aria-disabled='true'] {\n background: var(--scalar-background-3) !important;\n}\n.contextContainer {\n display: flex;\n width: 100%;\n padding: 10px 12px 12px 12px;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n user-select: none;\n justify-content: space-between;\n}\n\n.settingsButton {\n font-weight: var(--scalar-semibold);\n border-radius: var(--scalar-radius-lg);\n padding: 4px 6px;\n margin: -4px -6px;\n}\n.settingsButton:hover {\n background: var(--scalar-background-2);\n box-shadow: 0 0 var(--scalar-border-width) 0 var(--scalar-border-color);\n cursor: pointer;\n}\n\n.agentLabel {\n font-size: 0px;\n position: absolute;\n width: 100%;\n height: 100%;\n cursor: text;\n}\n.sendCheckboxContinue:has(input) {\n display: flex;\n align-items: center;\n border-radius: var(--scalar-radius-3xl);\n background: var(--scalar-background-2);\n box-shadow: 0 0 0 1.5px var(--scalar-background-2);\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n font-weight: var(--scalar-semibold);\n user-select: none;\n height: 28px;\n}\n.dark-mode .sendCheckboxContinue:has(input) {\n background: var(--scalar-background-3);\n box-shadow: 0 0 0 1.5px var(--scalar-background-3);\n}\n\n.addMoreContext {\n height: 40px;\n display: flex;\n position: relative;\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-3);\n padding: 0 8px 0 12px;\n align-items: center;\n}\n.addMoreContext:before {\n content: '';\n width: 8px;\n height: 8px;\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n transform: rotate(45deg);\n left: 18px;\n top: -3px;\n position: absolute;\n box-shadow:\n -0.5px -0.5px 0 var(--scalar-border-color),\n inset 0.5px 0.5px 1px var(--scalar-border-color);\n}\n.dark-mode .addMoreContext:before {\n box-shadow: -0.5px -0.5px 0 var(--scalar-border-color);\n}\n.addAPIContext {\n width: 28px;\n height: 28px;\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.termsAgree {\n display: flex;\n cursor: pointer;\n height: inherit;\n align-items: center;\n border-radius: var(--scalar-radius-3xl);\n gap: 5px;\n margin: 0px 5px;\n}\n\n.termsAgree:hover {\n color: var(--scalar-color-1);\n}\n\n.termsAgree:hover .termsAgreeIcon {\n background: var(--scalar-color-1);\n color: var(--scalar-background-1);\n}\n\n.termsAgreeIcon {\n width: inherit;\n height: inherit;\n padding: 2px;\n border-radius: var(--scalar-radius-full);\n background: var(--scalar-background-2);\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"PromptForm.vue.js","names":[],"sources":["../../src/views/PromptForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport { ScalarLoading } from '@scalar/components/loading'\nimport { ScalarTooltip } from '@scalar/components/tooltip'\nimport {\n ScalarIconArrowUp,\n ScalarIconCheck,\n ScalarIconLockSimple,\n ScalarIconPlus,\n ScalarIconX,\n} from '@scalar/icons'\nimport { computed, useTemplateRef, watch } from 'vue'\n\nimport ActionsDropdown from '@/components/ActionsDropdown.vue'\nimport ApprovalSection from '@/components/ApprovalSection.vue'\nimport ErrorMessageMessage from '@/components/ErrorMessage.vue'\nimport FreeMessagesInfoSection from '@/components/FreeMessagesInfoSection.vue'\nimport PaymentSection from '@/components/PaymentSection.vue'\nimport SearchPopover from '@/components/SearchPopover.vue'\nimport UploadSection from '@/components/UploadSection.vue'\nimport { AgentErrorCodes } from '@/entities/error/constants'\nimport { MAX_PROMPT_SIZE } from '@/entities/prompt/constants'\nimport { useRequestApprovals } from '@/hooks/use-chat-approvals'\nimport { useChatError } from '@/hooks/use-chat-error'\nimport { useChatPendingClientToolParts } from '@/hooks/use-chat-pending-client-tool-parts'\nimport { useUploadTmpDocument } from '@/hooks/use-upload-tmp-document'\nimport { useState } from '@/state/state'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\ndefineExpose({ focusPrompt })\n\nconst promptRef = useTemplateRef<HTMLTextAreaElement>('agentPrompt')\n\nconst state = useState()\n\nconst inputHasContent = computed(() => state.prompt.value.trim().length > 0)\nconst promptTooLarge = computed(\n () => state.prompt.value.trim().length > MAX_PROMPT_SIZE,\n)\n\n/** Show free messages info only after at least one message has been sent and when no API key is set. */\nconst showFreeMessagesInfo = computed(\n () =>\n state.chat.messages.length > 1 &&\n !state.getAgentKey?.() &&\n chatError?.value?.code !== AgentErrorCodes.LIMIT_REACHED,\n)\n\nwatch(state.prompt, () => {\n if (!promptRef?.value) {\n return\n }\n\n if (!state.prompt.value.length) {\n promptRef.value.style.height = '0px'\n return\n }\n\n promptRef.value.style.height = 'auto'\n promptRef.value.style.height = promptRef.value.scrollHeight + 'px'\n})\n\nfunction handlePromptKeydown(e: KeyboardEvent) {\n // Ignore the Enter that only commits an IME composition (e.g. Japanese, Chinese,\n // Korean). On macOS Chrome that keydown still reports key === 'Enter' with\n // isComposing === true, so without this guard the message sends mid-composition.\n if (e.isComposing) {\n return\n }\n\n if (state.loading.value) {\n return\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit()\n window.scrollTo(0, document.body.scrollHeight)\n }\n}\n\nfunction focusPrompt() {\n promptRef.value?.focus()\n}\n\nwatch(\n () => state.chat.status,\n (status) => {\n if (status === 'ready' || status === 'error') {\n promptRef.value?.focus()\n }\n },\n)\n\nconst { approvalRequiredParts, respondToRequestApprovals } =\n useRequestApprovals()\n\nconst { pendingClientToolParts } = useChatPendingClientToolParts()\n\nconst uploadTmpDoc = useUploadTmpDocument()\n\nfunction acceptTerms() {\n state.terms.accept()\n\n if (state.mode === 'preview' && state.getActiveDocumentJson) {\n uploadTmpDoc.uploadTempDocument(state.getActiveDocumentJson(), true)\n }\n}\n\nconst isPending = computed(() =>\n Object.values(state.pendingDocuments).some(Boolean),\n)\n\nconst submitDisabled = computed(() => {\n const tooLarge = promptTooLarge.value\n const missingInput = !inputHasContent.value\n const awaitingApproval = approvalRequiredParts.value.length > 0\n const pendingToolParts = pendingClientToolParts.value.length > 0\n\n const isPreview = state.mode === 'preview'\n\n const termsNotAccepted = isPreview && !state.terms.accepted.value\n const uploadingTmpDoc = isPreview && !!uploadTmpDoc.uploadState.value\n const isLoading = isPending.value\n\n return (\n tooLarge ||\n missingInput ||\n awaitingApproval ||\n pendingToolParts ||\n termsNotAccepted ||\n uploadingTmpDoc ||\n isLoading\n )\n})\n\nfunction handleSubmit() {\n if (submitDisabled.value) {\n return\n }\n\n emit('submit')\n}\n\nconst chatError = useChatError()\n</script>\n\n<template>\n <div class=\"actionContainer\">\n <UploadSection\n v-if=\"uploadTmpDoc.uploadState.value || isPending\"\n :uploadState=\"uploadTmpDoc.uploadState.value ?? { type: 'loading' }\" />\n <ErrorMessageMessage\n v-if=\"chatError\"\n :error=\"chatError\" />\n <ApprovalSection\n v-if=\"approvalRequiredParts.length\"\n @approve=\"respondToRequestApprovals(true)\"\n @reject=\"respondToRequestApprovals(false)\" />\n <PaymentSection v-if=\"chatError?.code === AgentErrorCodes.LIMIT_REACHED\" />\n <FreeMessagesInfoSection v-if=\"showFreeMessagesInfo\" />\n <form\n class=\"promptForm\"\n @submit.prevent=\"handleSubmit\">\n <label\n class=\"agentLabel\"\n for=\"agentTextarea\">\n Type a Request To get Started\n </label>\n <textarea\n id=\"agentTextarea\"\n ref=\"agentPrompt\"\n v-model=\"state.prompt.value\"\n class=\"prompt custom-scroll\"\n :disabled=\"state.loading.value\"\n name=\"prompt\"\n placeholder=\"Ask me anything…\"\n @keydown=\"handlePromptKeydown\" />\n <div class=\"inputActionsContainer\">\n <div class=\"inputActionsLeft\">\n <template v-if=\"!state.hideAddApi\">\n <SearchPopover v-if=\"!state.isLoggedIn?.value\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </SearchPopover>\n <ActionsDropdown\n v-else\n @uploadApi=\"$emit('uploadApi')\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </ActionsDropdown>\n </template>\n <div\n v-for=\"document in state.registryDocuments.value\"\n :key=\"document.id\"\n class=\"apiPill\">\n <img\n v-if=\"document.logoUrl\"\n class=\"apiPillLogo\"\n :src=\"document.logoUrl\" />\n {{ document.title }}\n <button\n v-if=\"document.removable\"\n class=\"apiPillRemove\"\n type=\"button\"\n @click=\"state.removeDocument(document)\">\n <ScalarIconX\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </div>\n </div>\n\n <div class=\"inputActionsRight\">\n <template v-if=\"!state.loading.value\">\n <ScalarTooltip content=\"Settings\">\n <ScalarIconButton\n class=\"settingsButton h-7 w-7 p-1.5\"\n :icon=\"ScalarIconLockSimple\"\n label=\"Scalar\"\n size=\"md\"\n weight=\"bold\"\n @click=\"state.settingsModal.show()\" />\n </ScalarTooltip>\n </template>\n <div class=\"sendCheckboxContinue\">\n <div\n v-if=\"!state.terms.accepted.value && state.mode === 'preview'\"\n class=\"relative flex items-center gap-1.5\">\n <input\n id=\"agentTermsAgree\"\n class=\"sr-only\"\n type=\"checkbox\"\n @change=\"acceptTerms\" />\n <label\n class=\"termsAgree\"\n for=\"agentTermsAgree\">\n <ScalarIconCheck\n class=\"termsAgreeIcon\"\n weight=\"bold\" />\n Agree to Terms & Conditions\n </label>\n </div>\n <ScalarIconButton\n v-if=\"!state.loading.value\"\n class=\"sendButton h-7 w-7 p-1.5\"\n :disabled=\"submitDisabled\"\n :icon=\"ScalarIconArrowUp\"\n label=\"Scalar\"\n size=\"md\"\n type=\"submit\"\n weight=\"bold\" />\n <ScalarLoading\n v-else\n class=\"loader h-7 w-7\"\n :loader=\"{\n isLoading: state.loading.value,\n isValid: false,\n clear: async () => {},\n invalidate: async () => {},\n isInvalid: false,\n isActive: false,\n validate: async () => {},\n start: () => {},\n }\"\n size=\"2xl\" />\n </div>\n </div>\n </div>\n </form>\n\n <div\n v-if=\"state.chat.messages.length <= 1 && !state.hideAddApi\"\n class=\"addMoreContext\">\n <span>Load additional APIs</span>\n <div class=\"ml-auto flex items-center gap-1\">\n <button\n v-for=\"doc of state.curatedDocuments.value\"\n :key=\"doc.id\"\n class=\"addAPIContext\"\n type=\"button\"\n @click=\"state.addDocument(doc)\">\n <img\n v-if=\"doc.logoUrl\"\n :alt=\"doc.title\"\n class=\"size-4\"\n :src=\"doc.logoUrl\" />\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.actionContainer {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: var(--scalar-radius-3xl);\n width: 100%;\n position: relative;\n /* visually hides overflowing text below */\n box-shadow: 0 24px 0 2px var(--scalar-background-1);\n}\n.promptForm {\n width: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n background: var(--scalar-background-1);\n box-shadow:\n var(--scalar-shadow-1),\n 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n border-radius: var(--scalar-radius-3xl);\n}\n\n.inputActionsContainer {\n display: flex;\n justify-content: space-between;\n padding: 0 8px 8px 8px;\n}\n\n.inputActionsLeft {\n display: flex;\n flex-wrap: wrap; /* key: allows pills to go to next line */\n align-items: center;\n gap: 5px; /* spacing between pills */\n}\n\n.inputActionsRight {\n display: flex;\n gap: 5px;\n position: relative;\n}\n\n.apiPill {\n font-size: var(--scalar-font-size-3);\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n color: var(--scalar-color-2);\n font-weight: var(--scalar-semibold);\n height: 28px;\n align-items: center;\n display: flex;\n border-radius: var(--scalar-radius-3xl);\n padding: 0 8px;\n pointer-events: all;\n z-index: 1;\n gap: 4px;\n user-select: none;\n}\n.apiPillLogo {\n width: 15px;\n}\n\n.apiPillRemove {\n width: 24px;\n height: 24px;\n margin-right: -6px;\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.apiPill:hover .apiPillRemove {\n background: var(--scalar-background-2);\n}\n.dark-mode .apiPill:hover .apiPillRemove {\n background: var(--scalar-background-3);\n}\n\n.apiPillRemove:hover {\n color: var(--scalar-color-1);\n}\n\n.prompt {\n width: 100%;\n outline: none;\n border: none;\n resize: none;\n field-sizing: content;\n min-height: 64px;\n z-index: 1;\n max-height: 250px;\n max-width: 100%;\n overflow-y: auto;\n scrollbar-width: thin;\n word-wrap: break-word;\n font-family: var(--scalar-font);\n font-size: 16px;\n padding: 12px 12px 14px 12px;\n}\n.dark-mode .promptForm {\n background: var(--scalar-background-2);\n}\n\n.prompt:disabled {\n color: var(--scalar-color-3);\n}\n\n.addAPIButton {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n height: 28px;\n width: 28px;\n font-weight: var(--scalar-bold);\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n gap: 4px;\n pointer-events: all;\n z-index: 1;\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.addAPIButton:hover {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.dark-mode .addAPIButton:hover {\n background: var(--scalar-background-3);\n}\n\n.settingsButton {\n color: var(--scalar-color-3) !important;\n border-radius: var(--scalar-radius-full) !important;\n margin: 0 !important;\n z-index: 1;\n}\n.settingsButton[aria-disabled='true'] {\n background: var(--scalar-background-2);\n}\n.dark-mode .settingsButton:hover {\n background: var(--scalar-background-3);\n}\n\n.sendButton {\n background: var(--scalar-color-blue) !important;\n border-radius: var(--scalar-radius-full) !important;\n margin: 0 !important;\n z-index: 1;\n border: var(--scalar-border-width) solid var(--scalar-color-blue);\n}\n.sendButton:not([aria-disabled='true']) {\n color: white !important;\n}\n.sendButton:not([aria-disabled='true']):hover {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n transparent 10%\n ) !important;\n}\n.sendButton[aria-disabled='true'] {\n background: var(--scalar-background-2) !important;\n color: var(--scalar-color-3) !important;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.dark-mode .sendButton[aria-disabled='true'] {\n background: var(--scalar-background-3) !important;\n}\n.contextContainer {\n display: flex;\n width: 100%;\n padding: 10px 12px 12px 12px;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n user-select: none;\n justify-content: space-between;\n}\n\n.settingsButton {\n font-weight: var(--scalar-semibold);\n border-radius: var(--scalar-radius-lg);\n padding: 4px 6px;\n margin: -4px -6px;\n}\n.settingsButton:hover {\n background: var(--scalar-background-2);\n box-shadow: 0 0 var(--scalar-border-width) 0 var(--scalar-border-color);\n cursor: pointer;\n}\n\n.agentLabel {\n font-size: 0px;\n position: absolute;\n width: 100%;\n height: 100%;\n cursor: text;\n}\n.sendCheckboxContinue:has(input) {\n display: flex;\n align-items: center;\n border-radius: var(--scalar-radius-3xl);\n background: var(--scalar-background-2);\n box-shadow: 0 0 0 1.5px var(--scalar-background-2);\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n font-weight: var(--scalar-semibold);\n user-select: none;\n height: 28px;\n}\n.dark-mode .sendCheckboxContinue:has(input) {\n background: var(--scalar-background-3);\n box-shadow: 0 0 0 1.5px var(--scalar-background-3);\n}\n\n.addMoreContext {\n height: 40px;\n display: flex;\n position: relative;\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-3);\n padding: 0 8px 0 12px;\n align-items: center;\n}\n.addMoreContext:before {\n content: '';\n width: 8px;\n height: 8px;\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n transform: rotate(45deg);\n left: 18px;\n top: -3px;\n position: absolute;\n box-shadow:\n -0.5px -0.5px 0 var(--scalar-border-color),\n inset 0.5px 0.5px 1px var(--scalar-border-color);\n}\n.dark-mode .addMoreContext:before {\n box-shadow: -0.5px -0.5px 0 var(--scalar-border-color);\n}\n.addAPIContext {\n width: 28px;\n height: 28px;\n border-radius: var(--scalar-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.termsAgree {\n display: flex;\n cursor: pointer;\n height: inherit;\n align-items: center;\n border-radius: var(--scalar-radius-3xl);\n gap: 5px;\n margin: 0px 5px;\n}\n\n.termsAgree:hover {\n color: var(--scalar-color-1);\n}\n\n.termsAgree:hover .termsAgreeIcon {\n background: var(--scalar-color-1);\n color: var(--scalar-background-1);\n}\n\n.termsAgreeIcon {\n width: inherit;\n height: inherit;\n padding: 2px;\n border-radius: var(--scalar-radius-full);\n background: var(--scalar-background-2);\n}\n</style>\n"],"mappings":""}
@@ -5,12 +5,12 @@ import { useState } from "../state/state.js";
5
5
  import { useRequestApprovals } from "../hooks/use-chat-approvals.js";
6
6
  import ActionsDropdown_default from "../components/ActionsDropdown.vue.js";
7
7
  import ApprovalSection_default from "../components/ApprovalSection.vue.js";
8
- import { useChatError } from "../hooks/use-chat-error.js";
9
8
  import ErrorMessage_default from "../components/ErrorMessage.vue.js";
10
9
  import FreeMessagesInfoSection_default from "../components/FreeMessagesInfoSection.vue.js";
11
10
  import PaymentSection_default from "../components/PaymentSection.vue.js";
12
11
  import SearchPopover_default from "../components/SearchPopover.vue.js";
13
12
  import UploadSection_default from "../components/UploadSection.vue.js";
13
+ import { useChatError } from "../hooks/use-chat-error.js";
14
14
  import { useChatPendingClientToolParts } from "../hooks/use-chat-pending-client-tool-parts.js";
15
15
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, renderList, toDisplayString, unref, useTemplateRef, vModelText, watch, withCtx, withDirectives, withModifiers } from "vue";
16
16
  import { ScalarIconArrowUp, ScalarIconCheck, ScalarIconLockSimple, ScalarIconPlus, ScalarIconX } from "@scalar/icons";
@@ -49,7 +49,7 @@ var _hoisted_13 = {
49
49
  var _hoisted_14 = { class: "ml-auto flex items-center gap-1" };
50
50
  var _hoisted_15 = ["onClick"];
51
51
  var _hoisted_16 = ["alt", "src"];
52
- var PromptForm_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
52
+ var PromptForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
53
53
  __name: "PromptForm",
54
54
  emits: ["submit", "uploadApi"],
55
55
  setup(__props, { expose: __expose, emit: __emit }) {
@@ -71,6 +71,7 @@ var PromptForm_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
71
71
  promptRef.value.style.height = promptRef.value.scrollHeight + "px";
72
72
  });
73
73
  function handlePromptKeydown(e) {
74
+ if (e.isComposing) return;
74
75
  if (state.loading.value) return;
75
76
  if (e.key === "Enter" && !e.shiftKey) {
76
77
  e.preventDefault();