import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; import { fn } from "@ember/helper"; import { on } from "@ember/modifier"; import { action } from "@ember/object"; import didInsert from "@ember/render-modifiers/modifiers/did-insert"; import didUpdate from "@ember/render-modifiers/modifiers/did-update"; import { service } from "@ember/service"; import AceEditor from "discourse/components/ace-editor"; import BackButton from "discourse/components/back-button"; import DButton from "discourse/components/d-button"; import DTooltip from "discourse/components/d-tooltip"; import withEventValue from "discourse/helpers/with-event-value"; import { popupAjaxError } from "discourse/lib/ajax-error"; import I18n from "discourse-i18n"; import ComboBox from "select-kit/components/combo-box"; import AiToolParameterEditor from "./ai-tool-parameter-editor"; import AiToolTestModal from "./modal/ai-tool-test-modal"; import RagOptions from "./rag-options"; import RagUploader from "./rag-uploader"; const ACE_EDITOR_MODE = "javascript"; const ACE_EDITOR_THEME = "chrome"; export default class AiToolEditor extends Component { @service router; @service dialog; @service modal; @service toasts; @service store; @service siteSettings; @tracked isSaving = false; @tracked editingModel = null; @tracked showDelete = false; @tracked selectedPreset = null; get presets() { return this.args.presets.map((preset) => { return { name: preset.preset_name, id: preset.preset_id, }; }); } get showPresets() { return !this.selectedPreset && this.args.model.isNew; } @action updateModel() { this.editingModel = this.args.model.workingCopy(); this.showDelete = !this.args.model.isNew; } @action configurePreset() { this.selectedPreset = this.args.presets.findBy("preset_id", this.presetId); this.editingModel = this.store .createRecord("ai-tool", this.selectedPreset) .workingCopy(); this.showDelete = false; } @action updateUploads(uploads) { this.editingModel.rag_uploads = uploads; } @action removeUpload(upload) { this.editingModel.rag_uploads.removeObject(upload); if (!this.args.model.isNew) { this.save(); } } @action async save() { this.isSaving = true; try { const data = this.editingModel.getProperties( "name", "description", "parameters", "script", "summary", "rag_uploads", "rag_chunk_tokens", "rag_chunk_overlap_tokens" ); await this.args.model.save(data); this.toasts.success({ data: { message: I18n.t("discourse_ai.tools.saved") }, duration: 2000, }); if (!this.args.tools.any((tool) => tool.id === this.args.model.id)) { this.args.tools.pushObject(this.args.model); } this.router.transitionTo( "adminPlugins.show.discourse-ai-tools.show", this.args.model ); } catch (e) { popupAjaxError(e); } finally { this.isSaving = false; } } @action delete() { return this.dialog.confirm({ message: I18n.t("discourse_ai.tools.confirm_delete"), didConfirm: async () => { await this.args.model.destroyRecord(); this.args.tools.removeObject(this.args.model); this.router.transitionTo("adminPlugins.show.discourse-ai-tools.index"); }, }); } @action openTestModal() { this.modal.show(AiToolTestModal, { model: { tool: this.editingModel, }, }); } }