空间即应用:站点发布
将工作空间中的静态页面或 HTTP 服务发布为独立站点
站点发布
站点发布用于把工作空间中的页面或服务发布为可访问的独立站点。发布后系统会自动生成站点地址,适合分享文档、Demo 页面、原型页面、预览服务或内部工具。
- 静态 HTML:从工作空间文件系统读取 HTML、CSS、JS、图片等文件。
- HTTP 服务:发布工作空间内正在运行的 Web 应用或接口服务。
站点默认仅空间成员可见,发布者也可以按需要调整为组织内可见。未发布、草稿或已下线站点不会对外访问。
适用场景
- 将工作空间中的静态页面快速分享给团队成员查看。
- 把正在开发的前端应用、后端服务或全栈 Demo 以站点形式对外预览。
- 发布需要登录访问的内部工具,并明确告知访问者站点会读取哪些个人数据。
- 在本地执行机或云端运行环境中调试 Web 服务访问效果。
静态 HTML
静态模式需要配置站点根目录和入口文件。根路径访问会返回入口文件,子路径会映射到站点根目录下的同名资源。
静态资源支持相对路径加载,例如 ./main.js、main.js、css/style.css。HTML 中以 / 开头的绝对路径不会自动改写到站点路径下,建议静态站点使用相对路径。
文件读取统一通过工作空间文件适配器完成,因此云端 workspace 和本地执行机 workspace 都使用同一套访问规则。
HTTP 服务
HTTP 服务发布面向需要进程持续运行的 Web 应用,例如开发服务器、后端接口服务或全栈框架应用。
发布 HTTP 服务时,需要填写应用监听端口,并可补充服务启动说明、健康检查路径、基础路径等高级配置。服务启动说明用于帮助发布者或协作者在服务停止后快速恢复运行。
访问站点时,后端会根据工作空间当前执行模式解析目标:
- 云端 sandbox:如果容器已停止,会自动唤起容器。
- 本地执行机:如果本地执行机离线,会返回不可用状态,不会回退到云端 sandbox。
系统会记录服务恢复状态,便于发布者判断服务是否已恢复成功。
访问地址
站点优先使用自动生成的独立站点地址访问。独立地址可以让页面资源、接口请求、Cookie 和前端路由更接近真实部署方式。
发布者可以在创建站点时选填独立域名前缀;留空时系统自动生成。站点创建后也可以在编辑页修改前缀。系统会检查前缀格式和全局占用情况,避免不同站点使用同一个独立站点地址。修改前缀只改变访问地址,不会重新创建站点,也不会清除访问者已经对该站点完成的授权。
系统也保留平台内兼容访问入口,便于从工作空间设置、文件预览等位置跳转和调试。
系统管理员可以在平台管理后台按站点禁用独立站点域名访问。禁用后,站点不会被删除,发布配置仍然保留;访问该独立站点地址时会显示临时不可用提示,用于异常流量、故障排查或稳定性保护场景。
授权数据
发布站点时,发布者需要声明站点会读取哪些访问者数据。访问者首次打开站点时,会看到对应的授权确认页面;同意后,该授权只对当前站点生效,不会被其他站点复用。
当前产品界面按 API 能力分类声明授权,而不是按权限等级打包授权。发布者可以选择基础访问、个人信息、个人组织信息、组织管理信息、工作空间读取、工作空间写入、空间知识目录读取、空间知识目录写入、插件读取、插件写入、AI / Chat 调用、会话历史与元数据管理等分类。
涉及组织或工作空间的能力需要访问者选择资源范围。组织管理信息授权时只记录用户同意和组织范围;实际读取组织成员等管理员接口时,后端会再次校验访问者当前是否为组织管理员。工作空间写入用于创建或修改工作空间元信息,空间知识目录写入用于创建、更新或删除工作空间知识目录文件,二者需要分别授权。会话历史与元数据管理按工作空间范围统一授权,授权后站点可访问所选工作空间下的所有会话。任务写入是任务协作能力,访问者是工作空间 viewer 时也可以授权并通过站点 API 创建、修改或删除任务。站点授权 API 前缀和后台 PAT 调用规则见下方说明,通用平台接口详情见 常用 API。
访问者授权后,可以在个人设置的“站点授权”中查看站点已获得的权限,并可以打开站点、调整授权范围或撤销授权。撤销后,再次访问该站点时需要重新确认授权。
能力模块
能力模块按站点可申请的业务能力划分。同一个工作空间资源范围下,工作空间元信息写入、知识库文件写入、插件操作和任务写入是不同概念,应按实际用途分别授权。
站点授权 API 统一使用 /.well-known/knodo-site-auth 前缀。站点页面或站点后台调用平台 API 时,在原平台 API 路径前加该前缀。例如 /api/v1/auth/me 对应 /.well-known/knodo-site-auth/api/v1/auth/me。
后端会先校验 knodo_site_access,再判断目标接口是否开放给站点授权调用以及能力范围是否满足;没有开放或授权不足的接口不能调用。
| 模块 | 风险 | 资源范围 | 说明 |
|---|---|---|---|
| 基础访问 | 低 | 无 | 获取当前站点授权摘要 |
| 个人信息 | 低 | 无 | 读取访问者姓名、头像等基础资料 |
| 个人组织信息 | 中 | 组织 | 读取访问者相关组织摘要 |
| 组织管理信息 | 高 | 管理员组织 | 读取组织成员列表、角色等管理员信息 |
| 工作空间读取 | 中 | 工作空间 | 读取工作空间元信息 |
| 工作空间写入 | 高 | 可写工作空间 | 创建或修改工作空间元信息,不等同于知识库文件写入 |
| 空间知识目录读取 | 中 | 工作空间 | 读取工作空间知识目录和文件内容 |
| 空间知识目录写入 | 高 | 可写工作空间 | 创建、更新、删除工作空间知识目录文件 |
| AI / Chat 调用 | 高 | 工作空间或 Bot | 发起 AI 调用或继续对话 |
| 会话历史与元数据管理 | 高 | 工作空间 | 读取所选工作空间下的所有会话历史,管理标签、标题、摘要等元数据 |
| 插件读取 | 中 | 组织或工作空间 | 读取可见插件、插件详情或工作空间绑定关系 |
| 插件写入 | 高 | 组织或可写工作空间 | 上传、修改插件或变更工作空间插件绑定 |
| 任务读取 | 中 | 工作空间 | 读取工作空间任务 |
| 任务写入 | 高 | 有任务访问资格的工作空间 | 创建、修改或删除工作空间任务;viewer 也可以授权和使用 |
站点 API 调用
站点前端使用站点域名下的授权 API 前缀,统一前缀为 /.well-known/knodo-site-auth。浏览器会自动携带 knodo_site_access Cookie,避免跨域,也不需要在前端保存 Token。
const response = await fetch("/.well-known/knodo-site-auth/api/v1/auth/me");
const auth = await response.json();站点后台也可以转发 knodo_site_access 调用同一前缀下的 API:
curl "https://<site-domain>/.well-known/knodo-site-auth/api/v1/auth/me" \
-H "Cookie: knodo_site_access=jvs_site_xxx"如果站点后台要调用通用平台 API,应使用 Knodo 平台域名下的 /api/v1/...,并通过 PAT 认证。PAT 的认证方式和常用接口详情见 常用 API。
已开放给站点授权前缀的接口如下。调用时把“平台 API”前面加上 /.well-known/knodo-site-auth 即可。
| 模块 | 方法 | 平台 API |
|---|---|---|
| 基础访问 | GET | /api/v1/auth/me |
| 工作空间读取 | GET | /api/v1/workspaces |
| 工作空间读取 | GET | /api/v1/workspaces/{id} |
| 工作空间写入 | POST | /api/v1/workspaces |
| 工作空间写入 | PATCH | /api/v1/workspaces/{id} |
| 空间知识目录读取 | GET | /api/v1/workspaces/{workspaceId}/files |
| 空间知识目录读取 | GET | /api/v1/workspaces/{workspaceId}/files/tree |
| 空间知识目录读取 | GET | /api/v1/workspaces/{workspaceId}/files/content |
| 空间知识目录写入 | POST | /api/v1/workspaces/{workspaceId}/files/upload |
| 空间知识目录写入 | PUT | /api/v1/workspaces/{workspaceId}/files/text-file |
| 空间知识目录写入 | DELETE | /api/v1/workspaces/{workspaceId}/files/delete |
| 插件读取 | GET | /api/v1/plugins |
| 插件读取 | GET | /api/v1/plugins/{id} |
| 插件读取 | GET | /api/v1/workspaces/{workspaceId}/plugins |
| 插件读取 | GET | /api/v1/workspaces/{workspaceId}/plugins/available |
| 插件写入 | POST | /api/v1/plugins/upload |
| 插件写入 | PUT | /api/v1/plugins/{id}/reupload |
| 插件写入 | PATCH | /api/v1/plugins/{id}/status |
| 插件写入 | POST | /api/v1/workspaces/{workspaceId}/plugins |
| 插件写入 | DELETE | /api/v1/workspaces/{workspaceId}/plugins/{pluginId} |
| 任务读取 | GET | /api/v1/workspaces/{workspaceId}/task-items |
| 任务读取 | GET | /api/v1/workspaces/{workspaceId}/task-items/{taskId} |
| 任务写入 | POST | /api/v1/workspaces/{workspaceId}/task-items |
| 任务写入 | PATCH | /api/v1/workspaces/{workspaceId}/task-items/{taskId} |
| 任务写入 | DELETE | /api/v1/workspaces/{workspaceId}/task-items/{taskId} |
| AI / Chat 调用 | POST | /api/v1/workspaces/{workspaceId}/chat/submit |
| AI / Chat 调用 | POST | /api/v1/bots/{botId}/chat/completions |
| 会话历史与元数据管理 | GET | /api/v1/workspaces/{workspaceId}/chat/conversations |
| 会话历史与元数据管理 | GET | /api/v1/workspaces/{workspaceId}/chat/conversations/{conversationId}/messages |
| 会话历史与元数据管理 | GET | /api/v1/workspaces/{workspaceId}/chat/conversations/{conversationId}/status |
| 会话历史与元数据管理 | PATCH | /api/v1/workspaces/{workspaceId}/chat/conversations/{conversationId} |
| 会话历史与元数据管理 | DELETE | /api/v1/workspaces/{workspaceId}/chat/conversations/{conversationId} |
限制说明:站点授权前缀目前不开放 GET /api/v1/workspaces/{workspaceId}/chat/conversations/{conversationId}/stream 这类 SSE 流式接口;Bot Chat 的 stream=true 也不通过站点授权前缀开放。需要流式能力时,建议由独立站点后台使用 PAT 调用平台 API,再按站点自身协议返回给前端。
修改工作空间基本信息使用 PATCH /api/v1/workspaces/{id}。请求体里缺失的 key 不会修改对应字段;只有显式传入的字段才会更新。
权限
站点权限分为两层:站点可见性控制“谁可以打开站点”,授权数据控制“站点打开后可以代表访问者读取或写入哪些数据”。
站点可见性支持:
- 组织内可见:同组织登录用户可访问。
- 空间成员可见:仅工作空间成员可访问。
授权数据按能力模块控制:
- 基础访问、个人信息等无资源范围的能力,只确认能力本身。
- 组织管理信息授权时不要求访问者是组织管理员;调用组织成员等管理员接口时才校验当前管理员身份。
- 工作空间读取、空间知识目录读取、空间知识目录写入、AI / Chat 调用等能力需要选择具体工作空间范围;其中空间知识目录写入需要工作空间 admin/editor。
- 任务写入按任务协作权限处理,工作空间 viewer 也可以授权和使用,不按知识库或插件写入的 admin/editor 规则处理。
- 会话历史与元数据管理需要选择工作空间范围;授权会话即授权所选工作空间下的所有会话。
- 插件读取、插件写入、任务读取、任务写入属于站点声明的高阶业务能力,需要按组织或工作空间范围单独授权。
两层权限互不替代:即使用户可以打开站点,站点读取个人资料、访问工作空间内容或写入知识库前,仍需要用户确认对应能力和资源范围。用户撤销站点授权后,站点可见性不变,但站点不能再调用已撤销的授权数据。