dsh-agentone 1.0.3 → 1.0.5
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.
- package/README.md +3 -0
- package/lib/client.js +59 -3
- package/lib/page.js +7 -3
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -70,6 +70,9 @@ lark-cli / ccpg-cli 状态探测。
|
|
|
70
70
|
(改名不影响、被删自动重建);设置页「云盘」tab 支持初始化/重新定位/
|
|
71
71
|
粘贴链接收养其他文件夹(`POST /agentone/api/drive/home/resolve`)。
|
|
72
72
|
独立 dsh 未装 better-sidebar 时静默不注册该页签。
|
|
73
|
+
宿主适配:页签与 footer 入口**所有宿主恒注册**(官方桌面版 `dsh-app://` 不再被
|
|
74
|
+
误伤);个别会静默拦跨源 iframe 的桌面壳由页签内运行时探测兜底——`onLoad` 后
|
|
75
|
+
`contentDocument` 仍可读即白屏,换退路卡片(新窗口打开 + 重试)。
|
|
73
76
|
内容变化时自动刷新:服务端对根清单算指纹(`GET /agentone/api/drive/rev`,10s 节流),
|
|
74
77
|
页签 ready 后每 8s 轮询,指纹变了才重挂载 iframe。用户正在云盘里浏览时不硬刷新
|
|
75
78
|
(重载会回到根视图):顶部弹蓝色横幅「云盘内容有更新 / 立即刷新」,右下角常驻
|
package/lib/client.js
CHANGED
|
@@ -353,6 +353,7 @@ window.__ModuleLoader__.load({
|
|
|
353
353
|
const [retryTick, setRetryTick] = React.useState(0);
|
|
354
354
|
const [reloadTick, setReloadTick] = React.useState(0);
|
|
355
355
|
const [stale, setStale] = React.useState(false);
|
|
356
|
+
const [blocked, setBlocked] = React.useState(false);
|
|
356
357
|
React.useEffect(() => {
|
|
357
358
|
let cancelled = false;
|
|
358
359
|
setPhase({ kind: 'loading' });
|
|
@@ -402,6 +403,25 @@ window.__ModuleLoader__.load({
|
|
|
402
403
|
return () => { stopped = true; clearInterval(timer); };
|
|
403
404
|
}, [phase.kind === 'ready' ? phase.url : '']);
|
|
404
405
|
|
|
406
|
+
// 白屏宿主探测:个别桌面壳(如 DSH NEXT)会静默拦下跨源 iframe
|
|
407
|
+
// (CSP/COEP),页签里只剩一张白屏。注册期无法预判——官方桌面版与
|
|
408
|
+
// NEXT 同为 dsh-app://,宿主侧没有可靠标识可分(按协议隐藏曾把官方
|
|
409
|
+
// 桌面版一起误伤)。只能在 load 后实测:被拦的 iframe 停在初始
|
|
410
|
+
// about:blank,contentDocument 可读且非 null;正常跨源加载后 Chrome
|
|
411
|
+
// 里 contentDocument 为 null。探到被拦换退路卡片(新窗口打开 + 重试),
|
|
412
|
+
// url/重挂载变化时复位重探。
|
|
413
|
+
React.useEffect(() => {
|
|
414
|
+
setBlocked(false);
|
|
415
|
+
}, [phase.kind === 'ready' ? phase.url : '', reloadTick]);
|
|
416
|
+
|
|
417
|
+
const probeFrameLoad = (event) => {
|
|
418
|
+
const el = event && event.target;
|
|
419
|
+
if (!el) return;
|
|
420
|
+
let blockedNow = false;
|
|
421
|
+
try { blockedNow = el.contentDocument != null; } catch { blockedNow = false; }
|
|
422
|
+
if (blockedNow) setBlocked(true);
|
|
423
|
+
};
|
|
424
|
+
|
|
405
425
|
// 手动刷新:立即重载 iframe 并重新寻址(资料夹被重新定位/收养过也能跟上);
|
|
406
426
|
// 寻址失败保留当前画面不打断
|
|
407
427
|
const refreshDrive = () => {
|
|
@@ -419,10 +439,42 @@ window.__ModuleLoader__.load({
|
|
|
419
439
|
}, '正在定位你的飞书云盘文件夹…');
|
|
420
440
|
}
|
|
421
441
|
if (phase.kind === 'ready') {
|
|
442
|
+
if (blocked) {
|
|
443
|
+
return React.createElement('div', {
|
|
444
|
+
style: {
|
|
445
|
+
padding: '28px 20px', textAlign: 'center',
|
|
446
|
+
color: 'var(--dsw-alias-label-secondary, #57606a)', fontSize: '13px', lineHeight: '1.7',
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
React.createElement('p', {
|
|
450
|
+
style: { margin: '0 0 6px', fontSize: '14px', color: 'var(--dsw-alias-label-primary, #3c434d)' },
|
|
451
|
+
}, '当前桌面壳不支持在页签里内嵌网页'),
|
|
452
|
+
React.createElement('p', { style: { margin: '0 0 16px' } },
|
|
453
|
+
'可以改用系统浏览器打开云盘文件夹,上传和管理不受影响。'),
|
|
454
|
+
React.createElement('button', {
|
|
455
|
+
type: 'button',
|
|
456
|
+
style: {
|
|
457
|
+
padding: '7px 18px', fontSize: '13px', borderRadius: '9px', border: 'none',
|
|
458
|
+
cursor: 'pointer', background: '#2f6feb', color: '#fff', marginRight: '8px',
|
|
459
|
+
},
|
|
460
|
+
onClick: () => window.open(phase.url, '_blank', 'noopener'),
|
|
461
|
+
}, '新窗口打开云盘'),
|
|
462
|
+
React.createElement('button', {
|
|
463
|
+
type: 'button',
|
|
464
|
+
style: {
|
|
465
|
+
padding: '7px 18px', fontSize: '13px', borderRadius: '9px', border: 'none',
|
|
466
|
+
cursor: 'pointer',
|
|
467
|
+
background: 'var(--dsw-alias-fill-secondary, #f2f3f5)',
|
|
468
|
+
color: 'var(--dsw-alias-label-primary, #3c434d)',
|
|
469
|
+
},
|
|
470
|
+
onClick: () => { setBlocked(false); setReloadTick((t) => t + 1); },
|
|
471
|
+
}, '重试'));
|
|
472
|
+
}
|
|
422
473
|
// 不设 sandbox:飞书登录态依赖真实第三方 cookie 上下文(spike 实测
|
|
423
474
|
// 无 sandbox 时登录页可渲染、登录后云盘可用)。key 随 reloadTick 变化
|
|
424
475
|
// 即重挂载 = 重载(跨域 iframe 不能调 contentWindow.location.reload)。
|
|
425
476
|
// 用户浏览中时刷新被推迟:顶部横幅 + 胶囊按钮变色双提示(见上面轮询注释)。
|
|
477
|
+
// onLoad 探测白屏宿主(见 probeFrameLoad 注释)。
|
|
426
478
|
const refreshTitle = stale ? DRIVE_STALE_TITLE : DRIVE_REFRESH_TITLE;
|
|
427
479
|
const banner = React.createElement('div', {
|
|
428
480
|
key: 'stale-banner',
|
|
@@ -447,6 +499,7 @@ window.__ModuleLoader__.load({
|
|
|
447
499
|
key: `drive-frame-${reloadTick}`,
|
|
448
500
|
src: phase.url,
|
|
449
501
|
title: '飞书云盘',
|
|
502
|
+
onLoad: probeFrameLoad,
|
|
450
503
|
style: {
|
|
451
504
|
border: 'none', width: '100%', height: '100%', minHeight: '320px',
|
|
452
505
|
background: '#fff', display: 'block',
|
|
@@ -610,6 +663,10 @@ window.__ModuleLoader__.load({
|
|
|
610
663
|
// 那个窗口里取到 null 会静默跳过且永不重试(真机事故:侧边栏找不到云盘入口)。
|
|
611
664
|
function registerFeishuDriveTab(ctx) {
|
|
612
665
|
if (typeof ctx.inject !== 'function') return () => {};
|
|
666
|
+
// 所有宿主一律注册:官方桌面版(dsh-app://)的跨源 iframe 实际可用
|
|
667
|
+
// (r12-r14 真机长期验证,免扫码),按协议隐藏会把它误伤。个别会拦
|
|
668
|
+
// iframe 的桌面壳(如 DSH NEXT)由 FeishuDriveTab 里的 onLoad 运行时
|
|
669
|
+
// 探测兜底(白屏 → 退路卡片),不在注册期猜宿主。
|
|
613
670
|
return ctx.inject(['betterSidebar'], (scope) => {
|
|
614
671
|
const sidebar = scope.betterSidebar;
|
|
615
672
|
setDriveSidebarService(sidebar);
|
|
@@ -709,10 +766,9 @@ window.__ModuleLoader__.load({
|
|
|
709
766
|
|
|
710
767
|
function apply(ctx) {
|
|
711
768
|
setupNavIcon();
|
|
712
|
-
// 飞书云盘侧边栏 tab(better-sidebar
|
|
769
|
+
// 飞书云盘侧边栏 tab(better-sidebar 缺失时内部静默跳过;所有宿主
|
|
770
|
+
// 恒注册,白屏宿主由页签内探测兜底,见 registerFeishuDriveTab 注释)
|
|
713
771
|
registerFeishuDriveTab(ctx);
|
|
714
|
-
// 主界面左栏底部云盘入口(order 10 < 飞书账号 20 → 排在它上方、设置按钮之下)。
|
|
715
|
-
// 不依赖 better-sidebar:点击时服务在就开页签,不在退化为新窗口开设置页。
|
|
716
772
|
ctx.slots.inject('sidebar.footer.action', () =>
|
|
717
773
|
ctx.slots.register(
|
|
718
774
|
{
|
package/lib/page.js
CHANGED
|
@@ -1203,7 +1203,10 @@ const renderDrive = async () => {
|
|
|
1203
1203
|
if (seq !== renderDrive._seq) return;
|
|
1204
1204
|
renderDrive._data = data;
|
|
1205
1205
|
if (data.state === 'ready') {
|
|
1206
|
-
|
|
1206
|
+
// 云盘页签在所有宿主恒注册(官方桌面版不再被误伤);个别白屏宿主由
|
|
1207
|
+
// 页签内运行时探测换退路卡片,这里的文案不再按宿主分叉。
|
|
1208
|
+
statusEl.innerHTML = '<span class="pill ok">已就绪</span>'
|
|
1209
|
+
+ '点「打开云盘」会在侧边栏的「飞书云盘」页签里进入这个文件夹。';
|
|
1207
1210
|
if (data.url) {
|
|
1208
1211
|
linkEl.textContent = data.name || 'AgentOne';
|
|
1209
1212
|
linkEl.href = data.url;
|
|
@@ -1530,9 +1533,10 @@ const searchCatalog = async () => {
|
|
|
1530
1533
|
const action = known
|
|
1531
1534
|
? '<span class="pill ok" style="font-size:11px">已安装</span>'
|
|
1532
1535
|
: '<button class="btn small primary" data-install="' + esc(item.slug) + '">安装</button>';
|
|
1536
|
+
const tag = item.category ? '<span class="tag" data-cat="' + esc(item.category) + '">' + esc(item.category) + '</span>' : '';
|
|
1533
1537
|
return '<div class="skill-item"><div class="skill-info"><div class="skill-name">'
|
|
1534
1538
|
+ esc(item.display_name || item.slug)
|
|
1535
|
-
+
|
|
1539
|
+
+ tag + '</div><div class="skill-sub">'
|
|
1536
1540
|
+ esc(item.summary || item.slug) + ' · ' + (item.downloads || 0) + ' 次安装</div></div>' + action + '</div>';
|
|
1537
1541
|
});
|
|
1538
1542
|
$('search-results').innerHTML = rows.length
|
|
@@ -1862,8 +1866,8 @@ export function statusPageHtml() {
|
|
|
1862
1866
|
<span class="v"><a id="drive-folder-link" target="_blank" rel="noopener"></a></span>
|
|
1863
1867
|
</div>
|
|
1864
1868
|
<div class="row" style="margin-top:12px">
|
|
1865
|
-
<button id="drive-open-btn" class="btn small">打开云盘</button>
|
|
1866
1869
|
<button id="drive-resolve-btn" class="btn small primary" data-loading="定位中…">初始化 / 重新定位</button>
|
|
1870
|
+
<button id="drive-open-btn" class="btn small">打开云盘</button>
|
|
1867
1871
|
</div>
|
|
1868
1872
|
<div class="hint" id="drive-firstuse-hint">首次使用:云盘需要飞书授权。点「打开云盘」后在侧边栏页签里按提示点「去授权」,用手机飞书扫描弹窗里的二维码确认一次即可(之后不再需要)。</div>
|
|
1869
1873
|
<div class="hint" id="drive-hint">初始化会在你的飞书「我的空间」根目录找到(没有则创建)名为「AgentOne」的文件夹;之后侧边栏云盘页签直接进入这个文件夹,你看到的飞书云盘界面里做的上传、整理都发生在这里。</div>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-agentone",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "AgentOne 平台集成:平台模型、SkillHub 技能、套餐、CLI
|
|
3
|
+
"version": "1.0.5",
|
|
4
|
+
"description": "AgentOne 平台集成:平台模型、SkillHub 技能、套餐、CLI、飞书云盘共享文件夹(web/官方桌面端侧栏页签 + 左栏底部入口;「启用云盘」后 AI 可读取/搜索资料、看最近更新、存文档、传本地文件)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"smoke": "node scripts/env-matrix-smoke.mjs"
|