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.
Files changed (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.i18n.yaml +6 -0
  3. package/README.md +183 -0
  4. package/README.zh.md +183 -0
  5. package/THIRD_PARTY_NOTICES.md +199 -0
  6. package/dist/_headers +3 -0
  7. package/dist/assets/fonts/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  8. package/dist/assets/fonts/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  9. package/dist/assets/fonts/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  10. package/dist/assets/fonts/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  11. package/dist/assets/fonts/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  12. package/dist/assets/fonts/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  13. package/dist/assets/fonts/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  14. package/dist/assets/fonts/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  15. package/dist/assets/fonts/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  16. package/dist/assets/fonts/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  17. package/dist/assets/fonts/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  18. package/dist/assets/fonts/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  19. package/dist/assets/fonts/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  20. package/dist/assets/fonts/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  21. package/dist/assets/fonts/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  22. package/dist/assets/fonts/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  23. package/dist/assets/fonts/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  24. package/dist/assets/fonts/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  25. package/dist/assets/fonts/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  26. package/dist/assets/fonts/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  27. package/dist/assets/fonts/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  28. package/dist/assets/fonts/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  29. package/dist/assets/fonts/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  30. package/dist/assets/fonts/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  31. package/dist/assets/fonts/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  32. package/dist/assets/fonts/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  33. package/dist/assets/fonts/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  34. package/dist/assets/fonts/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  35. package/dist/assets/fonts/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  36. package/dist/assets/fonts/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  37. package/dist/assets/fonts/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  38. package/dist/assets/fonts/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  39. package/dist/assets/fonts/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  40. package/dist/assets/fonts/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  41. package/dist/assets/fonts/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  42. package/dist/assets/fonts/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  43. package/dist/assets/fonts/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  44. package/dist/assets/fonts/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  45. package/dist/assets/fonts/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  46. package/dist/assets/fonts/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  47. package/dist/assets/fonts/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  48. package/dist/assets/fonts/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  49. package/dist/assets/fonts/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  50. package/dist/assets/fonts/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  51. package/dist/assets/fonts/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  52. package/dist/assets/fonts/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  53. package/dist/assets/fonts/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  54. package/dist/assets/fonts/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  55. package/dist/assets/fonts/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  56. package/dist/assets/fonts/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  57. package/dist/assets/fonts/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  58. package/dist/assets/fonts/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  59. package/dist/assets/fonts/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  60. package/dist/assets/fonts/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  61. package/dist/assets/fonts/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  62. package/dist/assets/fonts/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  63. package/dist/assets/fonts/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  64. package/dist/assets/fonts/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  65. package/dist/assets/fonts/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  66. package/dist/assets/index-C-1AiF3k.js +112 -0
  67. package/dist/assets/index-CSGf6Qzd.css +1 -0
  68. package/dist/assets/langs/c-BIGW1oBm.js +2 -0
  69. package/dist/assets/langs/cpp-DIPi6g--.js +2 -0
  70. package/dist/assets/langs/csharp-DSvCPggb.js +2 -0
  71. package/dist/assets/langs/css-CLj8gQPS.js +2 -0
  72. package/dist/assets/langs/go-C27-OAKa.js +2 -0
  73. package/dist/assets/langs/html-CfGypltT.js +2 -0
  74. package/dist/assets/langs/ini-BEwlwnbL.js +2 -0
  75. package/dist/assets/langs/java-CylS5w8V.js +2 -0
  76. package/dist/assets/langs/kotlin-BdnUsdx6.js +2 -0
  77. package/dist/assets/langs/less-B1dDrJ26.js +2 -0
  78. package/dist/assets/langs/lua-BaeVxFsk.js +2 -0
  79. package/dist/assets/langs/markdown-Cvjx9yec.js +2 -0
  80. package/dist/assets/langs/mdx-Cmh6b_Ma.js +2 -0
  81. package/dist/assets/langs/php-D-uCvoST.js +2 -0
  82. package/dist/assets/langs/python-B6aJPvgy.js +2 -0
  83. package/dist/assets/langs/ruby-DEItuUFs.js +2 -0
  84. package/dist/assets/langs/rust-B1yitclQ.js +2 -0
  85. package/dist/assets/langs/scss-D5BDwBP9.js +2 -0
  86. package/dist/assets/langs/sql-CRqJ_cUM.js +2 -0
  87. package/dist/assets/langs/swift-D82vCrfD.js +2 -0
  88. package/dist/assets/langs/toml-vGWfd6FD.js +2 -0
  89. package/dist/assets/langs/xml-sdJ4AIDG.js +2 -0
  90. package/dist/assets/langs/yaml-Buea-lGh.js +2 -0
  91. package/dist/assets/vendor-Cjbwl5VI.js +411 -0
  92. package/dist/assets/vendor-CjyC-hUb.css +1 -0
  93. package/dist/favicon.svg +8 -0
  94. package/dist/index.html +35 -0
  95. package/dist/manifest.webmanifest +16 -0
  96. package/dist/plugins/@deepseek-ai/dsh-api-gateway/client.js +420 -0
  97. package/dist/plugins/@deepseek-ai/dsh-api-remotes/client.js +5937 -0
  98. package/dist/plugins/@deepseek-ai/dsh-client-connection/client.js +10207 -0
  99. package/dist/plugins/@deepseek-ai/dsh-client-locale/client.js +1231 -0
  100. package/dist/plugins/@deepseek-ai/dsh-client-modules/client.js +259 -0
  101. package/dist/plugins/@deepseek-ai/dsh-client-runtime/client.js +10539 -0
  102. package/dist/plugins/@deepseek-ai/dsh-client-ui-agent-preset/client.js +1725 -0
  103. package/dist/plugins/@deepseek-ai/dsh-client-ui-commands/client.js +1116 -0
  104. package/dist/plugins/@deepseek-ai/dsh-client-ui-conversation/client.js +9832 -0
  105. package/dist/plugins/@deepseek-ai/dsh-client-ui-deliverables/client.js +373 -0
  106. package/dist/plugins/@deepseek-ai/dsh-client-ui-edge/client.js +549 -0
  107. package/dist/plugins/@deepseek-ai/dsh-client-ui-input-trigger/client.js +859 -0
  108. package/dist/plugins/@deepseek-ai/dsh-client-ui-jobs/client.js +280 -0
  109. package/dist/plugins/@deepseek-ai/dsh-client-ui-layout/client.js +456 -0
  110. package/dist/plugins/@deepseek-ai/dsh-client-ui-model-selection/client.js +804 -0
  111. package/dist/plugins/@deepseek-ai/dsh-client-ui-permission-presets/client.js +461 -0
  112. package/dist/plugins/@deepseek-ai/dsh-client-ui-settings/client.js +254 -0
  113. package/dist/plugins/@deepseek-ai/dsh-client-ui-settings-general/client.js +609 -0
  114. package/dist/plugins/@deepseek-ai/dsh-client-ui-sidebar/client.js +292 -0
  115. package/dist/plugins/@deepseek-ai/dsh-client-ui-skill/client.js +327 -0
  116. package/dist/plugins/@deepseek-ai/dsh-client-ui-subagent/client.js +710 -0
  117. package/dist/plugins/@deepseek-ai/dsh-client-ui-theme/client.js +1312 -0
  118. package/dist/plugins/@deepseek-ai/dsh-client-ui-tool/client.js +1630 -0
  119. package/dist/plugins/@deepseek-ai/dsh-client-ui-trajectory/client.js +7370 -0
  120. package/dist/plugins/@deepseek-ai/dsh-client-ui-user-questions/client.js +700 -0
  121. package/dist/plugins/@deepseek-ai/dsh-client-ui-workflow-run/client.js +474 -0
  122. package/dist/plugins/@deepseek-ai/dsh-client-ui-workspace/client.js +2426 -0
  123. package/dist/plugins/@deepseek-ai/dsh-typert-registry/client.js +1372 -0
  124. package/package.json +97 -0
  125. package/scripts/assemble-web.mjs +230 -0
  126. package/scripts/bundle-size.d.mts +2 -0
  127. package/scripts/bundle-size.mjs +26 -0
  128. package/scripts/bundle.mjs +53 -0
  129. package/scripts/cli.d.mts +39 -0
  130. package/scripts/cli.mjs +496 -0
  131. package/scripts/install.d.mts +149 -0
  132. package/scripts/install.mjs +989 -0
  133. package/scripts/legal-files.mjs +24 -0
  134. package/scripts/verify-packed.mjs +32 -0
  135. package/scripts/wrangler-config.d.mts +18 -0
  136. package/scripts/wrangler-config.mjs +84 -0
  137. package/src/agent.ts +119 -0
  138. package/src/auth.ts +352 -0
  139. package/src/deepseek.ts +231 -0
  140. package/src/deployment.ts +147 -0
  141. package/src/direct-shell-core-empty.ts +10 -0
  142. package/src/direct-shell-protocol.ts +5 -0
  143. package/src/direct-shell.ts +341 -0
  144. package/src/do-session-persistence.ts +1064 -0
  145. package/src/edge-api.ts +796 -0
  146. package/src/edge-credentials.ts +56 -0
  147. package/src/edge-remotes.ts +41 -0
  148. package/src/edge-workspace-store.ts +339 -0
  149. package/src/http.ts +212 -0
  150. package/src/index.ts +196 -0
  151. package/src/instance.ts +1007 -0
  152. package/src/isolated-direct-shell-unavailable.ts +11 -0
  153. package/src/protocol.ts +39 -0
  154. package/src/release.ts +9 -0
  155. package/src/session-store.ts +1110 -0
  156. package/src/sse.ts +86 -0
  157. package/src/web-search.ts +38 -0
  158. package/src/workspace.ts +270 -0
  159. 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