@numa-tech/numa 1.17.1 → 1.19.0

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 (46) hide show
  1. package/README.md +114 -3
  2. package/THIRD_PARTY_NOTICES.md +50 -0
  3. package/dist/command-catalog.js +19 -0
  4. package/dist/command-catalog.js.map +1 -1
  5. package/dist/oss/auth-code.d.ts +4 -0
  6. package/dist/oss/auth-code.js +56 -0
  7. package/dist/oss/auth-code.js.map +1 -0
  8. package/dist/oss/clipboard.d.ts +10 -0
  9. package/dist/oss/clipboard.js +43 -0
  10. package/dist/oss/clipboard.js.map +1 -0
  11. package/dist/oss/commands.d.ts +6 -1
  12. package/dist/oss/commands.js +122 -2
  13. package/dist/oss/commands.js.map +1 -1
  14. package/dist/oss/local-picker.d.ts +23 -0
  15. package/dist/oss/local-picker.js +245 -0
  16. package/dist/oss/local-picker.js.map +1 -0
  17. package/dist/oss/transfer-paths.d.ts +16 -0
  18. package/dist/oss/transfer-paths.js +131 -0
  19. package/dist/oss/transfer-paths.js.map +1 -0
  20. package/dist/oss/transfer-queue.d.ts +62 -0
  21. package/dist/oss/transfer-queue.js +349 -0
  22. package/dist/oss/transfer-queue.js.map +1 -0
  23. package/dist/oss/transfer-types.d.ts +54 -0
  24. package/dist/oss/transfer-types.js +2 -0
  25. package/dist/oss/transfer-types.js.map +1 -0
  26. package/dist/oss/transfer-worker.d.ts +3 -0
  27. package/dist/oss/transfer-worker.js +415 -0
  28. package/dist/oss/transfer-worker.js.map +1 -0
  29. package/dist/oss/transfers.d.ts +26 -0
  30. package/dist/oss/transfers.js +82 -0
  31. package/dist/oss/transfers.js.map +1 -1
  32. package/dist/oss/web-icons.d.ts +3 -0
  33. package/dist/oss/web-icons.js +4 -0
  34. package/dist/oss/web-icons.js.map +1 -0
  35. package/dist/oss/web-page.d.ts +4 -0
  36. package/dist/oss/web-page.js +343 -0
  37. package/dist/oss/web-page.js.map +1 -0
  38. package/dist/oss/web-session.d.ts +16 -0
  39. package/dist/oss/web-session.js +62 -0
  40. package/dist/oss/web-session.js.map +1 -0
  41. package/dist/oss/web.d.ts +25 -0
  42. package/dist/oss/web.js +425 -0
  43. package/dist/oss/web.js.map +1 -0
  44. package/dist/web-console.js +1 -1
  45. package/dist/web-console.js.map +1 -1
  46. package/package.json +7 -4
@@ -1 +1 @@
1
- {"version":3,"file":"transfers.js","sourceRoot":"","sources":["../../src/oss/transfers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transfers.js","sourceRoot":"","sources":["../../src/oss/transfers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Lucide SVG assets (ISC); sources and full license in THIRD_PARTY_NOTICES.md. */
2
+ export declare const OSS_REFRESH_ICON = "<svg aria-hidden=\"true\" focusable=\"false\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n>\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n</svg>";
3
+ export declare const OSS_COPY_ICON = "<svg aria-hidden=\"true\" focusable=\"false\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n>\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n</svg>";
@@ -0,0 +1,4 @@
1
+ /** Lucide SVG assets (ISC); sources and full license in THIRD_PARTY_NOTICES.md. */
2
+ export const OSS_REFRESH_ICON = "<svg aria-hidden=\"true\" focusable=\"false\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n>\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n</svg>";
3
+ export const OSS_COPY_ICON = "<svg aria-hidden=\"true\" focusable=\"false\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n>\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n</svg>";
4
+ //# sourceMappingURL=web-icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-icons.js","sourceRoot":"","sources":["../../src/oss/web-icons.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,gBAAgB,GAAG,2dAA2d,CAAC;AAC5f,MAAM,CAAC,MAAM,aAAa,GAAG,0aAA0a,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Self-contained local assets: no CDN, remote fonts, analytics or credential-bearing markup. */
2
+ export declare const OSS_WEB_HTML: string;
3
+ export declare const OSS_WEB_CSS: string;
4
+ export declare const OSS_WEB_JS: string;
@@ -0,0 +1,343 @@
1
+ import { OSS_REFRESH_ICON, OSS_COPY_ICON } from "./web-icons.js";
2
+ /** Self-contained local assets: no CDN, remote fonts, analytics or credential-bearing markup. */
3
+ export const OSS_WEB_HTML = String.raw `<!doctype html>
4
+ <html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
5
+ <title>Numa · OSS 文件</title><link rel="icon" href="data:,"><link rel="stylesheet" href="/app.css"><script src="/app.js" defer></script></head>
6
+ <body><header class="topbar"><a class="brand" href="/">numa<span> / OSS</span></a><span class="local"><i></i> 本机连接</span><span class="topnote">文件工作区</span><button id="tasks-toggle" aria-controls="tasks-panel" aria-expanded="false">传输任务 <span id="tasks-count">0</span></button></header>
7
+ <div class="authorization"><div class="grant-field"><label for="grant">当前授权</label><select id="grant" aria-label="选择 OSS Grant"><option>正在读取授权…</option></select><button id="grants-refresh" class="quiet icon-button" title="刷新授权列表" aria-label="刷新授权列表">${OSS_REFRESH_ICON}</button></div>
8
+ <div class="session-controls"><div class="expiry"><span>STS 剩余时间</span><strong id="countdown" aria-live="off">--:--</strong></div><label class="check"><input id="auto-renew" type="checkbox" checked>自动续期</label><button id="renew">立即续期</button></div></div>
9
+ <div id="notice" class="notice" role="status" hidden></div>
10
+ <div class="workspace"><aside class="sidebar"><div class="eyebrow">存储位置</div><button id="root" class="root-button"><span class="folder-icon"></span><span id="bucket">正在连接</span></button><div class="scope-label">授权目录</div><div id="scope" class="scope">—</div><div class="sidebar-bottom"><span id="permission">正在读取权限</span><p>文件操作仅限当前授权范围。<br>关闭 CLI 将断开本机连接。</p></div></aside>
11
+ <main class="files"><div class="page-heading"><div><div class="eyebrow">OBJECT STORAGE</div><h1>文件</h1></div><div class="upload-actions"><button id="upload-folder" disabled>上传文件夹</button><button id="upload" class="primary" disabled>+ 上传文件</button></div></div>
12
+ <div class="location"><button id="up" class="quiet" title="返回上级目录" aria-label="返回上级目录">↑</button><nav id="breadcrumbs" aria-label="文件路径"></nav><button id="refresh" class="quiet icon-button" title="刷新文件列表" aria-label="刷新文件列表">${OSS_REFRESH_ICON}</button></div>
13
+ <div class="toolbar"><input id="search" type="search" placeholder="筛选已加载的文件与目录…" aria-label="筛选已加载的文件与目录"><span id="selection-count"></span><button id="download-selected" disabled>下载所选</button><button id="delete-selected" class="danger" disabled>删除所选</button></div>
14
+ <div class="table-wrap"><table><thead><tr><th class="check-cell"><input id="select-all" type="checkbox" aria-label="选择已显示的文件与目录"></th><th>名称</th><th class="size-cell">大小</th><th class="date-cell">修改时间</th></tr></thead><tbody id="rows"></tbody></table><div id="empty" class="empty">正在连接当前授权…</div></div>
15
+ <footer class="list-footer"><span id="list-summary">—</span><button id="more" hidden>加载更多</button></footer>
16
+
17
+ </main><aside class="preview-panel"><div class="preview-heading"><h2>文件预览</h2><button id="preview-close" class="quiet" aria-label="关闭预览">×</button></div><div id="preview" class="preview-body"><div class="preview-empty">选择一个文件<br><small>查看内容与文件信息</small></div></div><div class="preview-actions"><button id="download" disabled>下载文件</button><button id="delete" class="danger" disabled>删除文件</button></div></aside></div>
18
+ <dialog id="delete-dialog"><h2>删除所选文件?</h2><p>此操作会删除远程 OSS 对象,不能在此页面撤销。</p><ul id="delete-list"></ul><p id="delete-target" class="scope"></p><div class="dialog-actions"><button id="delete-cancel">取消</button><button id="delete-confirm" class="destructive">确认删除</button></div></dialog>
19
+ <section id="tasks-panel" class="tasks-panel" aria-labelledby="tasks-heading" hidden><div class="tasks-heading"><h2 id="tasks-heading">传输任务</h2><button id="tasks-close" class="quiet" aria-label="关闭传输任务">×</button></div><p class="tasks-note">由本机 CLI 持续传输,关闭浏览器后仍会继续。CLI 重启后,未完成任务会暂停,需手动恢复。</p><p id="tasks-connection" role="status" hidden></p><div id="tasks-list" class="tasks-list"></div><p id="tasks-empty" class="tasks-note">暂无任务。选择文件或文件夹开始传输。</p></section>
20
+ <template id="copy-icon">${OSS_COPY_ICON}</template>
21
+ </body></html>`;
22
+ export const OSS_WEB_CSS = String.raw `
23
+ .icon-button{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;min-width:34px;min-height:34px}
24
+ :root{font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC",sans-serif;color:#23322e;background:#f5f7f5;font-size:14px;font-synthesis:none}*{box-sizing:border-box}body{margin:0}button,input,select{font:inherit}button,select{cursor:pointer}button{border:1px solid #d8e0db;background:white;color:#344b41;border-radius:6px;padding:8px 12px;white-space:nowrap}button:hover:not(:disabled){background:#eff5f1;border-color:#a5bcae}button:disabled{opacity:.4;cursor:not-allowed}input:focus-visible,button:focus-visible,select:focus-visible{outline:2px solid #16805a;outline-offset:2px}input[type=checkbox]{accent-color:#197854;width:15px;height:15px;cursor:pointer}input[type=search]{border:1px solid #dbe3de;border-radius:6px;padding:9px 12px;min-width:160px;background:#fafcfb;color:#23322e}select{border:0;background:transparent;color:#263d31;max-width:100%;padding:6px 24px 6px 0;font-weight:550}h1,h2,p{margin:0}h1{font-size:27px;letter-spacing:-.7px;font-weight:600}h2{font-size:15px;font-weight:600}.topbar{height:62px;padding:0 26px;background:#20372e;color:#ecf4ed;display:flex;align-items:center;gap:20px}.brand{font-size:24px;letter-spacing:-1px;font-weight:650;color:inherit;text-decoration:none}.brand span{font-size:16px;font-weight:400;letter-spacing:.5px;color:#a9c0b0;margin-left:12px}.local{font-size:11px;color:#cee0d5;display:flex;align-items:center;gap:6px}.local i{height:6px;width:6px;background:#8edaac;border-radius:50%}.topnote{margin-left:auto;color:#aac0b2;font-size:12px;letter-spacing:2px}.authorization{display:flex;align-items:center;justify-content:space-between;gap:24px;background:#fff;border-bottom:1px solid #dbe3de;padding:16px 26px}.grant-field{min-width:0;display:flex;align-items:center;gap:12px;flex:1}.grant-field label{font-size:12px;color:#7a8c80;white-space:nowrap}.session-controls{display:flex;align-items:center;gap:18px;flex-shrink:0}.expiry{display:flex;align-items:center;gap:10px;font-size:11px;color:#718076}.expiry strong{font-family:ui-monospace,SFMono-Regular,monospace;color:#2b674c;font-size:20px;font-weight:500;min-width:62px}.expiry strong.warning{color:#b45309}.expiry strong.expired{color:#bf403d}.check{display:flex;align-items:center;gap:5px;font-size:12px;white-space:nowrap}.quiet{background:transparent;border-color:transparent;color:#718577;padding:6px 8px}.primary{color:white;background:#227b54;border-color:#227b54}.primary:hover:not(:disabled){background:#196140;color:white}.danger{color:#9f4b40}.destructive{color:white;background:#a7473d;border-color:#a7473d}.notice{margin:0;padding:10px 26px;background:#fff4df;border-bottom:1px solid #ead9b8;color:#845422;font-size:13px;line-height:1.6}.notice.success{background:#e9f6ec;color:#266342;border-color:#c9e3d0}.workspace{display:grid;grid-template-columns:205px minmax(420px,1fr) 310px;min-height:calc(100vh - 137px)}.sidebar{border-right:1px solid #dbe3de;padding:30px 16px;display:flex;flex-direction:column;background:#f0f4f0;min-width:0}.eyebrow{font-size:10px;letter-spacing:1.7px;color:#89988d;font-weight:600}.sidebar .eyebrow{padding-left:10px}.root-button{display:flex;align-items:center;gap:10px;margin-top:18px;white-space:normal;text-align:left;overflow-wrap:anywhere;background:#e1ebe2;border:0;color:#24573d;font-size:13px}.folder-icon{display:inline-block;width:16px;height:11px;background:#9fbba1;border-radius:2px;position:relative;flex-shrink:0;margin-top:3px}.folder-icon:before{content:"";position:absolute;left:0;top:-3px;width:7px;height:4px;border-radius:2px 2px 0 0;background:inherit}.scope-label{font-size:11px;color:#86978a;margin:23px 10px 9px}.scope{font-family:ui-monospace,SFMono-Regular,monospace;font-size:12px;color:#637c6a;overflow-wrap:anywhere;line-height:1.7}.sidebar>.scope{padding:0 10px}.sidebar-bottom{margin-top:auto;padding:40px 10px 0;color:#607e68;font-size:12px}.sidebar-bottom p{margin-top:12px;line-height:1.8;color:#8b9b8e;font-size:11px}.files{background:white;min-width:0;padding:30px 28px 0;display:flex;flex-direction:column}.page-heading{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px}.page-heading .eyebrow{margin-bottom:8px}.location{display:flex;align-items:center;gap:6px;border-top:1px solid #e8ede9;border-bottom:1px solid #e8ede9;padding:9px 0;min-width:0}.location nav{display:flex;align-items:center;flex-wrap:wrap;flex:1;gap:2px;min-width:0}.location nav button{padding:4px 7px;border:0;font-size:12px;max-width:220px;overflow:hidden;text-overflow:ellipsis}.location nav span{color:#c1ccc4}.toolbar{display:flex;gap:8px;align-items:center;margin:18px 0}.toolbar input[type=search]{flex:1;min-width:0}.toolbar button{font-size:12px;padding:7px 9px}#selection-count{font-size:11px;color:#819286;white-space:nowrap}.table-wrap{overflow-x:auto;min-height:290px}table{width:100%;border-collapse:collapse;table-layout:fixed}th{text-align:left;font-size:11px;color:#8a978e;font-weight:500;border-bottom:1px solid #e3e9e4;padding:11px 9px}td{padding:12px 9px;border-bottom:1px solid #f0f3f0;font-size:12px;color:#79897e}.check-cell{width:30px;padding-left:0}.size-cell{width:82px;text-align:right;font-variant-numeric:tabular-nums}.date-cell{width:145px;text-align:right}tr:hover td{background:#f7faf7}tr.active td{background:#edf5ee}td .entry{border:0;background:transparent;padding:0;display:flex;align-items:center;gap:10px;max-width:100%;color:#354e3e;font-size:13px;text-align:left}td .entry span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-icon{display:inline-block;width:13px;height:16px;border:1px solid #a8b8ad;background:#f5f8f5;border-radius:2px;flex-shrink:0}.empty{text-align:center;padding:65px 20px;color:#8b9b8f;line-height:1.9}.list-footer{border-top:1px solid #e9eee9;display:flex;align-items:center;justify-content:space-between;color:#92a095;font-size:11px;padding:13px 0;margin-top:auto;min-height:48px}.preview-panel{border-left:1px solid #dbe3de;display:flex;flex-direction:column;padding:29px 20px 20px;background:#f8faf7;min-width:0}.preview-heading{display:flex;justify-content:space-between;align-items:center}.preview-heading h2{font-size:13px;color:#61776a}.preview-body{padding-top:25px;flex:1;min-width:0}.preview-empty{text-align:center;color:#859889;padding:80px 0;line-height:2}.preview-empty small{color:#a0aca2;font-size:11px}.preview-body h3{font-size:15px;line-height:1.7;overflow-wrap:anywhere;font-weight:500;margin:0 0 18px}.preview-body dl{font-size:11px;display:grid;grid-template-columns:60px minmax(0,1fr);gap:10px;margin:20px 0;color:#91a094}.preview-body dd{margin:0;color:#607968;overflow-wrap:anywhere}.preview-body pre{font:11px/1.8 ui-monospace,SFMono-Regular,monospace;white-space:pre-wrap;overflow-wrap:anywhere;max-height:50vh;overflow:auto;background:#edf2ec;padding:12px;border-radius:5px;color:#48654e}.preview-body img{max-width:100%;max-height:40vh;object-fit:contain;border-radius:4px}.preview-body p{font-size:12px;line-height:1.8;color:#8c9a8f}.preview-actions{display:flex;gap:8px;padding-top:20px}.preview-actions button{flex:1;font-size:12px}.transfer{border-top:1px solid #dce8df;padding:14px 0;font-size:12px}.transfer>div{display:flex;align-items:center;justify-content:space-between}.transfer progress{width:100%;height:5px;accent-color:#227b54;margin:10px 0}.transfer span{font-size:11px;color:#7b9082}dialog{border:1px solid #d4ded6;border-radius:10px;padding:26px;max-width:min(480px,90vw);color:#344c3c;box-shadow:0 20px 80px #182c2530}dialog::backdrop{background:#1c322747}dialog h2{font-size:19px;margin-bottom:15px}dialog p{font-size:13px;line-height:1.8;color:#879489}dialog ul{max-height:180px;overflow:auto;padding-left:20px;font-size:12px;line-height:1.9;overflow-wrap:anywhere}.dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:24px}[hidden]{display:none!important}@media(min-width:1500px){.workspace{grid-template-columns:235px minmax(500px,1fr) 370px}.files{padding-left:38px;padding-right:38px}}@media(max-width:1100px){.workspace{grid-template-columns:160px minmax(360px,1fr) 260px}.files{padding:24px 18px 0}.authorization{flex-wrap:wrap;gap:10px}.grant-field{flex-basis:100%}.session-controls{margin-left:auto}.date-cell{width:110px}.toolbar{flex-wrap:wrap}.toolbar input[type=search]{flex-basis:100%}}@media(max-width:820px){.workspace{grid-template-columns:1fr}.sidebar{display:none}.preview-panel{border-left:0;border-top:1px solid #dbe3de}.preview-empty{padding:20px}.files{min-height:60vh}.authorization{padding:14px 18px}.grant-field{gap:7px;flex-wrap:wrap}.grant-field select{flex:1;min-width:180px}.session-controls{width:100%;justify-content:space-between;gap:8px}.expiry{gap:6px}.topbar{padding:0 18px}.topnote{display:none}.date-cell{width:110px}.preview-body pre{max-height:280px}.preview-actions{max-width:360px}}
25
+ /* Independent scrolling keeps file actions within the current viewport. */
26
+ body{height:100vh;height:100dvh;display:flex;flex-direction:column;overflow:hidden}
27
+ .topbar,.authorization,.notice{flex-shrink:0}.notice{max-height:20vh;overflow:auto}
28
+ .workspace{flex:1;min-height:0;overflow:hidden}.sidebar{min-height:0;overflow:auto}
29
+ .files{min-height:0;overflow:hidden}.files>:not(.table-wrap){flex-shrink:0}
30
+ .table-wrap{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain}
31
+ .table-wrap thead{position:sticky;top:0;background:#fff;z-index:1}
32
+ .list-footer{margin-top:0;flex-shrink:0}.preview-panel{min-height:0;overflow:hidden}
33
+ .preview-heading,.preview-actions{flex-shrink:0}.preview-body{min-height:0;overflow:auto;overscroll-behavior:contain;padding-right:6px}
34
+ .preview-actions{border-top:1px solid #dbe3de;margin-top:16px;padding-top:16px;background:#f8faf7}
35
+ .preview-body h4{font-size:12px;font-weight:600;margin:24px 0 12px;color:#496553}
36
+ .preview-body dl{grid-template-columns:78px minmax(0,1fr)}.preview-body dt{overflow-wrap:anywhere}
37
+ .preview-body .metadata-list{grid-template-columns:minmax(0,1fr);gap:5px}.metadata-list dd{padding-bottom:9px}
38
+ .copy-field{display:flex;align-items:flex-start;gap:6px;min-width:0}.copy-field>span{min-width:0;overflow-wrap:anywhere}
39
+ .copy-button{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:2px;width:24px;height:24px;margin-top:-3px}
40
+ .copy-button svg{width:15px;height:15px}.copy-button.copied{color:#18764e;background:#e1f2e7}
41
+ .copy-field a{color:#197854;text-underline-offset:3px;line-height:1.7}.copy-manual{width:100%;font:inherit}
42
+ .clipboard-fallback{position:fixed;left:0;top:0;opacity:0;pointer-events:none}
43
+ .icon-button{color:#526f5e}.icon-button svg{display:block}.is-loading svg{animation:oss-refresh-spin .8s linear infinite}
44
+ @keyframes oss-refresh-spin{to{transform:rotate(360deg)}}
45
+ @media(prefers-reduced-motion:reduce){.is-loading svg{animation:none}.is-loading{opacity:.55}}
46
+ @media(max-width:820px){.workspace{display:flex;flex-direction:column;overflow:auto}.files{flex:none;height:58dvh;min-height:330px}.preview-panel{flex:none;height:45dvh;min-height:270px}.preview-body pre{max-height:none}}
47
+
48
+ .upload-actions{display:flex;gap:8px}.tasks-panel{position:fixed;right:20px;bottom:20px;top:155px;width:min(480px,calc(100vw - 32px));z-index:5;background:#fff;border:1px solid #cbd9cf;border-radius:10px;box-shadow:0 12px 50px #20372e30;display:flex;flex-direction:column;overflow:hidden}.tasks-heading{display:flex;align-items:center;justify-content:space-between;padding:15px 18px;border-bottom:1px solid #e4ebe5}.tasks-note{font-size:12px;line-height:1.8;color:#718577;padding:12px 18px}.tasks-list{overflow:auto;overscroll-behavior:contain;flex:1;min-height:0}.task-card{padding:15px 18px;border-top:1px solid #e8eee9}.task-card h3{font-size:13px;margin:0 0 7px;overflow-wrap:anywhere;font-weight:550}.task-meta,.task-path,.task-stats{font-size:11px;color:#738a7b;line-height:1.7;overflow-wrap:anywhere}.task-path{font-family:ui-monospace,SFMono-Regular,monospace}.task-card progress{width:100%;height:6px;accent-color:#227b54;margin:10px 0 6px}.task-actions{display:flex;gap:7px;margin-top:10px}.task-actions button{font-size:12px;padding:5px 10px}.task-error,#tasks-connection{font-size:12px;color:#9f4b40;line-height:1.7;overflow-wrap:anywhere}.task-error{margin-top:8px}#tasks-connection{padding:0 18px 10px}#tasks-toggle{font-size:12px;background:#2f4b3e;border-color:#607969;color:#edf5ef}#tasks-count{font-variant-numeric:tabular-nums;margin-left:5px}@media(max-width:820px){.tasks-panel{top:140px;right:16px;bottom:16px}.upload-actions{gap:5px}.upload-actions button{font-size:12px;padding:7px 9px}}
49
+ `;
50
+ export const OSS_WEB_JS = String.raw `(() => {
51
+ 'use strict';
52
+ const $ = id => document.getElementById(id);
53
+ const fragment = new URLSearchParams(location.hash.slice(1));
54
+ const supplied = fragment.get('token');
55
+ let token = supplied || sessionStorage.getItem('numa-oss-web-token');
56
+ if (supplied) { sessionStorage.setItem('numa-oss-web-token', supplied); history.replaceState(null, '', location.pathname); }
57
+ const state = { id: 0, epoch: 0, dir: '', root: '', rows: [], marker: '', selected: new Set(), file: null,
58
+ session: null, offset: 0, ready: false, loading: false, mutating: false, controller: null, previewController: null, renewalBusy: false, grantsLoading: false };
59
+ const node = (tag, text, className) => { const el = document.createElement(tag); if (text !== undefined) el.textContent = text; if (className) el.className = className; return el; };
60
+ function notice(text, success = false) { $('notice').textContent = text; $('notice').className = 'notice' + (success ? ' success' : ''); $('notice').hidden = !text; }
61
+ function setBusy(id, busy) {
62
+ const button = $(id); button.classList.toggle('is-loading', busy); button.setAttribute('aria-busy', String(busy));
63
+ }
64
+ function copyButton(value, label) {
65
+ const button = node('button', undefined, 'quiet copy-button'); button.title = '复制' + label; button.setAttribute('aria-label', button.title);
66
+ button.append($('copy-icon').content.cloneNode(true));
67
+ button.onclick = async () => {
68
+ try {
69
+ if (navigator.clipboard?.writeText) await navigator.clipboard.writeText(value);
70
+ else {
71
+ const field = node('textarea', undefined, 'clipboard-fallback'); field.value = value; document.body.append(field); field.select();
72
+ try { if (!document.execCommand('copy')) throw new Error('copy unavailable'); } finally { field.remove(); button.focus(); }
73
+ }
74
+ button.classList.add('copied'); button.title = '已复制'; notice(label + '已复制。', true);
75
+ setTimeout(() => { button.classList.remove('copied'); button.title = '复制' + label; }, 1600);
76
+ } catch {
77
+ const field = node('input', undefined, 'copy-manual'); field.value = value; field.readOnly = true;
78
+ button.parentElement.append(field); field.select(); notice('浏览器未允许复制,请复制已选中的内容。');
79
+ }
80
+ };
81
+ return button;
82
+ }
83
+ function fail(error) { if (error.name !== 'AbortError') notice(error.message || '操作失败,请重试。'); }
84
+ function url(path, params = {}, id = state.id) { return '/api/' + path + '?' + new URLSearchParams({ grantId: String(id), ...params }); }
85
+ async function api(path, params = {}, options = {}, id = state.id) {
86
+ let res;
87
+ try { res = await fetch(url(path, params, id), { ...options, headers: { Authorization: 'Bearer ' + token, ...options.headers } }); }
88
+ catch (error) { if (error.name === 'AbortError') throw error; throw new Error('连接已中断,请确认 CLI 仍在运行。'); }
89
+ let data; try { data = await res.json(); } catch { throw new Error('连接已中断,请确认 CLI 仍在运行。'); }
90
+ if (!res.ok || !data.ok) { const error = new Error(data.error?.message || '请求失败。'); error.code = data.error?.code; throw error; }
91
+ return data;
92
+ }
93
+ function bytes(value) { if (!Number.isFinite(value)) return '—'; if (value < 1024) return value + ' B'; const i = Math.min(3, Math.floor(Math.log(value) / Math.log(1024))); return (value / Math.pow(1024, i)).toFixed(1) + [' B',' KiB',' MiB',' GiB'][i]; }
94
+ function date(value) { if (!value) return '—'; const d = new Date(value); return Number.isNaN(d.getTime()) ? '—' : d.toLocaleString('zh-CN', { hour12: false }); }
95
+ function remaining() { return state.session ? Math.max(0, Math.ceil((Date.parse(state.session.expiration) - Date.now() - state.offset) / 1000)) : 0; }
96
+ function controls() {
97
+ const active = state.ready && remaining() > 0 && !state.mutating;
98
+ $('upload').disabled = !active || !state.session?.write;
99
+ $('upload-folder').disabled = $('upload').disabled;
100
+ $('download').disabled = !active || !state.file || !state.session?.read;
101
+ $('delete').disabled = !active || !state.file || !state.session?.delete;
102
+ $('download-selected').disabled = !active || !state.selected.size || !state.session?.read;
103
+ $('delete-selected').disabled = !active || !state.selected.size || !state.session?.delete || state.rows.some(row => row.directory && state.selected.has(row.key));
104
+ $('grant').disabled = state.mutating;
105
+ $('grants-refresh').disabled = state.mutating || state.grantsLoading;
106
+ $('refresh').disabled = state.mutating || state.loading || !state.session;
107
+ $('renew').disabled = !state.id || state.renewalBusy;
108
+ $('auto-renew').disabled = !state.session || state.renewalBusy;
109
+ $('selection-count').textContent = state.selected.size ? '已选 ' + state.selected.size + ' 项' : '';
110
+ }
111
+ function tick() {
112
+ const seconds = remaining();
113
+ $('countdown').textContent = !state.session ? '--:--' : seconds ? String(Math.floor(seconds / 60)).padStart(2, '0') + ':' + String(seconds % 60).padStart(2, '0') : '已到期';
114
+ $('countdown').className = !state.session ? '' : !seconds ? 'expired' : seconds <= 90 ? 'warning' : '';
115
+ controls();
116
+ }
117
+ function setSession(session) {
118
+ state.session = session; state.offset = session.serverTime - Date.now(); state.root = session.root; state.ready = true;
119
+ $('auto-renew').checked = session.autoRenew; $('bucket').textContent = session.bucket;
120
+ $('scope').textContent = 'oss://' + session.bucket + '/' + session.root;
121
+ $('permission').textContent = [session.list && '浏览', session.read && '读取', session.write && '上传', session.delete && '删除'].filter(Boolean).join(' · ') || '无文件操作权限';
122
+ $('countdown').title = '到期时间:' + date(session.expiration); tick();
123
+ }
124
+ function breadcrumbs() {
125
+ const box = $('breadcrumbs'); box.replaceChildren();
126
+ const add = (label, path) => { const button = node('button', label); button.onclick = () => navigate(path); box.append(button); };
127
+ add(state.session?.bucket || '根目录', state.root);
128
+ let path = state.root;
129
+ state.dir.slice(state.root.length).split('/').filter(Boolean).forEach(part => { path += part + '/'; box.append(node('span', '/')); add(part, path); });
130
+ $('up').disabled = state.dir === state.root || state.loading;
131
+ }
132
+ function visible() { const query = $('search').value.toLocaleLowerCase(); return state.rows.filter(row => row.key.slice(state.dir.length).toLocaleLowerCase().includes(query)); }
133
+ function renderRows() {
134
+ const body = $('rows'); body.replaceChildren(); const rows = visible();
135
+ for (const row of rows) {
136
+ const tr = node('tr'); if (state.file?.key === row.key) tr.className = 'active';
137
+ const checkCell = node('td', undefined, 'check-cell');
138
+ { const check = document.createElement('input'); check.type = 'checkbox'; check.checked = state.selected.has(row.key); check.setAttribute('aria-label', '选择 ' + row.key); check.onchange = () => { if (check.checked) state.selected.add(row.key); else state.selected.delete(row.key); updateSelection(); controls(); }; checkCell.append(check); }
139
+ tr.append(checkCell);
140
+ const name = node('td'); const button = node('button', undefined, 'entry'); button.title = row.key;
141
+ button.append(node('span', undefined, row.directory ? 'folder-icon' : 'file-icon'), node('span', row.key.slice(state.dir.length) || row.key));
142
+ button.onclick = () => row.directory ? navigate(row.key) : preview(row); name.append(button); tr.append(name);
143
+ tr.append(node('td', row.directory ? '—' : bytes(row.sizeBytes), 'size-cell'), node('td', date(row.lastModified), 'date-cell'));
144
+ body.append(tr);
145
+ }
146
+ $('empty').hidden = rows.length > 0; $('empty').textContent = state.loading ? '正在读取文件…' : $('search').value ? '已加载列表中没有匹配项' : '此目录暂无文件';
147
+ $('list-summary').textContent = '已加载 ' + state.rows.length + ' 项' + ($('search').value ? ' · 显示 ' + rows.length + ' 项' : '') + (state.marker ? ' · 还有更多文件' : '');
148
+ $('more').hidden = !state.marker; $('more').disabled = state.loading;
149
+ updateSelection(); controls();
150
+ }
151
+ function updateSelection() { const rows = visible(), count = rows.filter(row => state.selected.has(row.key)).length; $('select-all').checked = rows.length > 0 && count === rows.length; $('select-all').indeterminate = count > 0 && count < rows.length; }
152
+ function clearPreview() { state.previewController?.abort(); state.file = null; $('preview').replaceChildren(node('div', '选择文件以查看内容与信息', 'preview-empty')); controls(); }
153
+ async function navigate(dir, append = false) {
154
+ if (state.mutating) return;
155
+ if (state.session && remaining() <= 0) { notice('STS 已到期,请点击立即续期后继续。'); return; }
156
+ const epoch = state.epoch, id = state.id; state.controller?.abort(); state.controller = new AbortController();
157
+ const controller = state.controller;
158
+ if (!append) { state.dir = dir; state.rows = []; state.selected.clear(); state.marker = ''; clearPreview(); }
159
+ state.loading = true; setBusy('refresh', true); renderRows(); breadcrumbs();
160
+ try {
161
+ const data = await api('list', { prefix: dir, ...(append ? { marker: state.marker } : {}) }, { signal: controller.signal }, id);
162
+ if (epoch !== state.epoch || controller !== state.controller) return;
163
+ setSession(data.session);
164
+ const entries = data.listing.directories.map(key => ({ key, directory: true })).concat(data.listing.objects.filter(r => r.key !== dir).map(r => ({ ...r, directory: false })));
165
+ const merged = new Map((append ? state.rows : []).concat(entries).map(r => [r.key, r]));
166
+ state.rows = [...merged.values()].sort((a,b) => Number(b.directory) - Number(a.directory) || a.key.localeCompare(b.key));
167
+ state.marker = data.listing.truncated ? data.listing.nextMarker || '' : '';
168
+ } catch (error) { if (epoch === state.epoch && controller === state.controller) { fail(error); if (error.code?.includes('session') || error.code?.includes('refresh')) state.ready = false; } }
169
+ finally { if (epoch === state.epoch && controller === state.controller) { state.loading = false; setBusy('refresh', false); renderRows(); breadcrumbs(); } }
170
+ }
171
+ async function preview(row) {
172
+ clearPreview(); state.file = row; renderRows();
173
+ const epoch = state.epoch, id = state.id; state.previewController = new AbortController(); const controller = state.previewController;
174
+ $('preview').replaceChildren(node('h3', row.key.split('/').pop()), node('p', '正在读取预览…'));
175
+ try {
176
+ const data = await api('preview', { key: row.key }, { signal: controller.signal }, id);
177
+ if (epoch !== state.epoch || controller !== state.previewController) return;
178
+ const box = $('preview'); box.replaceChildren(node('h3', row.key.split('/').pop()));
179
+ if (data.kind === 'text') box.append(node('pre', data.text));
180
+ else if (data.kind === 'image') { const img = document.createElement('img'); img.src = data.data; img.alt = row.key; img.onerror = () => img.replaceWith(node('p', '图片无法预览,请下载后查看。')); box.append(img); }
181
+ else box.append(node('p', '此文件暂不支持在线预览,请下载后查看。支持文本与不超过 1 MiB 的常见图片。'));
182
+ if (data.truncated && data.kind === 'text') box.append(node('p', '仅显示前 256 KiB;下载可查看完整内容。'));
183
+ const meta = data.metadata, dl = node('dl');
184
+ for (const [label, value] of [['大小', bytes(meta.contentLength)], ['类型', meta.contentType || '—'], ['修改时间', date(meta.lastModified)]]) dl.append(node('dt', label), node('dd', value));
185
+ const path = node('dd', undefined, 'copy-field'); path.append(copyButton(meta.key, '对象路径'), node('span', meta.key));
186
+ dl.append(node('dt', '对象路径'), path);
187
+ if (data.publicUrl) {
188
+ const address = node('dd', undefined, 'copy-field'), link = node('a', '打开链接');
189
+ link.href = data.publicUrl; link.target = '_blank'; link.rel = 'noopener noreferrer'; link.title = '打开文件公网地址';
190
+ address.append(copyButton(data.publicUrl, '公网地址'), link); dl.append(node('dt', '公网地址'), address);
191
+ }
192
+ box.append(dl, node('p', '公网地址不含临时签名;私有对象需授权访问。'));
193
+ const standard = node('dl', undefined, 'metadata-list');
194
+ for (const [label, key] of [['ETag','etag'],['存储类型','storageClass'],['对象类型','objectType'],['版本 ID','versionId'],['CRC64','crc64'],['Cache-Control','cacheControl'],['Content-Disposition','contentDisposition'],['Content-Encoding','contentEncoding'],['Expires','expires'],['服务端加密','serverSideEncryption']]) {
195
+ if (meta[key] !== undefined) standard.append(node('dt', label), node('dd', String(meta[key])));
196
+ }
197
+ box.append(node('h4', 'OSS 系统元数据'), standard.children.length ? standard : node('p', '暂无其他系统元数据'));
198
+ const custom = node('dl', undefined, 'metadata-list');
199
+ for (const [key, value] of Object.entries(meta.metadata || {}).sort(([a], [b]) => a.localeCompare(b))) custom.append(node('dt', key.startsWith('x-oss-meta-') ? key : 'x-oss-meta-' + key), node('dd', value));
200
+ box.append(node('h4', 'OSS 自定义元数据'), custom.children.length ? custom : node('p', '暂无自定义元数据'));
201
+ } catch (error) { if (epoch === state.epoch && controller === state.previewController && error.name !== 'AbortError') { $('preview').replaceChildren(node('h3', row.key.split('/').pop()), node('p', error.message)); } }
202
+ }
203
+ async function selectGrant(id) {
204
+ state.loading = false; setBusy('refresh', false);
205
+ state.epoch++; const epoch = state.epoch; state.id = Number(id); state.ready = false; state.session = null; state.rows = []; state.selected.clear(); state.marker = ''; state.dir = ''; state.root = '';
206
+ state.controller?.abort(); $('search').value = ''; clearPreview(); notice(''); tick(); renderRows(); $('scope').textContent = '正在连接…'; $('bucket').textContent = '正在连接…';
207
+ try { const data = await api('session', {}, {}, state.id); if (epoch !== state.epoch) return; setSession(data.session); await navigate(state.root); }
208
+ catch (error) { if (epoch === state.epoch) { fail(error); $('empty').textContent = '连接失败,请检查授权并重试。'; } }
209
+ }
210
+ async function refreshGrants(initial = false) {
211
+ if (state.grantsLoading) return;
212
+ state.grantsLoading = true; setBusy('grants-refresh', true); controls();
213
+ try {
214
+ const data = await api('grants'); const select = $('grant'); const previous = state.id;
215
+ select.replaceChildren(); for (const grant of data.grants) { const option = node('option', (grant.policyCode || 'Grant') + ' · ' + grant.bucketName + '/' + grant.objectPrefix + ' (#' + grant.grantId + ')'); option.value = String(grant.grantId); select.append(option); }
216
+ if (!data.grants.length) { state.ready = false; controls(); throw new Error('当前没有可用授权,请核对 Grant 配置。'); }
217
+ const id = data.grants.some(g => g.grantId === previous) ? previous : data.grants.some(g => g.grantId === data.selectedGrantId) ? data.selectedGrantId : data.grants[0].grantId;
218
+ select.value = String(id); if (initial || id !== previous) await selectGrant(id);
219
+ } catch (error) { fail(error); }
220
+ finally { state.grantsLoading = false; setBusy('grants-refresh', false); controls(); }
221
+ }
222
+ async function renew(manual = false) {
223
+ if (!state.id || state.renewalBusy) return;
224
+ const epoch = state.epoch, id = state.id; state.renewalBusy = true; controls();
225
+ if (manual) $('renew').textContent = '续期中…';
226
+ try { const data = await api(manual ? 'renew' : 'session', {}, manual ? { method: 'POST' } : {}, id); if (epoch === state.epoch) { setSession(data.session); if (manual) notice('STS 已续期,可继续使用。', true); } }
227
+ catch (error) { if (epoch === state.epoch) { state.ready = false; fail(error); } }
228
+ finally { state.renewalBusy = false; $('renew').textContent = '立即续期'; tick(); }
229
+ }
230
+ async function chooseTransfer(path, body) {
231
+ if (state.mutating || !state.ready || remaining() <= 0) return;
232
+ const id = state.id; state.mutating = true; controls();
233
+ const controller = new AbortController(), timeout = setTimeout(() => controller.abort(), 5 * 60 * 1000);
234
+ notice('请在系统对话框中选择' + (path === 'transfers/download' ? '保存目录' : '上传内容') + '…');
235
+ try {
236
+ const data = await api(path, {}, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), signal: controller.signal }, id);
237
+ if (data.cancelled) { notice('已取消选择。'); return; }
238
+ showTasks(true); notice('已加入本机传输队列。可在传输任务中查看进度。', true); await pollTransfers();
239
+ } catch (error) { if (error.name === 'AbortError') notice('选择或任务准备超时。请先查看传输任务,确认是否已加入队列。'); else fail(error); }
240
+ finally { clearTimeout(timeout); state.mutating = false; controls(); }
241
+ }
242
+ async function download(keys) {
243
+ if (!state.session?.read || !keys.length) return;
244
+ const entries = keys.map(key => ({ key, directory: !!state.rows.find(row => row.key === key)?.directory }));
245
+ await chooseTransfer('transfers/download', { entries });
246
+ }
247
+ const taskCards = new Map(), taskStatuses = new Map(), taskBusy = new Set();
248
+ let pollingTransfers = false, pendingUploadNotice = false;
249
+ const taskLabels = { queued:'排队中', running:'传输中', pausing:'正在暂停', paused:'已暂停', cancelling:'正在取消', cancelled:'已取消', completed:'已完成', failed:'失败' };
250
+ function showTasks(show) { $('tasks-panel').hidden = !show; $('tasks-toggle').setAttribute('aria-expanded', String(show)); }
251
+ function setText(element, value) { if (element.textContent !== value) element.textContent = value; }
252
+ async function taskAction(id, action) {
253
+ if (taskBusy.has(id)) return;
254
+ taskBusy.add(id); const card = taskCards.get(id); if (card) for (const button of card.actions.values()) button.disabled = true;
255
+ try { await api('transfers/' + encodeURIComponent(id) + '/' + action, {}, { method:'POST' }); }
256
+ catch (error) { fail(error); }
257
+ finally { taskBusy.delete(id); await pollTransfers(); }
258
+ }
259
+ function renderTasks(jobs) {
260
+ const present = new Set(jobs.map(job => job.id));
261
+ for (const [id, card] of taskCards) if (!present.has(id)) { card.root.remove(); taskCards.delete(id); taskStatuses.delete(id); }
262
+ for (const job of jobs) {
263
+ let card = taskCards.get(job.id);
264
+ if (!card) {
265
+ const root = node('article', undefined, 'task-card'), title = node('h3'), meta = node('p', undefined, 'task-meta'), path = node('p', undefined, 'task-path'), progress = node('progress'), stats = node('p', undefined, 'task-stats'), error = node('p', undefined, 'task-error'), buttons = node('div', undefined, 'task-actions');
266
+ progress.max = 100; progress.setAttribute('aria-label', '文件传输进度');
267
+ const actions = new Map();
268
+ for (const [action, label] of [['pause','暂停'],['resume','恢复'],['cancel','取消']]) { const button = node('button', label); button.onclick = () => taskAction(job.id, action); actions.set(action, button); buttons.append(button); }
269
+ root.append(title, meta, path, progress, stats, error, buttons); $('tasks-list').append(root);
270
+ card = { root, title, meta, path, progress, stats, error, actions }; taskCards.set(job.id, card);
271
+ }
272
+ const prior = taskStatuses.get(job.id);
273
+ if (prior && prior !== 'completed' && job.status === 'completed' && job.direction === 'upload' && Number(job.grantId) === state.id) pendingUploadNotice = true;
274
+ taskStatuses.set(job.id, job.status);
275
+ setText(card.title, job.key); setText(card.meta, (job.direction === 'upload' ? '上传' : '下载') + ' · Grant #' + job.grantId + ' · ' + (taskLabels[job.status] || '状态未知'));
276
+ setText(card.path, job.localPath); card.path.title = job.localPath;
277
+ card.progress.value = job.size > 0 ? Math.min(100, job.transferred / job.size * 100) : job.status === 'completed' ? 100 : 0;
278
+ card.progress.setAttribute('aria-valuetext', bytes(job.transferred) + ' / ' + bytes(job.size));
279
+ setText(card.stats, bytes(job.transferred) + ' / ' + bytes(job.size) + (job.status === 'running' ? ' · ' + bytes(Math.max(0, Number(job.bytesPerSecond) || 0)) + '/s' : ''));
280
+ setText(card.error, job.error || ''); card.error.hidden = !job.error;
281
+ const available = { pause: ['queued','running'].includes(job.status), resume: ['paused','failed'].includes(job.status), cancel: ['queued','running','paused','failed'].includes(job.status) };
282
+ for (const [action, button] of card.actions) { button.hidden = !available[action]; button.disabled = taskBusy.has(job.id); }
283
+ }
284
+ $('tasks-empty').hidden = jobs.length > 0;
285
+ setText($('tasks-count'), String(jobs.length));
286
+ $('tasks-toggle').title = jobs.filter(job => ['queued','running','pausing','cancelling'].includes(job.status)).length + ' 个进行中的任务';
287
+ if (pendingUploadNotice && !state.mutating && !state.loading) { pendingUploadNotice = false; notice('当前授权有上传任务已完成。点击刷新文件列表查看新文件;当前预览已保留。', true); }
288
+ }
289
+ async function pollTransfers() {
290
+ if (!token || pollingTransfers) return;
291
+ pollingTransfers = true;
292
+ try { const data = await api('transfers'); renderTasks(data.jobs || []); $('tasks-connection').hidden = true; }
293
+ catch (error) { setText($('tasks-connection'), error.message || '暂时无法读取任务状态。'); $('tasks-connection').hidden = false; }
294
+ finally { pollingTransfers = false; }
295
+ }
296
+ let deletion = null;
297
+ function askDelete(keys) {
298
+ if (!keys.length || state.mutating || !state.session?.delete || remaining() <= 0) return;
299
+ if (keys.some(key => state.rows.find(row => row.key === key)?.directory)) { notice('目录仅支持下载。删除前请取消选择目录。'); return; }
300
+ deletion = { keys, id: state.id, dir: state.dir, epoch: state.epoch };
301
+ $('delete-list').replaceChildren(...keys.map(key => node('li', key)));
302
+ $('delete-target').textContent = 'Grant #' + state.id + ' · ' + state.session.bucket;
303
+ $('delete-dialog').showModal();
304
+ }
305
+ async function deleteFiles() {
306
+ const target = deletion; if (!target) return; deletion = null; $('delete-dialog').close(); state.mutating = true; controls(); let done = 0;
307
+ try { for (const key of target.keys) { await api('object', { key }, { method: 'DELETE', headers: { 'X-Numa-Confirm': 'delete' } }, target.id); done++; } notice('已删除 ' + done + ' 个文件。', true); }
308
+ catch (error) { notice('已删除 ' + done + ' 个文件,后续操作已停止。' + error.message); }
309
+ finally { state.mutating = false; controls(); if (state.epoch === target.epoch) await navigate(target.dir); }
310
+ }
311
+ $('grant').onchange = () => selectGrant($('grant').value);
312
+ $('grants-refresh').onclick = () => { if (!state.mutating) refreshGrants(); };
313
+ $('renew').onclick = () => renew(true);
314
+ $('auto-renew').onchange = async () => {
315
+ const epoch = state.epoch, id = state.id, enabled = $('auto-renew').checked; state.renewalBusy = true; controls();
316
+ try { const data = await api('auto-renew', { enabled: String(enabled) }, { method: 'POST' }, id); if (epoch === state.epoch) { setSession(data.session); notice(enabled ? '自动续期已开启。' : '自动续期已关闭;到期后请点击立即续期。', true); } }
317
+ catch (error) { if (epoch === state.epoch) { $('auto-renew').checked = !!state.session?.autoRenew; fail(error); } }
318
+ finally { state.renewalBusy = false; controls(); }
319
+ };
320
+ $('root').onclick = () => navigate(state.root);
321
+ $('up').onclick = () => { const parts = state.dir.slice(state.root.length).split('/').filter(Boolean); parts.pop(); navigate(state.root + (parts.length ? parts.join('/') + '/' : '')); };
322
+ $('refresh').onclick = () => { notice(''); navigate(state.dir); };
323
+ $('search').oninput = renderRows;
324
+ $('more').onclick = () => navigate(state.dir, true);
325
+ $('select-all').onchange = () => { for (const row of visible()) { if ($('select-all').checked) state.selected.add(row.key); else state.selected.delete(row.key); } renderRows(); };
326
+ $('preview-close').onclick = () => { clearPreview(); renderRows(); };
327
+ $('download').onclick = () => { if (state.file) download([state.file.key]); };
328
+ $('download-selected').onclick = () => download([...state.selected]);
329
+ $('delete').onclick = () => { if (state.file) askDelete([state.file.key]); };
330
+ $('delete-selected').onclick = () => askDelete([...state.selected]);
331
+ $('delete-cancel').onclick = () => { deletion = null; $('delete-dialog').close(); };
332
+ $('delete-confirm').onclick = deleteFiles;
333
+ $('upload').onclick = () => { if (state.session?.write) chooseTransfer('transfers/upload', { prefix: state.dir, folder: false }); };
334
+ $('upload-folder').onclick = () => { if (state.session?.write) chooseTransfer('transfers/upload', { prefix: state.dir, folder: true }); };
335
+ $('tasks-toggle').onclick = () => showTasks($('tasks-panel').hidden);
336
+ $('tasks-close').onclick = () => { showTasks(false); $('tasks-toggle').focus(); };
337
+ setInterval(pollTransfers, 1000);
338
+ setInterval(tick, 1000);
339
+ setInterval(() => { if (state.id && !state.loading) renew(false); }, 15000);
340
+ if (!token) { notice('请通过 numa oss web 启动,并使用 CLI 显示的完整链接打开页面。'); $('empty').textContent = '等待本机会话'; }
341
+ else { refreshGrants(true); pollTransfers(); }
342
+ })();`;
343
+ //# sourceMappingURL=web-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-page.js","sourceRoot":"","sources":["../../src/oss/web-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEjE,iGAAiG;AACjG,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA;;;;4PAIsN,gBAAgB;;;;;mOAKzC,gBAAgB;;;;;;;;2BAQxN,aAAa;eACzB,CAAC;AAEhB,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BpC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAoS9B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type AccessSession } from "./schemas.js";
2
+ /** One Grant's credentials; no credentials leave this process through web APIs. */
3
+ export declare class OssWebSession {
4
+ private readonly grantId;
5
+ private readonly issue;
6
+ private readonly now;
7
+ autoRenew: boolean;
8
+ private cached?;
9
+ private binding?;
10
+ private pending?;
11
+ constructor(grantId: number, issue: () => Promise<AccessSession>, now?: () => number);
12
+ get(): Promise<AccessSession>;
13
+ status(): Promise<AccessSession>;
14
+ renew(): Promise<AccessSession>;
15
+ private refresh;
16
+ }
@@ -0,0 +1,62 @@
1
+ import { AccessSessionSchema } from "./schemas.js";
2
+ import { ossSessionCapabilities } from "./transfers.js";
3
+ import { OssError } from "./errors.js";
4
+ /** One Grant's credentials; no credentials leave this process through web APIs. */
5
+ export class OssWebSession {
6
+ grantId;
7
+ issue;
8
+ now;
9
+ autoRenew = true;
10
+ cached;
11
+ binding;
12
+ pending;
13
+ constructor(grantId, issue, now = Date.now) {
14
+ this.grantId = grantId;
15
+ this.issue = issue;
16
+ this.now = now;
17
+ }
18
+ async get() {
19
+ if (!this.cached)
20
+ return this.renew();
21
+ const remaining = Date.parse(this.cached.expiration) - this.now();
22
+ if (this.autoRenew && remaining <= 90_000)
23
+ return this.renew();
24
+ if (remaining <= 0)
25
+ throw new OssError("会话已到期,请点击立即续期。", "oss_web_session_expired", 401);
26
+ return this.cached;
27
+ }
28
+ async status() {
29
+ return this.cached && !this.autoRenew ? this.cached : this.get();
30
+ }
31
+ renew() {
32
+ if (this.pending)
33
+ return this.pending;
34
+ this.pending = this.refresh().finally(() => { this.pending = undefined; });
35
+ return this.pending;
36
+ }
37
+ async refresh() {
38
+ try {
39
+ const parsed = AccessSessionSchema.safeParse(await this.issue());
40
+ if (!parsed.success || parsed.data.grantId !== this.grantId
41
+ || !(Date.parse(parsed.data.expiration) > this.now() + 90_000))
42
+ throw new Error("Invalid session");
43
+ const session = parsed.data;
44
+ const { root } = ossSessionCapabilities(session);
45
+ const binding = JSON.stringify([session.accountUid, session.bucketName, session.region, root,
46
+ session.scopeType, session.roleArn, session.sourceIdentity]);
47
+ if (this.binding !== undefined && binding !== this.binding) {
48
+ throw new OssError("授权范围或身份已变化,请重新启动网页服务。", "oss_web_scope_changed", 409);
49
+ }
50
+ this.binding = binding;
51
+ this.cached = session;
52
+ return session;
53
+ }
54
+ catch (error) {
55
+ if (error instanceof OssError && error.code === "oss_web_scope_changed")
56
+ throw error;
57
+ // Issuer/SDK exceptions may contain credentials or invalid response values.
58
+ throw new OssError("无法获取或续期 STS,请检查 CLI 登录与 Grant 状态后重试。", "oss_web_refresh_failed", 503);
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=web-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-session.js","sourceRoot":"","sources":["../../src/oss/web-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { OssClient } from "./client.js";
2
+ import { OssTransferClient } from "./transfers.js";
3
+ import type { AccessGrant } from "./schemas.js";
4
+ import { type LocalPicker } from "./local-picker.js";
5
+ import type { TransferWorker } from "./transfer-types.js";
6
+ export interface OssWebOptions {
7
+ grantId: number;
8
+ port?: number;
9
+ openBrowser?: boolean;
10
+ client?: Pick<OssClient, "listGrants" | "issueSession">;
11
+ transfer?: OssTransferClient;
12
+ picker?: LocalPicker;
13
+ taskDirectory?: string;
14
+ taskNamespace?: string;
15
+ taskWorker?: TransferWorker;
16
+ now?: () => number;
17
+ }
18
+ export interface OssWebHandle {
19
+ url: string;
20
+ browserOpened: boolean;
21
+ close(): Promise<void>;
22
+ waitUntilClosed(): Promise<void>;
23
+ }
24
+ export declare function readyWebGrants(grants: AccessGrant[]): AccessGrant[];
25
+ export declare function startOssWeb(options: OssWebOptions): Promise<OssWebHandle>;