@xpert-ai/plugin-live-dashboard 0.0.0-stage → 0.1.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.
Files changed (95) hide show
  1. package/.xpertai-plugin/plugin.json +8 -0
  2. package/README.md +108 -2
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.js +11 -0
  5. package/dist/lib/agent.schema.d.ts +568 -0
  6. package/dist/lib/agent.schema.js +52 -0
  7. package/dist/lib/dashboard-icon.d.ts +5 -0
  8. package/dist/lib/dashboard-icon.js +8 -0
  9. package/dist/lib/dashboard-navigation.d.ts +38 -0
  10. package/dist/lib/dashboard-navigation.js +18 -0
  11. package/dist/lib/dashboard-queries.d.ts +8 -0
  12. package/dist/lib/dashboard-queries.js +39 -0
  13. package/dist/lib/dashboard-receipt.d.ts +11 -0
  14. package/dist/lib/dashboard-receipt.js +35 -0
  15. package/dist/lib/dashboard.schema.d.ts +816 -0
  16. package/dist/lib/dashboard.schema.js +74 -0
  17. package/dist/lib/dashboard.service.d.ts +243 -0
  18. package/dist/lib/dashboard.service.js +185 -0
  19. package/dist/lib/document-libraries.d.ts +8 -0
  20. package/dist/lib/document-libraries.js +41 -0
  21. package/dist/lib/document-package.d.ts +41 -0
  22. package/dist/lib/document-package.js +25 -0
  23. package/dist/lib/editing.d.ts +403 -0
  24. package/dist/lib/editing.js +114 -0
  25. package/dist/lib/filter-evidence.d.ts +71 -0
  26. package/dist/lib/filter-evidence.js +60 -0
  27. package/dist/lib/html-guidance.d.ts +1 -0
  28. package/dist/lib/html-guidance.js +4 -0
  29. package/dist/lib/html-validation.d.ts +19 -0
  30. package/dist/lib/html-validation.js +136 -0
  31. package/dist/lib/middleware.d.ts +10 -0
  32. package/dist/lib/middleware.js +225 -0
  33. package/dist/lib/plugin.d.ts +2 -0
  34. package/dist/lib/plugin.js +22 -0
  35. package/dist/lib/presentation.provider.d.ts +122 -0
  36. package/dist/lib/presentation.provider.js +72 -0
  37. package/dist/lib/remote-entry.d.ts +4 -0
  38. package/dist/lib/remote-entry.js +12 -0
  39. package/dist/lib/renderer.d.ts +58 -0
  40. package/dist/lib/renderer.js +32 -0
  41. package/dist/lib/resource-card.d.ts +21 -0
  42. package/dist/lib/resource-card.js +33 -0
  43. package/dist/lib/save-evidence.d.ts +24 -0
  44. package/dist/lib/save-evidence.js +99 -0
  45. package/dist/lib/sharing.service.d.ts +93 -0
  46. package/dist/lib/sharing.service.js +71 -0
  47. package/dist/lib/view.provider.d.ts +235 -0
  48. package/dist/lib/view.provider.js +103 -0
  49. package/dist/libraries/ECHARTS-LICENSE.txt +222 -0
  50. package/dist/libraries/ECHARTS-NOTICE.txt +5 -0
  51. package/dist/libraries/THREE-LICENSE.txt +21 -0
  52. package/dist/libraries/catalog.json +1 -0
  53. package/dist/remote/app.css +1 -0
  54. package/dist/remote/app.js +253 -0
  55. package/dist/remote/build-manifest.json +63 -0
  56. package/dist/remote/renderer-source.json +5 -0
  57. package/dist/remote/renderer.html +4653 -0
  58. package/dist/sandbox-actions/action.json +10 -0
  59. package/dist/sandbox-actions/bundle/host.js +149 -0
  60. package/dist/sandbox-actions/bundle/runner.mjs +15 -0
  61. package/dist/sandbox-actions/bundle/validate.mjs +140 -0
  62. package/dist/validation/host-entry.d.ts +1 -0
  63. package/dist/validation/host-entry.js +6 -0
  64. package/docs/AGENTS.md +9 -0
  65. package/docs/acceptance.md +89 -0
  66. package/docs/agent-acceptance.md +96 -0
  67. package/docs/chat-resource-cards.mdx +60 -0
  68. package/docs/docs.json +49 -0
  69. package/docs/drafts-acceptance.mdx +42 -0
  70. package/docs/drafts.mdx +35 -0
  71. package/docs/editing.mdx +63 -0
  72. package/docs/evolution-acceptance.mdx +98 -0
  73. package/docs/file-authoring-acceptance.mdx +62 -0
  74. package/docs/file-authoring.mdx +49 -0
  75. package/docs/file-datasets-acceptance.mdx +65 -0
  76. package/docs/fixed-build-multimodel-acceptance.mdx +129 -0
  77. package/docs/frontend-libraries-acceptance.mdx +86 -0
  78. package/docs/frontend-libraries.mdx +57 -0
  79. package/docs/html-acceptance.md +86 -0
  80. package/docs/html-mode.md +76 -0
  81. package/docs/index.mdx +47 -0
  82. package/docs/retry-regression-acceptance.mdx +112 -0
  83. package/docs/team-sharing-acceptance.mdx +66 -0
  84. package/docs/team-sharing.mdx +44 -0
  85. package/docs/verification.mdx +91 -0
  86. package/examples/assistant-middleware.yaml +28 -0
  87. package/examples/data-xpert-sales.json +118 -0
  88. package/examples/postgres-sales.json +93 -0
  89. package/index.cjs +1 -0
  90. package/package.json +73 -3
  91. package/skills/live-dashboard/SKILL.md +71 -0
  92. package/skills/live-dashboard/agents/xpertai.yaml +21 -0
  93. package/skills/live-dashboard/references/data-validation.md +15 -0
  94. package/skills/live-dashboard/references/html-lifecycle.md +129 -0
  95. package/skills/live-dashboard/references/html-runtime.md +53 -0
@@ -0,0 +1,112 @@
1
+ ---
2
+ title: "2026-10-19 生成重试与持续编辑回归"
3
+ description: "CSV、JSON、XLSX 的真实模型迭代、可复用回归流程、权限和查询边界证据。"
4
+ ---
5
+
6
+ ## 范围与环境
7
+
8
+ 本轮于 2026-10-18 至 19 日在本地 xpert-pro 源码环境执行,复用现有 Assistant、模型、
9
+ WorkspaceFiles 和声明式 `file.table` 数据源。输入为独立合成的 CSV、JSON、XLSX 七笔销售数据。
10
+ 所有生成、修复及持续修改均通过真实 Chat 发送,脚本不改写 Agent 生成的 HTML。
11
+
12
+ 源码基线为 xpert `a7ff08645`、xpert-pro `0a76dabebd`、插件 `4da9a261`,加本轮工作区改动。
13
+ 平台能力同步至 xpert-pro;插件通过平台本地部署命令安装,按回执重启 API,并核对安装技能的字节。
14
+ 部署后严格环境检查为 ready。此处是本地应用回归,不是发布包或 SDK npm 兼容性认证。
15
+
16
+ ## 实现分层
17
+
18
+ | 所属 | 改动 |
19
+ | --- | --- |
20
+ | 平台 SDK | 根据已发现的 Provider JSON Schema 检查 payload 结构;不改参数、不补默认值、不替代授权或 Provider 校验 |
21
+ | 平台文件工具 | 准确说明顺序编辑不回滚,报告已应用数量和失败序号,错误时给出重读当前文件的恢复步骤 |
22
+ | 看板插件 | 预览提前返回待执行筛选测试;打开副本明确已存在并提供保存参数;Agent 更新显式提交标题,改名和页面一次保存 |
23
+ | 插件技能及回归脚本 | 指导局部修复,按实际工具回执与持久化内容验收,保留失败与恢复记录 |
24
+
25
+ 没有将看板字段或业务 oracle 放入平台,没有放宽创建工具的覆盖限制、草稿 CAS、
26
+ Provider 权限、声明式 Binding 或 HTML 沙箱边界。
27
+
28
+ ## 真实模型与业务结果
29
+
30
+ | 来源 | 初次保存 / 业务修复 | 第一次修改 | 第二次修改 | 接受的页面检查 |
31
+ | --- | --- | --- | --- | --- |
32
+ | CSV | r3 页面筛选失败;Chat 修复至 r4 | r5 | r6 | 24 / 24 |
33
+ | JSON | r1 | r2 | r3 | 24 / 24 |
34
+ | XLSX | r1 | r3 | r4 | 24 / 24 |
35
+
36
+ 最终回归序列共 10 个模型轮次,包含 CSV 的额外业务修复;9 个接受的页面轮次通过 72 个交互检查。
37
+ 其中 7 个接受轮次没有工具错误,2 个经工具错误恢复;连同原始 CSV 失败轮次,总计 4 次工具错误、14 次保存调用。
38
+ 最新“显式标题与页面一起保存”约束部署后的 6 轮修复或修改,均为零工具错误、一次保存。
39
+ XLSX 首轮修改和生成阶段发生在此前的迭代构建,整组结果不是单一不变构建的首次成功率。
40
+
41
+ 每个接受的页面轮次执行八个检查:初始数据、华东筛选、更新源文件后的宿主刷新、
42
+ 页面刷新、华西筛选、恢复源文件后全部区域、关闭后资源卡片重开、整页刷新恢复。
43
+ 检查同时核对 KPI、逐行明细、逐月图表和区域系列,以及每个已声明 Binding 的成功查询。
44
+
45
+ 独立口径为总额 5700、华东 3500、华西 2200。源文件首笔金额分别增加 100、200、300,
46
+ 刷新后华东为 3600、3700、3800。工具栏刷新保留筛选和页面实例。
47
+ 持续修改保持相同 Artifact、草稿、Binding、控件和依赖版本;保存 HTML 摘要与回执匹配。
48
+ 新标题和新增说明反映在页面及保存元数据中。没有创建正式版本。
49
+
50
+ ## 失败与恢复不能被隐藏
51
+
52
+ - 最终回归序列的首次 CSV 页面在筛选华东后仍保留华西零值系列,虽然 KPI 和明细正确,页面验收仍判失败。
53
+ 通过 Chat 在原草稿修复,再执行完整检查。修复是额外一轮,不算首次生成通过;原失败证据仍保留。
54
+ - 本轮较早的诊断尝试发现了 XLSX 契约摘要抄写错误后的重复预览,以及 CSV 编辑失败后的部分写入和错误正式基准参数。
55
+ 这些尝试保留状态及中止记录,用于推动结构错误反馈、顺序编辑恢复和 JSON null 说明;不计为接受的闭环。
56
+ - 诊断期间还出现浏览器导航超时、关闭流式 Chat 浏览器延迟和旧版检查器等待过长。
57
+ 回归流程增加了发送后恢复观察、避免重复发送和有界检查;保留这类执行器失败,不将其混作模型业务成功。
58
+ - 较早生成及编辑仍有文件已存在、字段选择错误和字符串 `None` 等可恢复工具错误。
59
+ 本次减少重试的结论来自有限真实样本,不承诺任何模型都能零错误或一次生成正确。
60
+
61
+ 权限回归最初遗漏了组织初始化自动添加的默认工作区成员资格,撤销单独分享后仍可读,
62
+ 该失败记录得到保留。修正测试前提后才验证撤销全部相关授权。早期清理还遇到软删除用户保留临时角色引用;
63
+ 仅对本轮两个已软删除测试用户执行定向本地残留清理,未修改业务账户。
64
+ 复跑流程在软删除前停用测试用户并切换到已有非管理员清理角色,最终通过公共接口完成清理。
65
+
66
+ 上一轮固定基线的九个模型轮次记录了 10 次工具错误、18 次保存调用。本轮在诊断中迭代了代码,
67
+ 不能将两批不同模型输出当作受控性能实验,也不能把最后几轮的成功率外推到所有生成请求。
68
+
69
+ ## 权限和查询边界
70
+
71
+ - 三种格式使用同一非管理员 JWT:授权时查询 201,撤销 `DATA_SOURCE_VIEW` 后查询与发现均为 403,恢复后为 201。
72
+ - 先移除测试用户在默认工作区的继承成员资格,再撤销 Assistant 显式分享,三种文件查询均为 403;恢复后为 201。
73
+ - 最终页面共有 6 个已保存 Binding,对每个执行 9 种覆盖尝试,合计 54 次均被拒绝:文件路径、文件目录、Reader、URL、Provider、完整 Binding、payload、未知控件、未知 Binding。
74
+ - 三个最终页面均观察到直接网络请求被 CSP 的 `connect-src` 拒绝。
75
+ - 最终权限回归通过公共接口清理分享、工作区测试成员、临时权限和临时角色,并停用及软删除测试用户。
76
+
77
+ 前端还检查未知 Binding、未知控件、父页面 DOM 访问和直接网络请求。
78
+ 独立边界脚本使用可访问的本地健康接口,并观察浏览器 `connect-src` 违规事件,
79
+ 不会把不存在域名的请求失败当作沙箱隔离证明。
80
+
81
+ 源文件在每轮结束时恢复原始字节,最终重新下载并核对初始 SHA-256。
82
+ 临时权限实体由专用回归流程创建和清理,不改业务账户、连接认证或外部 SSO 策略。
83
+ 此项不代表重新验收外部身份提供方撤销,也没有扩展其他数据源验收矩阵。
84
+
85
+ ## 自动检查与复跑入口
86
+
87
+ - 平台 SDK 两组测试 6 项;SandboxFile 中间件 10 项;文件活动证据 32 项。
88
+ - 看板插件 64 项测试、真实 Chromium HTML 预检 34 项通过。
89
+ - 插件元数据、远程 bundle 类型检查、构建摘要及 plugin-dev-harness 生命周期通过。
90
+ - 相关平台、插件、官网中英文 MDX 编译通过。官网全站链接检查另报告 79 个文件中的 194 条既有断链,
91
+ 不涉及本轮修改的实时看板页面;本轮未改动其他栏目。
92
+
93
+ 复跑步骤、合成数据口径、私有配置示例和失败恢复方法见
94
+ `tests/acceptance/README.md` 与 `tests/acceptance/context.example.json`。
95
+ 脚本包括生成、检查页面选择器、交互、持续修改对比、边界、权限和汇总七个阶段。
96
+ 工具统计只认实际 mutation tool-call ID 对应的回执,并核对持久化内容;文本或伪造 JSON 成功声明不能通过。
97
+
98
+ 原始状态、逐轮保存回执、截图、部署记录、源文件备份及完整检查输出保存在仓库外的私有验收目录。
99
+ 新尝试使用新目录;业务修复另留轮次;汇总仅在完整交互通过、权限实体清理完成、源文件摘要恢复后成功。
100
+ 详见[构建与验证](./verification)和[文件编写流程](./file-authoring)。
101
+
102
+
103
+ ## 分批审查补充(2026-10-19)
104
+
105
+ 插件实现已提交为 `e755ed43`,平台通用校验和文件编辑恢复已提交为 `fc83e88b9`。
106
+ 以上运行环境结果仍对应前述部署时的工作区内容;后续分批审查不代表重新部署或重新执行真实模型验收。
107
+
108
+ 审查时收紧了回归证据的两处判断:持续编辑补找 HTML 摘要时,只接受实际成功的看板工具回执;
109
+ 汇总必须包含源文件更新刷新这一完整交互序列,不能把 `read-only` 诊断当作完整验收。
110
+ 新增反例覆盖普通消息伪造 JSON、错误回执、其他 Artifact、摘要不匹配、缺少边界检查和只读刷新。
111
+ 三个证据单元测试通过,并以更严格的规则离线复核上述九个已接受页面的原始状态、回执、HTML 摘要和交互记录,全部通过。
112
+ 此项复核不调用模型、不修改源文件、不重新建立权限或 SSO 验收结论。
@@ -0,0 +1,66 @@
1
+ ---
2
+ title: 团队分享验收(2026-10-17)
3
+ description: 已发布只读分享、独立页及权限边界的本地验证
4
+ ---
5
+
6
+ 本次将平台能力同步到 xpert-pro,部署 Live Dashboard 与 Workspace Script 插件并重启 API,在现有 data-xpert SSO 联调环境验证。使用既有验收看板的正式版本和独立测试用户;没有重新生成看板、修改业务数据或发布新的正式版本,也不属于正式发行验证。
7
+
8
+ ## 已安装环境
9
+
10
+ | 场景 | 结果 |
11
+ | --- | --- |
12
+ | 匿名、组织外用户 | 分别拒绝 API 访问;独立页先登录再返回原 URL |
13
+ | 组织成员读取 | 能打开正式版本;不能通过 owner 管理接口读取 Artifact |
14
+ | 来源授权 | 无数据源权限的成员查询被拒绝,获得权限后成功;没有使用创建者身份代查 |
15
+ | PostgreSQL / data-xpert | 通过展示查询接口分别返回 6 行,重复查询使用新的执行 ID |
16
+ | ECharts 浏览器 | 全部净销售额 5700,华东筛选 3500、明细 3 行;图形和明细正常显示 |
17
+ | 刷新与重开 | 刷新保留筛选并产生新查询,重开恢复正式 v2 与默认总额 5700 |
18
+ | 固定与最新 | 固定 v1;相同配置复用链接;切换为最新后读取 v2,原链接失效 |
19
+ | 撤销 | 原链接读取失败 |
20
+ | 查询边界 | 发布指令、SQL 载荷覆盖、未声明 Binding、其他版本目标均被拒绝;HTML 直接网络请求被 CSP 阻止 |
21
+ | 私有脚本依赖 | Workspace Script 正式看板返回私有依赖诊断并阻止开启分享 |
22
+
23
+ 独立页使用完整可用屏幕宽度;WorkBench 新增分享按钮后修复窄屏工具栏溢出,并通过 320–1280 像素的既有响应式回归。已打开页面在撤销后不会主动清除已显示的数据,但下一次查询/重开重新检查权限。
24
+
25
+ ## 自动验证
26
+
27
+ - 平台 contracts/SDK 构建、server-ai TypeScript 与 Cloud Angular 编译通过。
28
+ - Artifact 原有访问控制、展示服务和真实 Nest HTTP 管线共 27 项测试通过,含成员失效与撤销/版本变化发生在查询期间的返回前复查。
29
+ - 通用前端桥接 2 项测试通过,覆盖消息白名单和网络策略。
30
+ - Live Dashboard 插件 48 项测试通过;Workspace Script 18 项测试通过。
31
+ - 生产前端浏览器夹具回归通过,覆盖已有草稿、发布、筛选、刷新、重开、搜索选择及响应式布局;新增分享开启、首次复制、固定版本、弹窗重开策略恢复和撤销检查通过。
32
+ - 两个插件均通过 plugin-dev-harness 的加载、初始化和关闭。
33
+
34
+ 没有重新进行 Agent 一句话生成、MySQL/Doris 实例联调或团队成员 data-xpert SSO 新账号登录验收;已有相应来源的历史记录不因本次测试被覆盖。成员移除与在途撤销由自动测试验证,真实环境测试的是非成员拒绝、成员只读查询、来源权限及链接撤销。
35
+
36
+ 全新管理员浏览器会话的 Chat 页停留在“请选择一个组织”状态,未进入实际 Workbench,因此分享弹窗完整点击链路只计入生产前端夹具验证。实际平台的分享创建、固定版本切换和撤销通过受权 View Host API 验证;独立页的成员登录、筛选、刷新和重开通过实际浏览器验证。
37
+
38
+ 临时账号凭据、机器路径、Artifact ID、链接 slug、查询回执和截图不纳入发行包。聊天消息内展示属于下一批。
39
+
40
+ ## 独立页浮层操作栏
41
+
42
+ 同日追加 UI 调整:工具栏默认收起为半透明按钮,悬停临时展开,点击或触摸保持展开。收起按钮、Escape 和点击 HTML 画布均可关闭;标题、正式版本、更新时间、刷新及标准模式筛选位于浮层,画布不再为工具栏预留高度。
43
+
44
+ 在实际 xpert-pro 独立页使用创建者正常登录验证:1440×1000 视口下,展开前后画布均从 y=0 开始、保持 1000 高;375×812 视口中浮层保持在屏幕内,触摸点击可展开。鼠标从按钮移入浮层可连续操作,移开自动收起;点击固定、键盘打开/Escape、关闭和点击 iframe 画布收起均通过。刷新请求成功,华东筛选仍为 3500。构建、48 项插件测试、既有 Workbench 浏览器回归和插件生命周期验证通过,检查了收起、展开及窄屏截图。
45
+
46
+ ## 安装环境复验与 ChatKit 资源卡片(同日追加)
47
+
48
+ 平台和插件最新实现再次同步、构建、部署到 xpert-pro,重启后确认 Live Dashboard 与 Workspace Script 均已加载。以下为实际浏览器和授权 API 的新结果,补齐前文尚未完成的真实 Workbench 点击链路;历史记录仍保留。
49
+
50
+ | 场景 | 结果 |
51
+ | --- | --- |
52
+ | ChatKit 原生 Workbench | 从历史消息资源卡片打开正式看板,页面位于 ChatKit 内部的“实时看板”标签 |
53
+ | 真实 Agent 输出 | 自然语言请求读取两份已有看板,实际工具调用输出正式版与草稿资源卡片;没有修改或发布看板 |
54
+ | 卡片切换与恢复 | 两张卡片在同一标签切换,关闭后点击重开;整页刷新分别恢复草稿 r2 和正式 v2,消息卡片仍可使用 |
55
+ | 真实分享弹窗 | 首次复制、打开独立页、固定 v1、重开恢复固定策略、切换最新 v2、撤销及重新开启均通过 |
56
+ | 分享链接失效 | 策略改变后旧链接不可读;撤销后已打开的独立页重新加载被拒绝,最后恢复为跟随最新正式版本 |
57
+ | 成员和来源权限 | 新建本地测试成员,未加入组织时拒绝;加入组织但无来源权限时查询拒绝。使用仅授予 `DATA_SOURCE_VIEW` 的独立测试角色后查询成功 |
58
+ | 成员浏览器 | 正常登录后总额 5700,华东 3500 / 3 行;刷新保留筛选,重开恢复默认值,无编辑/发布入口 |
59
+ | 查询边界 | 发布、SQL 覆盖、未声明 Binding、伪造正式版本与 owner 管理接口均被拒绝;HTML 直接网络请求仍被 CSP 阻止 |
60
+ | 独立页浮层 | 悬停、点击固定、键盘、画布点击关闭、375 像素触屏与展开前后全屏画布尺寸复验通过 |
61
+
62
+ 真实点击发现并修复了独立页继承插件 iframe 沙箱而无法启动登录应用的问题。作者 View 声明 `artifact.presentation.open`,调用平台受控命令打开同源 Artifact 展示 URL;新窗口清除 opener,展示页仍重新检查权限。没有增加 iframe 的同源/弹窗逃逸权限,也没有开放 HTML 网络请求或 Binding 以外的查询。浏览器入口只导入 contracts 类型,避免将需要动态求值的运行时依赖带入受 CSP 限制的包。
63
+
64
+ 新增平台打开命令、功能模块注册与销毁清理及 ChatKit 宿主授权共 20 项定向测试通过;Cloud TypeScript、contracts 构建、Live Dashboard 54 项测试、Workspace Script 18 项测试、生产前端 Workbench 回归和插件生命周期通过。共享页面使用普通登录会话,本次没有重新验收团队成员的 data-xpert SSO 新账号流程,也不属于 npm 发行或正式版本发布验证。本地插件使用当前平台源码构建的 contracts/SDK;其包版本标签较插件声明范围旧,不能据此声称已验证公开包版本兼容性。
65
+
66
+ 浏览器自动化使用正常登录和组织选择,没有复制浏览器会话凭据。测试成员在验收后通过平台接口软删除,临时角色权限及本地凭据文件已清理;空角色记录因已删除用户的外键引用保留。业务看板的草稿和正式版本保持原有内容。
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: 团队分享与独立看板页
3
+ description: 分享已发布版本,保持数据访问权限、草稿和编辑边界
4
+ ---
5
+
6
+ ## 使用流程
7
+
8
+ 在 Workbench 选择看板,点击「团队分享」。已有正式版本时,可选择跟随最新正式版本或固定一个历史版本,再开启分享、复制链接。链接进入平台独立页;未登录用户先登录,再返回原页面。
9
+
10
+ 独立页默认只显示右上角半透明操作按钮,悬停临时展开,点击保持展开;可通过收起按钮或 Escape 关闭。标题、正式版本、刷新时间与刷新操作位于浮层内,标准图表的筛选控件也在其中,展开不会挤占画布高度。
11
+
12
+ 组织成员可以查看、筛选和刷新。修改、草稿预览、发布和分享管理仍由创建者通过 Workbench 完成。独立页不显示这些操作,也不接受对应后端指令。分享不会创建正式版本;只有草稿的看板必须先人工发布。
13
+
14
+ 更改版本模式或固定目标会替换链接并使原链接失效。相同配置重复开启复用链接。撤销立即影响后续访问和查询;已经显示在浏览器中的数据无法追溯收回。
15
+
16
+ ## 平台与插件分工
17
+
18
+ | 平台通用能力 | 看板插件能力 |
19
+ | --- | --- |
20
+ | ArtifactLink、组织成员 ACL、链接撤销与正式版本解析 | 分享弹窗及发布前置、数据来源诊断 |
21
+ | ArtifactPresentationProvider 注册与作用域选择 | 解析看板版本包,校验内容摘要和来源身份 |
22
+ | 登录回跳、独立路由、隔离 iframe 和只读操作传输 | 标准 Data Analytics 和 HTML/ECharts 渲染 |
23
+ | 每次请求前后重新校验访问权与版本 | 从已保存定义解析 Binding、筛选参数校验 |
24
+ | Dataset 查询、来源认证与当前访问者授权 | `query` / `query-binding` 操作,不接受原生查询覆盖 |
25
+
26
+ 无新增分享业务表,也没有复制看板或创建另一个 Artifact。版本包携带 HTML 和固定图库依赖;标准与 HTML 模式复用原有渲染器。展示容器不认识看板、SQL 或本体语法。
27
+
28
+ ## 权限与刷新
29
+
30
+ 分享只授予正式定义的读取权。PostgreSQL/MySQL/Doris 继续使用平台受控查询,data-xpert 继续使用访问者的授权和本体策略;不会使用创建者身份代查。组织成员缺少数据源权限时仍查询失败。
31
+
32
+ 来源插件可在 Provider descriptor 的 `sharing` 声明 `owner_only` 及原因码。Workspace 脚本当前依赖私有定义、脚本和文件 Artifact,因此会阻止开启团队分享。后续应先提供这些依赖的显式协作授权,不能在看板层绕过文件 ACL。
33
+
34
+ 独立页只接受已发布的 Artifact/version 目标。刷新仅重查已声明 Binding;前端不能提交 SQL、替换 provider/dataSource、读取草稿或调用发布。HTML 与前端依赖运行在无网络的隔离环境中。
35
+
36
+ 跟随最新版本的链接在重新打开时读取当前正式版本;若页面打开后发布了新版本,旧目标查询会返回冲突,提示重新打开,避免旧 HTML 与新 Binding 混用。筛选值属于当前页面状态,刷新保留,重开恢复定义默认值。刷新仍是主动查询或定义中已配置的轮询,不是服务端推送。
37
+
38
+ ## 接口
39
+
40
+ 平台:`GET /api/artifacts/shared-links/:slug/presentation` 读取正式展示描述;`POST .../presentation/query` 使用 `{target: {artifactId, versionId}, operation, input}` 查询。两者需要平台登录,响应不缓存。
41
+
42
+ 插件 Workbench actions:`share-status`、`share`、`revoke-share`。仅通过受权 View Host 调用,服务再次检查 Artifact 创建者和 host。团队分享使用 `shareKey: team-readonly`、`organization_all`、禁下载和严格 HTML 规则,URL 由平台生成。
43
+
44
+ 本期没有聊天消息嵌入、匿名访问、团队编辑或 Workspace 私有依赖自动共享。
@@ -0,0 +1,91 @@
1
+ ---
2
+ title: "构建与验证"
3
+ description: "区分暂存代码检查、打包验证、浏览器回归和真实平台验收。"
4
+ ---
5
+
6
+ ## 本地自动检查
7
+
8
+ 在 xpertai 工作区使用固定版本的 Corepack pnpm:
9
+
10
+ ```sh
11
+ corepack pnpm exec nx run @xpert-ai/plugin-live-dashboard:test
12
+ corepack pnpm exec nx run @xpert-ai/plugin-live-dashboard:verify:dist
13
+ ```
14
+
15
+ 测试覆盖 Dataset 映射、图表粒度、预览回执、权限重验、筛选探测、版本并发、
16
+ 不可变 HTML、查询入口拒绝替代 Binding,以及后台预检与临时数据清理。
17
+ 源文件与远程 bundle 的摘要一致性通过 `verify:dist` 核对。
18
+
19
+ Action 验证拒绝额外文件、符号链接和陈旧内容。打包后从源码目录验证解压的真实包:
20
+
21
+ ```sh
22
+ node scripts/build-action.mjs --verify-package /absolute/path/to/extracted/package
23
+ ```
24
+
25
+ 同时运行仓库的 `plugin-dev-harness`,验证实际包入口、Nest 注入和关闭流程。
26
+ 能力 mocks 只用于生命周期,不证明真实平台权限或容器执行。
27
+
28
+ ## 浏览器与平台验证
29
+
30
+ `tests/html-preflight-browser.mjs` 使用真实 Chromium 和构建后的通用文档宿主,
31
+ 检查数据渲染、未知 Binding 和渲染异常。
32
+ `tests/workbench-browser.mjs` 使用生产远程 bundle 与内存 View Host,
33
+ 检查保存、筛选、刷新、重开和成功回执的精确版本。
34
+
35
+ ```sh
36
+ node tests/html-preflight-browser.mjs /absolute/path/to/platform
37
+ node tests/workbench-browser.mjs /absolute/path/to/platform /private/screenshot.png
38
+ ```
39
+
40
+ 开发依赖固定使用已发布的 SDK/contracts 3.25.0,构建无需本地平台链接。
41
+ 分批提交审核在临时快照构建和测试,不覆盖运行中的 dist,也不重新部署或重跑 SSO。
42
+
43
+ 真实验收使用 `verify-installed-dashboard.mjs` / `verify-installed-html.mjs`,
44
+ 传入私有上下文与独立业务 oracle。固定日期的历史模型、SSO 与页面交互结果
45
+ 保留在历史验收文档中,不应当作本次暂存代码的重新部署证明。
46
+
47
+ ## 持续修改的真实验收
48
+
49
+ `tests/verify-installed-evolution.mjs` 检查同一 Artifact 的多个精确版本、定义 ID、
50
+ 样式修改前后 Binding 不变、独立业务 oracle、刷新执行 ID 和声明式查询拒绝路径:
51
+
52
+ ```sh
53
+ node tests/verify-installed-evolution.mjs \
54
+ --platform-root /absolute/path/to/platform \
55
+ --context /private/evolution-context.json \
56
+ --output /private/evolution-receipts.json
57
+ ```
58
+
59
+ 私有上下文提供 `apiUrl`、`orgId`、`assistantId`、Keychain 服务名以及 `cases`。
60
+ 每个 case 包含 `name`、`artifactId`、`providerId`、按时间排序的 `versions`
61
+ (`versionId`,纯样式修改另设 `preserveBindings: true`)和独立 `oracle`。
62
+ 初始版本可提供修改前捕获的 `manifestSha256`,用于验证历史定义字节对应的 JSON 内容未变。
63
+ oracle 指定 `fields`、`numericFields` 与各场景的 `controls`、预期 `rows`。
64
+ 不要使用被测接口返回的数据来生成预期值,不要提交私有上下文或回执。
65
+
66
+ 接口检查不替代浏览器验收。还需在真实 SSO Workbench 中用一句话生成,选中页面后
67
+ 用不含 ID 的修改请求取得 `dashboard_open({})` 和 `dashboard_update` 回执,
68
+ 实际修改来源数据、刷新后检查数值变化和筛选保留,再恢复来源。
69
+ 最后通过版本菜单查看旧版,重开当前版,并在平台重启后复验持久化结果。
70
+
71
+ CSV/JSON/XLSX 的真实模型生成、持续编辑、源文件更新及权限检查范围,见 [2026-10-18 文件数据看板闭环验收](./file-datasets-acceptance)。
72
+
73
+ ## 文件看板的可复用 Chat 回归
74
+
75
+ `tests/acceptance/README.md` 和 `context.example.json` 定义可复用的本地应用验收流程。
76
+ `author.mjs` 通过真实 Chat 发送一句话与两轮持续修改,保留逐轮状态和工具证据;
77
+ `inspect.mjs` 读取实际页面以记录选择器;`verify-ui.mjs` 对照独立合成数据验证数值、
78
+ 筛选、源文件更新刷新、卡片重开和整页恢复。`evolution.mjs` 比较同一 Artifact 的草稿、
79
+ Binding、依赖锁和保存字节;`boundary.mjs` 和 `permissions.mjs` 分别验证查询越界与
80
+ 相同 Token 下的权限撤销,并清理本轮临时授权实体。
81
+
82
+ 上下文、账户配置、原始状态与截图保存在仓库外。每次新生成使用独立输出目录;
83
+ 修复后复验应另留记录,不能覆盖失败样本。页面预检、模型首次成功率、最终业务正确性
84
+ 和正式发布兼容性是不同结论;本流程不执行正式发布验证。
85
+
86
+ 本轮真实结果、失败样本与结论范围见 [2026-10-19 生成重试与持续编辑回归](./retry-regression-acceptance)。
87
+
88
+ 固定运行代码、构建字节与逐轮模型身份的后续回归,见
89
+ [2026-10-19 固定构建与多模型回归](./fixed-build-multimodel-acceptance)。
90
+ `build.mjs` 在运行前记录外部不可覆盖清单,`models.mjs` 核对实际根执行的模型和参数;
91
+ 工具首次成功、业务首次通过、额外修复轮次与模型不可用分别记录。
@@ -0,0 +1,28 @@
1
+ # Graph fragment, not a complete importable Assistant DSL.
2
+ # Merge into the Assistant's nodes/connections and retain its model/workspace settings.
3
+ nodes:
4
+ - key: dashboard-agent
5
+ type: agent
6
+ entity:
7
+ key: dashboard-agent
8
+ name: Dashboard
9
+ prompt: >-
10
+ Discover authorized business data and generate verified live dashboards.
11
+ Ask for clarification when the requested metric is unsupported.
12
+ options:
13
+ middlewares:
14
+ order: [live-dashboard-tools]
15
+ - key: live-dashboard-tools
16
+ type: workflow
17
+ entity:
18
+ key: live-dashboard-tools
19
+ type: middleware
20
+ provider: LiveDashboard
21
+ title: Live Dashboard
22
+ required: true
23
+ options: {}
24
+ connections:
25
+ - key: dashboard-tools
26
+ type: workflow
27
+ from: dashboard-agent
28
+ to: live-dashboard-tools
@@ -0,0 +1,118 @@
1
+ {
2
+ "schema": "xpert.live-dashboard/v1",
3
+ "id": "33333333-3333-4333-8333-333333333333",
4
+ "title": "本体区域销售",
5
+ "controls": [
6
+ {
7
+ "controlId": "region",
8
+ "label": "区域",
9
+ "type": "string",
10
+ "defaultValue": "west",
11
+ "allowedValues": [
12
+ "",
13
+ "east",
14
+ "west"
15
+ ]
16
+ }
17
+ ],
18
+ "bindings": [
19
+ {
20
+ "schemaVersion": 1,
21
+ "id": "sales",
22
+ "dataSourceId": "22222222-2222-4222-8222-222222222222",
23
+ "providerId": "data-xpert.ontology",
24
+ "operation": "action",
25
+ "contractVersion": 1,
26
+ "payload": {
27
+ "resourceId": "datax-semantic-model-<published-model-id>",
28
+ "actionTypeCode": "sql.query_cube_slice",
29
+ "target": {
30
+ "entityTypeCode": "semantic_cube",
31
+ "entityRef": "<published-model-id>::Sales"
32
+ },
33
+ "params": {
34
+ "dimensions": [
35
+ "Region"
36
+ ],
37
+ "measures": [
38
+ "Amount"
39
+ ],
40
+ "filters": [
41
+ {
42
+ "field": "Region",
43
+ "op": "contains",
44
+ "value": ""
45
+ }
46
+ ],
47
+ "limit": 100
48
+ },
49
+ "parameterPaths": {
50
+ "region": [
51
+ "filters",
52
+ "0",
53
+ "value"
54
+ ]
55
+ }
56
+ },
57
+ "parameters": [
58
+ {
59
+ "name": "region",
60
+ "controlId": "region",
61
+ "type": "string",
62
+ "required": true,
63
+ "defaultValue": "west",
64
+ "allowedValues": [
65
+ "",
66
+ "east",
67
+ "west"
68
+ ]
69
+ }
70
+ ],
71
+ "output": {
72
+ "datasetId": "sales",
73
+ "grain": [
74
+ "region"
75
+ ],
76
+ "fields": [
77
+ {
78
+ "id": "region",
79
+ "sourceField": "Region",
80
+ "label": "区域",
81
+ "logicalType": "string",
82
+ "role": "dimension",
83
+ "nullable": false
84
+ },
85
+ {
86
+ "id": "amount",
87
+ "sourceField": "Amount",
88
+ "label": "销售额",
89
+ "logicalType": "float64",
90
+ "role": "measure",
91
+ "nullable": false
92
+ }
93
+ ]
94
+ }
95
+ }
96
+ ],
97
+ "charts": [
98
+ {
99
+ "id": "sales",
100
+ "title": "区域销售额",
101
+ "type": "bar",
102
+ "datasetId": "sales",
103
+ "x": "region",
104
+ "y": "amount"
105
+ }
106
+ ],
107
+ "tables": [
108
+ {
109
+ "id": "details",
110
+ "title": "销售明细",
111
+ "datasetId": "sales",
112
+ "fields": [
113
+ "region",
114
+ "amount"
115
+ ]
116
+ }
117
+ ]
118
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "schema": "xpert.live-dashboard/v1",
3
+ "id": "11111111-1111-4111-8111-111111111111",
4
+ "title": "区域销售",
5
+ "controls": [
6
+ {
7
+ "controlId": "region",
8
+ "label": "区域",
9
+ "type": "string",
10
+ "defaultValue": "all",
11
+ "allowedValues": [
12
+ "all",
13
+ "east",
14
+ "west"
15
+ ]
16
+ }
17
+ ],
18
+ "bindings": [
19
+ {
20
+ "schemaVersion": 1,
21
+ "id": "sales",
22
+ "dataSourceId": "22222222-2222-4222-8222-222222222222",
23
+ "providerId": "postgres.sql",
24
+ "operation": "query",
25
+ "contractVersion": 1,
26
+ "payload": {
27
+ "sql": "SELECT region, amount::double precision AS amount FROM (SELECT 'east' AS region,120 AS amount UNION ALL SELECT 'west',80) AS sales WHERE $1 = 'all' OR region = $1 ORDER BY region",
28
+ "parameterOrder": [
29
+ "region"
30
+ ]
31
+ },
32
+ "parameters": [
33
+ {
34
+ "name": "region",
35
+ "controlId": "region",
36
+ "type": "string",
37
+ "required": true,
38
+ "defaultValue": "all",
39
+ "allowedValues": [
40
+ "all",
41
+ "east",
42
+ "west"
43
+ ]
44
+ }
45
+ ],
46
+ "output": {
47
+ "datasetId": "sales",
48
+ "grain": [
49
+ "region"
50
+ ],
51
+ "fields": [
52
+ {
53
+ "id": "region",
54
+ "sourceField": "region",
55
+ "label": "区域",
56
+ "logicalType": "string",
57
+ "role": "dimension",
58
+ "nullable": false
59
+ },
60
+ {
61
+ "id": "amount",
62
+ "sourceField": "amount",
63
+ "label": "销售额",
64
+ "logicalType": "float64",
65
+ "role": "measure",
66
+ "nullable": false
67
+ }
68
+ ]
69
+ }
70
+ }
71
+ ],
72
+ "charts": [
73
+ {
74
+ "id": "sales",
75
+ "title": "区域销售额",
76
+ "type": "bar",
77
+ "datasetId": "sales",
78
+ "x": "region",
79
+ "y": "amount"
80
+ }
81
+ ],
82
+ "tables": [
83
+ {
84
+ "id": "details",
85
+ "title": "销售明细",
86
+ "datasetId": "sales",
87
+ "fields": [
88
+ "region",
89
+ "amount"
90
+ ]
91
+ }
92
+ ]
93
+ }
package/index.cjs ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/index.js').default
package/package.json CHANGED
@@ -1,6 +1,76 @@
1
1
  {
2
2
  "name": "@xpert-ai/plugin-live-dashboard",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.1",
4
+ "description": "Versioned live dashboards using platform analytics and Data Analytics renderer",
5
+ "main": "./index.cjs",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "require": "./index.cjs",
11
+ "default": "./index.cjs"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "index.cjs",
18
+ "README.md",
19
+ "docs",
20
+ "examples",
21
+ ".xpertai-plugin",
22
+ "skills"
23
+ ],
24
+ "license": "AGPL-3.0",
25
+ "private": false,
26
+ "xpert": {
27
+ "plugin": {
28
+ "level": "system",
29
+ "artifactNamespace": "live_dashboard"
30
+ }
31
+ },
32
+ "peerDependencies": {
33
+ "@xpert-ai/plugin-sdk": "^3.25.0",
34
+ "@xpert-ai/contracts": "^3.25.0",
35
+ "@nestjs/common": "^11.1.6",
36
+ "@nestjs/core": "^11.1.6",
37
+ "zod": "3.25.67",
38
+ "@langchain/core": ">=0.3.0"
39
+ },
40
+ "devDependencies": {
41
+ "echarts": "5.6.0",
42
+ "three": "0.185.1",
43
+ "@xpert-ai/plugin-sdk": "3.25.0",
44
+ "@xpert-ai/contracts": "3.25.0",
45
+ "@nestjs/common": "^11.1.6",
46
+ "@nestjs/core": "^11.1.6",
47
+ "zod": "3.25.67",
48
+ "typescript": "^5.9.2",
49
+ "@types/node": "^20.19.9",
50
+ "reflect-metadata": "^0.2.2",
51
+ "@langchain/core": "0.3.72",
52
+ "react": "^18.3.1",
53
+ "react-dom": "^18.3.1",
54
+ "@types/react": "^18.3.24",
55
+ "@types/react-dom": "^18.3.7",
56
+ "vite": "^7.3.0",
57
+ "@tailwindcss/vite": "^4.3.2",
58
+ "tailwindcss": "^4.3.2",
59
+ "@xpert-ai/community-data-analytics": "0.1.35",
60
+ "@xpert-ai/plugin-shadcn-ui": "0.1.0"
61
+ },
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "https://github.com/xpert-ai/xpert-plugins.git",
65
+ "directory": "xpertai/apps/live-dashboard"
66
+ },
67
+ "publishConfig": {
68
+ "access": "public"
69
+ },
70
+ "scripts": {
71
+ "verify:dist": "node scripts/verify-dist.mjs && node scripts/build-action.mjs --verify && node scripts/build-libraries.mjs --verify",
72
+ "build": "pnpm --filter @xpert-ai/plugin-shadcn-ui build && node scripts/build-libraries.mjs && tsc -p tsconfig.json && tsc -p tsconfig.remote.json --noEmit && node scripts/build-remote.mjs && node scripts/build-action.mjs",
73
+ "test": "pnpm run build && node --test tests/*.test.cjs",
74
+ "typecheck": "tsc -p tsconfig.json --noEmit"
75
+ }
6
76
  }