1 line
42 KiB
Plaintext
1 line
42 KiB
Plaintext
{"version":3,"mappings":"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","names":["openAssistantForm","appId","taskType","taskTypeIdList","input","inputs","isInsideViewer","closeOnResult","actionButtons","customId","identifier","mountPoint","createApp","__vitePreload","n","AssistantTextProcessingModal","selectedTaskTypeId","getLastSelectedTaskType","resolve","reject","modalMountPoint","content","modalId","app","view","lastTask","cancelTaskPolling","syncSubmit","taskTypeId","newTaskCustomId","scheduleTask","response","task","pollTask","finishedTask","TASK_STATUS_STRING","showError","emit","error","data","getTask","updatedTask","getNotifyReady","setNotifyReady","res","cancelTask","updateTask","object","taskId","obj","callback","axios","generateOcsUrl","url","enable","saveLastTargetLanguage","params","saveLastSelectedTaskType","generateUrl","req","targetLanguage","handleNotification","event","showAssistantTaskResult","openAssistantTask","addAssistantMenuEntry","headerRight","menuEntry","AssistantHeaderMenuEntry","r"],"ignoreList":[],"sources":["../src/assistant.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { TASK_STATUS_STRING } from './constants.js'\nimport { showError } from '@nextcloud/dialogs'\nimport { emit } from '@nextcloud/event-bus'\n\nwindow.assistantPollTimerId = null\n\n// TODO add param to lock on specific task type\n\n/**\n * Creates an assistant modal and return a promise which provides the result\n *\n * OCA.Assistant.openAssistantForm({\n * appId: 'my_app_id',\n * customId: 'my task custom ID',\n * taskType: 'OCP\\\\TextProcessing\\\\FreePromptTaskType',\n * input: 'count to 3',\n * actionButtons: [\n * {\n * label: 'Label 1',\n * title: 'Title 1',\n * variant: 'warning',\n * iconSvg: cogSvg,\n * onClick: (outputs) => { console.debug('first button clicked', outputs) },\n * },\n * {\n * label: 'Label 2',\n * title: 'Title 2',\n * onClick: (outputs) => { console.debug('second button clicked', outputs) },\n * },\n * ],\n * }).then(r => {console.debug('scheduled task', r.data.ocs.data.task)})\n *\n * @param {object} params parameters for the assistant\n * @param {string} params.appId the scheduling app id\n * @param {string} params.customId the task custom identifier\n * @param {string} params.identifier DEPRECATED the task custom identifier\n * @param {string} params.taskType the selected task type ID\n * @param {Array} params.taskTypeIdList the task types to display (all if not specified)\n * @param {string} params.input DEPRECATED optional initial input text\n * @param {object} params.inputs optional initial named inputs\n * @param {boolean} params.isInsideViewer Should be true if this function is called while the Viewer is displayed\n * @param {boolean} params.closeOnResult If true, the modal will be closed when getting a sync result\n * @param {Array} params.actionButtons List of extra buttons to show in the assistant result form (only if closeOnResult is false)\n * @param {HTMLElement} params.mountPoint The DOM element in which the assistant modal will be mounted\n * @return {Promise<unknown>}\n */\nexport async function openAssistantForm({\n\tappId, taskType = null, taskTypeIdList = null, input = '', inputs = {},\n\tisInsideViewer = undefined, closeOnResult = false, actionButtons = undefined,\n\tcustomId = '', identifier = '', mountPoint = null,\n}) {\n\tconst { createApp } = await import('vue')\n\tconst { default: AssistantTextProcessingModal } = await import('./components/AssistantTextProcessingModal.vue')\n\n\t// fallback to the last used one\n\tconst selectedTaskTypeId = taskType ?? (await getLastSelectedTaskType())?.data\n\n\treturn new Promise((resolve, reject) => {\n\t\tlet modalMountPoint\n\t\tconst content = document.querySelector('#content') ?? document.querySelector('#content-vue')\n\n\t\tif (mountPoint !== null) {\n\t\t\t// if a mount point is specified, always use it\n\t\t\tmodalMountPoint = mountPoint\n\t\t} else {\n\t\t\tconst modalId = 'assistantTextProcessingModal'\n\t\t\tmodalMountPoint = document.createElement('div')\n\t\t\tmodalMountPoint.id = modalId\n\t\t\t// the default mount point location is different whether the assistant is opened from the viewer or not\n\t\t\tif (isInsideViewer) {\n\t\t\t\t// so the assistant modal is opened on top of the current viewer\n\t\t\t\tdocument.querySelector('body').append(modalMountPoint)\n\t\t\t} else {\n\t\t\t\t// so the viewer can be later opened on top of the assistant\n\t\t\t\tdocument.querySelector('body').insertBefore(modalMountPoint, content.nextSibling)\n\t\t\t}\n\t\t}\n\n\t\t// TODO remaining issue: we can't open output files in the viewer if the assistant is displayed in the viewer\n\t\t// because the new viewer will replace the existing one...\n\t\t// Maybe that's an acceptable limitation\n\n\t\tconst app = createApp(\n\t\t\tAssistantTextProcessingModal,\n\t\t\t{\n\t\t\t\tisInsideViewer,\n\t\t\t\tinitInputs: input ? { prompt: input } : inputs,\n\t\t\t\tinitSelectedTaskTypeId: selectedTaskTypeId,\n\t\t\t\tshowSyncTaskRunning: false,\n\t\t\t\tactionButtons,\n\t\t\t\ttaskTypeIdList,\n\t\t\t\t/*\n\t\t\t\t// events emitted by the root component can be listened to this way\n\t\t\t\t// this is a handler for the 'load-task' event\n\t\t\t\tonLoadTask(data) {\n\t\t\t\t},\n\t\t\t\t*/\n\t\t\t},\n\t\t)\n\t\tapp.mixin({ methods: { t, n } })\n\t\tconst view = app.mount(modalMountPoint)\n\t\tlet lastTask = null\n\n\t\tmodalMountPoint.addEventListener('cancel', () => {\n\t\t\tcancelTaskPolling()\n\t\t\tapp.unmount()\n\t\t\treject(new Error('User cancellation'))\n\t\t})\n\t\tconst syncSubmit = (inputs, taskTypeId, newTaskCustomId = '') => {\n\t\t\tview.loading = true\n\t\t\tview.showSyncTaskRunning = true\n\t\t\tview.isNotifyEnabled = false\n\t\t\tview.progress = null\n\t\t\tview.expectedRuntime = null\n\t\t\tview.inputs = inputs\n\t\t\tview.selectedTaskTypeId = taskTypeId\n\n\t\t\tscheduleTask(appId, newTaskCustomId, taskTypeId, inputs)\n\t\t\t\t.then((response) => {\n\t\t\t\t\tconst task = response.data?.ocs?.data?.task\n\t\t\t\t\tlastTask = task\n\t\t\t\t\tview.selectedTaskId = lastTask?.id\n\t\t\t\t\tview.expectedRuntime = (lastTask?.completionExpectedAt - lastTask?.scheduledAt) || null\n\n\t\t\t\t\tpollTask(task.id, view).then(finishedTask => {\n\t\t\t\t\t\tconsole.debug('pollTask.then', finishedTask)\n\t\t\t\t\t\tif (finishedTask.status === TASK_STATUS_STRING.successful) {\n\t\t\t\t\t\t\tif (closeOnResult) {\n\t\t\t\t\t\t\t\tapp.unmount()\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tview.outputs = finishedTask?.output\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (finishedTask.status === TASK_STATUS_STRING.failed) {\n\t\t\t\t\t\t\tshowError(\n\t\t\t\t\t\t\t\tt('assistant', 'The server failed to process your task with ID {id}', { id: finishedTask.id })\n\t\t\t\t\t\t\t\t+ '. ' + t('assistant', 'Please inform the server administrators of this issue.'),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tconsole.error('[assistant] Task failed', finishedTask)\n\t\t\t\t\t\t\tview.outputs = null\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresolve(finishedTask)\n\t\t\t\t\t\tview.loading = false\n\t\t\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\t\t\temit('assistant:task:updated', finishedTask)\n\t\t\t\t\t}).catch(error => {\n\t\t\t\t\t\tconsole.debug('[assistant] poll error', error.message)\n\t\t\t\t\t\tif (error.message === 'task-not-found') {\n\t\t\t\t\t\t\tview.loading = false\n\t\t\t\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\t\t\t\tview.isNotifyEnabled = false\n\t\t\t\t\t\t\tview.outputs = null\n\t\t\t\t\t\t\tview.selectedTaskId = null\n\t\t\t\t\t\t\tlastTask = null\n\t\t\t\t\t\t\tshowError(t('assistant', 'The current Assistant task could not be found'))\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch(error => {\n\t\t\t\t\tview.loading = false\n\t\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\t\tconsole.error('Assistant scheduling error', error?.response?.data?.ocs?.data?.message)\n\t\t\t\t\tshowError(t('assistant', 'Assistant error') + ': ' + t('assistant', 'Something went wrong when scheduling the task'))\n\t\t\t\t})\n\t\t}\n\t\tmodalMountPoint.addEventListener('sync-submit', (data) => {\n\t\t\tconsole.debug('[assistant] submit', data)\n\t\t\tsyncSubmit(data.detail.inputs, data.detail.selectedTaskTypeId, customId || identifier)\n\t\t})\n\t\tmodalMountPoint.addEventListener('try-again', (data) => {\n\t\t\tconst task = data.detail\n\t\t\tconsole.debug('[assistant] try again', task)\n\t\t\tsyncSubmit(task.input, task.type)\n\t\t})\n\t\tmodalMountPoint.addEventListener('load-task', (data) => {\n\t\t\tconst task = data.detail\n\t\t\tconsole.debug('[assistant] loading task', task)\n\t\t\tcancelTaskPolling()\n\t\t\tview.showSyncTaskRunning = false\n\t\t\tview.isNotifyEnabled = false\n\t\t\tview.loading = false\n\n\t\t\tview.selectedTaskTypeId = task.type\n\t\t\tview.inputs = task.input\n\t\t\tview.outputs = task.status === TASK_STATUS_STRING.successful ? task.output : null\n\t\t\tview.selectedTaskId = task.id\n\t\t\tlastTask = task\n\n\t\t\tif ([TASK_STATUS_STRING.scheduled, TASK_STATUS_STRING.running].includes(task?.status)) {\n\t\t\t\tgetTask(task.id).then(response => {\n\t\t\t\t\tconst updatedTask = response.data?.ocs?.data?.task\n\n\t\t\t\t\tif (![TASK_STATUS_STRING.scheduled, TASK_STATUS_STRING.running].includes(updatedTask?.status)) {\n\t\t\t\t\t\tview.selectedTaskTypeId = updatedTask.type\n\t\t\t\t\t\tview.inputs = updatedTask.input\n\t\t\t\t\t\tview.outputs = updatedTask.status === TASK_STATUS_STRING.successful ? updatedTask.output : null\n\t\t\t\t\t\tview.selectedTaskId = updatedTask.id\n\t\t\t\t\t\tlastTask = updatedTask\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tgetNotifyReady(task.id).then(response => {\n\t\t\t\t\t\tview.isNotifyEnabled = !!response.data?.ocs?.data?.id\n\t\t\t\t\t}).catch(error => {\n\t\t\t\t\t\tconsole.error('[assistant] get task notification status error', error)\n\t\t\t\t\t})\n\n\t\t\t\t\tview.loading = true\n\t\t\t\t\tview.showSyncTaskRunning = true\n\t\t\t\t\tview.progress = null\n\t\t\t\t\tview.expectedRuntime = (updatedTask?.completionExpectedAt - updatedTask?.scheduledAt) || null\n\n\t\t\t\t\tpollTask(updatedTask.id, view).then(finishedTask => {\n\t\t\t\t\t\tconsole.debug('pollTask.then', finishedTask)\n\t\t\t\t\t\tif (finishedTask.status === TASK_STATUS_STRING.successful) {\n\t\t\t\t\t\t\tview.outputs = finishedTask?.output\n\t\t\t\t\t\t\tview.selectedTaskId = finishedTask?.id\n\t\t\t\t\t\t} else if (finishedTask.status === TASK_STATUS_STRING.failed) {\n\t\t\t\t\t\t\tshowError(\n\t\t\t\t\t\t\t\tt('assistant', 'The server failed to process your task with ID {id}', { id: finishedTask.id })\n\t\t\t\t\t\t\t\t+ '. ' + t('assistant', 'Please inform the server administrators of this issue.'),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tconsole.error('[assistant] Task failed', finishedTask)\n\t\t\t\t\t\t\tview.outputs = null\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// resolve(finishedTask)\n\t\t\t\t\t\tview.loading = false\n\t\t\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\t\t\temit('assistant:task:updated', finishedTask)\n\t\t\t\t\t}).catch(error => {\n\t\t\t\t\t\tconsole.debug('[assistant] poll error', error)\n\t\t\t\t\t\tif (error.message === 'task-not-found') {\n\t\t\t\t\t\t\tview.loading = false\n\t\t\t\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\t\t\t\tview.isNotifyEnabled = false\n\t\t\t\t\t\t\tview.outputs = null\n\t\t\t\t\t\t\tview.selectedTaskId = null\n\t\t\t\t\t\t\tlastTask = null\n\t\t\t\t\t\t\tshowError(t('assistant', 'The current Assistant task could not be found'))\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}).catch(error => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tmodalMountPoint.addEventListener('new-task', () => {\n\t\t\tconsole.debug('[assistant] new task')\n\t\t\tcancelTaskPolling()\n\t\t\tview.loading = false\n\t\t\tview.showSyncTaskRunning = false\n\t\t\tview.isNotifyEnabled = false\n\t\t\tview.outputs = null\n\t\t\tview.selectedTaskId = null\n\t\t\tlastTask = null\n\t\t})\n\t\tmodalMountPoint.addEventListener('background-notify', (data) => {\n\t\t\tsetNotifyReady(lastTask.id, data.detail).then(res => {\n\t\t\t\tview.isNotifyEnabled = data.detail\n\t\t\t})\n\t\t})\n\t\tmodalMountPoint.addEventListener('cancel-task', () => {\n\t\t\tcancelTaskPolling()\n\t\t\tsetNotifyReady(lastTask.id, false)\n\t\t\tcancelTask(lastTask.id).then(res => {\n\t\t\t\tview.loading = false\n\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\tview.selectedTaskId = null\n\t\t\t\tlastTask = null\n\t\t\t})\n\t\t})\n\t\tmodalMountPoint.addEventListener('action-button-clicked', (data) => {\n\t\t\tif (data.detail.button?.onClick) {\n\t\t\t\tlastTask.output = data.detail.output\n\t\t\t\tdata.detail.button.onClick(lastTask)\n\t\t\t}\n\t\t\tapp.unmount()\n\t\t})\n\t})\n}\n\nfunction updateTask(task, object) {\n\tif (task?.status === TASK_STATUS_STRING.running) {\n\t\tobject.progress = task?.progress * 100\n\t}\n\tobject.taskStatus = task?.status\n\tobject.scheduledAt = task?.scheduledAt\n}\n\nexport async function pollTask(taskId, obj, callback = updateTask) {\n\treturn new Promise((resolve, reject) => {\n\t\twindow.assistantPollTimerId = setInterval(() => {\n\t\t\tgetTask(taskId).then(response => {\n\t\t\t\tconst task = response.data?.ocs?.data?.task\n\t\t\t\tif (window.assistantPollTimerId === null) {\n\t\t\t\t\treject(new Error('pollTask cancelled'))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (obj) {\n\t\t\t\t\tcallback(task, obj)\n\t\t\t\t}\n\t\t\t\tif (![TASK_STATUS_STRING.scheduled, TASK_STATUS_STRING.running].includes(task?.status)) {\n\t\t\t\t\t// stop polling\n\t\t\t\t\tclearInterval(window.assistantPollTimerId)\n\t\t\t\t\twindow.assistantPollTimerId = null\n\t\t\t\t\tresolve(task)\n\t\t\t\t}\n\t\t\t}).catch(error => {\n\t\t\t\tconsole.debug('[assistant] poll request failed', error)\n\t\t\t\tif (error.status === 404) {\n\t\t\t\t\tclearInterval(window.assistantPollTimerId)\n\t\t\t\t\twindow.assistantPollTimerId = null\n\t\t\t\t\treject(new Error('task-not-found'))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\treject(new Error('pollTask request failed'))\n\t\t\t})\n\t\t}, 2000)\n\t})\n}\n\nexport async function cancelTaskPolling() {\n\twindow.assistantAbortController?.abort()\n\tclearInterval(window.assistantPollTimerId)\n\twindow.assistantPollTimerId = null\n}\n\nexport async function getTask(taskId) {\n\twindow.assistantAbortController = new AbortController()\n\tconst { default: axios } = await import('@nextcloud/axios')\n\tconst { generateOcsUrl } = await import('@nextcloud/router')\n\tconst url = generateOcsUrl('taskprocessing/task/{taskId}', { taskId })\n\treturn axios.get(url, { signal: window.assistantAbortController.signal })\n}\n\nexport async function getNotifyReady(taskId) {\n\tconst { default: axios } = await import('@nextcloud/axios')\n\tconst { generateOcsUrl } = await import('@nextcloud/router')\n\tconst url = generateOcsUrl('/apps/assistant/api/v1/task/{taskId}/notify', { taskId })\n\treturn axios.get(url, {})\n}\n\nexport async function setNotifyReady(taskId, enable) {\n\tconst { default: axios } = await import('@nextcloud/axios')\n\tconst { generateOcsUrl } = await import('@nextcloud/router')\n\treturn axios({\n\t\tmethod: enable ? 'post' : 'delete',\n\t\turl: generateOcsUrl('/apps/assistant/api/v1/task/{taskId}/notify', { taskId }),\n\t})\n}\n\nexport async function cancelTask(taskId) {\n\tconst { default: axios } = await import('@nextcloud/axios')\n\tconst { generateOcsUrl } = await import('@nextcloud/router')\n\tconst url = generateOcsUrl('taskprocessing/task/{taskId}', { taskId })\n\treturn axios.delete(url, {})\n}\n\n/**\n * Send a request to schedule a task\n *\n * @param {string} appId the scheduling app id\n * @param {string} customId the task custom ID\n * @param {string} taskType the task type class\n * @param {Array} inputs the task input texts as an array\n * @return {Promise<*>}\n */\nexport async function scheduleTask(appId, customId, taskType, inputs) {\n\twindow.assistantAbortController = new AbortController()\n\tconst { default: axios } = await import('@nextcloud/axios')\n\tconst { generateOcsUrl } = await import('@nextcloud/router')\n\tif (taskType === 'core:text2text:translate') {\n\t\tsaveLastTargetLanguage(inputs.target_language)\n\t}\n\tconst url = generateOcsUrl('taskprocessing/schedule')\n\tconst params = {\n\t\tinput: inputs,\n\t\ttype: taskType,\n\t\tappId,\n\t\tcustomId,\n\t}\n\treturn axios.post(url, params, { signal: window.assistantAbortController.signal })\n}\n\nexport async function saveLastSelectedTaskType(taskType) {\n\tconst { default: axios } = await import('@nextcloud/axios')\n\tconst { generateUrl } = await import('@nextcloud/router')\n\n\tconst req = {\n\t\tvalues: {\n\t\t\tlast_task_type: taskType,\n\t\t},\n\t}\n\tconst url = generateUrl('/apps/assistant/config')\n\treturn axios.put(url, req)\n}\n\nasync function getLastSelectedTaskType() {\n\tconst { default: axios } = await import('@nextcloud/axios')\n\tconst { generateUrl } = await import('@nextcloud/router')\n\n\tconst req = {\n\t\tparams: {\n\t\t\tkey: 'last_task_type',\n\t\t},\n\t}\n\tconst url = generateUrl('/apps/assistant/config')\n\treturn axios.get(url, req).catch(error => {\n\t\tif (error.response?.status === 404) {\n\t\t\tconsole.debug(t('assistant', 'No last task type available, falling back to default'))\n\t\t\treturn { data: 'chatty-llm' }\n\t\t}\n\n\t\tconsole.error(error)\n\t})\n}\n\nasync function saveLastTargetLanguage(targetLanguage) {\n\tOCA.Assistant.last_target_language = targetLanguage\n\n\tconst { default: axios } = await import('@nextcloud/axios')\n\tconst { generateUrl } = await import('@nextcloud/router')\n\n\tconst req = {\n\t\tvalues: {\n\t\t\tlast_target_language: targetLanguage,\n\t\t},\n\t}\n\tconst url = generateUrl('/apps/assistant/config')\n\treturn axios.put(url, req)\n}\n\n/**\n * Check if we want to cancel a notification action click and handle it ourselves\n *\n * @param {event} event the notification event\n */\nexport function handleNotification(event) {\n\tif (event.notification.app !== 'assistant' || event.action.type !== 'WEB') {\n\t\treturn\n\t}\n\t// Handle the action click only if the task was scheduled by the assistant\n\t// or if the scheduling app didn't give any notification target\n\t// We use the object type to know\n\tif (event.notification.objectType === 'task') {\n\t\tevent.cancelAction = true\n\t\tshowAssistantTaskResult(event.notification.objectId)\n\t}\n}\n\n/**\n * Show the result of a task based on the meta task id\n *\n * @param {number} taskId the assistant meta task id to show the result of\n * @return {Promise<void>}\n */\nasync function showAssistantTaskResult(taskId) {\n\tgetTask(taskId).then(response => {\n\t\tconsole.debug('showing results for task', response.data?.ocs?.data?.task)\n\t\topenAssistantTask(response.data?.ocs?.data?.task, {})\n\t}).catch(error => {\n\t\tif (error.response?.status === 401) {\n\t\t\tshowError(t('assistant', 'Please log in to view the task result'))\n\t\t\treturn\n\t\t}\n\n\t\tconsole.error(error)\n\t\tshowError(t('assistant', 'This task does not exist or has been cleaned up'))\n\t})\n}\n\n/**\n * Open an assistant modal to show the result of a task\n *\n * @param {object} task the task we want to see the result of\n * @param {object} params parameters for the assistant\n * @param {boolean} params.isInsideViewer Should be true if this function is called while the Viewer is displayed\n * @param {Array} params.actionButtons List of extra buttons to show in the assistant result form\n * @param {HTMLElement} params.mountPoint The DOM element in which the assistant modal will be mounted\n * @return {Promise<void>}\n */\nexport async function openAssistantTask(\n\ttask,\n\t{\n\t\tisInsideViewer = undefined,\n\t\tactionButtons = undefined,\n\t\tmountPoint = null,\n\t} = {}) {\n\tconst { createApp } = await import('vue')\n\tconst { default: AssistantTextProcessingModal } = await import('./components/AssistantTextProcessingModal.vue')\n\n\tlet modalMountPoint\n\tconst content = document.querySelector('#content') ?? document.querySelector('#content-vue')\n\n\tif (mountPoint !== null) {\n\t\t// if a mount point is specified, always use it\n\t\tmodalMountPoint = mountPoint\n\t} else {\n\t\tconst modalId = 'assistantTextProcessingModal'\n\t\tmodalMountPoint = document.createElement('div')\n\t\tmodalMountPoint.id = modalId\n\t\t// the default mount point location is different whether the assistant is opened from the viewer or not\n\t\tif (isInsideViewer) {\n\t\t\t// so the assistant modal is opened on top of the current viewer\n\t\t\tdocument.querySelector('body').append(modalMountPoint)\n\t\t} else {\n\t\t\t// so the viewer can be later opened on top of the assistant\n\t\t\tdocument.querySelector('body').insertBefore(modalMountPoint, content.nextSibling)\n\t\t}\n\t}\n\n\tconst app = createApp(\n\t\tAssistantTextProcessingModal,\n\t\t{\n\t\t\tisInsideViewer,\n\t\t\tinitSelectedTaskId: task.id,\n\t\t\tinitInputs: task.input,\n\t\t\tinitOutputs: task.output ?? {},\n\t\t\tinitSelectedTaskTypeId: task.type,\n\t\t\tactionButtons,\n\t\t},\n\t)\n\tapp.mixin({ methods: { t, n } })\n\tconst view = app.mount(modalMountPoint)\n\tlet lastTask = task\n\n\tmodalMountPoint.addEventListener('cancel', () => {\n\t\tcancelTaskPolling()\n\t\tapp.unmount()\n\t})\n\tmodalMountPoint.addEventListener('submit', (data) => {\n\t\tscheduleTask(task.appId, task.identifier ?? '', data.detail.selectedTaskTypeId, data.detail.inputs)\n\t\t\t.then((response) => {\n\t\t\t\tconsole.debug('scheduled task', response.data?.ocs?.data?.task)\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tapp.unmount()\n\t\t\t\tconsole.error('Assistant scheduling error', error)\n\t\t\t\tshowError(\n\t\t\t\t\tt('assistant', 'Assistant failed to schedule your task')\n\t\t\t\t\t\t+ '. ' + t('assistant', 'Please try again and inform the server administrators if this issue persists.'),\n\t\t\t\t)\n\t\t\t})\n\t})\n\tconst syncSubmit = (inputs, taskTypeId, newTaskCustomId = '') => {\n\t\tview.loading = true\n\t\tview.showSyncTaskRunning = true\n\t\tview.isNotifyEnabled = false\n\t\tview.expectedRuntime = null\n\t\tview.inputs = inputs\n\t\tview.selectedTaskTypeId = taskTypeId\n\n\t\tscheduleTask('assistant', newTaskCustomId, taskTypeId, inputs)\n\t\t\t.then((response) => {\n\t\t\t\tconst task = response.data?.ocs?.data?.task\n\t\t\t\tlastTask = task\n\t\t\t\tview.selectedTaskId = lastTask?.id\n\t\t\t\tview.expectedRuntime = (lastTask?.completionExpectedAt - lastTask?.scheduledAt) || null\n\t\t\t\tpollTask(task.id, view).then(finishedTask => {\n\t\t\t\t\tif (finishedTask.status === TASK_STATUS_STRING.successful) {\n\t\t\t\t\t\tview.outputs = finishedTask?.output\n\t\t\t\t\t} else if (finishedTask.status === TASK_STATUS_STRING.failed) {\n\t\t\t\t\t\tshowError(\n\t\t\t\t\t\t\tt('assistant', 'The server failed to process your task with ID {id}', { id: finishedTask.id })\n\t\t\t\t\t\t\t\t+ '. ' + t('assistant', 'Please inform the server administrators of this issue.'),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconsole.error('[assistant] Task failed', finishedTask)\n\t\t\t\t\t\tview.outputs = null\n\t\t\t\t\t}\n\t\t\t\t\t// resolve(finishedTask)\n\t\t\t\t\tview.loading = false\n\t\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\t\temit('assistant:task:updated', finishedTask)\n\t\t\t\t}).catch(error => {\n\t\t\t\t\tconsole.debug('[assistant] poll error', error)\n\t\t\t\t\tview.outputs = null\n\t\t\t\t\tif (error.message === 'task-not-found') {\n\t\t\t\t\t\tview.loading = false\n\t\t\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\t\t\tview.isNotifyEnabled = false\n\t\t\t\t\t\tview.selectedTaskId = null\n\t\t\t\t\t\tlastTask = null\n\t\t\t\t\t\tshowError(t('assistant', 'The current Assistant task could not be found'))\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tview.loading = false\n\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\tconsole.error('Assistant scheduling error', error?.response?.data?.ocs?.data?.message)\n\t\t\t\tshowError(t('assistant', 'Assistant error') + ': ' + t('assistant', 'Something went wrong when scheduling the task'))\n\t\t\t})\n\t}\n\tmodalMountPoint.addEventListener('sync-submit', (data) => {\n\t\tsyncSubmit(data.detail.inputs, data.detail.selectedTaskTypeId, task.identifier ?? '')\n\t})\n\tmodalMountPoint.addEventListener('try-again', (data) => {\n\t\tconst task = data.detail\n\t\tsyncSubmit(task.input, task.type)\n\t})\n\tmodalMountPoint.addEventListener('load-task', (data) => {\n\t\tconst task = data.detail\n\t\tcancelTaskPolling()\n\t\tview.showSyncTaskRunning = false\n\t\tview.isNotifyEnabled = false\n\t\tview.loading = false\n\n\t\tview.selectedTaskTypeId = task.type\n\t\tview.inputs = task.input\n\t\tview.outputs = task.status === TASK_STATUS_STRING.successful ? task.output : null\n\t\tview.selectedTaskId = task.id\n\t\tlastTask = task\n\n\t\tif ([TASK_STATUS_STRING.scheduled, TASK_STATUS_STRING.running].includes(task?.status)) {\n\t\t\tgetTask(task.id).then(response => {\n\t\t\t\tconst updatedTask = response.data?.ocs?.data?.task\n\n\t\t\t\tif (![TASK_STATUS_STRING.scheduled, TASK_STATUS_STRING.running].includes(updatedTask?.status)) {\n\t\t\t\t\tview.selectedTaskTypeId = updatedTask.type\n\t\t\t\t\tview.inputs = updatedTask.input\n\t\t\t\t\tview.outputs = updatedTask.status === TASK_STATUS_STRING.successful ? updatedTask.output : null\n\t\t\t\t\tview.selectedTaskId = updatedTask.id\n\t\t\t\t\tlastTask = updatedTask\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tgetNotifyReady(task.id).then(response => {\n\t\t\t\t\tview.isNotifyEnabled = !!response.data?.ocs?.data?.id\n\t\t\t\t}).catch(error => {\n\t\t\t\t\tconsole.error('[assistant] get task notification status error', error)\n\t\t\t\t})\n\n\t\t\t\tview.loading = true\n\t\t\t\tview.showSyncTaskRunning = true\n\t\t\t\tview.progress = null\n\t\t\t\tview.expectedRuntime = (updatedTask?.completionExpectedAt - updatedTask?.scheduledAt) || null\n\n\t\t\t\tpollTask(updatedTask.id, view).then(finishedTask => {\n\t\t\t\t\tconsole.debug('pollTask.then', finishedTask)\n\t\t\t\t\tif (finishedTask.status === TASK_STATUS_STRING.successful) {\n\t\t\t\t\t\tview.outputs = finishedTask?.output\n\t\t\t\t\t\tview.selectedTaskId = finishedTask?.id\n\t\t\t\t\t} else if (finishedTask.status === TASK_STATUS_STRING.failed) {\n\t\t\t\t\t\tshowError(\n\t\t\t\t\t\t\tt('assistant', 'The server failed to process your task with ID {id}', { id: finishedTask.id })\n\t\t\t\t\t\t\t\t+ '. ' + t('assistant', 'Please inform the server administrators of this issue.'),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconsole.error('[assistant] Task failed', finishedTask)\n\t\t\t\t\t\tview.outputs = null\n\t\t\t\t\t}\n\t\t\t\t\t// resolve(finishedTask)\n\t\t\t\t\tview.loading = false\n\t\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\t\temit('assistant:task:updated', finishedTask)\n\t\t\t\t}).catch(error => {\n\t\t\t\t\tconsole.debug('[assistant] poll error', error)\n\t\t\t\t\tif (error.message === 'task-not-found') {\n\t\t\t\t\t\tview.loading = false\n\t\t\t\t\t\tview.showSyncTaskRunning = false\n\t\t\t\t\t\tview.isNotifyEnabled = false\n\t\t\t\t\t\tview.outputs = null\n\t\t\t\t\t\tview.selectedTaskId = null\n\t\t\t\t\t\tlastTask = null\n\t\t\t\t\t\tshowError(t('assistant', 'The current Assistant task could not be found'))\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}).catch(error => {\n\t\t\t\tconsole.error(error)\n\t\t\t})\n\t\t}\n\t})\n\tmodalMountPoint.addEventListener('new-task', () => {\n\t\tconsole.debug('[assistant] new task')\n\t\tcancelTaskPolling()\n\t\tview.loading = false\n\t\tview.showSyncTaskRunning = false\n\t\tview.isNotifyEnabled = false\n\t\tview.outputs = null\n\t\tview.selectedTaskId = null\n\t\tlastTask = null\n\t})\n\tmodalMountPoint.addEventListener('background-notify', (data) => {\n\t\tsetNotifyReady(lastTask.id, data.detail).then(res => {\n\t\t\tview.isNotifyEnabled = data.detail\n\t\t})\n\t})\n\tmodalMountPoint.addEventListener('cancel-task', () => {\n\t\tcancelTaskPolling()\n\t\tsetNotifyReady(lastTask.id, false)\n\t\tcancelTask(lastTask.id).then(res => {\n\t\t\tview.loading = false\n\t\t\tview.showSyncTaskRunning = false\n\t\t\tview.selectedTaskId = null\n\t\t\tlastTask = null\n\t\t})\n\t})\n\tmodalMountPoint.addEventListener('action-button-clicked', (data) => {\n\t\tif (data.detail.button?.onClick) {\n\t\t\tlastTask.output = data.detail.output\n\t\t\tdata.detail.button.onClick(lastTask)\n\t\t}\n\t\tapp.unmount()\n\t})\n}\n\nexport async function addAssistantMenuEntry() {\n\t// changed in NC 31 header-right -> header-end\n\tconst headerRight = document.querySelector('#header .header-right') ?? document.querySelector('#header .header-end')\n\tconst menuEntry = document.createElement('div')\n\tmenuEntry.id = 'assistant'\n\theaderRight.prepend(menuEntry)\n\n\tconst { createApp } = await import('vue')\n\tconst { default: AssistantHeaderMenuEntry } = await import('./components/AssistantHeaderMenuEntry.vue')\n\n\tconst view = createApp(AssistantHeaderMenuEntry, {})\n\tview.mixin({ methods: { t, n } })\n\tview.mount(menuEntry)\n\n\tmenuEntry.addEventListener('click', () => {\n\t\tif (OCA.Assistant.openingAssistant) {\n\t\t\treturn\n\t\t}\n\t\tOCA.Assistant.openingAssistant = true\n\t\tsetTimeout(() => {\n\t\t\tOCA.Assistant.openingAssistant = false\n\t\t}, 1000)\n\t\topenAssistantForm({ appId: 'assistant' })\n\t\t\t.then(r => {\n\t\t\t\tconsole.debug('[Assistant header menu entry] scheduled task', r)\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error('[Assistant header menu entry] Assistant openAssistantForm promise rejected:', error.message)\n\t\t\t})\n\t})\n}\n"],"file":"assistant-BXW7b7pj.chunk.mjs"} |