[{"data":1,"prerenderedAt":1746},["ShallowReactive",2],{"nav-docs":3,"page-/docs/webspace/examples/monster-raid":964,"surround-/docs/webspace/examples/monster-raid":1740,"raw-/docs/webspace/examples/monster-raid":1743},[4,56,287,615,718,857,890,947],{"title":5,"path":6,"stem":7,"children":8,"page":55},"Space Builder","/getting-started","00.getting-started",[9,13,17,23,29,33,38,42,46,50],{"title":10,"path":11,"stem":12,"children":-1},"Introducing SpaceBuilder","/getting-started/overview","00.getting-started/00.overview",{"title":14,"path":15,"stem":16,"children":-1},"Create a SetFN Account","/getting-started/create-setfn-account","00.getting-started/05.create-setfn-account",{"title":18,"path":19,"stem":20,"tags":21,"children":-1},"Installing on Linux","/getting-started/install-linux","00.getting-started/10.install-linux",[22],"recommended",{"title":24,"path":25,"stem":26,"tags":27,"children":-1},"Installing with Docker","/getting-started/install-docker","00.getting-started/12.install-docker",[28],"preparing",{"title":30,"path":31,"stem":32,"children":-1},"Installing on Windows","/getting-started/install-windows","00.getting-started/14.install-windows",{"title":34,"path":35,"stem":36,"tags":37,"children":-1},"Installing on macOS","/getting-started/install-macos","00.getting-started/16.install-macos",[28],{"title":39,"path":40,"stem":41,"children":-1},"Initial Setup","/getting-started/initial-setup","00.getting-started/20.initial-setup",{"title":43,"path":44,"stem":45,"children":-1},"License Activation","/getting-started/license-activation","00.getting-started/30.license-activation",{"title":47,"path":48,"stem":49,"children":-1},"Checking Your Access Address (Local/Internal Network)","/getting-started/access-url","00.getting-started/35.access-url",{"title":51,"path":52,"stem":53,"tags":54,"children":-1},"Choosing an External Access Method","/getting-started/access-domain","00.getting-started/40.access-domain",[22],false,{"title":57,"path":58,"stem":59,"children":60,"page":-1},"Space management","/admin","10.admin",[61,64,77,135,164,201,221,234,241,270],{"title":62,"path":58,"stem":63,"children":-1},"Explore the Administrator Menus","10.admin/00.index",{"title":65,"path":66,"stem":67,"children":68,"page":55},"Admin Home","/admin/home","10.admin/00.home",[69,73],{"title":70,"path":71,"stem":72,"children":-1},"Accessing the Admin Page","/admin/home/admin-page-access","10.admin/00.home/00.admin-page-access",{"title":74,"path":75,"stem":76,"children":-1},"License Management","/admin/home/license","10.admin/00.home/20.license",{"title":78,"path":79,"stem":80,"children":81,"page":55},"User management","/admin/user-management","10.admin/10.user-management",[82,86,92,96,100,104,108,112,116,120,125,130],{"title":83,"path":84,"stem":85,"children":-1},"Set signup policy and default permissions","/admin/user-management/signup-policy","10.admin/10.user-management/02.signup-policy",{"title":87,"path":88,"stem":89,"tags":90,"children":-1},"Register signup terms","/admin/user-management/signup-terms","10.admin/10.user-management/04.signup-terms",[91],"new",{"title":93,"path":94,"stem":95,"children":-1},"Creating a User Account","/admin/user-management/invite-new-member","10.admin/10.user-management/10.invite-new-member",{"title":97,"path":98,"stem":99,"children":-1},"Editing a User Account","/admin/user-management/edit-member","10.admin/10.user-management/11.edit-member",{"title":101,"path":102,"stem":103,"children":-1},"Adding an Admin","/admin/user-management/add-new-admin","10.admin/10.user-management/12.add-new-admin",{"title":105,"path":106,"stem":107,"children":-1},"Team Management","/admin/user-management/team","10.admin/10.user-management/22.team",{"title":109,"path":110,"stem":111,"children":-1},"Level management","/admin/user-management/level","10.admin/10.user-management/24.level",{"title":113,"path":114,"stem":115,"children":-1},"Checking Access Logs","/admin/user-management/access-log","10.admin/10.user-management/30.access-log",{"title":117,"path":118,"stem":119,"children":-1},"Configure Account & Security policies","/admin/user-management/account-security","10.admin/10.user-management/32.account-security",{"title":121,"path":122,"stem":123,"tags":124,"children":-1},"Configure CAPTCHA","/admin/user-management/captcha","10.admin/10.user-management/33.captcha",[91],{"title":126,"path":127,"stem":128,"tags":129,"children":-1},"Configure notice delivery","/admin/user-management/notice-settings","10.admin/10.user-management/34.notice-settings",[91],{"title":131,"path":132,"stem":133,"tags":134,"children":-1},"Send bulk notices to members","/admin/user-management/bulk-mail","10.admin/10.user-management/36.bulk-mail",[91],{"title":136,"path":137,"stem":138,"children":139,"page":55},"Service Configuration","/admin/service-config","10.admin/20.service-config",[140,144,148,152,156,160],{"title":141,"path":142,"stem":143,"children":-1},"File Area Settings","/admin/service-config/file-area","10.admin/20.service-config/10.file-area",{"title":145,"path":146,"stem":147,"children":-1},"Webhook Settings","/admin/service-config/webhook-settings","10.admin/20.service-config/16.webhook-settings",{"title":149,"path":150,"stem":151,"children":-1},"Community Settings","/admin/service-config/community-space","10.admin/20.service-config/22.community-space",{"title":153,"path":154,"stem":155,"children":-1},"AI Chatbot Policy Settings","/admin/service-config/community-ai-chatbot","10.admin/20.service-config/24.community-ai-chatbot",{"title":157,"path":158,"stem":159,"children":-1},"Email Settings","/admin/service-config/email-settings","10.admin/20.service-config/30.email-settings",{"title":161,"path":162,"stem":163,"children":-1},"Branding Settings","/admin/service-config/brand","10.admin/20.service-config/40.brand",{"title":165,"path":166,"stem":167,"children":168},"Knowledge Services","/admin/knowledge","10.admin/30.knowledge/00.index",[169,171,177,181,185,189,193,197],{"title":170,"path":166,"stem":167,"children":-1},"Knowledge Services overview",{"title":172,"path":173,"stem":174,"children":175},"Ingestion & Indexing","/admin/knowledge/indexing","10.admin/30.knowledge/10.indexing",[176],{"title":172,"path":173,"stem":174,"children":-1},{"title":178,"path":179,"stem":180,"children":-1},"Search Management","/admin/knowledge/search","10.admin/30.knowledge/20.search",{"title":182,"path":183,"stem":184,"children":-1},"Knowledge Storage","/admin/knowledge/storage","10.admin/30.knowledge/30.storage",{"title":186,"path":187,"stem":188,"children":-1},"Operating Knowledge Storage","/admin/knowledge/storage-operations","10.admin/30.knowledge/32.storage-operations",{"title":190,"path":191,"stem":192,"children":-1},"Connect Qdrant","/admin/knowledge/qdrant","10.admin/30.knowledge/34.qdrant",{"title":194,"path":195,"stem":196,"children":-1},"Setting Up a Qdrant Server","/admin/knowledge/qdrant-server-setup","10.admin/30.knowledge/35.qdrant-server-setup",{"title":198,"path":199,"stem":200,"children":-1},"Connect Milvus","/admin/knowledge/milvus","10.admin/30.knowledge/36.milvus",{"title":202,"path":203,"stem":204,"children":205},"AI Services","/admin/ai","10.admin/35.ai/00.index",[206,208,212,217],{"title":207,"path":203,"stem":204,"children":-1},"Manage AI Services",{"title":209,"path":210,"stem":211,"children":-1},"Configure Models & Runtime","/admin/ai/models","10.admin/35.ai/10.models",{"title":213,"path":214,"stem":215,"tags":216,"children":-1},"Configure Tools & Integrations","/admin/ai/integrations","10.admin/35.ai/20.integrations",[91],{"title":218,"path":219,"stem":220,"children":-1},"Manage the MCP Server","/admin/ai/mcp","10.admin/35.ai/30.mcp",{"title":222,"path":223,"stem":224,"children":225,"page":55},"plugin","/admin/plugin","10.admin/40.plugin",[226,230],{"title":227,"path":228,"stem":229,"children":-1},"Managing Plugins","/admin/plugin/overview","10.admin/40.plugin/00.overview",{"title":231,"path":232,"stem":233,"children":-1},"Extension Plugin Settings","/admin/plugin/settings","10.admin/40.plugin/10.settings",{"title":235,"path":236,"stem":237,"children":238,"tags":240},"Review Operations & Audit Logs","/admin/operations","10.admin/45.operations/00.index",[239],{"title":235,"path":236,"stem":237,"tags":240,"children":-1},[91],{"title":242,"path":243,"stem":244,"children":245,"page":55},"Security Management","/admin/security","10.admin/50.security",[246,250,254,258,262,266],{"title":247,"path":248,"stem":249,"children":-1},"Security Overview","/admin/security/overview","10.admin/50.security/00.overview",{"title":251,"path":252,"stem":253,"children":-1},"Checking the Audit Log","/admin/security/audit-log","10.admin/50.security/05.audit-log",{"title":255,"path":256,"stem":257,"children":-1},"Block Management","/admin/security/block-management","10.admin/50.security/10.block-management",{"title":259,"path":260,"stem":261,"children":-1},"Security Settings","/admin/security/security-setting","10.admin/50.security/12.security-setting",{"title":263,"path":264,"stem":265,"children":-1},"Process pending device approvals","/admin/security/device-approvals","10.admin/50.security/14.device-approvals",{"title":267,"path":268,"stem":269,"children":-1},"IP Access Restriction","/admin/security/ip-restriction","10.admin/50.security/16.ip-restriction",{"title":271,"path":272,"stem":273,"children":274,"page":55},"System management","/admin/system-admin","10.admin/60.system-admin",[275,279,283],{"title":276,"path":277,"stem":278,"children":-1},"Device Information","/admin/system-admin/device-info","10.admin/60.system-admin/10.device-info",{"title":280,"path":281,"stem":282,"children":-1},"Server Restart and System Maintenance","/admin/system-admin/server-restart","10.admin/60.system-admin/12.server-restart",{"title":284,"path":285,"stem":286,"children":-1},"Background Services","/admin/system-admin/background-service","10.admin/60.system-admin/14.background-service",{"title":288,"path":289,"stem":290,"children":291,"page":55},"Use workspace","/workspace","20.workspace",[292,325,342,404,520,567,597],{"title":293,"path":294,"stem":295,"children":296,"page":55},"menu","/workspace/menu","20.workspace/05.menu",[297,301,305,309,313,317,321],{"title":298,"path":299,"stem":300,"children":-1},"Workspace Overview","/workspace/menu/overview","20.workspace/05.menu/00.overview",{"title":302,"path":303,"stem":304,"children":-1},"Team Space","/workspace/menu/team-space","20.workspace/05.menu/05.team-space",{"title":306,"path":307,"stem":308,"children":-1},"Client Space","/workspace/menu/client-space","20.workspace/05.menu/06.client-space",{"title":310,"path":311,"stem":312,"children":-1},"Favorites","/workspace/menu/favorites","20.workspace/05.menu/10.favorites",{"title":314,"path":315,"stem":316,"children":-1},"Recent Documents","/workspace/menu/recent","20.workspace/05.menu/20.recent",{"title":318,"path":319,"stem":320,"children":-1},"External Share","/workspace/menu/external-share","20.workspace/05.menu/30.external-share",{"title":322,"path":323,"stem":324,"children":-1},"Trash","/workspace/menu/trash","20.workspace/05.menu/40.trash",{"title":326,"path":327,"stem":328,"children":329,"page":55},"Account","/workspace/account","20.workspace/10.account",[330,334,338],{"title":331,"path":332,"stem":333,"children":-1},"Sign Up and Log In","/workspace/account/signup","20.workspace/10.account/10.signup",{"title":335,"path":336,"stem":337,"children":-1},"Resetting Your Password","/workspace/account/reset-password","20.workspace/10.account/20.reset-password",{"title":339,"path":340,"stem":341,"children":-1},"Account Settings","/workspace/account/account-settings","20.workspace/10.account/30.account-settings",{"title":343,"path":344,"stem":345,"children":346,"page":55},"folder","/workspace/folder","20.workspace/20.folder",[347,351,355,359,363,369,373,377,382,386,390,394,400],{"title":348,"path":349,"stem":350,"children":-1},"Folder Basics","/workspace/folder/basic","20.workspace/20.folder/10.basic",{"title":352,"path":353,"stem":354,"children":-1},"Creating Multiple Folders at Once","/workspace/folder/bulk-folder-creation","20.workspace/20.folder/12.bulk-folder-creation",{"title":356,"path":357,"stem":358,"children":-1},"Filter","/workspace/folder/filter","20.workspace/20.folder/13.filter",{"title":360,"path":361,"stem":362,"children":-1},"Configuring Folder View Options","/workspace/folder/folder-view-options","20.workspace/20.folder/14.folder-view-options",{"title":364,"path":365,"stem":366,"tags":367,"children":-1},"Folder Web View","/workspace/folder/folder-web-view","20.workspace/20.folder/16.folder-web-view",[368],"hot",{"title":370,"path":371,"stem":372,"children":-1},"Folder Organization","/workspace/folder/folder-organize","20.workspace/20.folder/17.folder-organize",{"title":374,"path":375,"stem":376,"children":-1},"Folder Notice (README)","/workspace/folder/folder-readme","20.workspace/20.folder/18.folder-readme",{"title":378,"path":379,"stem":380,"tags":381,"children":-1},"Exporting Folder/File Lists","/workspace/folder/folder-export","20.workspace/20.folder/20.folder-export",[368],{"title":383,"path":384,"stem":385,"children":-1},"Setting Level-Based Access Permissions","/workspace/folder/level-access-permissions","20.workspace/20.folder/24.level-access-permissions",{"title":387,"path":388,"stem":389,"children":-1},"Setting Team-Based Access Permissions","/workspace/folder/team-access-permissions","20.workspace/20.folder/26.team-access-permissions",{"title":391,"path":392,"stem":393,"children":-1},"Folder Webhooks","/workspace/folder/webhook","20.workspace/20.folder/30.webhook",{"title":395,"path":396,"stem":397,"children":398},"Configure folder knowledge indexing","/workspace/folder/knowledge-index","20.workspace/20.folder/32.knowledge-index",[399],{"title":395,"path":396,"stem":397,"children":-1},{"title":401,"path":402,"stem":403,"children":-1},"Work Automation Folder","/workspace/folder/automation","20.workspace/20.folder/40.automation",{"title":405,"path":406,"stem":407,"children":408,"page":55},"file","/workspace/file","20.workspace/30.file",[409,413,418,422,426,430,434,438,442,447,451,455,460,464,468,472,476,480,484,488,492,496,500,504,508,512,516],{"title":410,"path":411,"stem":412,"children":-1},"File Management Basics","/workspace/file/overview","20.workspace/30.file/00.overview",{"title":414,"path":415,"stem":416,"tags":417,"children":-1},"Checking the List While Viewing a File","/workspace/file/list-in-file","20.workspace/30.file/05.list-in-file",[368],{"title":419,"path":420,"stem":421,"children":-1},"Viewing and Editing Markdown and Text Files","/workspace/file/text-file-viewer","20.workspace/30.file/10.text-file-viewer",{"title":423,"path":424,"stem":425,"children":-1},"Viewing HTML Files","/workspace/file/html-viewer","20.workspace/30.file/11.html-viewer",{"title":427,"path":428,"stem":429,"children":-1},"Viewing and Editing CSV Files","/workspace/file/csv-viewer","20.workspace/30.file/12.csv-viewer",{"title":431,"path":432,"stem":433,"children":-1},"Viewing Image/Video Files","/workspace/file/image-file-viewer","20.workspace/30.file/13.image-file-viewer",{"title":435,"path":436,"stem":437,"children":-1},"Viewing Office/PDF Files","/workspace/file/office-viewer","20.workspace/30.file/14.office-viewer",{"title":439,"path":440,"stem":441,"children":-1},"Pasting Web Pages (HTML)","/workspace/file/paste-html","20.workspace/30.file/20.paste-html",{"title":443,"path":444,"stem":445,"tags":446,"children":-1},"Pasting Screenshots","/workspace/file/paste-screenshot","20.workspace/30.file/21.paste-screenshot",[368],{"title":448,"path":449,"stem":450,"children":-1},"Pasting Markdown (MD)","/workspace/file/paste-md","20.workspace/30.file/22.paste-md",{"title":452,"path":453,"stem":454,"children":-1},"Screen Recording","/workspace/file/screen-recording","20.workspace/30.file/23.screen-recording",{"title":456,"path":457,"stem":458,"tags":459,"children":-1},"Quick Note","/workspace/file/quick-note","20.workspace/30.file/24.quick-note",[91,368],{"title":461,"path":462,"stem":463,"children":-1},"File Tags","/workspace/file/file-tag","20.workspace/30.file/33.file-tag",{"title":465,"path":466,"stem":467,"children":-1},"Bulk Renaming Files","/workspace/file/bulk-name-revise","20.workspace/30.file/34.bulk-name-revise",{"title":469,"path":470,"stem":471,"children":-1},"File Conversion","/workspace/file/file-convert-overview","20.workspace/30.file/40.file-convert-overview",{"title":473,"path":474,"stem":475,"children":-1},"Template Files","/workspace/file/templates","20.workspace/30.file/41.templates",{"title":477,"path":478,"stem":479,"children":-1},"To-Do List","/workspace/file/template-todo","20.workspace/30.file/42.template-todo",{"title":481,"path":482,"stem":483,"children":-1},"Approval Form","/workspace/file/template-approval","20.workspace/30.file/43.template-approval",{"title":485,"path":486,"stem":487,"children":-1},"Kanban Board","/workspace/file/template-kanban","20.workspace/30.file/44.template-kanban",{"title":489,"path":490,"stem":491,"children":-1},"Timeline","/workspace/file/template-timeline","20.workspace/30.file/45.template-timeline",{"title":493,"path":494,"stem":495,"children":-1},"Memo","/workspace/file/template-memo","20.workspace/30.file/46.template-memo",{"title":497,"path":498,"stem":499,"children":-1},"AI Chat File","/workspace/file/ai-chat-file","20.workspace/30.file/47.ai-chat-file",{"title":501,"path":502,"stem":503,"children":-1},"Checking the File Change History","/workspace/file/audit-trail","20.workspace/30.file/50.audit-trail",{"title":505,"path":506,"stem":507,"children":-1},"File Version Control","/workspace/file/version-trail","20.workspace/30.file/51.version-trail",{"title":509,"path":510,"stem":511,"children":-1},"Edit Lock","/workspace/file/file-lock","20.workspace/30.file/52.file-lock",{"title":513,"path":514,"stem":515,"children":-1},"File Encryption","/workspace/file/file-encrypt","20.workspace/30.file/53.file-encrypt",{"title":517,"path":518,"stem":519,"children":-1},"Register disk files","/workspace/file/disk-file-registration","20.workspace/30.file/60.disk-file-registration",{"title":521,"path":522,"stem":523,"children":524,"page":55},"Collaboration","/workspace/cooperation","20.workspace/35.cooperation",[525,529,533,537,542,546,550,554,559,563],{"title":526,"path":527,"stem":528,"children":-1},"File/Folder Comments","/workspace/cooperation/file-comments","20.workspace/35.cooperation/00.file-comments",{"title":530,"path":531,"stem":532,"children":-1},"Chat","/workspace/cooperation/chat","20.workspace/35.cooperation/10.chat",{"title":534,"path":535,"stem":536,"children":-1},"Collaboration Chat and Edit Lock","/workspace/cooperation/collaboration-chat","20.workspace/35.cooperation/11.collaboration-chat",{"title":538,"path":539,"stem":540,"tags":541,"children":-1},"Following a Team Member's Location","/workspace/cooperation/follow-team-location","20.workspace/35.cooperation/12.follow-team-location",[368],{"title":543,"path":544,"stem":545,"children":-1},"Mentions","/workspace/cooperation/mention","20.workspace/35.cooperation/14.mention",{"title":547,"path":548,"stem":549,"children":-1},"Direct Messages","/workspace/cooperation/dm","20.workspace/35.cooperation/16.dm",{"title":551,"path":552,"stem":553,"children":-1},"Notification Inbox","/workspace/cooperation/notification-inbox","20.workspace/35.cooperation/18.notification-inbox",{"title":555,"path":556,"stem":557,"tags":558,"children":-1},"Checking Team Activity","/workspace/cooperation/file-activity","20.workspace/35.cooperation/30.file-activity",[368],{"title":560,"path":561,"stem":562,"children":-1},"Creating an External Share Link","/workspace/cooperation/share-link-creation","20.workspace/35.cooperation/40.share-link-creation",{"title":564,"path":565,"stem":566,"children":-1},"Sending an External Share Link by Email","/workspace/cooperation/share-link-email","20.workspace/35.cooperation/42.share-link-email",{"title":568,"path":569,"stem":570,"children":571,"page":55},"Search","/workspace/search","20.workspace/40.search",[572,576,581,585,589,593],{"title":573,"path":574,"stem":575,"children":-1},"File Search","/workspace/search/search","20.workspace/40.search/00.search",{"title":577,"path":578,"stem":579,"tags":580,"children":-1},"Context Search (AI Search)","/workspace/search/context-search","20.workspace/40.search/10.context-search",[368],{"title":582,"path":583,"stem":584,"children":-1},"Image Search","/workspace/search/image-search","20.workspace/40.search/20.image-search",{"title":586,"path":587,"stem":588,"children":-1},"Chat Search","/workspace/search/chat-search","20.workspace/40.search/30.chat-search",{"title":590,"path":591,"stem":592,"children":-1},"Comment Search","/workspace/search/comment-search","20.workspace/40.search/40.comment-search",{"title":594,"path":595,"stem":596,"children":-1},"Synonym Search","/workspace/search/synonym-search","20.workspace/40.search/50.synonym-search",{"title":598,"path":599,"stem":600,"children":601,"page":55},"AI","/workspace/ai","20.workspace/50.ai",[602,606,611],{"title":603,"path":604,"stem":605,"children":-1},"AI Features Summary","/workspace/ai/overview","20.workspace/50.ai/00.overview",{"title":607,"path":608,"stem":609,"tags":610,"children":-1},"Requesting Work from the Local AI","/workspace/ai/ai-work","20.workspace/50.ai/10.ai-work",[368],{"title":612,"path":613,"stem":614,"children":-1},"Using External AI","/workspace/ai/external-ai","20.workspace/50.ai/20.external-ai",{"title":616,"path":617,"stem":618,"children":619,"page":55},"Webspace","/webspace","40.webspace",[620,624,628,632,636,640,645,649,653,657,661,690],{"title":621,"path":622,"stem":623,"children":-1},"What is WebSpace?","/webspace/overview","40.webspace/00.overview",{"title":625,"path":626,"stem":627,"children":-1},"Deploying a Website","/webspace/website-release","40.webspace/10.website-release",{"title":629,"path":630,"stem":631,"children":-1},"Create a schema file (.sfn)","/webspace/create-database","40.webspace/20.create-database",{"title":633,"path":634,"stem":635,"children":-1},"Build APIs and deploy a database","/webspace/api-overview","40.webspace/24.api-overview",{"title":637,"path":638,"stem":639,"children":-1},"Checking the Frontend Sample","/webspace/frontend-example","40.webspace/26.frontend-example",{"title":641,"path":642,"stem":643,"tags":644,"children":-1},"Building an Internal Team Web Service","/webspace/internal-webservice","40.webspace/32.internal-webservice",[368],{"title":646,"path":647,"stem":648,"children":-1},"Building a Publicly Accessible Web Service","/webspace/external-webservice","40.webspace/34.external-webservice",{"title":650,"path":651,"stem":652,"children":-1},"Import and export SQL","/webspace/sql-converter","40.webspace/42.sql-converter",{"title":654,"path":655,"stem":656,"children":-1},"Developer Tip 2: Code Converter","/webspace/code-converter","40.webspace/44.code-converter",{"title":658,"path":659,"stem":660,"children":-1},"Performance and scaling","/webspace/performance","40.webspace/48.performance",{"title":662,"path":663,"stem":664,"children":665,"page":55},"Webspace Management","/webspace/admin","40.webspace/50.admin",[666,670,674,678,682,686],{"title":667,"path":668,"stem":669,"children":-1},"Get started with WebSpace administration","/webspace/admin/overview","40.webspace/50.admin/00.overview",{"title":671,"path":672,"stem":673,"children":-1},"Operations","/webspace/admin/operations","40.webspace/50.admin/10.operations",{"title":675,"path":676,"stem":677,"children":-1},"Workspace access","/webspace/admin/workspace-access","40.webspace/50.admin/20.workspace-access",{"title":679,"path":680,"stem":681,"children":-1},"API & site security","/webspace/admin/api-site-security","40.webspace/50.admin/30.api-site-security",{"title":683,"path":684,"stem":685,"children":-1},"Services and capacity","/webspace/admin/service-capacity","40.webspace/50.admin/40.service-capacity",{"title":687,"path":688,"stem":689,"children":-1},"Deployment management and frontend releases","/webspace/admin/deployments","40.webspace/50.admin/50.deployments",{"title":691,"path":692,"stem":693,"children":694,"page":55},"Try WebSpace","/webspace/examples","40.webspace/60.examples",[695,699,703,708,713],{"title":696,"path":697,"stem":698,"children":-1},"WebSpace examples","/webspace/examples/overview","40.webspace/60.examples/00.overview",{"title":700,"path":701,"stem":702,"children":-1},"Build a real-time Gomoku game","/webspace/examples/realtime-gomoku","40.webspace/60.examples/20.realtime-gomoku",{"title":704,"path":705,"stem":706,"tags":707,"children":-1},"Build a resource board from folder files","/webspace/examples/folder-board","40.webspace/60.examples/30.folder-board",[91],{"title":709,"path":710,"stem":711,"tags":712,"children":-1},"Build a shared monster raid","/webspace/examples/monster-raid","40.webspace/60.examples/40.monster-raid",[91],{"title":714,"path":715,"stem":716,"tags":717,"children":-1},"Deploy an AI support chat sample","/webspace/examples/ai-support-chat","40.webspace/60.examples/50.ai-support-chat",[91],{"title":719,"path":720,"stem":721,"children":722,"page":55},"Using plugin","/plugin","50.plugin",[723,727,744,788,806,836],{"title":724,"path":725,"stem":726,"children":-1},"Plugin Overview","/plugin/overview","50.plugin/00.overview",{"title":728,"path":729,"stem":730,"children":731,"page":55},"Calendar","/plugin/calendar","50.plugin/10.calendar",[732,736,740],{"title":733,"path":734,"stem":735,"children":-1},"Calendar Introduction","/plugin/calendar/overview","50.plugin/10.calendar/00.overview",{"title":737,"path":738,"stem":739,"children":-1},"Creating, Editing, and Deleting Events","/plugin/calendar/create-event","50.plugin/10.calendar/10.create-event",{"title":741,"path":742,"stem":743,"children":-1},"Checking Activity History","/plugin/calendar/file-activity","50.plugin/10.calendar/40.file-activity",{"title":745,"path":746,"stem":747,"children":748,"page":55},"Email","/plugin/email","50.plugin/20.email",[749,753,756,760,764,768,772,776,780,784],{"title":750,"path":751,"stem":752,"children":-1},"Email Introduction","/plugin/email/overview","50.plugin/20.email/00.overview",{"title":157,"path":754,"stem":755,"children":-1},"/plugin/email/setfn-email-setting","50.plugin/20.email/05.setfn-email-setting",{"title":757,"path":758,"stem":759,"children":-1},"Connect an External Email Account","/plugin/email/external-email","50.plugin/20.email/07.external-email",{"title":761,"path":762,"stem":763,"children":-1},"Basic Email Functionality","/plugin/email/email-basic","50.plugin/20.email/10.email-basic",{"title":765,"path":766,"stem":767,"children":-1},"Composing and Sending Email","/plugin/email/email-compose","50.plugin/20.email/20.email-compose",{"title":769,"path":770,"stem":771,"children":-1},"Attaching Files","/plugin/email/email-attachment","50.plugin/20.email/30.email-attachment",{"title":773,"path":774,"stem":775,"children":-1},"Mail Folder Management","/plugin/email/email-folders","50.plugin/20.email/40.email-folders",{"title":777,"path":778,"stem":779,"children":-1},"Automatic Email Classification","/plugin/email/email-auto-classify","50.plugin/20.email/50.email-auto-classify",{"title":781,"path":782,"stem":783,"children":-1},"Email File Archiving and Sharing","/plugin/email/email-open-in-space","50.plugin/20.email/60.email-open-in-space",{"title":785,"path":786,"stem":787,"children":-1},"Email Security","/plugin/email/email-security","50.plugin/20.email/70.email-security",{"title":789,"path":790,"stem":791,"children":792,"page":55},"Workflow","/plugin/workflow","50.plugin/30.workflow",[793,797,802],{"title":794,"path":795,"stem":796,"children":-1},"Workflow Introduction","/plugin/workflow/overview","50.plugin/30.workflow/00.overview",{"title":798,"path":799,"stem":800,"tags":801,"children":-1},"Creating a New Workflow","/plugin/workflow/new-workflow","50.plugin/30.workflow/10.new-workflow",[368],{"title":803,"path":804,"stem":805,"children":-1},"Checking Execution History","/plugin/workflow/execution-history","50.plugin/30.workflow/20.execution-history",{"title":807,"path":808,"stem":809,"children":810,"page":55},"Pinetuning (AI learning)","/plugin/fine-tuning","50.plugin/40.fine-tuning",[811,816,820,824,828,832],{"title":812,"path":813,"stem":814,"tags":815,"children":-1},"Fine-tuning Introduction","/plugin/fine-tuning/overview","50.plugin/40.fine-tuning/00.overview",[368],{"title":817,"path":818,"stem":819,"children":-1},"Preprocessing Training Data","/plugin/fine-tuning/pre-processing","50.plugin/40.fine-tuning/10.pre-processing",{"title":821,"path":822,"stem":823,"children":-1},"Training","/plugin/fine-tuning/training","50.plugin/40.fine-tuning/20.training",{"title":825,"path":826,"stem":827,"children":-1},"Evaluation","/plugin/fine-tuning/evaluation","50.plugin/40.fine-tuning/30.evaluation",{"title":829,"path":830,"stem":831,"children":-1},"Chat Test","/plugin/fine-tuning/chat-test","50.plugin/40.fine-tuning/40.chat-test",{"title":833,"path":834,"stem":835,"children":-1},"Export","/plugin/fine-tuning/export","50.plugin/40.fine-tuning/50.export",{"title":837,"path":838,"stem":839,"children":840,"page":55},"EDC (data collection)","/plugin/edc","50.plugin/50.edc",[841,845,849,853],{"title":842,"path":843,"stem":844,"children":-1},"EDC Introduction","/plugin/edc/overview","50.plugin/50.edc/00.overview",{"title":846,"path":847,"stem":848,"children":-1},"Data Entry, Audit Trail","/plugin/edc/data-entry","50.plugin/50.edc/10.data-entry",{"title":850,"path":851,"stem":852,"children":-1},"Builder","/plugin/edc/builder","50.plugin/50.edc/20.builder",{"title":854,"path":855,"stem":856,"children":-1},"User/Site Settings","/plugin/edc/account","50.plugin/50.edc/30.account",{"title":858,"path":859,"stem":860,"children":861,"page":55},"FAQ","/faq","99.FAQ",[862,866,870,874,878,882,886],{"title":863,"path":864,"stem":865,"children":-1},"SetFN vs Cloud Services Comparison","/faq/comparison-cloud","99.FAQ/10.comparison-cloud",{"title":867,"path":868,"stem":869,"children":-1},"SetFN vs NAS Comparison","/faq/comparison-nas","99.FAQ/20.comparison-nas",{"title":871,"path":872,"stem":873,"children":-1},"Security Policy","/faq/security-policy","99.FAQ/30.security-policy",{"title":875,"path":876,"stem":877,"children":-1},"Why Is SetFN Fast","/faq/why-fast","99.FAQ/40.why-fast",{"title":879,"path":880,"stem":881,"children":-1},"License FAQ","/faq/license-faq","99.FAQ/50.license-faq",{"title":883,"path":884,"stem":885,"children":-1},"AI Features FAQ","/faq/ai-faq","99.FAQ/60.ai-faq",{"title":887,"path":888,"stem":889,"children":-1},"Troubleshooting Guide","/faq/troubleshooting","99.FAQ/70.troubleshooting",{"title":891,"path":892,"stem":893,"children":894,"page":55},"Applied (draft)","/draft","draft",[895,899,903,907,911,915,919,923,927,931,935,939,943],{"title":896,"path":897,"stem":898,"children":-1},"Example 1. Building an Introduction Page","/draft/static-intro","draft/05.static-intro",{"title":900,"path":901,"stem":902,"children":-1},"Example 2. Building a Notice Board","/draft/public-notice-board","draft/07.public-notice-board",{"title":904,"path":905,"stem":906,"children":-1},"Example 3. Building a Coffee Chat Booking System","/draft/coffee-chat-booking","draft/08.coffee-chat-booking",{"title":908,"path":909,"stem":910,"children":-1},"Example 4. Building a Leave Request System","/draft/leave-request","draft/09.leave-request",{"title":912,"path":913,"stem":914,"children":-1},"Example 5. Building Real-Time Team Chat","/draft/team-chat","draft/10.team-chat",{"title":916,"path":917,"stem":918,"children":-1},"Example 6. Building a Job Application Intake","/draft/client-submission","draft/11.client-submission",{"title":920,"path":921,"stem":922,"children":-1},"Example 7. Building an Issue Tracker with Team and Level Conditions","/draft/crm-basic","draft/12.crm-basic",{"title":924,"path":925,"stem":926,"children":-1},"Example 8. Building a Status Filter and Stats Summary Screen","/draft/crm-search-filter","draft/13.crm-search-filter",{"title":928,"path":929,"stem":930,"children":-1},"Example 9. Building Real-Time Community Chat with Moderation","/draft/community-moderation","draft/14.community-moderation",{"title":932,"path":933,"stem":934,"children":-1},"Example 10. Building a Real-Time Attendance Check / Poll","/draft/attendance-poll","draft/15.attendance-poll",{"title":936,"path":937,"stem":938,"children":-1},"Example 11. Building a Debate Battle","/draft/debate-battle","draft/16.debate-battle",{"title":940,"path":941,"stem":942,"children":-1},"Example 13. Building an Announcement Read Receipt","/draft/announcement-read","draft/18.announcement-read",{"title":944,"path":945,"stem":946,"children":-1},"Example 14. Building an Inventory Management System","/draft/inventory-management","draft/19.inventory-management",{"title":948,"path":949,"stem":950,"children":951,"page":55},"SJAUTO","/sjauto","sjauto",[952,956,960],{"title":953,"path":954,"stem":955,"children":-1},"Access the Administrator Page","/sjauto/admin-page-access","sjauto/00.admin-page-access",{"title":957,"path":958,"stem":959,"children":-1},"Sign Up and Sign In","/sjauto/signup","sjauto/10.signup",{"title":961,"path":962,"stem":963,"children":-1},"AI Chat Files","/sjauto/ai-chat-file","sjauto/ai-chat-file",{"id":965,"title":709,"body":966,"cover":1723,"description":1724,"extension":1725,"image":1723,"meta":1726,"navigation":1728,"path":710,"seo":1729,"stem":711,"tags":1738,"thumbnail":1723,"__hash__":1739},"docs_en/40.webspace/60.examples/40.monster-raid.md",{"type":967,"value":968,"toc":1712},"minimal",[969,973,982,987,1008,1012,1027,1055,1066,1070,1073,1123,1129,1133,1139,1255,1270,1274,1281,1375,1381,1385,1392,1502,1512,1527,1534,1612,1618,1622,1655,1665,1669,1686,1690,1708],[970,971,709],"h1",{"id":972},"build-a-shared-monster-raid",[974,975,976,977,981],"p",{},"This example builds a real-time raid in which several members attack the same monster until its health reaches zero. Webspace's ",[978,979,980],"code",{},"shared-resource"," processor applies attacks, health changes, and per-action rewards together on the server.",[983,984,986],"h2",{"id":985},"before-you-begin","Before you begin",[988,989,990,994,1005],"ul",{},[991,992,993],"li",{},"You need permission to deploy schemas and APIs.",[991,995,996,997,1000,1001,1004],{},"Members must have the real-time ",[978,998,999],{},"send"," and ",[978,1002,1003],{},"receive"," permissions.",[991,1006,1007],{},"Restrict the raid-target creation API to administrators.",[983,1009,1011],{"id":1010},"start-with-the-complete-schema","Start with the complete schema",[974,1013,1014,1023,1024,1026],{},[1015,1016,1018,1019,1022],"a",{"href":1017},"/examples/webspace/monster-raid/shared-resource-game.sfn","Download the shared-resource game schema (",[978,1020,1021],{},".sfn",")",". It includes the columns and permissions for all three tables used in this guide, together with the ",[978,1025,980],{}," processor configuration.",[1028,1029,1030,1033,1052],"ol",{},[991,1031,1032],{},"Download the file, upload it to a team or personal folder, and open it in the schema editor.",[991,1034,1035,1036,1039,1040,1043,1044,1047,1048,1051],{},"In the ",[978,1037,1038],{},"API Build"," deployment settings, review the ",[978,1041,1042],{},"Database identifier",". Change the default ",[978,1045,1046],{},"resource_game"," to a new identifier such as ",[978,1049,1050],{},"monster_raid_team_a"," so it does not conflict with an existing database.",[991,1053,1054],{},"Review the permissions and processor settings, then deploy the schema.",[974,1056,1057,1058,1061,1062,1065],{},"This file is a backend structure example for a shared resource. Its ",[978,1059,1060],{},"includeClient"," setting is ",[978,1063,1064],{},"false",", so it does not generate a game interface or include an initial monster record. Build the interface separately with the APIs and WebSocket events below, and create the raid target before playing.",[983,1067,1069],{"id":1068},"separate-the-data-into-three-tables","Separate the data into three tables",[974,1071,1072],{},"The shared-resource structure separates three types of data.",[1074,1075,1076,1089],"table",{},[1077,1078,1079],"thead",{},[1080,1081,1082,1086],"tr",{},[1083,1084,1085],"th",{},"Table",[1083,1087,1088],{},"Stored data",[1090,1091,1092,1103,1113],"tbody",{},[1080,1093,1094,1100],{},[1095,1096,1097],"td",{},[978,1098,1099],{},"game_resources",[1095,1101,1102],{},"Monster code, status, current and maximum health, version, and reward item",[1080,1104,1105,1110],{},[1095,1106,1107],{},[978,1108,1109],{},"game_actions",[1095,1111,1112],{},"Action ID, acting member, applied damage, resulting health, and reward quantity",[1080,1114,1115,1120],{},[1095,1116,1117],{},[978,1118,1119],{},"game_inventory",[1095,1121,1122],{},"Each member's items and accumulated quantities",[974,1124,1125,1126,1128],{},"The action ID in ",[978,1127,1109],{}," identifies retries. Sending the same action ID again does not apply health changes or rewards twice.",[983,1130,1132],{"id":1131},"configure-the-real-time-processor","Configure the real-time processor",[974,1134,1135,1136,1138],{},"Enable the real-time feature and select ",[978,1137,980],{}," as its event processor. With the default table names, the processor configuration has this shape:",[1140,1141,1146],"pre",{"className":1142,"code":1143,"language":1144,"meta":1145,"style":1145},"language-json shiki shiki-themes github-light github-dark monokai","{\n  \"resourcesTable\": \"game_resources\",\n  \"actionsTable\": \"game_actions\",\n  \"inventoryTable\": \"game_inventory\",\n  \"actionPower\": 1,\n  \"rewardPerAction\": 1,\n  \"maxClientAmount\": 1,\n  \"broadcast\": \"namespace\"\n}\n","json","",[978,1147,1148,1157,1174,1187,1200,1214,1226,1238,1249],{"__ignoreMap":1145},[1149,1150,1153],"span",{"class":1151,"line":1152},"line",1,[1149,1154,1156],{"class":1155},"sMOD_","{\n",[1149,1158,1160,1164,1167,1171],{"class":1151,"line":1159},2,[1149,1161,1163],{"class":1162},"s-m8C","  \"resourcesTable\"",[1149,1165,1166],{"class":1155},": ",[1149,1168,1170],{"class":1169},"sCZoN","\"game_resources\"",[1149,1172,1173],{"class":1155},",\n",[1149,1175,1177,1180,1182,1185],{"class":1151,"line":1176},3,[1149,1178,1179],{"class":1162},"  \"actionsTable\"",[1149,1181,1166],{"class":1155},[1149,1183,1184],{"class":1169},"\"game_actions\"",[1149,1186,1173],{"class":1155},[1149,1188,1190,1193,1195,1198],{"class":1151,"line":1189},4,[1149,1191,1192],{"class":1162},"  \"inventoryTable\"",[1149,1194,1166],{"class":1155},[1149,1196,1197],{"class":1169},"\"game_inventory\"",[1149,1199,1173],{"class":1155},[1149,1201,1203,1206,1208,1212],{"class":1151,"line":1202},5,[1149,1204,1205],{"class":1162},"  \"actionPower\"",[1149,1207,1166],{"class":1155},[1149,1209,1211],{"class":1210},"s7F3e","1",[1149,1213,1173],{"class":1155},[1149,1215,1217,1220,1222,1224],{"class":1151,"line":1216},6,[1149,1218,1219],{"class":1162},"  \"rewardPerAction\"",[1149,1221,1166],{"class":1155},[1149,1223,1211],{"class":1210},[1149,1225,1173],{"class":1155},[1149,1227,1229,1232,1234,1236],{"class":1151,"line":1228},7,[1149,1230,1231],{"class":1162},"  \"maxClientAmount\"",[1149,1233,1166],{"class":1155},[1149,1235,1211],{"class":1210},[1149,1237,1173],{"class":1155},[1149,1239,1241,1244,1246],{"class":1151,"line":1240},8,[1149,1242,1243],{"class":1162},"  \"broadcast\"",[1149,1245,1166],{"class":1155},[1149,1247,1248],{"class":1169},"\"namespace\"\n",[1149,1250,1252],{"class":1151,"line":1251},9,[1149,1253,1254],{"class":1155},"}\n",[974,1256,1257,1258,1261,1262,1265,1266,1269],{},"With ",[978,1259,1260],{},"broadcast"," set to ",[978,1263,1264],{},"namespace",", clients connected to the same Webspace real-time namespace receive the result event. Set it to ",[978,1267,1268],{},"actor"," to return results only to the member who acted.",[983,1271,1273],{"id":1272},"create-a-raid-target","Create a raid target",[974,1275,1276,1277,1280],{},"Call ",[978,1278,1279],{},"game_resources/create"," as an administrator to create the monster.",[1140,1282,1284],{"className":1142,"code":1283,"language":1144,"meta":1145,"style":1145},"{\n  \"code\": \"RAID-1\",\n  \"kind\": \"monster\",\n  \"status\": \"active\",\n  \"current_value\": 10000,\n  \"max_value\": 10000,\n  \"version\": 0,\n  \"reward_item_code\": \"monster-core\"\n}\n",[978,1285,1286,1290,1302,1314,1326,1338,1349,1361,1371],{"__ignoreMap":1145},[1149,1287,1288],{"class":1151,"line":1152},[1149,1289,1156],{"class":1155},[1149,1291,1292,1295,1297,1300],{"class":1151,"line":1159},[1149,1293,1294],{"class":1162},"  \"code\"",[1149,1296,1166],{"class":1155},[1149,1298,1299],{"class":1169},"\"RAID-1\"",[1149,1301,1173],{"class":1155},[1149,1303,1304,1307,1309,1312],{"class":1151,"line":1176},[1149,1305,1306],{"class":1162},"  \"kind\"",[1149,1308,1166],{"class":1155},[1149,1310,1311],{"class":1169},"\"monster\"",[1149,1313,1173],{"class":1155},[1149,1315,1316,1319,1321,1324],{"class":1151,"line":1189},[1149,1317,1318],{"class":1162},"  \"status\"",[1149,1320,1166],{"class":1155},[1149,1322,1323],{"class":1169},"\"active\"",[1149,1325,1173],{"class":1155},[1149,1327,1328,1331,1333,1336],{"class":1151,"line":1202},[1149,1329,1330],{"class":1162},"  \"current_value\"",[1149,1332,1166],{"class":1155},[1149,1334,1335],{"class":1210},"10000",[1149,1337,1173],{"class":1155},[1149,1339,1340,1343,1345,1347],{"class":1151,"line":1216},[1149,1341,1342],{"class":1162},"  \"max_value\"",[1149,1344,1166],{"class":1155},[1149,1346,1335],{"class":1210},[1149,1348,1173],{"class":1155},[1149,1350,1351,1354,1356,1359],{"class":1151,"line":1228},[1149,1352,1353],{"class":1162},"  \"version\"",[1149,1355,1166],{"class":1155},[1149,1357,1358],{"class":1210},"0",[1149,1360,1173],{"class":1155},[1149,1362,1363,1366,1368],{"class":1151,"line":1240},[1149,1364,1365],{"class":1162},"  \"reward_item_code\"",[1149,1367,1166],{"class":1155},[1149,1369,1370],{"class":1169},"\"monster-core\"\n",[1149,1372,1373],{"class":1151,"line":1251},[1149,1374,1254],{"class":1155},[974,1376,1377,1378,1380],{},"When the page opens, read the current health and version from the ",[978,1379,1099],{}," API. Read it again after a new connection or reconnection so the interface uses the current server state.",[983,1382,1384],{"id":1383},"send-an-attack-over-websocket","Send an attack over WebSocket",[974,1386,1387,1388,1391],{},"After an authenticated member subscribes to the real-time connection, send a ",[978,1389,1390],{},"resource-game.act"," event.",[1140,1393,1395],{"className":1142,"code":1394,"language":1144,"meta":1145,"style":1145},"{\n  \"type\": \"webspace:send\",\n  \"data\": {\n    \"dbName\": \"monster_raid_team_a\",\n    \"event\": \"resource-game.act\",\n    \"payload\": {\n      \"actionId\": \"attack-00000001\",\n      \"resourceCode\": \"RAID-1\",\n      \"amount\": 1\n    }\n  }\n}\n",[978,1396,1397,1401,1413,1421,1433,1445,1452,1464,1475,1485,1491,1497],{"__ignoreMap":1145},[1149,1398,1399],{"class":1151,"line":1152},[1149,1400,1156],{"class":1155},[1149,1402,1403,1406,1408,1411],{"class":1151,"line":1159},[1149,1404,1405],{"class":1162},"  \"type\"",[1149,1407,1166],{"class":1155},[1149,1409,1410],{"class":1169},"\"webspace:send\"",[1149,1412,1173],{"class":1155},[1149,1414,1415,1418],{"class":1151,"line":1176},[1149,1416,1417],{"class":1162},"  \"data\"",[1149,1419,1420],{"class":1155},": {\n",[1149,1422,1423,1426,1428,1431],{"class":1151,"line":1189},[1149,1424,1425],{"class":1162},"    \"dbName\"",[1149,1427,1166],{"class":1155},[1149,1429,1430],{"class":1169},"\"monster_raid_team_a\"",[1149,1432,1173],{"class":1155},[1149,1434,1435,1438,1440,1443],{"class":1151,"line":1202},[1149,1436,1437],{"class":1162},"    \"event\"",[1149,1439,1166],{"class":1155},[1149,1441,1442],{"class":1169},"\"resource-game.act\"",[1149,1444,1173],{"class":1155},[1149,1446,1447,1450],{"class":1151,"line":1216},[1149,1448,1449],{"class":1162},"    \"payload\"",[1149,1451,1420],{"class":1155},[1149,1453,1454,1457,1459,1462],{"class":1151,"line":1228},[1149,1455,1456],{"class":1162},"      \"actionId\"",[1149,1458,1166],{"class":1155},[1149,1460,1461],{"class":1169},"\"attack-00000001\"",[1149,1463,1173],{"class":1155},[1149,1465,1466,1469,1471,1473],{"class":1151,"line":1240},[1149,1467,1468],{"class":1162},"      \"resourceCode\"",[1149,1470,1166],{"class":1155},[1149,1472,1299],{"class":1169},[1149,1474,1173],{"class":1155},[1149,1476,1477,1480,1482],{"class":1151,"line":1251},[1149,1478,1479],{"class":1162},"      \"amount\"",[1149,1481,1166],{"class":1155},[1149,1483,1484],{"class":1210},"1\n",[1149,1486,1488],{"class":1151,"line":1487},10,[1149,1489,1490],{"class":1155},"    }\n",[1149,1492,1494],{"class":1151,"line":1493},11,[1149,1495,1496],{"class":1155},"  }\n",[1149,1498,1500],{"class":1151,"line":1499},12,[1149,1501,1254],{"class":1155},[974,1503,1504,1505,1507,1508,1511],{},"Use the ",[978,1506,1042],{}," selected during deployment as ",[978,1509,1510],{},"dbName",".",[974,1513,1514,1515,1518,1519,1522,1523,1526],{},"Create an ",[978,1516,1517],{},"actionId"," of 8–80 ASCII letters, numbers, underscores, or hyphens. ",[978,1520,1521],{},"amount"," defaults to 1 when omitted. When included, it must be an integer within the processor's ",[978,1524,1525],{},"maxClientAmount"," limit.",[974,1528,1529,1530,1533],{},"The server returns ",[978,1531,1532],{},"resource-game.action-applied"," after processing the action.",[1140,1535,1537],{"className":1142,"code":1536,"language":1144,"meta":1145,"style":1145},"{\n  \"actionId\": \"attack-00000001\",\n  \"resourceId\": 1,\n  \"currentValue\": 9999,\n  \"version\": 1,\n  \"rewardQuantity\": 1,\n  \"duplicate\": false\n}\n",[978,1538,1539,1543,1554,1565,1577,1587,1598,1608],{"__ignoreMap":1145},[1149,1540,1541],{"class":1151,"line":1152},[1149,1542,1156],{"class":1155},[1149,1544,1545,1548,1550,1552],{"class":1151,"line":1159},[1149,1546,1547],{"class":1162},"  \"actionId\"",[1149,1549,1166],{"class":1155},[1149,1551,1461],{"class":1169},[1149,1553,1173],{"class":1155},[1149,1555,1556,1559,1561,1563],{"class":1151,"line":1176},[1149,1557,1558],{"class":1162},"  \"resourceId\"",[1149,1560,1166],{"class":1155},[1149,1562,1211],{"class":1210},[1149,1564,1173],{"class":1155},[1149,1566,1567,1570,1572,1575],{"class":1151,"line":1189},[1149,1568,1569],{"class":1162},"  \"currentValue\"",[1149,1571,1166],{"class":1155},[1149,1573,1574],{"class":1210},"9999",[1149,1576,1173],{"class":1155},[1149,1578,1579,1581,1583,1585],{"class":1151,"line":1202},[1149,1580,1353],{"class":1162},[1149,1582,1166],{"class":1155},[1149,1584,1211],{"class":1210},[1149,1586,1173],{"class":1155},[1149,1588,1589,1592,1594,1596],{"class":1151,"line":1216},[1149,1590,1591],{"class":1162},"  \"rewardQuantity\"",[1149,1593,1166],{"class":1155},[1149,1595,1211],{"class":1210},[1149,1597,1173],{"class":1155},[1149,1599,1600,1603,1605],{"class":1151,"line":1228},[1149,1601,1602],{"class":1162},"  \"duplicate\"",[1149,1604,1166],{"class":1155},[1149,1606,1607],{"class":1210},"false\n",[1149,1609,1610],{"class":1151,"line":1240},[1149,1611,1254],{"class":1155},[974,1613,1614,1615,1617],{},"Update the health display only after receiving this result. A client request that sends ",[978,1616,1532],{}," directly is rejected.",[983,1619,1621],{"id":1620},"display-health-and-rewards","Display health and rewards",[1028,1623,1624,1631,1637,1643,1649],{},[991,1625,1626,1627,1630],{},"Confirm that ",[978,1628,1629],{},"resourceId"," belongs to the monster currently displayed.",[991,1632,1626,1633,1636],{},[978,1634,1635],{},"version"," is newer than the previous result.",[991,1638,1639,1640,1511],{},"Update the health display from ",[978,1641,1642],{},"currentValue",[991,1644,1645,1646,1648],{},"Show the shared completion state when ",[978,1647,1642],{}," reaches zero.",[991,1650,1651,1652,1511],{},"Reload personal items from ",[978,1653,1654],{},"game_inventory/list",[974,1656,1657,1658,1660,1661,1664],{},"Apply owner-only read access to ",[978,1659,1119],{},", so members can read only their own data. Do not infer another member's inventory from ",[978,1662,1663],{},"rewardQuantity"," in a shared event.",[983,1666,1668],{"id":1667},"notes","Notes",[988,1670,1671,1674,1677,1680],{},[991,1672,1673],{},"Attack strength and rewards come from the server's processor configuration, not client values.",[991,1675,1676],{},"The resource change, action record, and reward update run in one transaction.",[991,1678,1679],{},"The shared structure provides per-action rewards. Kill rankings and kill-only rewards require a separate design.",[991,1681,1682,1683,1685],{},"Do not treat a delayed response as success. Retry with the same ",[978,1684,1517],{}," to avoid applying the action twice.",[983,1687,1689],{"id":1688},"related-documentation","Related documentation",[988,1691,1692,1697,1703],{},[991,1693,1694],{},[1015,1695,700],{"href":1696},"./realtime-gomoku",[991,1698,1699],{},[1015,1700,1702],{"href":1701},"../api-overview","Build and deploy an API and database",[991,1704,1705],{},[1015,1706,658],{"href":1707},"../performance",[1709,1710,1711],"style",{},"html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .s-m8C, html code.shiki .s-m8C{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sCZoN, html code.shiki .sCZoN{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":1145,"searchDepth":1159,"depth":1176,"links":1713},[1714,1715,1716,1717,1718,1719,1720,1721,1722],{"id":985,"depth":1159,"text":986},{"id":1010,"depth":1159,"text":1011},{"id":1068,"depth":1159,"text":1069},{"id":1131,"depth":1159,"text":1132},{"id":1272,"depth":1159,"text":1273},{"id":1383,"depth":1159,"text":1384},{"id":1620,"depth":1159,"text":1621},{"id":1667,"depth":1159,"text":1668},{"id":1688,"depth":1159,"text":1689},null,"Use Webspace's shared-resource real-time processor to build a server-authoritative raid where members attack one monster together.","md",{"slug":1727},"/webspace/examples/monster-raid/",true,{"title":1730,"description":1731,"ogType":1732,"twitterCard":1733,"keywords":1734},"Build a shared monster raid | Webspace examples","Connect shared-resource tables, WebSocket events, and per-member rewards to build a monster raid interface.","article","summary_large_image",[1735,980,1736,1737],"Webspace monster raid","WebSocket game","SetFN",[91],"gSzjOmQF1teBXhweeYUcOVPXj3BEZJ5ybkYvfhlXDBY",[1741,1742],{"title":704,"path":705,"stem":706,"children":-1},{"title":714,"path":715,"stem":716,"children":-1},{"title":709,"filename":1744,"content":1745},"monster-raid","# Build a shared monster raid\r\n\r\nThis example builds a real-time raid in which several members attack the same monster until its health reaches zero. Webspace's `shared-resource` processor applies attacks, health changes, and per-action rewards together on the server.\r\n\r\n## Before you begin\r\n\r\n- You need permission to deploy schemas and APIs.\r\n- Members must have the real-time `send` and `receive` permissions.\r\n- Restrict the raid-target creation API to administrators.\r\n\r\n## Start with the complete schema\r\n\r\n[Download the shared-resource game schema (`.sfn`)](/examples/webspace/monster-raid/shared-resource-game.sfn). It includes the columns and permissions for all three tables used in this guide, together with the `shared-resource` processor configuration.\r\n\r\n1. Download the file, upload it to a team or personal folder, and open it in the schema editor.\r\n2. In the `API Build` deployment settings, review the `Database identifier`. Change the default `resource_game` to a new identifier such as `monster_raid_team_a` so it does not conflict with an existing database.\r\n3. Review the permissions and processor settings, then deploy the schema.\r\n\r\nThis file is a backend structure example for a shared resource. Its `includeClient` setting is `false`, so it does not generate a game interface or include an initial monster record. Build the interface separately with the APIs and WebSocket events below, and create the raid target before playing.\r\n\r\n## Separate the data into three tables\r\n\r\nThe shared-resource structure separates three types of data.\r\n\r\n| Table | Stored data |\r\n| --- | --- |\r\n| `game_resources` | Monster code, status, current and maximum health, version, and reward item |\r\n| `game_actions` | Action ID, acting member, applied damage, resulting health, and reward quantity |\r\n| `game_inventory` | Each member's items and accumulated quantities |\r\n\r\nThe action ID in `game_actions` identifies retries. Sending the same action ID again does not apply health changes or rewards twice.\r\n\r\n## Configure the real-time processor\r\n\r\nEnable the real-time feature and select `shared-resource` as its event processor. With the default table names, the processor configuration has this shape:\r\n\r\n```json\r\n{\r\n  \"resourcesTable\": \"game_resources\",\r\n  \"actionsTable\": \"game_actions\",\r\n  \"inventoryTable\": \"game_inventory\",\r\n  \"actionPower\": 1,\r\n  \"rewardPerAction\": 1,\r\n  \"maxClientAmount\": 1,\r\n  \"broadcast\": \"namespace\"\r\n}\r\n```\r\n\r\nWith `broadcast` set to `namespace`, clients connected to the same Webspace real-time namespace receive the result event. Set it to `actor` to return results only to the member who acted.\r\n\r\n## Create a raid target\r\n\r\nCall `game_resources/create` as an administrator to create the monster.\r\n\r\n```json\r\n{\r\n  \"code\": \"RAID-1\",\r\n  \"kind\": \"monster\",\r\n  \"status\": \"active\",\r\n  \"current_value\": 10000,\r\n  \"max_value\": 10000,\r\n  \"version\": 0,\r\n  \"reward_item_code\": \"monster-core\"\r\n}\r\n```\r\n\r\nWhen the page opens, read the current health and version from the `game_resources` API. Read it again after a new connection or reconnection so the interface uses the current server state.\r\n\r\n## Send an attack over WebSocket\r\n\r\nAfter an authenticated member subscribes to the real-time connection, send a `resource-game.act` event.\r\n\r\n```json\r\n{\r\n  \"type\": \"webspace:send\",\r\n  \"data\": {\r\n    \"dbName\": \"monster_raid_team_a\",\r\n    \"event\": \"resource-game.act\",\r\n    \"payload\": {\r\n      \"actionId\": \"attack-00000001\",\r\n      \"resourceCode\": \"RAID-1\",\r\n      \"amount\": 1\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nUse the `Database identifier` selected during deployment as `dbName`.\r\n\r\nCreate an `actionId` of 8–80 ASCII letters, numbers, underscores, or hyphens. `amount` defaults to 1 when omitted. When included, it must be an integer within the processor's `maxClientAmount` limit.\r\n\r\nThe server returns `resource-game.action-applied` after processing the action.\r\n\r\n```json\r\n{\r\n  \"actionId\": \"attack-00000001\",\r\n  \"resourceId\": 1,\r\n  \"currentValue\": 9999,\r\n  \"version\": 1,\r\n  \"rewardQuantity\": 1,\r\n  \"duplicate\": false\r\n}\r\n```\r\n\r\nUpdate the health display only after receiving this result. A client request that sends `resource-game.action-applied` directly is rejected.\r\n\r\n## Display health and rewards\r\n\r\n1. Confirm that `resourceId` belongs to the monster currently displayed.\r\n2. Confirm that `version` is newer than the previous result.\r\n3. Update the health display from `currentValue`.\r\n4. Show the shared completion state when `currentValue` reaches zero.\r\n5. Reload personal items from `game_inventory/list`.\r\n\r\nApply owner-only read access to `game_inventory`, so members can read only their own data. Do not infer another member's inventory from `rewardQuantity` in a shared event.\r\n\r\n## Notes\r\n\r\n- Attack strength and rewards come from the server's processor configuration, not client values.\r\n- The resource change, action record, and reward update run in one transaction.\r\n- The shared structure provides per-action rewards. Kill rankings and kill-only rewards require a separate design.\r\n- Do not treat a delayed response as success. Retry with the same `actionId` to avoid applying the action twice.\r\n\r\n## Related documentation\r\n\r\n- [Build a real-time Gomoku game](./20.realtime-gomoku.md)\r\n- [Build and deploy an API and database](../24.api-overview.md)\r\n- [Performance and scaling](../48.performance.md)\n",1791199130656]