dsh-edge 0.1.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.
- package/LICENSE +21 -0
- package/README.i18n.yaml +6 -0
- package/README.md +183 -0
- package/README.zh.md +183 -0
- package/THIRD_PARTY_NOTICES.md +199 -0
- package/dist/_headers +3 -0
- package/dist/assets/fonts/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/assets/fonts/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/assets/fonts/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/assets/fonts/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/assets/fonts/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/assets/fonts/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/assets/fonts/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/assets/fonts/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/assets/fonts/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/assets/fonts/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/assets/fonts/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/assets/fonts/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/assets/fonts/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/assets/fonts/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/assets/fonts/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/assets/fonts/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/assets/fonts/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/assets/fonts/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/assets/fonts/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/assets/fonts/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/assets/fonts/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/assets/fonts/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/assets/fonts/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/assets/fonts/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/assets/fonts/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/assets/fonts/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/assets/index-C-1AiF3k.js +112 -0
- package/dist/assets/index-CSGf6Qzd.css +1 -0
- package/dist/assets/langs/c-BIGW1oBm.js +2 -0
- package/dist/assets/langs/cpp-DIPi6g--.js +2 -0
- package/dist/assets/langs/csharp-DSvCPggb.js +2 -0
- package/dist/assets/langs/css-CLj8gQPS.js +2 -0
- package/dist/assets/langs/go-C27-OAKa.js +2 -0
- package/dist/assets/langs/html-CfGypltT.js +2 -0
- package/dist/assets/langs/ini-BEwlwnbL.js +2 -0
- package/dist/assets/langs/java-CylS5w8V.js +2 -0
- package/dist/assets/langs/kotlin-BdnUsdx6.js +2 -0
- package/dist/assets/langs/less-B1dDrJ26.js +2 -0
- package/dist/assets/langs/lua-BaeVxFsk.js +2 -0
- package/dist/assets/langs/markdown-Cvjx9yec.js +2 -0
- package/dist/assets/langs/mdx-Cmh6b_Ma.js +2 -0
- package/dist/assets/langs/php-D-uCvoST.js +2 -0
- package/dist/assets/langs/python-B6aJPvgy.js +2 -0
- package/dist/assets/langs/ruby-DEItuUFs.js +2 -0
- package/dist/assets/langs/rust-B1yitclQ.js +2 -0
- package/dist/assets/langs/scss-D5BDwBP9.js +2 -0
- package/dist/assets/langs/sql-CRqJ_cUM.js +2 -0
- package/dist/assets/langs/swift-D82vCrfD.js +2 -0
- package/dist/assets/langs/toml-vGWfd6FD.js +2 -0
- package/dist/assets/langs/xml-sdJ4AIDG.js +2 -0
- package/dist/assets/langs/yaml-Buea-lGh.js +2 -0
- package/dist/assets/vendor-Cjbwl5VI.js +411 -0
- package/dist/assets/vendor-CjyC-hUb.css +1 -0
- package/dist/favicon.svg +8 -0
- package/dist/index.html +35 -0
- package/dist/manifest.webmanifest +16 -0
- package/dist/plugins/@deepseek-ai/dsh-api-gateway/client.js +420 -0
- package/dist/plugins/@deepseek-ai/dsh-api-remotes/client.js +5937 -0
- package/dist/plugins/@deepseek-ai/dsh-client-connection/client.js +10207 -0
- package/dist/plugins/@deepseek-ai/dsh-client-locale/client.js +1231 -0
- package/dist/plugins/@deepseek-ai/dsh-client-modules/client.js +259 -0
- package/dist/plugins/@deepseek-ai/dsh-client-runtime/client.js +10539 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-agent-preset/client.js +1725 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-commands/client.js +1116 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-conversation/client.js +9832 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-deliverables/client.js +373 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-edge/client.js +549 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-input-trigger/client.js +859 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-jobs/client.js +280 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-layout/client.js +456 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-model-selection/client.js +804 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-permission-presets/client.js +461 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-settings/client.js +254 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-settings-general/client.js +609 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-sidebar/client.js +292 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-skill/client.js +327 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-subagent/client.js +710 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-theme/client.js +1312 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-tool/client.js +1630 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-trajectory/client.js +7370 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-user-questions/client.js +700 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-workflow-run/client.js +474 -0
- package/dist/plugins/@deepseek-ai/dsh-client-ui-workspace/client.js +2426 -0
- package/dist/plugins/@deepseek-ai/dsh-typert-registry/client.js +1372 -0
- package/package.json +97 -0
- package/scripts/assemble-web.mjs +230 -0
- package/scripts/bundle-size.d.mts +2 -0
- package/scripts/bundle-size.mjs +26 -0
- package/scripts/bundle.mjs +53 -0
- package/scripts/cli.d.mts +39 -0
- package/scripts/cli.mjs +496 -0
- package/scripts/install.d.mts +149 -0
- package/scripts/install.mjs +989 -0
- package/scripts/legal-files.mjs +24 -0
- package/scripts/verify-packed.mjs +32 -0
- package/scripts/wrangler-config.d.mts +18 -0
- package/scripts/wrangler-config.mjs +84 -0
- package/src/agent.ts +119 -0
- package/src/auth.ts +352 -0
- package/src/deepseek.ts +231 -0
- package/src/deployment.ts +147 -0
- package/src/direct-shell-core-empty.ts +10 -0
- package/src/direct-shell-protocol.ts +5 -0
- package/src/direct-shell.ts +341 -0
- package/src/do-session-persistence.ts +1064 -0
- package/src/edge-api.ts +796 -0
- package/src/edge-credentials.ts +56 -0
- package/src/edge-remotes.ts +41 -0
- package/src/edge-workspace-store.ts +339 -0
- package/src/http.ts +212 -0
- package/src/index.ts +196 -0
- package/src/instance.ts +1007 -0
- package/src/isolated-direct-shell-unavailable.ts +11 -0
- package/src/protocol.ts +39 -0
- package/src/release.ts +9 -0
- package/src/session-store.ts +1110 -0
- package/src/sse.ts +86 -0
- package/src/web-search.ts +38 -0
- package/src/workspace.ts +270 -0
- package/wrangler.jsonc +56 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
window.__ModuleLoader__.load({
|
|
2
|
+
id: "@deepseek-ai/dsh-client-ui-jobs",
|
|
3
|
+
factory: (require) => {
|
|
4
|
+
var module = { exports: {} };
|
|
5
|
+
var exports = module.exports;
|
|
6
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
7
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
|
+
let react = require("react");
|
|
9
|
+
let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
10
|
+
//#region \0dsh-css:/private/var/folders/nm/n5smty9962gf5rhjc5855kt80000gn/T/dsh-edge-release-worktree.XXXXXX.RcJjogaGt4/repo/packages/client/ui-jobs/src/client/JobListAction.module.css.mjs
|
|
11
|
+
const css = ".dU5bwa_root{position:relative}.dU5bwa_trigger{min-height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:3px;padding:3px 2px;font-size:12px;line-height:18px;display:inline-flex}.dU5bwa_trigger:hover,.dU5bwa_trigger:focus-visible{color:var(--dsw-alias-label-secondary)}.dU5bwa_trigger svg{transition:transform .12s}.dU5bwa_triggerOpen{transform:rotate(180deg)}.dU5bwa_triggerDot{flex:none}.dU5bwa_count{margin:0 5px}.dU5bwa_menu{z-index:100;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-specific-menu);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);width:336px;max-width:min(400px,100vw - 32px);max-height:min(420px,100vh - 140px);box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:1px;margin:0;padding:4px;list-style:none;display:flex;position:absolute;top:calc(100% + 5px);left:0;overflow:auto}.dU5bwa_row{box-sizing:border-box;width:100%;min-height:32px;color:var(--dsw-alias-label-primary);border-radius:8px;align-items:center;gap:8px;padding:6px 8px;font-size:13px;line-height:18px;display:flex}.dU5bwa_rowSettled{color:var(--dsw-alias-label-tertiary)}.dU5bwa_rowDot{flex:none}.dU5bwa_kind{background:var(--dsw-alias-fill-l2);color:var(--dsw-alias-label-secondary);border-radius:5px;flex:none;padding:0 6px;font-size:11px;line-height:18px}.dU5bwa_label{min-width:0;font-family:var(--dsw-font-mono);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.dU5bwa_status,.dU5bwa_duration{color:var(--dsw-alias-label-tertiary);flex:none;font-size:11px;line-height:18px}.dU5bwa_status{white-space:nowrap;text-overflow:ellipsis;max-width:40%;overflow:hidden}.dU5bwa_duration{font-variant-numeric:tabular-nums}";
|
|
12
|
+
const tagId = "@deepseek-ai/dsh-client-ui-jobs/JobListAction.module.css";
|
|
13
|
+
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
14
|
+
const tag = document.createElement("style");
|
|
15
|
+
tag.dataset.plugin = "@deepseek-ai/dsh-client-ui-jobs";
|
|
16
|
+
tag.dataset.pluginCss = tagId;
|
|
17
|
+
tag.textContent = css;
|
|
18
|
+
document.head.appendChild(tag);
|
|
19
|
+
}
|
|
20
|
+
var JobListAction_module_css_default = {
|
|
21
|
+
"duration": "dU5bwa_duration",
|
|
22
|
+
"label": "dU5bwa_label",
|
|
23
|
+
"row": "dU5bwa_row",
|
|
24
|
+
"triggerDot": "dU5bwa_triggerDot",
|
|
25
|
+
"count": "dU5bwa_count",
|
|
26
|
+
"trigger": "dU5bwa_trigger",
|
|
27
|
+
"triggerOpen": "dU5bwa_triggerOpen",
|
|
28
|
+
"root": "dU5bwa_root",
|
|
29
|
+
"rowSettled": "dU5bwa_rowSettled",
|
|
30
|
+
"kind": "dU5bwa_kind",
|
|
31
|
+
"menu": "dU5bwa_menu",
|
|
32
|
+
"status": "dU5bwa_status",
|
|
33
|
+
"rowDot": "dU5bwa_rowDot"
|
|
34
|
+
};
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region lib/types/client/JobListAction.js
|
|
37
|
+
/** Stable empty list so a session with no jobs keeps one array identity. */
|
|
38
|
+
const NO_TASKS = [];
|
|
39
|
+
/** A job the registry still holds open, and whose duration therefore ticks. */
|
|
40
|
+
function isLive(job) {
|
|
41
|
+
return job.status === "running" || job.status === "stopping";
|
|
42
|
+
}
|
|
43
|
+
/** Closed-union exhaustiveness fence for the wire status set. */
|
|
44
|
+
/* v8 ignore next 3 -- closed-union backstop; only reached if a status is forged */
|
|
45
|
+
function assertNever(value) {
|
|
46
|
+
throw new Error(`unhandled job status: ${JSON.stringify(value)}`);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Status marker semantics. `stopping` and `killed` share the attention color:
|
|
50
|
+
* both mean the work ended (or is ending) on request rather than on its own.
|
|
51
|
+
*/
|
|
52
|
+
function dotState(status) {
|
|
53
|
+
switch (status) {
|
|
54
|
+
case "running": return "ongoing";
|
|
55
|
+
case "stopping": return "warning";
|
|
56
|
+
case "completed": return "done";
|
|
57
|
+
case "killed": return "warning";
|
|
58
|
+
case "failed": return "error";
|
|
59
|
+
/* v8 ignore next -- closed wire status union */
|
|
60
|
+
default: return assertNever(status);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Human status word for the row and its accessible name. */
|
|
64
|
+
function statusLabel(status, t) {
|
|
65
|
+
switch (status) {
|
|
66
|
+
case "running": return t("status.running");
|
|
67
|
+
case "stopping": return t("status.stopping");
|
|
68
|
+
case "completed": return t("status.completed");
|
|
69
|
+
case "killed": return t("status.killed");
|
|
70
|
+
case "failed": return t("status.failed");
|
|
71
|
+
/* v8 ignore next -- closed wire status union */
|
|
72
|
+
default: return assertNever(status);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Elapsed time in at most two adjacent units. A background job that outlives
|
|
77
|
+
* an hour is already exceptional, so hours is the widest unit — beyond that the
|
|
78
|
+
* figure stays in hours rather than growing a day/month vocabulary no producer
|
|
79
|
+
* currently reaches.
|
|
80
|
+
*/
|
|
81
|
+
function formatDuration(elapsedMs, t) {
|
|
82
|
+
const total = Math.max(0, Math.floor(elapsedMs / 1e3));
|
|
83
|
+
const seconds = total % 60;
|
|
84
|
+
const minutes = Math.floor(total / 60) % 60;
|
|
85
|
+
const hours = Math.floor(total / 3600);
|
|
86
|
+
if (hours > 0) return t("duration.hours", {
|
|
87
|
+
hours,
|
|
88
|
+
minutes
|
|
89
|
+
});
|
|
90
|
+
if (minutes > 0) return t("duration.minutes", {
|
|
91
|
+
minutes,
|
|
92
|
+
seconds
|
|
93
|
+
});
|
|
94
|
+
return t("duration.seconds", { seconds });
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Live rows first in start order, then settled rows newest-first. Two jobs
|
|
98
|
+
* that settled in the same millisecond fall back to start order, so the sort
|
|
99
|
+
* never depends on the host's map iteration.
|
|
100
|
+
*/
|
|
101
|
+
function ordered(jobs) {
|
|
102
|
+
return [...jobs].sort((left, right) => {
|
|
103
|
+
const liveLeft = isLive(left);
|
|
104
|
+
if (liveLeft !== isLive(right)) return liveLeft ? -1 : 1;
|
|
105
|
+
if (liveLeft) return left.startedAt - right.startedAt;
|
|
106
|
+
const finished = (right.finishedAt ?? right.startedAt) - (left.finishedAt ?? left.startedAt);
|
|
107
|
+
return finished !== 0 ? finished : left.startedAt - right.startedAt;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Session-header entry point for this session's background jobs. It renders
|
|
112
|
+
* nothing at all until the session has at least one job, so an ordinary
|
|
113
|
+
* conversation never grows a control for a capability it is not using.
|
|
114
|
+
* @param props - runtime slot currency plus the namespace translator.
|
|
115
|
+
* @returns the trigger and its popover list, or null when there is nothing to show.
|
|
116
|
+
*/
|
|
117
|
+
function JobListAction({ sessionId, useSessions, t }) {
|
|
118
|
+
const jobs = useSessions((state) => state.jobsBySession[sessionId]) ?? NO_TASKS;
|
|
119
|
+
const [open, setOpen] = (0, react.useState)(false);
|
|
120
|
+
const [now, setNow] = (0, react.useState)(() => Date.now());
|
|
121
|
+
const rootRef = (0, react.useRef)(null);
|
|
122
|
+
const triggerRef = (0, react.useRef)(null);
|
|
123
|
+
const rows = (0, react.useMemo)(() => ordered(jobs), [jobs]);
|
|
124
|
+
const liveCount = (0, react.useMemo)(() => jobs.filter(isLive).length, [jobs]);
|
|
125
|
+
(0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(rootRef, open, setOpen);
|
|
126
|
+
(0, react.useEffect)(() => {
|
|
127
|
+
if (!open || liveCount === 0) return;
|
|
128
|
+
setNow(Date.now());
|
|
129
|
+
const timer = setInterval(() => {
|
|
130
|
+
setNow(Date.now());
|
|
131
|
+
}, 1e3);
|
|
132
|
+
return () => {
|
|
133
|
+
clearInterval(timer);
|
|
134
|
+
};
|
|
135
|
+
}, [open, liveCount]);
|
|
136
|
+
(0, react.useEffect)(() => {
|
|
137
|
+
if (jobs.length === 0 && open) setOpen(false);
|
|
138
|
+
}, [jobs.length, open]);
|
|
139
|
+
if (jobs.length === 0) return null;
|
|
140
|
+
const countLabel = t(liveCount > 0 ? liveCount === 1 ? "count.live.one" : "count.live.other" : jobs.length === 1 ? "count.idle.one" : "count.idle.other", { count: liveCount > 0 ? liveCount : jobs.length });
|
|
141
|
+
const onKeyDown = (event) => {
|
|
142
|
+
if (event.key !== "Escape" || !open) return;
|
|
143
|
+
event.preventDefault();
|
|
144
|
+
setOpen(false);
|
|
145
|
+
triggerRef.current?.focus();
|
|
146
|
+
};
|
|
147
|
+
return (0, react_jsx_runtime.jsxs)("div", {
|
|
148
|
+
ref: rootRef,
|
|
149
|
+
className: JobListAction_module_css_default.root,
|
|
150
|
+
onKeyDown,
|
|
151
|
+
children: [(0, react_jsx_runtime.jsxs)("button", {
|
|
152
|
+
ref: triggerRef,
|
|
153
|
+
type: "button",
|
|
154
|
+
className: JobListAction_module_css_default.trigger,
|
|
155
|
+
"aria-expanded": open,
|
|
156
|
+
"aria-label": countLabel,
|
|
157
|
+
onClick: () => {
|
|
158
|
+
setNow(Date.now());
|
|
159
|
+
setOpen((current) => !current);
|
|
160
|
+
},
|
|
161
|
+
children: [
|
|
162
|
+
liveCount > 0 ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
|
|
163
|
+
state: "ongoing",
|
|
164
|
+
className: JobListAction_module_css_default.triggerDot
|
|
165
|
+
}) : null,
|
|
166
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
167
|
+
className: JobListAction_module_css_default.count,
|
|
168
|
+
children: countLabel
|
|
169
|
+
}),
|
|
170
|
+
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { className: open ? JobListAction_module_css_default.triggerOpen : void 0 })
|
|
171
|
+
]
|
|
172
|
+
}), open ? (0, react_jsx_runtime.jsx)("ul", {
|
|
173
|
+
className: JobListAction_module_css_default.menu,
|
|
174
|
+
"aria-label": t("list.aria"),
|
|
175
|
+
children: rows.map((job) => {
|
|
176
|
+
const live = isLive(job);
|
|
177
|
+
const duration = formatDuration(live ? now - job.startedAt : (job.finishedAt ?? job.startedAt) - job.startedAt, t);
|
|
178
|
+
const status = statusLabel(job.status, t);
|
|
179
|
+
return (0, react_jsx_runtime.jsxs)("li", {
|
|
180
|
+
className: live ? JobListAction_module_css_default.row : `${JobListAction_module_css_default.row} ${JobListAction_module_css_default.rowSettled}`,
|
|
181
|
+
children: [
|
|
182
|
+
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
|
|
183
|
+
state: dotState(job.status),
|
|
184
|
+
className: JobListAction_module_css_default.rowDot
|
|
185
|
+
}),
|
|
186
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
187
|
+
className: JobListAction_module_css_default.kind,
|
|
188
|
+
children: job.kind
|
|
189
|
+
}),
|
|
190
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
191
|
+
className: JobListAction_module_css_default.label,
|
|
192
|
+
title: job.label,
|
|
193
|
+
children: job.label
|
|
194
|
+
}),
|
|
195
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
196
|
+
className: JobListAction_module_css_default.status,
|
|
197
|
+
title: job.detail ?? status,
|
|
198
|
+
children: job.detail ?? status
|
|
199
|
+
}),
|
|
200
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
201
|
+
className: JobListAction_module_css_default.duration,
|
|
202
|
+
title: t(live ? "duration.title.live" : "duration.title.done", { duration }),
|
|
203
|
+
children: duration
|
|
204
|
+
})
|
|
205
|
+
]
|
|
206
|
+
}, job.id);
|
|
207
|
+
})
|
|
208
|
+
}) : null]
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
//#endregion
|
|
212
|
+
//#region lib/types/client/locales.js
|
|
213
|
+
/** Simplified Chinese dictionary (the key-set source of truth). */
|
|
214
|
+
const zh = {
|
|
215
|
+
"count.live.one": "{count} 个后台任务运行中",
|
|
216
|
+
"count.live.other": "{count} 个后台任务运行中",
|
|
217
|
+
"count.idle.one": "{count} 个后台任务",
|
|
218
|
+
"count.idle.other": "{count} 个后台任务",
|
|
219
|
+
"list.aria": "后台任务",
|
|
220
|
+
"status.running": "运行中",
|
|
221
|
+
"status.stopping": "正在停止",
|
|
222
|
+
"status.completed": "已完成",
|
|
223
|
+
"status.killed": "已取消",
|
|
224
|
+
"status.failed": "已失败",
|
|
225
|
+
"duration.seconds": "{seconds}秒",
|
|
226
|
+
"duration.minutes": "{minutes}分{seconds}秒",
|
|
227
|
+
"duration.hours": "{hours}小时{minutes}分",
|
|
228
|
+
"duration.title.live": "已运行 {duration}",
|
|
229
|
+
"duration.title.done": "耗时 {duration}"
|
|
230
|
+
};
|
|
231
|
+
/** English dictionary, key-identical to the Chinese source of truth. */
|
|
232
|
+
const en = {
|
|
233
|
+
"count.live.one": "{count} background job running",
|
|
234
|
+
"count.live.other": "{count} background jobs running",
|
|
235
|
+
"count.idle.one": "{count} background job",
|
|
236
|
+
"count.idle.other": "{count} background jobs",
|
|
237
|
+
"list.aria": "Background jobs",
|
|
238
|
+
"status.running": "running",
|
|
239
|
+
"status.stopping": "stopping",
|
|
240
|
+
"status.completed": "completed",
|
|
241
|
+
"status.killed": "cancelled",
|
|
242
|
+
"status.failed": "failed",
|
|
243
|
+
"duration.seconds": "{seconds}s",
|
|
244
|
+
"duration.minutes": "{minutes}m {seconds}s",
|
|
245
|
+
"duration.hours": "{hours}h {minutes}m",
|
|
246
|
+
"duration.title.live": "Running for {duration}",
|
|
247
|
+
"duration.title.done": "Took {duration}"
|
|
248
|
+
};
|
|
249
|
+
//#endregion
|
|
250
|
+
//#region lib/types/client/index.js
|
|
251
|
+
/** Required services for locale registration and header-slot contribution. */
|
|
252
|
+
const inject = [
|
|
253
|
+
"sessions",
|
|
254
|
+
"slots",
|
|
255
|
+
"locale"
|
|
256
|
+
];
|
|
257
|
+
/**
|
|
258
|
+
* Client plugin body: register the dictionaries and the header action.
|
|
259
|
+
* @param ctx - client root context.
|
|
260
|
+
*/
|
|
261
|
+
function apply(ctx) {
|
|
262
|
+
ctx.effect(() => ctx.locale.register("job", {
|
|
263
|
+
zh,
|
|
264
|
+
en
|
|
265
|
+
}), "ui-job: dictionaries");
|
|
266
|
+
ctx.slots.inject("conversation.session.header.actions", () => ctx.slots.register({
|
|
267
|
+
name: "conversation.session.header.actions",
|
|
268
|
+
id: "job-list",
|
|
269
|
+
order: 20,
|
|
270
|
+
locale: "job"
|
|
271
|
+
}, JobListAction));
|
|
272
|
+
}
|
|
273
|
+
//#endregion
|
|
274
|
+
exports.apply = apply;
|
|
275
|
+
exports.inject = inject;
|
|
276
|
+
return module.exports;
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
//# sourceMappingURL=client.js.map
|