技术文档

星企技术概览

星企是独立的企业协作客户端,拥有 iOS、Android 工程,与星线 App共享聊天服务的账户映射与部分基础设施。企业 API 位于 chat-service/src/enterprise-routes.mjs,并不因此成为星线 App 的前台功能。资料依据 2026 年 10 月 23 日源码整理;两端界面仍标记开发预览,正式企业服务及商店发布不能由源码或本机样例推定。

工程与服务边界

iOS 工程在 xingqi-ios-app/,使用 Swift、SwiftUI、URLSession 与独立安全凭据存储;Android 工程在 xingqi-android-app/,使用 Kotlin、Compose。二者 application/bundle 标识为 cn.thestarline.xingqi,与个人聊天产品分离。iOS 当前面向 iOS 17 及以后,Android 最低 API 26,编译与目标 API 35;构建元数据仍需随发布重新核对。

共享服务把 Account OIDC 用户映射为聊天用户,再使用聊天 Bearer 会话访问企业路由。Account 用户主键、聊天用户 UUID、组织 UUID 和消息序号各自独立。企业角色存储在企业成员关系中,与 Account 的平台管理员角色不相互授予。

模块 当前数据与操作 服务端实现
企业空间 创建、列出、选择组织,读取聚合工作区 enterprise/organizations.mjs
通讯录 部门、成员角色、职务、企业名片 enterprise/core.mjs、organizations.mjs
邀请与入企 有效期邀请码、预览、申请、审批、记录 enterprise/admissions.mjs
企业会话 全员群、同事单聊、成员群、文本、未读 enterprise/channels.mjs
工作内容 待办、公告与已读、HTTPS 办公服务入口 enterprise/content.mjs
数据约束 企业外键、成员关联、消息去重与历史边界 enterprise/schema.mjs、content-schema.mjs

以上路径均相对 chat-service/src/。当前未提供企业附件上传、音视频会议、考勤、网盘、企业认证审批或端到端加密主链路;不能把个人 App 的其他接口、占位页面或企业认证“待开放”界面写成已实现企业能力。

企业、成员与权限

创建组织时,服务端在同一事务创建组织、owner 成员和唯一 general 全员群。成员角色为 owner、admin、member。owner 可以给非所有者设置 admin/member;admin 不能提升自己、改所有者角色或移除其他管理员;所有者不能通过普通移除接口删除。部门、成员和服务均限定当前组织,不能只凭一个有效对象 ID 跨企业操作。

本人名片 PATCH 只接受 name,名称为 1–80 个 Unicode 字符的单行文字,null 恢复为账户名称。企业通讯录同时返回 accountName、cardName 与解析后的 displayName。名片是组织内资料,不修改 Account 全局名称,也不把一个企业的昵称带到另一个企业。管理者修改成员时还可维护部门、职务和受权限限制的角色。

邀请由管理者创建,随机码有效期 3 天,数据库只存摘要;它可以被多位同事使用,但仍需要管理者审批。预览只确认企业、期限和本人状态,不直接加入。申请人不能审批自己的申请,已决定的申请不能改为相反结果。重新申请需要新的有效邀请,不能复活已处理的旧记录。

会话与可见历史

会话类型为 general、direct、group。创建同事单聊要求最终恰好两名当前企业成员,同一对成员以稳定键复用会话。群会话也只能选择当前企业成员;企业成员资格并不自动提供某个专用群的访问权限,还要检查频道成员关系。

成员加入频道时保存 visible_after 历史边界和 last_read。新入企成员进入全员群只能看到加入边界后的消息;移除成员会通过外键清理其频道资格,重新加入时不会据此重新获得早期历史。消息列表最多 100 条,通过 before 向前翻页,按时间序号升序返回本页;消息 ID 是 JSON 字符串,客户端不应按字典序比较。

发送仅接受文本 body 与 clientId。服务端以频道、发送者、clientId 去重;同一内容重试返回原消息,换正文却复用 ID 返回冲突。未读计数排除本人发送的消息,并受个人可见边界与已读位置限制。企业消息没有单独事件游标或 WebSocket 推送接口,两端通过轮询更新工作区和当前会话。

待办、公告与办公入口

任意成员可以创建待办,指派对象必须是当前企业成员。管理者和创建者可以修改完整内容或删除;仅作为被指派人的普通成员只能更新完成状态。标题最多 120 字符,备注 4,000 字符,dueAt 是可空的安全整数毫秒时间,isCompleted 是布尔值。

公告由管理者发布、删除,所有企业成员可以标记已读。已读关系去重,重复打开不增加人数。标题最多 120 字符、正文 10,000 字符。服务入口由管理者维护,名称最多 80 字符、URL 最多 2,000 字符,只接受不嵌入账号密码的 HTTPS 地址,并拒绝控制字符等危险表达。

iOS 办公服务在非持久化网站数据容器中打开,Android 使用外部系统浏览器;不会把企业 Bearer 令牌注入外部网站。服务卡片是网址入口,不代表星企代理了该网站的认证、数据、审批或可用性。

客户端隔离与验收边界

两端使用会话与企业选择代次隔离异步响应,切换账号或企业时清除工作区、频道、草稿和待处理动作,避免旧请求覆盖新企业。401 需要处理账户会话;403 可能只是成员或管理权限变化,通常重新读取组织与当前角色,不能把它一律等同于 Account 全局退出。

当前星企登录仍从 GET /auth/start?app=xingqi 进入浏览器,回到 xingqiworkbench://auth 后只以 ticket 换票。聊天服务到 Account 的 OIDC 有 PKCE,但两端没有采用星线 App 已有的 /auth/native/start 原生附加 proof;不能宣称二者登录实现完全一致。

仓库有 iOS 契约、消息排序、企业隔离、退出持久化及 UI 测试,Android 有领域与企业流程等测试,服务端另有企业模块测试。本机专用样例入口仅用于隔离预览,生产 /__preview/enterprise/session 明确返回 404。历史测试记录不构成真实 Account 登录、跨网络企业业务或商店审核通过。具体接口与联调方法见星企接入细则。

Markdown 原文完整文档文本