plugin-build-guide-block 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,74 @@
1
+ # @nocobase/plugin-build-guide-block
2
+
3
+ Plugin tạo **User Guide (Hướng dẫn sử dụng)** dạng HTML từ tài liệu đính kèm bằng LLM, hiển thị dưới dạng block trên trang NocoBase.
4
+
5
+ ## Tính năng
6
+
7
+ ### Quản lý Space
8
+ - **Tạo Space**: Mỗi Space đại diện cho một bộ hướng dẫn, bao gồm tiêu đề, dịch vụ LLM, model, system prompt, và tài liệu đính kèm (tối đa 10 file).
9
+ - **Build bất đồng bộ**: Nhấn "Build" sẽ gửi tài liệu tới LLM để sinh HTML. Quá trình chạy nền — không block request, tránh timeout.
10
+ - **Trạng thái**: `draft` → `building` → `completed` | `error`. Build log hiển thị trực tiếp trên bảng quản lý.
11
+ - **CRUD đầy đủ**: Tạo, sửa, xóa Space (có xác nhận trước khi xóa).
12
+
13
+ ### User Guide Block
14
+ - Thêm block **"User Guide"** vào bất kỳ trang NocoBase nào qua menu "Add Block".
15
+ - Chọn Space (chỉ hiển thị các Space đã `completed`) trong cài đặt block.
16
+ - HTML được sanitize ở cả server (sanitize-html) và client (DOMPurify) để đảm bảo an toàn.
17
+
18
+ ### Bảo mật
19
+ - **ACL**: Chỉ admin với snippet `pm.ai-build-guide` mới CRUD/build được. User `loggedIn` chỉ đọc được HTML (`getHtml`).
20
+ - **HTML Sanitization**: Hai lớp bảo vệ — server-side (sanitize-html) + client-side (DOMPurify).
21
+ - **Status guard**: API `getHtml` chỉ trả HTML khi Space ở trạng thái `completed`.
22
+
23
+ ### Đa ngôn ngữ
24
+ - Hỗ trợ 3 ngôn ngữ: English (`en-US`), Tiếng Việt (`vi-VN`), 中文 (`zh-CN`).
25
+
26
+ ## Kiến trúc
27
+
28
+ ```
29
+ src/
30
+ ├── server/
31
+ │ ├── plugin.ts # Đăng ký actions, ACL
32
+ │ ├── actions/
33
+ │ │ ├── build.ts # Build async: đọc docs → gọi LLM → sanitize → lưu HTML
34
+ │ │ └── getHtml.ts # Trả raw HTML (Content-Type: text/html)
35
+ │ └── collections/
36
+ │ └── ai-build-guide-spaces.ts # Collection definition
37
+ ├── client/
38
+ │ ├── plugin.tsx # Đăng ký settings page, block initializer, FlowEngine model
39
+ │ ├── UserGuideBlock.tsx # Render HTML với DOMPurify
40
+ │ ├── UserGuideManager.tsx # Trang quản lý CRUD
41
+ │ ├── UserGuideBlockInitializer.tsx
42
+ │ ├── UserGuideBlockProvider.tsx
43
+ │ ├── schemas/
44
+ │ │ └── spacesSchema.ts # UI schema cho bảng + form
45
+ │ ├── components/
46
+ │ │ ├── BuildButton.tsx # Nút Build với auto-refresh
47
+ │ │ ├── LLMServiceSelect.tsx
48
+ │ │ ├── ModelSelect.tsx
49
+ │ │ └── StatusTag.tsx
50
+ │ └── models/
51
+ │ └── UserGuideBlockModel.ts # FlowEngine block model
52
+ └── locale/
53
+ ├── en-US.json
54
+ ├── vi-VN.json
55
+ └── zh-CN.json
56
+ ```
57
+
58
+ ## Dependencies
59
+
60
+ | Package | Loại | Mục đích |
61
+ |---------|------|----------|
62
+ | `sanitize-html` | dependency | Sanitize HTML phía server |
63
+ | `dompurify` | dependency | Sanitize HTML phía client |
64
+ | `@nocobase/plugin-ai` | peerDependency | Kết nối LLM service |
65
+ | `@nocobase/plugin-file-manager` | peerDependency | Đọc file đính kèm |
66
+ | `@langchain/core` | peerDependency | Message types cho LLM |
67
+ | `axios` | peerDependency | Fetch file từ URL |
68
+
69
+ ## Cách sử dụng
70
+
71
+ 1. Bật plugin trong Plugin Manager.
72
+ 2. Vào **Settings → Build Guide Block** để tạo Space.
73
+ 3. Chọn LLM Service, Model, upload tài liệu, nhấn **Build**.
74
+ 4. Khi status = `completed`, vào trang bất kỳ → **Add Block → User Guide** → chọn Space.
package/client.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './dist/client';
2
+ export { default } from './dist/client';
package/client.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/client/index.js');
@@ -0,0 +1,10 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@formily/core"),require("react-i18next"),require("@nocobase/client"),require("react"),require("@nocobase/flow-engine"),require("@formily/react"),require("@ant-design/icons"),require("antd")):"function"==typeof define&&define.amd?define("plugin-build-guide-block",["@formily/core","react-i18next","@nocobase/client","react","@nocobase/flow-engine","@formily/react","@ant-design/icons","antd"],t):"object"==typeof exports?exports["plugin-build-guide-block"]=t(require("@formily/core"),require("react-i18next"),require("@nocobase/client"),require("react"),require("@nocobase/flow-engine"),require("@formily/react"),require("@ant-design/icons"),require("antd")):e["plugin-build-guide-block"]=t(e["@formily/core"],e["react-i18next"],e["@nocobase/client"],e.react,e["@nocobase/flow-engine"],e["@formily/react"],e["@ant-design/icons"],e.antd)}(self,function(e,t,n,r,o,i,a,l){return function(){"use strict";var c={482:function(e){e.exports=a},563:function(t){t.exports=e},505:function(e){e.exports=i},772:function(e){e.exports=n},667:function(e){e.exports=o},721:function(e){e.exports=l},156:function(e){e.exports=r},238:function(e){e.exports=t}},u={};function s(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return c[e](n,n.exports,s),n.exports}s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},s.d=function(e,t){for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var p={};return!function(){s.r(p),s.d(p,{default:function(){return eB}});var e,t=s(772),n=s(156),r=s.n(n),o=s(563),i=s(721),a=s(238),l={type:"object",properties:{page:{type:"void","x-component":"Page","x-component-props":{ghost:!0},properties:{actions:{type:"void","x-component":"ActionBar","x-component-props":{style:{marginBottom:16}},properties:{create:{type:"void","x-component":"Action","x-component-props":{type:"primary",title:'{{t("Create space")}}',icon:"PlusOutlined"},properties:{drawer:{type:"void","x-component":"Action.Drawer","x-component-props":{title:'{{t("Create space")}}'},properties:{form:{type:"void","x-component":"FormV2","x-use-component-props":"useCreateFormProps",properties:{title:{type:"string",title:'{{t("Title")}}',required:!0,"x-decorator":"FormItem","x-component":"Input"},llmService:{type:"string",title:'{{t("LLM Service")}}',required:!0,"x-decorator":"FormItem","x-component":"LLMServiceSelect"},model:{type:"string",title:'{{t("Model")}}',required:!0,"x-decorator":"FormItem","x-component":"ModelSelect","x-reactions":{dependencies:["llmService"],fulfill:{state:{value:"{{$deps[0] ? $self.value : undefined}}"}}}},systemPrompt:{type:"string",title:'{{t("System Prompt")}}',"x-decorator":"FormItem","x-component":"Input.TextArea","x-component-props":{rows:4},default:"You are an expert technical writer. Please generate a comprehensive HTML user guide based on the provided documents. Ensure the output is valid HTML and does not include Markdown syntax like ```html blocks."},documents:{type:"array",title:'{{t("Documents")}}',"x-decorator":"FormItem","x-component":"Upload.Attachment","x-component-props":{multiple:!0,action:"attachments:create",maxCount:10}},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{type:"void",title:'{{t("Cancel")}}',"x-component":"Action","x-use-component-props":"useCancelActionProps"},submit:{type:"void",title:'{{t("Submit")}}',"x-component":"Action","x-use-component-props":"useCreateActionProps"}}}}}}}}}}},table:{type:"array","x-decorator":"TableBlockProvider","x-use-decorator-props":"useTableBlockProps","x-component":"TableV2","x-component-props":{rowKey:"id",rowSelection:{type:"checkbox"}},properties:{title:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column",properties:{title:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},status:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column",properties:{status:{type:"string","x-component":"StatusTag","x-read-pretty":!0}}},buildLog:{type:"void","x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column",properties:{buildLog:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},actions:{type:"void",title:'{{t("Actions")}}',"x-decorator":"TableV2.Column.Decorator","x-component":"TableV2.Column",properties:{actions:{type:"void","x-component":"Space","x-component-props":{split:"|"},properties:{build:{type:"void","x-component":"BuildButton"},update:{type:"void",title:'{{t("Edit")}}',"x-component":"Action.Link","x-component-props":{type:"primary"},properties:{drawer:{type:"void","x-component":"Action.Drawer","x-component-props":{title:'{{t("Edit space")}}'},properties:{form:{type:"void","x-component":"FormV2","x-use-component-props":"useEditFormProps",properties:{title:{type:"string",title:'{{t("Title")}}',required:!0,"x-decorator":"FormItem","x-component":"Input"},llmService:{type:"string",title:'{{t("LLM Service")}}',required:!0,"x-decorator":"FormItem","x-component":"LLMServiceSelect"},model:{type:"string",title:'{{t("Model")}}',required:!0,"x-decorator":"FormItem","x-component":"ModelSelect"},systemPrompt:{type:"string",title:'{{t("System Prompt")}}',"x-decorator":"FormItem","x-component":"Input.TextArea","x-component-props":{rows:4}},documents:{type:"array",title:'{{t("Documents")}}',"x-decorator":"FormItem","x-component":"Upload.Attachment","x-component-props":{multiple:!0,action:"attachments:create",maxCount:10}},generatedHtml:{type:"string",title:'{{t("Generated HTML")}}',"x-decorator":"FormItem","x-component":"Input.TextArea","x-component-props":{rows:6},"x-read-pretty":!0},buildLog:{type:"string",title:'{{t("Build Log")}}',"x-decorator":"FormItem","x-component":"Input.TextArea","x-read-pretty":!0},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{type:"void",title:'{{t("Cancel")}}',"x-component":"Action","x-use-component-props":"useCancelActionProps"},submit:{type:"void",title:'{{t("Submit")}}',"x-component":"Action","x-use-component-props":"useUpdateActionProps"}}}}}}}}},delete:{type:"void",title:'{{t("Delete")}}',"x-component":"Action.Link","x-use-component-props":"useDestroyActionProps","x-component-props":{confirm:{title:'{{t("Delete")}}',content:'{{t("Are you sure you want to delete this space?")}}'}}}}}}}}}}}}},c=s(505);function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function f(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,l=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(e){l=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(l)throw r}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return u(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var m=function(e){var o,a,l=f((0,n.useState)([]),2),u=l[0],s=l[1],p=f((0,n.useState)(!1),2),m=p[0],d=p[1],y=(0,t.useAPIClient)(),h=(0,c.useField)();return(0,n.useEffect)(function(){var e=!0;return d(!0),y.resource("ai").listLLMServices().then(function(t){if(e){var n;s(((null==t||null==(n=t.data)?void 0:n.data)||[]).map(function(e){return{label:e.title||e.name,value:e.name}}))}}).catch(function(t){e&&console.error("Failed to load LLM services:",t)}).finally(function(){e&&d(!1)}),function(){e=!1}},[y]),r().createElement(i.Select,(o=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},e),a=a={options:u,loading:m,value:h.value,onChange:function(e){var t;h.setValue(e),null==(t=h.query(".model").take())||t.setValue(void 0)}},Object.getOwnPropertyDescriptors?Object.defineProperties(o,Object.getOwnPropertyDescriptors(a)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(a)).forEach(function(e){Object.defineProperty(o,e,Object.getOwnPropertyDescriptor(a,e))}),o))};function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var y=function(e){var o,a,l,u=(o=(0,n.useState)([]),function(e){if(Array.isArray(e))return e}(o)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,l=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){l=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(l)throw r}}return i}}(o,2)||function(e,t){if(e){if("string"==typeof e)return d(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return d(e,t)}}(o,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=u[0],p=u[1],f=(0,t.useAPIClient)(),m=(0,c.useField)(),y=(0,c.useForm)().values.llmService;return(0,n.useEffect)(function(){var e=!0;return y?(f.resource("ai").listModels({llmService:y}).then(function(t){if(e){var n;p(((null==t||null==(n=t.data)?void 0:n.data)||[]).map(function(e){return{label:e.id||e.name,value:e.id||e.name}}))}}).catch(console.error),function(){e=!1}):void p([])},[f,y]),r().createElement(i.Select,(a=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},e),l=l={options:s,value:m.value,onChange:function(e){m.setValue(e)},disabled:!y},Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(l)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(l)).forEach(function(e){Object.defineProperty(a,e,Object.getOwnPropertyDescriptor(l,e))}),a))},h={draft:"default",building:"blue",completed:"success",error:"error"},b=function(e){var t=(0,c.useField)(),n=e.value||t.value;return n?r().createElement(i.Tag,{color:h[n]||"default"},String(n).toUpperCase()):null},g=s(482);function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function x(e,t,n,r,o,i,a){try{var l=e[i](a),c=l.value}catch(e){n(e);return}l.done?t(c):Promise.resolve(c).then(r,o)}var S=function(){var e,o,l,c=(e=(0,n.useState)(!1),function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,l=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){l=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(l)throw r}}return i}}(e,2)||function(e,t){if(e){if("string"==typeof e)return v(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return v(e,t)}}(e,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=c[0],s=c[1],p=(0,t.useAPIClient)(),f=i.App.useApp().message,m=(0,a.useTranslation)().t,d=(0,t.useCollectionRecordData)(),y=(0,t.useDataBlockRequest)().refresh,h=(o=function(){var e,t,n,r;return function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function l(i){return function(l){var c=[i,l];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&c[0]?r.return:c[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,c[1])).done)return o;switch(r=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,r=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===c[0]||2===c[0])){a=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){a.label=c[1];break}if(6===c[0]&&a.label<o[1]){a.label=o[1],o=c;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(c);break}o[2]&&a.ops.pop(),a.trys.pop();continue}c=t.call(e,a)}catch(e){c=[6,e],r=0}finally{n=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(o){switch(o.label){case 0:if(!(null==d?void 0:d.id))return[2];s(!0),o.label=1;case 1:return o.trys.push([1,3,4,5]),[4,p.resource("aiBuildGuideSpaces").build({filterByTk:d.id})];case 2:return o.sent(),f.success(m("Build started")),setTimeout(function(){return null==y?void 0:y()},1500),[3,5];case 3:return console.error(e=o.sent()),f.error((null==e||null==(r=e.response)||null==(n=r.data)||null==(t=n.error)?void 0:t.message)||m("Build failed")),[3,5];case 4:return s(!1),[7];case 5:return[2]}})},l=function(){var e=this,t=arguments;return new Promise(function(n,r){var i=o.apply(e,t);function a(e){x(i,n,r,a,l,"next",e)}function l(e){x(i,n,r,a,l,"throw",e)}a(void 0)})},function(){return l.apply(this,arguments)});return r().createElement(i.Button,{type:"primary",icon:r().createElement(g.PlayCircleOutlined,null),loading:u,onClick:h},m("Build"))};function T(e,t,n,r,o,i,a){try{var l=e[i](a),c=l.value}catch(e){n(e);return}l.done?t(c):Promise.resolve(c).then(r,o)}function w(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){T(i,r,o,a,l,"next",e)}function l(e){T(i,r,o,a,l,"throw",e)}a(void 0)})}}function A(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function l(i){return function(l){var c=[i,l];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&c[0]?r.return:c[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,c[1])).done)return o;switch(r=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,r=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===c[0]||2===c[0])){a=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){a.label=c[1];break}if(6===c[0]&&a.label<o[1]){a.label=o[1],o=c;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(c);break}o[2]&&a.ops.pop(),a.trys.pop();continue}c=t.call(e,a)}catch(e){c=[6,e],r=0}finally{n=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var O=function(){var e=(0,a.useTranslation)().t;return r().createElement(t.ExtendCollectionsProvider,{collections:[{name:"aiBuildGuideSpaces",fields:[{name:"title",type:"string"},{name:"llmService",type:"string"},{name:"model",type:"string"},{name:"status",type:"string"},{name:"buildLog",type:"string"}]}]},r().createElement(t.SchemaComponent,{schema:l,components:{LLMServiceSelect:m,ModelSelect:y,StatusTag:b,BuildButton:S},scope:{t:e,useCreateFormProps:function(){return{form:(0,n.useMemo)(function(){return(0,o.createForm)()},[])}},useEditFormProps:function(){var e=(0,t.useCollectionRecordData)();return{form:(0,n.useMemo)(function(){return(0,o.createForm)({initialValues:e})},[e])}},useCancelActionProps:function(){var e=(0,t.useActionContext)().setVisible;return{type:"default",onClick:function(){e(!1)}}},useCreateActionProps:function(){var n=(0,t.useActionContext)().setVisible,r=i.App.useApp().message,o=(0,t.useDataBlockResource)(),a=(0,t.useDataBlockRequest)().refresh;return{type:"primary",onClick:function(){var t=this;return w(function(){var i;return A(this,function(l){switch(l.label){case 0:return[4,(i=t.form).submit()];case 1:return l.sent(),[4,o.create({values:i.values})];case 2:return l.sent(),a(),r.success(e("Saved successfully")),n(!1),[2]}})})()}}},useUpdateActionProps:function(){var n=(0,t.useActionContext)().setVisible,r=i.App.useApp().message,o=(0,t.useDataBlockResource)(),a=(0,t.useDataBlockRequest)().refresh,l=(0,t.useCollectionRecordData)();return{type:"primary",onClick:function(){var t=this;return w(function(){var i;return A(this,function(c){switch(c.label){case 0:return[4,(i=t.form).submit()];case 1:return c.sent(),[4,o.update({filterByTk:l.id,values:i.values})];case 2:return c.sent(),a(),r.success(e("Saved successfully")),n(!1),[2]}})})()}}},useDestroyActionProps:t.useDestroyActionProps,useTableBlockProps:function(){return{collection:"aiBuildGuideSpaces",request:{resource:"aiBuildGuideSpaces",action:"list",params:{appends:["documents"],sort:["-createdAt"]}}}}}}))};let{entries:E,setPrototypeOf:_,isFrozen:k,getPrototypeOf:C,getOwnPropertyDescriptor:N}=Object,{freeze:P,seal:I,create:D}=Object,{apply:L,construct:R}="undefined"!=typeof Reflect&&Reflect;P||(P=function(e){return e}),I||(I=function(e){return e}),L||(L=function(e,t,n){return e.apply(t,n)}),R||(R=function(e,t){return new e(...t)});let M=K(Array.prototype.forEach),j=K(Array.prototype.lastIndexOf),U=K(Array.prototype.pop),F=K(Array.prototype.push),B=K(Array.prototype.splice),z=K(String.prototype.toLowerCase),G=K(String.prototype.toString),H=K(String.prototype.match),q=K(String.prototype.replace),W=K(String.prototype.indexOf),V=K(String.prototype.trim),Y=K(Object.prototype.hasOwnProperty),$=K(RegExp.prototype.test),X=(e=TypeError,function(){for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return R(e,n)});function K(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var n=arguments.length,r=Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return L(e,t,r)}}function Z(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:z;_&&_(e,null);let r=t.length;for(;r--;){let o=t[r];if("string"==typeof o){let e=n(o);e!==o&&(k(t)||(t[r]=e),o=e)}e[o]=!0}return e}function J(e){let t=D(null);for(let[n,r]of E(e))Y(e,n)&&(Array.isArray(r)?t[n]=function(e){for(let t=0;t<e.length;t++)Y(e,t)||(e[t]=null);return e}(r):r&&"object"==typeof r&&r.constructor===Object?t[n]=J(r):t[n]=r);return t}function Q(e,t){for(;null!==e;){let n=N(e,t);if(n){if(n.get)return K(n.get);if("function"==typeof n.value)return K(n.value)}e=C(e)}return function(){return null}}let ee=P(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),et=P(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),en=P(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),er=P(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),eo=P(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),ei=P(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),ea=P(["#text"]),el=P(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),ec=P(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),eu=P(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),es=P(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),ep=I(/\{\{[\w\W]*|[\w\W]*\}\}/gm),ef=I(/<%[\w\W]*|[\w\W]*%>/gm),em=I(/\$\{[\w\W]*/gm),ed=I(/^data-[\-\w.\u00B7-\uFFFF]+$/),ey=I(/^aria-[\-\w]+$/),eh=I(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),eb=I(/^(?:\w+script|data):/i),eg=I(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),ev=I(/^html$/i);var ex=Object.freeze({__proto__:null,ARIA_ATTR:ey,ATTR_WHITESPACE:eg,CUSTOM_ELEMENT:I(/^[a-z][.\w]*(-[.\w]+)+$/i),DATA_ATTR:ed,DOCTYPE_NAME:ev,ERB_EXPR:ef,IS_ALLOWED_URI:eh,IS_SCRIPT_OR_DATA:eb,MUSTACHE_EXPR:ep,TMPLIT_EXPR:em});let eS={element:1,text:3,progressingInstruction:7,comment:8,document:9},eT=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null,r="data-tt-policy-suffix";t&&t.hasAttribute(r)&&(n=t.getAttribute(r));let o="dompurify"+(n?"#"+n:"");try{return e.createPolicy(o,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+o+" could not be created."),null}},ew=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};var eA=function e(){let t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"undefined"==typeof window?null:window,r=t=>e(t);if(r.version="3.2.6",r.removed=[],!n||!n.document||n.document.nodeType!==eS.document||!n.Element)return r.isSupported=!1,r;let{document:o}=n,i=o,a=i.currentScript,{DocumentFragment:l,HTMLTemplateElement:c,Node:u,Element:s,NodeFilter:p,NamedNodeMap:f=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:m,DOMParser:d,trustedTypes:y}=n,h=s.prototype,b=Q(h,"cloneNode"),g=Q(h,"remove"),v=Q(h,"nextSibling"),x=Q(h,"childNodes"),S=Q(h,"parentNode");if("function"==typeof c){let e=o.createElement("template");e.content&&e.content.ownerDocument&&(o=e.content.ownerDocument)}let T="",{implementation:w,createNodeIterator:A,createDocumentFragment:O,getElementsByTagName:_}=o,{importNode:k}=i,C=ew();r.isSupported="function"==typeof E&&"function"==typeof S&&w&&void 0!==w.createHTMLDocument;let{MUSTACHE_EXPR:N,ERB_EXPR:I,TMPLIT_EXPR:L,DATA_ATTR:R,ARIA_ATTR:K,IS_SCRIPT_OR_DATA:ep,ATTR_WHITESPACE:ef,CUSTOM_ELEMENT:em}=ex,{IS_ALLOWED_URI:ed}=ex,ey=null,eb=Z({},[...ee,...et,...en,...eo,...ea]),eg=null,eA=Z({},[...el,...ec,...eu,...es]),eO=Object.seal(D(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),eE=null,e_=null,ek=!0,eC=!0,eN=!1,eP=!0,eI=!1,eD=!0,eL=!1,eR=!1,eM=!1,ej=!1,eU=!1,eF=!1,eB=!0,ez=!1,eG=!0,eH=!1,eq={},eW=null,eV=Z({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),eY=null,e$=Z({},["audio","video","img","source","image","track"]),eX=null,eK=Z({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),eZ="http://www.w3.org/1998/Math/MathML",eJ="http://www.w3.org/2000/svg",eQ="http://www.w3.org/1999/xhtml",e0=eQ,e1=!1,e2=null,e3=Z({},[eZ,eJ,eQ],G),e6=Z({},["mi","mo","mn","ms","mtext"]),e5=Z({},["annotation-xml"]),e8=Z({},["title","style","font","a","script"]),e4=null,e7=["application/xhtml+xml","text/html"],e9=null,te=null,tt=o.createElement("form"),tn=function(e){return e instanceof RegExp||e instanceof Function},tr=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!te||te!==e){if(e&&"object"==typeof e||(e={}),e=J(e),e9="application/xhtml+xml"===(e4=-1===e7.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE)?G:z,ey=Y(e,"ALLOWED_TAGS")?Z({},e.ALLOWED_TAGS,e9):eb,eg=Y(e,"ALLOWED_ATTR")?Z({},e.ALLOWED_ATTR,e9):eA,e2=Y(e,"ALLOWED_NAMESPACES")?Z({},e.ALLOWED_NAMESPACES,G):e3,eX=Y(e,"ADD_URI_SAFE_ATTR")?Z(J(eK),e.ADD_URI_SAFE_ATTR,e9):eK,eY=Y(e,"ADD_DATA_URI_TAGS")?Z(J(e$),e.ADD_DATA_URI_TAGS,e9):e$,eW=Y(e,"FORBID_CONTENTS")?Z({},e.FORBID_CONTENTS,e9):eV,eE=Y(e,"FORBID_TAGS")?Z({},e.FORBID_TAGS,e9):J({}),e_=Y(e,"FORBID_ATTR")?Z({},e.FORBID_ATTR,e9):J({}),eq=!!Y(e,"USE_PROFILES")&&e.USE_PROFILES,ek=!1!==e.ALLOW_ARIA_ATTR,eC=!1!==e.ALLOW_DATA_ATTR,eN=e.ALLOW_UNKNOWN_PROTOCOLS||!1,eP=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,eI=e.SAFE_FOR_TEMPLATES||!1,eD=!1!==e.SAFE_FOR_XML,eL=e.WHOLE_DOCUMENT||!1,ej=e.RETURN_DOM||!1,eU=e.RETURN_DOM_FRAGMENT||!1,eF=e.RETURN_TRUSTED_TYPE||!1,eM=e.FORCE_BODY||!1,eB=!1!==e.SANITIZE_DOM,ez=e.SANITIZE_NAMED_PROPS||!1,eG=!1!==e.KEEP_CONTENT,eH=e.IN_PLACE||!1,ed=e.ALLOWED_URI_REGEXP||eh,e0=e.NAMESPACE||eQ,e6=e.MATHML_TEXT_INTEGRATION_POINTS||e6,e5=e.HTML_INTEGRATION_POINTS||e5,eO=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&tn(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(eO.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&tn(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(eO.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(eO.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),eI&&(eC=!1),eU&&(ej=!0),eq&&(ey=Z({},ea),eg=[],!0===eq.html&&(Z(ey,ee),Z(eg,el)),!0===eq.svg&&(Z(ey,et),Z(eg,ec),Z(eg,es)),!0===eq.svgFilters&&(Z(ey,en),Z(eg,ec),Z(eg,es)),!0===eq.mathMl&&(Z(ey,eo),Z(eg,eu),Z(eg,es))),e.ADD_TAGS&&(ey===eb&&(ey=J(ey)),Z(ey,e.ADD_TAGS,e9)),e.ADD_ATTR&&(eg===eA&&(eg=J(eg)),Z(eg,e.ADD_ATTR,e9)),e.ADD_URI_SAFE_ATTR&&Z(eX,e.ADD_URI_SAFE_ATTR,e9),e.FORBID_CONTENTS&&(eW===eV&&(eW=J(eW)),Z(eW,e.FORBID_CONTENTS,e9)),eG&&(ey["#text"]=!0),eL&&Z(ey,["html","head","body"]),ey.table&&(Z(ey,["tbody"]),delete eE.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw X('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw X('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');T=(t=e.TRUSTED_TYPES_POLICY).createHTML("")}else void 0===t&&(t=eT(y,a)),null!==t&&"string"==typeof T&&(T=t.createHTML(""));P&&P(e),te=e}},to=Z({},[...et,...en,...er]),ti=Z({},[...eo,...ei]),ta=function(e){let t=S(e);t&&t.tagName||(t={namespaceURI:e0,tagName:"template"});let n=z(e.tagName),r=z(t.tagName);return!!e2[e.namespaceURI]&&(e.namespaceURI===eJ?t.namespaceURI===eQ?"svg"===n:t.namespaceURI===eZ?"svg"===n&&("annotation-xml"===r||e6[r]):!!to[n]:e.namespaceURI===eZ?t.namespaceURI===eQ?"math"===n:t.namespaceURI===eJ?"math"===n&&e5[r]:!!ti[n]:e.namespaceURI===eQ?(t.namespaceURI!==eJ||!!e5[r])&&(t.namespaceURI!==eZ||!!e6[r])&&!ti[n]&&(e8[n]||!to[n]):"application/xhtml+xml"===e4&&!!e2[e.namespaceURI])},tl=function(e){F(r.removed,{element:e});try{S(e).removeChild(e)}catch(t){g(e)}},tc=function(e,t){try{F(r.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){F(r.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(ej||eU)try{tl(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},tu=function(e){let n=null,r=null;if(eM)e="<remove></remove>"+e;else{let t=H(e,/^[\r\n\t ]+/);r=t&&t[0]}"application/xhtml+xml"===e4&&e0===eQ&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");let i=t?t.createHTML(e):e;if(e0===eQ)try{n=new d().parseFromString(i,e4)}catch(e){}if(!n||!n.documentElement){n=w.createDocument(e0,"template",null);try{n.documentElement.innerHTML=e1?T:i}catch(e){}}let a=n.body||n.documentElement;return(e&&r&&a.insertBefore(o.createTextNode(r),a.childNodes[0]||null),e0===eQ)?_.call(n,eL?"html":"body")[0]:eL?n.documentElement:a},ts=function(e){return A.call(e.ownerDocument||e,e,p.SHOW_ELEMENT|p.SHOW_COMMENT|p.SHOW_TEXT|p.SHOW_PROCESSING_INSTRUCTION|p.SHOW_CDATA_SECTION,null)},tp=function(e){return e instanceof m&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof f)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},tf=function(e){return"function"==typeof u&&e instanceof u};function tm(e,t,n){M(e,e=>{e.call(r,t,n,te)})}let td=function(e){let t=null;if(tm(C.beforeSanitizeElements,e,null),tp(e))return tl(e),!0;let n=e9(e.nodeName);if(tm(C.uponSanitizeElement,e,{tagName:n,allowedTags:ey}),eD&&e.hasChildNodes()&&!tf(e.firstElementChild)&&$(/<[/\w!]/g,e.innerHTML)&&$(/<[/\w!]/g,e.textContent)||e.nodeType===eS.progressingInstruction||eD&&e.nodeType===eS.comment&&$(/<[/\w]/g,e.data))return tl(e),!0;if(!ey[n]||eE[n]){if(!eE[n]&&th(n)&&(eO.tagNameCheck instanceof RegExp&&$(eO.tagNameCheck,n)||eO.tagNameCheck instanceof Function&&eO.tagNameCheck(n)))return!1;if(eG&&!eW[n]){let t=S(e)||e.parentNode,n=x(e)||e.childNodes;if(n&&t){let r=n.length;for(let o=r-1;o>=0;--o){let r=b(n[o],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,v(e))}}}return tl(e),!0}return e instanceof s&&!ta(e)||("noscript"===n||"noembed"===n||"noframes"===n)&&$(/<\/no(script|embed|frames)/i,e.innerHTML)?(tl(e),!0):(eI&&e.nodeType===eS.text&&(t=e.textContent,M([N,I,L],e=>{t=q(t,e," ")}),e.textContent!==t&&(F(r.removed,{element:e.cloneNode()}),e.textContent=t)),tm(C.afterSanitizeElements,e,null),!1)},ty=function(e,t,n){if(eB&&("id"===t||"name"===t)&&(n in o||n in tt))return!1;if(eC&&!e_[t]&&$(R,t));else if(ek&&$(K,t));else if(!eg[t]||e_[t]){if(!(th(e)&&(eO.tagNameCheck instanceof RegExp&&$(eO.tagNameCheck,e)||eO.tagNameCheck instanceof Function&&eO.tagNameCheck(e))&&(eO.attributeNameCheck instanceof RegExp&&$(eO.attributeNameCheck,t)||eO.attributeNameCheck instanceof Function&&eO.attributeNameCheck(t))||"is"===t&&eO.allowCustomizedBuiltInElements&&(eO.tagNameCheck instanceof RegExp&&$(eO.tagNameCheck,n)||eO.tagNameCheck instanceof Function&&eO.tagNameCheck(n))))return!1}else if(eX[t]);else if($(ed,q(n,ef,"")));else if(("src"===t||"xlink:href"===t||"href"===t)&&"script"!==e&&0===W(n,"data:")&&eY[e]);else if(eN&&!$(ep,q(n,ef,"")));else if(n)return!1;return!0},th=function(e){return"annotation-xml"!==e&&H(e,em)},tb=function(e){tm(C.beforeSanitizeAttributes,e,null);let{attributes:n}=e;if(!n||tp(e))return;let o={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:eg,forceKeepAttr:void 0},i=n.length;for(;i--;){let{name:a,namespaceURI:l,value:c}=n[i],u=e9(a),s="value"===a?c:V(c);if(o.attrName=u,o.attrValue=s,o.keepAttr=!0,o.forceKeepAttr=void 0,tm(C.uponSanitizeAttribute,e,o),s=o.attrValue,ez&&("id"===u||"name"===u)&&(tc(a,e),s="user-content-"+s),eD&&$(/((--!?|])>)|<\/(style|title)/i,s)){tc(a,e);continue}if(o.forceKeepAttr)continue;if(!o.keepAttr||!eP&&$(/\/>/i,s)){tc(a,e);continue}eI&&M([N,I,L],e=>{s=q(s,e," ")});let p=e9(e.nodeName);if(!ty(p,u,s)){tc(a,e);continue}if(t&&"object"==typeof y&&"function"==typeof y.getAttributeType)if(l);else switch(y.getAttributeType(p,u)){case"TrustedHTML":s=t.createHTML(s);break;case"TrustedScriptURL":s=t.createScriptURL(s)}if(s!==c)try{l?e.setAttributeNS(l,a,s):e.setAttribute(a,s),tp(e)?tl(e):U(r.removed)}catch(t){tc(a,e)}}tm(C.afterSanitizeAttributes,e,null)},tg=function e(t){let n=null,r=ts(t);for(tm(C.beforeSanitizeShadowDOM,t,null);n=r.nextNode();)tm(C.uponSanitizeShadowNode,n,null),td(n),tb(n),n.content instanceof l&&e(n.content);tm(C.afterSanitizeShadowDOM,t,null)};return r.sanitize=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=null,a=null,c=null,s=null;if((e1=!e)&&(e="\x3c!--\x3e"),"string"!=typeof e&&!tf(e))if("function"==typeof e.toString){if("string"!=typeof(e=e.toString()))throw X("dirty is not a string, aborting")}else throw X("toString is not a function");if(!r.isSupported)return e;if(eR||tr(n),r.removed=[],"string"==typeof e&&(eH=!1),eH){if(e.nodeName){let t=e9(e.nodeName);if(!ey[t]||eE[t])throw X("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof u)(a=(o=tu("\x3c!----\x3e")).ownerDocument.importNode(e,!0)).nodeType===eS.element&&"BODY"===a.nodeName||"HTML"===a.nodeName?o=a:o.appendChild(a);else{if(!ej&&!eI&&!eL&&-1===e.indexOf("<"))return t&&eF?t.createHTML(e):e;if(!(o=tu(e)))return ej?null:eF?T:""}o&&eM&&tl(o.firstChild);let p=ts(eH?e:o);for(;c=p.nextNode();)td(c),tb(c),c.content instanceof l&&tg(c.content);if(eH)return e;if(ej){if(eU)for(s=O.call(o.ownerDocument);o.firstChild;)s.appendChild(o.firstChild);else s=o;return(eg.shadowroot||eg.shadowrootmode)&&(s=k.call(i,s,!0)),s}let f=eL?o.outerHTML:o.innerHTML;return eL&&ey["!doctype"]&&o.ownerDocument&&o.ownerDocument.doctype&&o.ownerDocument.doctype.name&&$(ev,o.ownerDocument.doctype.name)&&(f="<!DOCTYPE "+o.ownerDocument.doctype.name+">\n"+f),eI&&M([N,I,L],e=>{f=q(f,e," ")}),t&&eF?t.createHTML(f):f},r.setConfig=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};tr(e),eR=!0},r.clearConfig=function(){te=null,eR=!1},r.isValidAttribute=function(e,t,n){return te||tr({}),ty(e9(e),e9(t),n)},r.addHook=function(e,t){"function"==typeof t&&F(C[e],t)},r.removeHook=function(e,t){if(void 0!==t){let n=j(C[e],t);return -1===n?void 0:B(C[e],n,1)[0]}return U(C[e])},r.removeHooks=function(e){C[e]=[]},r.removeAllHooks=function(){C=ew()},r}(),eO=(0,c.observer)(function(e){var n=e.spaceId,o=(0,a.useTranslation)().t,l=(0,t.useRequest)({url:"aiBuildGuideSpaces:getHtml/".concat(n)},{refreshDeps:[n],ready:!!n}),c=l.loading,u=l.data;return n?c?r().createElement(i.Card,{style:{padding:24,textAlign:"center"}},r().createElement(i.Spin,{size:"large"})):r().createElement(i.Card,{bordered:!1,className:"user-guide-block",style:{width:"100%",minHeight:300}},r().createElement("div",{className:"user-guide-content",dangerouslySetInnerHTML:{__html:eA.sanitize((null==u?void 0:u.data)||"")}})):r().createElement(i.Card,{style:{padding:24,textAlign:"center",color:"#888"}},o("Please select a User Guide Space in block settings"))},{displayName:"UserGuideBlock"}),eE=function(){var e,n,o=(0,t.useSchemaInitializer)().insert,i=(0,t.useSchemaInitializerItem)();return r().createElement(t.SchemaInitializerItem,(e=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},i),n=n={icon:r().createElement(g.ReadOutlined,null),onClick:function(){o({type:"void","x-settings":"userGuideBlockSettings","x-decorator":"BlockItem","x-decorator-props":{name:"userGuide"},"x-component":"UserGuideBlock","x-component-props":{}})}},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}),e))},e_=function(e){return r().createElement(t.SchemaComponentOptions,{components:{UserGuideBlock:eO,UserGuideBlockInitializer:eE}},e.children)},ek=s(667);function eC(e,t,n,r,o,i,a){try{var l=e[i](a),c=l.value}catch(e){n(e);return}l.done?t(c):Promise.resolve(c).then(r,o)}function eN(e){return(eN=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function eP(e,t){return(eP=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function eI(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(eI=function(){return!!e})()}var eD=function(e){if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function t(){var e,n;if(!(this instanceof t))throw TypeError("Cannot call a class as a function");return e=t,n=arguments,e=eN(e),function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,eI()?Reflect.construct(e,n||[],eN(this).constructor):e.apply(this,n))}return t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&eP(t,e),t}(t.BlockModel);function eL(e,t,n,r,o,i,a){try{var l=e[i](a),c=l.value}catch(e){n(e);return}l.done?t(c):Promise.resolve(c).then(r,o)}function eR(e,t,n){return(eR=eF()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&ej(o,n.prototype),o}).apply(null,arguments)}eD.registerFlow({key:"userGuideBlockSettings",title:(0,ek.escapeT)("User guide block setting",{ns:"build-guide-block"}),steps:{editUserGuide:{title:(0,ek.escapeT)("Edit user guide settings",{ns:"build-guide-block"}),uiSchema:function(e){return{spaceId:{title:(0,e.t)("Space"),type:"string","x-decorator":"FormItem","x-component":"RemoteSelect","x-component-props":{showSearch:!0,fieldNames:{label:"title",value:"id"},service:{resource:"aiBuildGuideSpaces",action:"list",params:{filter:{status:"completed"}}}},required:!0}}},handler:function(e,t){var n;return(n=function(){var n;return function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function l(i){return function(l){var c=[i,l];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&c[0]?r.return:c[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,c[1])).done)return o;switch(r=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,r=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===c[0]||2===c[0])){a=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){a.label=c[1];break}if(6===c[0]&&a.label<o[1]){a.label=o[1],o=c;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(c);break}o[2]&&a.ops.pop(),a.trys.pop();continue}c=t.call(e,a)}catch(e){c=[6,e],r=0}finally{n=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(r){return n=t.spaceId,e.model.setProps({spaceId:n}),[2]})},function(){var e=this,t=arguments;return new Promise(function(r,o){var i=n.apply(e,t);function a(e){eC(i,r,o,a,l,"next",e)}function l(e){eC(i,r,o,a,l,"throw",e)}a(void 0)})})()}}}}),eD.define({label:(0,ek.escapeT)("User Guide")});function eM(e){return(eM=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function ej(e,t){return(ej=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function eU(e){var t="function"==typeof Map?new Map:void 0;return(eU=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return eR(e,arguments,eM(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),ej(n,e)})(e)}function eF(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(eF=function(){return!!e})()}var eB=function(e){var t;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function n(){var e,t;if(!(this instanceof n))throw TypeError("Cannot call a class as a function");return e=n,t=arguments,e=eM(e),function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,eF()?Reflect.construct(e,t||[],eM(this).constructor):e.apply(this,t))}return n.prototype=Object.create(e&&e.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),e&&ej(n,e),t=[{key:"load",value:function(){var e,t=this;return(e=function(){var e;return function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function l(i){return function(l){var c=[i,l];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&c[0]?r.return:c[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,c[1])).done)return o;switch(r=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,r=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===c[0]||2===c[0])){a=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){a.label=c[1];break}if(6===c[0]&&a.label<o[1]){a.label=o[1],o=c;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(c);break}o[2]&&a.ops.pop(),a.trys.pop();continue}c=t.call(e,a)}catch(e){c=[6,e],r=0}finally{n=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(n){return t.app.pluginSettingsManager.add("ai-build-guide",{icon:"ReadOutlined",title:'{{t("Build Guide Block", { ns: "build-guide-block" })}}',Component:O}),t.app.use(e_),null==(e=t.app.schemaInitializerManager.get("page:addBlock"))||e.add("otherBlocks.aiUserGuide",{title:'{{t("User Guide", { ns: "build-guide-block" })}}',Component:"UserGuideBlockInitializer"}),t.flowEngine.registerModels({UserGuideBlockModel:eD}),[2]})},function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){eL(i,r,o,a,l,"next",e)}function l(e){eL(i,r,o,a,l,"throw",e)}a(void 0)})})()}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,t),n}(eU(t.Plugin))}(),p}()});
@@ -0,0 +1,26 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ module.exports = {
11
+ "@nocobase/client": "2.0.32",
12
+ "react": "18.2.0",
13
+ "antd": "5.24.2",
14
+ "@formily/react": "2.3.7",
15
+ "react-i18next": "11.18.6",
16
+ "@ant-design/icons": "5.6.1",
17
+ "@formily/core": "2.3.7",
18
+ "@nocobase/server": "2.0.32",
19
+ "@nocobase/flow-engine": "2.0.32",
20
+ "@nocobase/actions": "2.0.32",
21
+ "@nocobase/database": "2.0.32",
22
+ "@nocobase/plugin-ai": "2.0.32",
23
+ "@nocobase/plugin-file-manager": "2.0.32",
24
+ "@langchain/core": "1.1.24",
25
+ "axios": "1.7.7"
26
+ };
package/dist/index.js ADDED
@@ -0,0 +1,48 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __create = Object.create;
11
+ var __defProp = Object.defineProperty;
12
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
13
+ var __getOwnPropNames = Object.getOwnPropertyNames;
14
+ var __getProtoOf = Object.getPrototypeOf;
15
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
16
+ var __export = (target, all) => {
17
+ for (var name in all)
18
+ __defProp(target, name, { get: all[name], enumerable: true });
19
+ };
20
+ var __copyProps = (to, from, except, desc) => {
21
+ if (from && typeof from === "object" || typeof from === "function") {
22
+ for (let key of __getOwnPropNames(from))
23
+ if (!__hasOwnProp.call(to, key) && key !== except)
24
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
25
+ }
26
+ return to;
27
+ };
28
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
29
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
30
+ // If the importer is in node compatibility mode or this is not an ESM
31
+ // file that has been converted to a CommonJS file using a Babel-
32
+ // compatible transform (i.e. "__esModule" has not been set), then set
33
+ // "default" to the CommonJS "module.exports" for node compatibility.
34
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
35
+ mod
36
+ ));
37
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
38
+ var src_exports = {};
39
+ __export(src_exports, {
40
+ default: () => import_server.default
41
+ });
42
+ module.exports = __toCommonJS(src_exports);
43
+ __reExport(src_exports, require("./server"), module.exports);
44
+ var import_server = __toESM(require("./server"));
45
+ // Annotate the CommonJS export names for ESM import in node:
46
+ 0 && (module.exports = {
47
+ ...require("./server")
48
+ });
@@ -0,0 +1,27 @@
1
+ {
2
+ "Build Guide Block": "Build Guide Block",
3
+ "User guide block setting": "User guide block setting",
4
+ "Edit user guide settings": "Edit user guide settings",
5
+ "Space": "Space",
6
+ "User Guide": "User Guide",
7
+ "Create space": "Create space",
8
+ "Title": "Title",
9
+ "LLM Service": "LLM Service",
10
+ "Model": "Model",
11
+ "System Prompt": "System Prompt",
12
+ "Documents": "Documents",
13
+ "Cancel": "Cancel",
14
+ "Submit": "Submit",
15
+ "Actions": "Actions",
16
+ "Edit": "Edit",
17
+ "Edit space": "Edit space",
18
+ "Generated HTML": "Generated HTML",
19
+ "Build Log": "Build Log",
20
+ "Delete": "Delete",
21
+ "Saved successfully": "Saved successfully",
22
+ "Please select a User Guide Space in block settings": "Please select a User Guide Space in block settings",
23
+ "Build": "Build",
24
+ "Build started": "Build started",
25
+ "Build failed": "Build failed",
26
+ "Are you sure you want to delete this space?": "Are you sure you want to delete this space?"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "Build Guide Block": "Block Hướng dẫn sử dụng",
3
+ "User guide block setting": "Cài đặt Block Hướng dẫn",
4
+ "Edit user guide settings": "Chỉnh sửa cài đặt",
5
+ "Space": "Không gian (Space)",
6
+ "User Guide": "Hướng dẫn sử dụng",
7
+ "Create space": "Tạo Space",
8
+ "Title": "Tiêu đề",
9
+ "LLM Service": "Dịch vụ LLM",
10
+ "Model": "Mô hình (Model)",
11
+ "System Prompt": "Prompt hệ thống",
12
+ "Documents": "Tài liệu",
13
+ "Cancel": "Hủy",
14
+ "Submit": "Xác nhận",
15
+ "Actions": "Hành động",
16
+ "Edit": "Sửa",
17
+ "Edit space": "Sửa Space",
18
+ "Generated HTML": "HTML Đã tạo",
19
+ "Build Log": "Log quá trình Build",
20
+ "Delete": "Xóa",
21
+ "Saved successfully": "Lưu thành công",
22
+ "Please select a User Guide Space in block settings": "Vui lòng chọn Space trong cài đặt block",
23
+ "Build": "Tạo",
24
+ "Build started": "Đã bắt đầu tạo",
25
+ "Build failed": "Tạo thất bại",
26
+ "Are you sure you want to delete this space?": "Bạn có chắc chắn muốn xóa Space này không?"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "Build Guide Block": "生成指南区块",
3
+ "User guide block setting": "用户指南区块设置",
4
+ "Edit user guide settings": "编辑用户指南设置",
5
+ "Space": "空间",
6
+ "User Guide": "用户指南",
7
+ "Create space": "创建空间",
8
+ "Title": "标题",
9
+ "LLM Service": "大语言模型服务",
10
+ "Model": "模型",
11
+ "System Prompt": "系统提示词",
12
+ "Documents": "文档",
13
+ "Cancel": "取消",
14
+ "Submit": "提交",
15
+ "Actions": "操作",
16
+ "Edit": "编辑",
17
+ "Edit space": "编辑空间",
18
+ "Generated HTML": "生成的 HTML",
19
+ "Build Log": "构建日志",
20
+ "Delete": "删除",
21
+ "Saved successfully": "保存成功",
22
+ "Please select a User Guide Space in block settings": "请在区块设置中选择一个用户指南空间",
23
+ "Build": "构建",
24
+ "Build started": "构建已开始",
25
+ "Build failed": "构建失败",
26
+ "Are you sure you want to delete this space?": "确定要删除此空间吗?"
27
+ }
@@ -0,0 +1,207 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __create = Object.create;
11
+ var __defProp = Object.defineProperty;
12
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
13
+ var __getOwnPropNames = Object.getOwnPropertyNames;
14
+ var __getProtoOf = Object.getPrototypeOf;
15
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
16
+ var __export = (target, all) => {
17
+ for (var name in all)
18
+ __defProp(target, name, { get: all[name], enumerable: true });
19
+ };
20
+ var __copyProps = (to, from, except, desc) => {
21
+ if (from && typeof from === "object" || typeof from === "function") {
22
+ for (let key of __getOwnPropNames(from))
23
+ if (!__hasOwnProp.call(to, key) && key !== except)
24
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
25
+ }
26
+ return to;
27
+ };
28
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
29
+ // If the importer is in node compatibility mode or this is not an ESM
30
+ // file that has been converted to a CommonJS file using a Babel-
31
+ // compatible transform (i.e. "__esModule" has not been set), then set
32
+ // "default" to the CommonJS "module.exports" for node compatibility.
33
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
34
+ mod
35
+ ));
36
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
+ var build_exports = {};
38
+ __export(build_exports, {
39
+ build: () => build
40
+ });
41
+ module.exports = __toCommonJS(build_exports);
42
+ var import_sanitize_html = __toESM(require("sanitize-html"));
43
+ var import_messages = require("@langchain/core/messages");
44
+ var import_axios = __toESM(require("axios"));
45
+ var import_fs = __toESM(require("fs"));
46
+ var import_path = __toESM(require("path"));
47
+ async function fetchFileContent(app, file) {
48
+ const fileManager = app.pm.get("file-manager");
49
+ if (!fileManager) return "";
50
+ const url = await fileManager.getFileURL(file);
51
+ try {
52
+ if (url.startsWith("http")) {
53
+ const response = await import_axios.default.get(url, { responseType: "text", timeout: 15e3 });
54
+ return response.data;
55
+ } else {
56
+ let localPath = url;
57
+ if (process.env.APP_PUBLIC_PATH && localPath.startsWith(process.env.APP_PUBLIC_PATH)) {
58
+ localPath = localPath.slice(process.env.APP_PUBLIC_PATH.length);
59
+ }
60
+ localPath = import_path.default.join(process.cwd(), localPath);
61
+ const data = await import_fs.default.promises.readFile(localPath, "utf8");
62
+ return data;
63
+ }
64
+ } catch (err) {
65
+ app.log.error(`Failed to read file content for document ${file.id}`, err);
66
+ return `[Failed to read document: ${file.filename}]`;
67
+ }
68
+ }
69
+ async function build(ctx, next) {
70
+ const { filterByTk } = ctx.action.params;
71
+ const repository = ctx.db.getRepository("aiBuildGuideSpaces");
72
+ const space = await repository.findById(filterByTk);
73
+ if (!space) {
74
+ ctx.throw(404, "Space not found");
75
+ }
76
+ const app = ctx.app;
77
+ const db = ctx.db;
78
+ try {
79
+ await repository.update({
80
+ filterByTk,
81
+ values: {
82
+ status: "building",
83
+ buildLog: null
84
+ }
85
+ });
86
+ const bgPromise = (async () => {
87
+ const bgRepo = db.getRepository("aiBuildGuideSpaces");
88
+ const documents = await space.getDocuments();
89
+ let documentsText = "";
90
+ if (documents && documents.length > 0) {
91
+ const texts = await Promise.all(
92
+ documents.map(async (doc) => {
93
+ const content = await fetchFileContent(app, doc);
94
+ return `--- Document: ${doc.filename} ---
95
+ ${content}
96
+ `;
97
+ })
98
+ );
99
+ documentsText = texts.join("\n");
100
+ }
101
+ const aiPlugin = app.pm.get("ai");
102
+ if (!aiPlugin) {
103
+ throw new Error("Plugin AI is not available");
104
+ }
105
+ const { llmService, model, systemPrompt } = space.get();
106
+ if (!llmService || !model) {
107
+ throw new Error("LLM Service or model is missing in space configuration");
108
+ }
109
+ const serviceData = await aiPlugin.aiManager.getLLMService({ llmService, model });
110
+ const provider = serviceData.provider;
111
+ const messages = [];
112
+ if (systemPrompt) {
113
+ messages.push(new import_messages.SystemMessage(systemPrompt));
114
+ }
115
+ const instruction = `Please generate an HTML user guide based on the following documents. Output ONLY valid HTML without Markdown blocks.
116
+
117
+ Documents:
118
+ ${documentsText}`;
119
+ messages.push(new import_messages.HumanMessage(instruction));
120
+ const response = await provider.chatModel.invoke(messages);
121
+ let rawHtml = typeof response.content === "string" ? response.content : JSON.stringify(response.content);
122
+ rawHtml = rawHtml.replace(/^```html\s*/, "").replace(/```\s*$/, "");
123
+ const cleanHtml = (0, import_sanitize_html.default)(rawHtml, {
124
+ allowedTags: [
125
+ "div",
126
+ "p",
127
+ "h1",
128
+ "h2",
129
+ "h3",
130
+ "h4",
131
+ "h5",
132
+ "h6",
133
+ "ul",
134
+ "ol",
135
+ "li",
136
+ "table",
137
+ "thead",
138
+ "tbody",
139
+ "tr",
140
+ "td",
141
+ "th",
142
+ "a",
143
+ "img",
144
+ "span",
145
+ "strong",
146
+ "em",
147
+ "code",
148
+ "pre",
149
+ "blockquote",
150
+ "br",
151
+ "hr"
152
+ ],
153
+ allowedAttributes: {
154
+ "a": ["href", "target"],
155
+ "img": ["src", "alt", "width", "height"],
156
+ "*": ["style", "class"]
157
+ },
158
+ allowedStyles: {
159
+ "*": {
160
+ "color": [/^\#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/, /^rgb/, /^rgba/],
161
+ "background-color": [/^\#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/, /^rgb/, /^rgba/],
162
+ "text-align": [/^left$/, /^right$/, /^center$/, /^justify$/],
163
+ "font-size": [/^\d+(?:px|em|%)$/]
164
+ }
165
+ }
166
+ });
167
+ await bgRepo.update({
168
+ filterByTk,
169
+ values: {
170
+ generatedHtml: cleanHtml,
171
+ status: "completed"
172
+ }
173
+ });
174
+ })();
175
+ bgPromise.catch(async (error) => {
176
+ app.log.error("Build Guide Background Error", error);
177
+ try {
178
+ const bgRepo = db.getRepository("aiBuildGuideSpaces");
179
+ await bgRepo.update({
180
+ filterByTk,
181
+ values: {
182
+ status: "error",
183
+ buildLog: error.message || String(error)
184
+ }
185
+ });
186
+ } catch (updateErr) {
187
+ app.log.error("Failed to persist build error status", updateErr);
188
+ }
189
+ });
190
+ ctx.body = { status: "building" };
191
+ } catch (error) {
192
+ app.log.error("Build Guide Error", error);
193
+ await repository.update({
194
+ filterByTk,
195
+ values: {
196
+ status: "error",
197
+ buildLog: error.message || String(error)
198
+ }
199
+ });
200
+ ctx.throw(500, error.message || "Error occurred during build");
201
+ }
202
+ await next();
203
+ }
204
+ // Annotate the CommonJS export names for ESM import in node:
205
+ 0 && (module.exports = {
206
+ build
207
+ });
@@ -0,0 +1,53 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __export = (target, all) => {
15
+ for (var name in all)
16
+ __defProp(target, name, { get: all[name], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
+ var getHtml_exports = {};
28
+ __export(getHtml_exports, {
29
+ getHtml: () => getHtml
30
+ });
31
+ module.exports = __toCommonJS(getHtml_exports);
32
+ async function getHtml(ctx, next) {
33
+ const { filterByTk } = ctx.action.params;
34
+ const { resourceName } = ctx.action;
35
+ const repository = ctx.db.getRepository(resourceName);
36
+ const model = await repository.findById(filterByTk);
37
+ if (!model) {
38
+ ctx.throw(404, "User Guide not found");
39
+ }
40
+ if (model.get("status") !== "completed") {
41
+ ctx.throw(400, "User Guide is not ready yet");
42
+ }
43
+ ctx.body = model.get("generatedHtml") || "";
44
+ ctx.withoutDataWrapping = true;
45
+ ctx.set({
46
+ "Content-Type": "text/html; charset=UTF-8"
47
+ });
48
+ await next();
49
+ }
50
+ // Annotate the CommonJS export names for ESM import in node:
51
+ 0 && (module.exports = {
52
+ getHtml
53
+ });
@@ -0,0 +1,79 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __export = (target, all) => {
15
+ for (var name in all)
16
+ __defProp(target, name, { get: all[name], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
+ var ai_build_guide_spaces_exports = {};
28
+ __export(ai_build_guide_spaces_exports, {
29
+ default: () => ai_build_guide_spaces_default
30
+ });
31
+ module.exports = __toCommonJS(ai_build_guide_spaces_exports);
32
+ var import_database = require("@nocobase/database");
33
+ var ai_build_guide_spaces_default = (0, import_database.defineCollection)({
34
+ namespace: "build-guide-block.ai-build-guide-spaces",
35
+ name: "aiBuildGuideSpaces",
36
+ migrationRules: ["overwrite", "schema-only"],
37
+ timestamps: true,
38
+ fields: [
39
+ {
40
+ type: "uid",
41
+ name: "id",
42
+ primaryKey: true
43
+ },
44
+ {
45
+ type: "string",
46
+ name: "title"
47
+ },
48
+ {
49
+ type: "string",
50
+ name: "llmService"
51
+ },
52
+ {
53
+ type: "string",
54
+ name: "model"
55
+ },
56
+ {
57
+ type: "text",
58
+ name: "systemPrompt"
59
+ },
60
+ {
61
+ type: "text",
62
+ name: "generatedHtml"
63
+ },
64
+ {
65
+ type: "string",
66
+ name: "status",
67
+ defaultValue: "draft"
68
+ },
69
+ {
70
+ type: "text",
71
+ name: "buildLog"
72
+ },
73
+ {
74
+ type: "belongsToMany",
75
+ name: "documents",
76
+ target: "attachments"
77
+ }
78
+ ]
79
+ });
@@ -0,0 +1,42 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __create = Object.create;
11
+ var __defProp = Object.defineProperty;
12
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
13
+ var __getOwnPropNames = Object.getOwnPropertyNames;
14
+ var __getProtoOf = Object.getPrototypeOf;
15
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
16
+ var __export = (target, all) => {
17
+ for (var name in all)
18
+ __defProp(target, name, { get: all[name], enumerable: true });
19
+ };
20
+ var __copyProps = (to, from, except, desc) => {
21
+ if (from && typeof from === "object" || typeof from === "function") {
22
+ for (let key of __getOwnPropNames(from))
23
+ if (!__hasOwnProp.call(to, key) && key !== except)
24
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
25
+ }
26
+ return to;
27
+ };
28
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
29
+ // If the importer is in node compatibility mode or this is not an ESM
30
+ // file that has been converted to a CommonJS file using a Babel-
31
+ // compatible transform (i.e. "__esModule" has not been set), then set
32
+ // "default" to the CommonJS "module.exports" for node compatibility.
33
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
34
+ mod
35
+ ));
36
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
+ var server_exports = {};
38
+ __export(server_exports, {
39
+ default: () => import_plugin.default
40
+ });
41
+ module.exports = __toCommonJS(server_exports);
42
+ var import_plugin = __toESM(require("./plugin"));
@@ -0,0 +1,84 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __create = Object.create;
11
+ var __defProp = Object.defineProperty;
12
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
13
+ var __getOwnPropNames = Object.getOwnPropertyNames;
14
+ var __getProtoOf = Object.getPrototypeOf;
15
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
16
+ var __export = (target, all) => {
17
+ for (var name in all)
18
+ __defProp(target, name, { get: all[name], enumerable: true });
19
+ };
20
+ var __copyProps = (to, from, except, desc) => {
21
+ if (from && typeof from === "object" || typeof from === "function") {
22
+ for (let key of __getOwnPropNames(from))
23
+ if (!__hasOwnProp.call(to, key) && key !== except)
24
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
25
+ }
26
+ return to;
27
+ };
28
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
29
+ // If the importer is in node compatibility mode or this is not an ESM
30
+ // file that has been converted to a CommonJS file using a Babel-
31
+ // compatible transform (i.e. "__esModule" has not been set), then set
32
+ // "default" to the CommonJS "module.exports" for node compatibility.
33
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
34
+ mod
35
+ ));
36
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
+ var plugin_exports = {};
38
+ __export(plugin_exports, {
39
+ PluginBuildGuideBlockServer: () => PluginBuildGuideBlockServer,
40
+ default: () => plugin_default
41
+ });
42
+ module.exports = __toCommonJS(plugin_exports);
43
+ var import_server = require("@nocobase/server");
44
+ var import_path = __toESM(require("path"));
45
+ var import_build = require("./actions/build");
46
+ var import_getHtml = require("./actions/getHtml");
47
+ class PluginBuildGuideBlockServer extends import_server.Plugin {
48
+ afterAdd() {
49
+ }
50
+ beforeLoad() {
51
+ }
52
+ async load() {
53
+ await this.importCollections(import_path.default.resolve(__dirname, "collections"));
54
+ this.app.actions({
55
+ "aiBuildGuideSpaces:build": import_build.build,
56
+ "aiBuildGuideSpaces:getHtml": import_getHtml.getHtml
57
+ });
58
+ this.app.acl.allow("aiBuildGuideSpaces", "getHtml", "loggedIn");
59
+ this.app.acl.registerSnippet({
60
+ name: "pm.ai-build-guide",
61
+ actions: [
62
+ "aiBuildGuideSpaces:create",
63
+ "aiBuildGuideSpaces:update",
64
+ "aiBuildGuideSpaces:destroy",
65
+ "aiBuildGuideSpaces:list",
66
+ "aiBuildGuideSpaces:get",
67
+ "aiBuildGuideSpaces:build"
68
+ ]
69
+ });
70
+ }
71
+ async install(options) {
72
+ }
73
+ async afterEnable() {
74
+ }
75
+ async afterDisable() {
76
+ }
77
+ async remove() {
78
+ }
79
+ }
80
+ var plugin_default = PluginBuildGuideBlockServer;
81
+ // Annotate the CommonJS export names for ESM import in node:
82
+ 0 && (module.exports = {
83
+ PluginBuildGuideBlockServer
84
+ });
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "plugin-build-guide-block",
3
+ "version": "1.0.1",
4
+ "main": "dist/server/index.js",
5
+ "dependencies": {
6
+ "dompurify": "^3.1.2",
7
+ "sanitize-html": "^2.13.0"
8
+ },
9
+ "devDependencies": {
10
+ "@types/dompurify": "^3.0.4",
11
+ "@types/sanitize-html": "^2.9.5"
12
+ },
13
+ "peerDependencies": {
14
+ "@nocobase/client": "2.x",
15
+ "@nocobase/server": "2.x",
16
+ "@nocobase/database": "2.x",
17
+ "@nocobase/test": "2.x",
18
+ "@nocobase/plugin-ai": "2.x",
19
+ "@nocobase/plugin-file-manager": "2.x",
20
+ "@langchain/core": "*",
21
+ "axios": "*"
22
+ }
23
+ }
package/server.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './dist/server';
2
+ export { default } from './dist/server';
package/server.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/server/index.js');