@dungsil/dsh-plugin-ui-vcs 0.4.0 → 0.4.2

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 (3) hide show
  1. package/dist/client.js +101 -64
  2. package/dist/index.js +24 -12
  3. package/package.json +36 -33
package/dist/client.js CHANGED
@@ -23,6 +23,10 @@ var git_pull_request_draft_default = "<svg xmlns=\"http://www.w3.org/2000/svg\"
23
23
  var git_pull_request_closed_default = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"5\" cy=\"5\" r=\"2\"/>\n <circle cx=\"5\" cy=\"19\" r=\"2\"/>\n <circle cx=\"19\" cy=\"19\" r=\"2\"/>\n <path d=\"M5 7v10M19 17v-5M16 3l6 6m0-6-6 6\"/>\n</svg>\n";
24
24
  // ../../tools/ui/src/icons/git-merge.svg
25
25
  var git_merge_default = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"5\" cy=\"5\" r=\"2\"/>\n <circle cx=\"5\" cy=\"19\" r=\"2\"/>\n <circle cx=\"19\" cy=\"19\" r=\"2\"/>\n <path d=\"M5 7v10M5 7a12 12 0 0 0 12 12\"/>\n</svg>\n";
26
+ // ../../tools/ui/src/icons/circle-x.svg
27
+ var circle_x_default = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\"/>\n <path d=\"m9 9 6 6m0-6-6 6\"/>\n</svg>\n";
28
+ // ../../tools/ui/src/icons/circle-minus.svg
29
+ var circle_minus_default = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\"/>\n <path d=\"M9 12h6\"/>\n</svg>\n";
26
30
  // ../../tools/ui/src/client.ts
27
31
  function useLocaleSnapshot(locale) {
28
32
  const subscribe = (0, react.useCallback)((listener) => locale.subscribe(listener), [locale]);
@@ -57,6 +61,37 @@ function SettingsRow({ label, children }) {
57
61
  }), children]
58
62
  });
59
63
  }
64
+ // ../../tools/ui/src/button-picker.tsx
65
+ function ButtonPicker({ label, value, items, onChange, disabled = false, menuClassName, compact, ...buttonProps }) {
66
+ const [open, setOpen] = (0, react.useState)(false);
67
+ (0, react.useEffect)(() => {
68
+ if (disabled) setOpen(false);
69
+ }, [disabled]);
70
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
71
+ open: open && !disabled,
72
+ portal: true,
73
+ compact,
74
+ className: menuClassName,
75
+ selectedId: value,
76
+ items,
77
+ onClose: () => setOpen(false),
78
+ onSelect: (id) => {
79
+ setOpen(false);
80
+ const item = items.find((item) => item.id === id && !item.disabled);
81
+ if (!disabled && item) onChange(item.id);
82
+ },
83
+ anchor: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.Button, {
84
+ ...buttonProps,
85
+ type: "button",
86
+ "aria-label": label,
87
+ "aria-haspopup": "menu",
88
+ "aria-expanded": open && !disabled,
89
+ disabled,
90
+ onClick: () => setOpen((current) => !current),
91
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: items.find((item) => item.id === value)?.label }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { "aria-hidden": "true" })]
92
+ })
93
+ });
94
+ }
60
95
  // locale/en.json
61
96
  var en_default = {
62
97
  meta: {
@@ -10050,23 +10085,22 @@ function attentionDelete() {
10050
10085
  function peekDelete() {
10051
10086
  return "~";
10052
10087
  }
10053
- // ../../node_modules/.pnpm/mdast-util-gfm-table@2.0.0/node_modules/mdast-util-gfm-table/lib/index.js
10088
+ // ../../node_modules/.pnpm/mdast-util-gfm-table@2.0.1/node_modules/mdast-util-gfm-table/lib/index.js
10054
10089
  /**
10055
- * @typedef {import('mdast').InlineCode} InlineCode
10056
- * @typedef {import('mdast').Table} Table
10057
- * @typedef {import('mdast').TableCell} TableCell
10058
- * @typedef {import('mdast').TableRow} TableRow
10059
- *
10060
- * @typedef {import('markdown-table').Options} MarkdownTableOptions
10061
- *
10062
- * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext
10063
- * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension
10064
- * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle
10065
- *
10066
- * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension
10067
- * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle
10068
- * @typedef {import('mdast-util-to-markdown').State} State
10069
- * @typedef {import('mdast-util-to-markdown').Info} Info
10090
+ * @import {Heading, InlineCode, Table, TableCell, TableRow} from 'mdast'
10091
+ * @import {Options as MarkdownTableOptions} from 'markdown-table'
10092
+ * @import {
10093
+ * CompileContext,
10094
+ * Extension as FromMarkdownExtension,
10095
+ * Handle as FromMarkdownHandle,
10096
+ * } from 'mdast-util-from-markdown'
10097
+ * @import {
10098
+ * Options as ToMarkdownExtension,
10099
+ * Handle as ToMarkdownHandle,
10100
+ * Info,
10101
+ * Join,
10102
+ * State
10103
+ * } from 'mdast-util-to-markdown'
10070
10104
  */
10071
10105
  /**
10072
10106
  * @typedef Options
@@ -10105,6 +10139,8 @@ function gfmTableFromMarkdown() {
10105
10139
  };
10106
10140
  }
10107
10141
  /**
10142
+ * Enter a table.
10143
+ *
10108
10144
  * @this {CompileContext}
10109
10145
  * @type {FromMarkdownHandle}
10110
10146
  */
@@ -10115,11 +10151,14 @@ function enterTable(token) {
10115
10151
  align: align.map(function(d) {
10116
10152
  return d === "none" ? null : d;
10117
10153
  }),
10118
- children: []
10154
+ children: [],
10155
+ position: void 0
10119
10156
  }, token);
10120
10157
  this.data.inTable = true;
10121
10158
  }
10122
10159
  /**
10160
+ * Exit a table.
10161
+ *
10123
10162
  * @this {CompileContext}
10124
10163
  * @type {FromMarkdownHandle}
10125
10164
  */
@@ -10128,16 +10167,21 @@ function exitTable(token) {
10128
10167
  this.data.inTable = void 0;
10129
10168
  }
10130
10169
  /**
10170
+ * Enter a row.
10171
+ *
10131
10172
  * @this {CompileContext}
10132
10173
  * @type {FromMarkdownHandle}
10133
10174
  */
10134
10175
  function enterRow(token) {
10135
10176
  this.enter({
10136
10177
  type: "tableRow",
10137
- children: []
10178
+ children: [],
10179
+ position: void 0
10138
10180
  }, token);
10139
10181
  }
10140
10182
  /**
10183
+ * Exit a row or cell.
10184
+ *
10141
10185
  * @this {CompileContext}
10142
10186
  * @type {FromMarkdownHandle}
10143
10187
  */
@@ -10145,16 +10189,24 @@ function exit(token) {
10145
10189
  this.exit(token);
10146
10190
  }
10147
10191
  /**
10192
+ * Enter a cell.
10193
+ *
10148
10194
  * @this {CompileContext}
10149
10195
  * @type {FromMarkdownHandle}
10150
10196
  */
10151
10197
  function enterCell(token) {
10152
10198
  this.enter({
10153
10199
  type: "tableCell",
10154
- children: []
10200
+ children: [],
10201
+ position: void 0
10155
10202
  }, token);
10156
10203
  }
10157
10204
  /**
10205
+ * Exit code (text).
10206
+ *
10207
+ * Overwrites the default code text data handler to unescape escaped pipes
10208
+ * when they are in tables.
10209
+ *
10158
10210
  * @this {CompileContext}
10159
10211
  * @type {FromMarkdownHandle}
10160
10212
  */
@@ -10167,9 +10219,14 @@ function exitCodeText(token) {
10167
10219
  this.exit(token);
10168
10220
  }
10169
10221
  /**
10222
+ * Unescape an escaped pipe.
10223
+ *
10170
10224
  * @param {string} $0
10225
+ * Whole match.
10171
10226
  * @param {string} $1
10227
+ * Escaped character.
10172
10228
  * @returns {string}
10229
+ * Replacement.
10173
10230
  */
10174
10231
  function replace($0, $1) {
10175
10232
  return $1 === "|" ? $1 : $0;
@@ -13235,8 +13292,15 @@ const styles = `
13235
13292
  .dsh-pr-loading{display:inline-flex;flex-shrink:0;width:16px;height:16px;vertical-align:middle;color:var(--dsw-alias-label-secondary)}
13236
13293
  .dsh-pr-loading svg{width:100%;height:100%;animation:dsh-pr-spin .8s linear infinite}
13237
13294
  .dsh-pr-initial-loading{display:flex;justify-content:center;padding:24px 16px}
13295
+ .dsh-vcs-check-status{display:inline-flex;flex:none;width:14px;height:14px;align-items:center;justify-content:center;vertical-align:middle;color:var(--dsw-alias-label-tertiary)}
13296
+ .dsh-vcs-check-status>span{display:contents}
13297
+ .dsh-vcs-check-status svg{width:100%;height:100%}
13298
+ .dsh-vcs-check-status[data-state=done]{color:var(--dsw-alias-state-success-primary)}
13299
+ .dsh-vcs-check-status[data-state=error]{color:var(--dsw-alias-state-error-primary)}
13300
+ .dsh-vcs-check-status:is([data-state=ongoing],[data-state=warning]){color:var(--dsw-alias-state-warn-primary)}
13301
+ .dsh-vcs-check-status[data-state=ongoing] svg{animation:dsh-pr-spin 1.5s linear infinite}
13238
13302
  @keyframes dsh-pr-spin{to{transform:rotate(360deg)}}
13239
- @media(prefers-reduced-motion:reduce){.dsh-pr-loading svg{animation:none}}
13303
+ @media(prefers-reduced-motion:reduce){.dsh-pr-loading svg,.dsh-vcs-check-status[data-state=ongoing] svg{animation:none}}
13240
13304
  .dsh-pr-panel :is(a,textarea,summary,[role=tabpanel]):focus-visible{outline:2px solid var(--dsw-focus-ring-color);outline-offset:-2px}
13241
13305
  .dsh-pr-content{overflow:auto;flex:1;min-height:0}
13242
13306
  .dsh-pr-content>p{padding:20px 16px;color:var(--dsw-alias-label-secondary);line-height:1.6}
@@ -13356,6 +13420,7 @@ function bindPullRequestLinks(root, open) {
13356
13420
  }
13357
13421
  // src/pull-requests-client.tsx
13358
13422
  var pull_requests_client_exports = /* @__PURE__ */ __exportAll({
13423
+ CheckStatusIcon: () => CheckStatusIcon,
13359
13424
  apply: () => apply$2,
13360
13425
  checksState: () => checksState,
13361
13426
  inject: () => inject$1,
@@ -13398,6 +13463,14 @@ function checksState(item) {
13398
13463
  ].includes(state))) return "ongoing";
13399
13464
  return states.every((state) => ["success", "passed"].includes(state)) ? "done" : "idle";
13400
13465
  }
13466
+ function CheckStatusIcon({ state }) {
13467
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13468
+ className: "dsh-vcs-check-status",
13469
+ "data-state": state,
13470
+ "aria-hidden": "true",
13471
+ children: state === "done" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckCircleOutlineRegular, {}) : state === "ongoing" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLoadingOutlineRegular, {}) : state === "warning" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconQuestionOutlineRegular, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: state === "error" ? circle_x_default : circle_minus_default } })
13472
+ });
13473
+ }
13401
13474
  function Loading({ label }) {
13402
13475
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13403
13476
  className: "dsh-pr-loading",
@@ -13430,37 +13503,6 @@ function Description({ text, labels }) {
13430
13503
  variant: "compact"
13431
13504
  }), render(sections)] });
13432
13505
  }
13433
- function Choice({ label, value, items, onChange, disabled }) {
13434
- const [open, setOpen] = (0, react.useState)(false);
13435
- (0, react.useEffect)(() => {
13436
- if (disabled) setOpen(false);
13437
- }, [disabled]);
13438
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
13439
- open,
13440
- portal: true,
13441
- compact: true,
13442
- className: "dsh-pr-choice",
13443
- selectedId: value,
13444
- items,
13445
- onClose: () => setOpen(false),
13446
- onSelect: (id) => {
13447
- const item = items.find((item) => item.id === id && !item.disabled);
13448
- if (item) onChange(item.id);
13449
- setOpen(false);
13450
- },
13451
- anchor: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.Button, {
13452
- type: "button",
13453
- size: "sm",
13454
- className: "dsh-pr-picker",
13455
- "aria-label": label,
13456
- "aria-haspopup": "menu",
13457
- "aria-expanded": open,
13458
- disabled,
13459
- onClick: () => setOpen(!open),
13460
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: items.find((item) => item.id === value)?.label }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { "aria-hidden": "true" })]
13461
- })
13462
- });
13463
- }
13464
13506
  function apply$2(ctx) {
13465
13507
  const connection = ctx.get("connection");
13466
13508
  const sessions = ctx.get("sessions");
@@ -13910,10 +13952,7 @@ function apply$2(ctx) {
13910
13952
  onClick: () => setChecksOpen(!checksOpen),
13911
13953
  "aria-busy": loading,
13912
13954
  children: [
13913
- loading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Loading, { label: copy.loading }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
13914
- state,
13915
- appearance: "step"
13916
- }),
13955
+ loading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Loading, { label: copy.loading }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckStatusIcon, { state }),
13917
13956
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: item.headSha ? checksSummary : copy.checks }),
13918
13957
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { "aria-hidden": "true" })
13919
13958
  ]
@@ -13929,10 +13968,7 @@ function apply$2(ctx) {
13929
13968
  className: "dsh-pr-checks",
13930
13969
  children: item.checks.map((check, index) => {
13931
13970
  const status = checkStatus(check.status);
13932
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
13933
- state: status.state,
13934
- appearance: "step"
13935
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
13971
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckStatusIcon, { state: status.state }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
13936
13972
  className: "dsh-pr-check-name",
13937
13973
  children: [check.url ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
13938
13974
  href: check.url,
@@ -14090,7 +14126,11 @@ function apply$2(ctx) {
14090
14126
  })] }),
14091
14127
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
14092
14128
  className: "dsh-pr-actions",
14093
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Choice, {
14129
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ButtonPicker, {
14130
+ size: "sm",
14131
+ className: "dsh-pr-picker",
14132
+ menuClassName: "dsh-pr-choice",
14133
+ compact: true,
14094
14134
  label: copy.review,
14095
14135
  value: reviewAction,
14096
14136
  disabled: pending,
@@ -14823,10 +14863,7 @@ function apply(ctx) {
14823
14863
  className: "dsh-vcs-trigger",
14824
14864
  title: `${labels.checks}: ${ciLabel}`,
14825
14865
  onClick: () => ctx.sidebarRight.openTab("dungsil-vcs-pull-requests", { params: { section: "checks" } }),
14826
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
14827
- state: ciState,
14828
- appearance: "step"
14829
- }), `${labels.checks}: ${ciLabel}`]
14866
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckStatusIcon, { state: ciState }), `${labels.checks}: ${ciLabel}`]
14830
14867
  })]
14831
14868
  });
14832
14869
  }
package/dist/index.js CHANGED
@@ -16,7 +16,7 @@ var __exportAll = (all, no_symbols) => {
16
16
  if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
17
17
  return target;
18
18
  };
19
- // ../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.8.6/node_modules/@deepseek-ai/cosmokit/lib/index.js
19
+ // ../../node_modules/.pnpm/@deepseek-ai+cosmokit@1.9.0/node_modules/@deepseek-ai/cosmokit/lib/index.js
20
20
  /** Return true when a value is `null` or `undefined`. */
21
21
  function isNullable(value) {
22
22
  return value === null || value === void 0;
@@ -269,7 +269,7 @@ var Time;
269
269
  }
270
270
  Time.template = template;
271
271
  })(Time || (Time = {}));
272
- // ../../node_modules/.pnpm/@deepseek-ai+schemastery@3.18.5/node_modules/@deepseek-ai/schemastery/lib/index.mjs
272
+ // ../../node_modules/.pnpm/@deepseek-ai+schemastery@3.19.0/node_modules/@deepseek-ai/schemastery/lib/index.mjs
273
273
  const kSchema = Symbol.for("schemastery");
274
274
  const kValidationError = Symbol.for("ValidationError");
275
275
  globalThis.__schemastery_index__ ??= 0;
@@ -906,9 +906,14 @@ async function inspectSession(ctx, id, signal) {
906
906
  signal.throwIfAborted();
907
907
  const live = ctx.get("agents")?.get(id);
908
908
  if (live) return live.session;
909
- const inspection = await ctx.sessionController.inspect(id, signal);
910
- signal.throwIfAborted();
911
- return Session.create(id, inspection.events, inspection.meta, inspection.inheritedEventCount);
909
+ const handle = await ctx.sessionPersistence.open(id, "read", { signal });
910
+ try {
911
+ const { events } = await handle.read(void 0, void 0, { signal });
912
+ signal.throwIfAborted();
913
+ return Session.create(id, events, handle.header, handle.inheritedEventCount);
914
+ } finally {
915
+ await handle.close();
916
+ }
912
917
  }
913
918
  // ../../tools/async/src/index.ts
914
919
  function createTaskQueue({ concurrency, maxPending }) {
@@ -979,6 +984,7 @@ const name$3 = "dungsil-vcs-pull-requests";
979
984
  const inject$3 = [
980
985
  "connection",
981
986
  "sessionController",
987
+ "sessionPersistence",
982
988
  "workingDirectory",
983
989
  "subprocess",
984
990
  "sandbox",
@@ -2165,7 +2171,7 @@ async function updateReview(run, context, texts) {
2165
2171
  context.existingReview = updated;
2166
2172
  return { url: updated.url };
2167
2173
  }
2168
- // ../../node_modules/.pnpm/@deepseek-ai+dsh-typert-protocol@0.2.1-rc.5_@deepseek-ai+cordis@4.0.5/node_modules/@deepseek-ai/dsh-typert-protocol/lib/index.js
2174
+ // ../../node_modules/.pnpm/@deepseek-ai+dsh-typert-protocol@0.2.2-rc.1_@deepseek-ai+cordis@4.1.0/node_modules/@deepseek-ai/dsh-typert-protocol/lib/index.js
2169
2175
  /** The one Remote failure class shared by owners, the Gateway, and consumers. */
2170
2176
  /**
2171
2177
  * One Remote call failure: a real Error carrying its stable code and typed
@@ -2346,7 +2352,7 @@ function sameInvocation(left, right) {
2346
2352
  function validateName(subject, value) {
2347
2353
  if (!isTypertRemoteSegment(value)) throw new TypeError(`typert-protocol: ${subject} must contain only RPC endpoint segment characters`);
2348
2354
  }
2349
- // ../../node_modules/.pnpm/@deepseek-ai+dsh-util-values@0.2.1-rc.5_@deepseek-ai+cordis@4.0.5/node_modules/@deepseek-ai/dsh-util-values/lib/index.js
2355
+ // ../../node_modules/.pnpm/@deepseek-ai+dsh-util-values@0.2.2-rc.1_@deepseek-ai+cordis@4.1.0/node_modules/@deepseek-ai/dsh-util-values/lib/index.js
2350
2356
  /**
2351
2357
  * Lazily scanned view of one JSON object's top-level fields, built from text
2352
2358
  * that may still be streaming or from an already parsed object. Nothing is
@@ -3022,7 +3028,7 @@ function deepFreeze(value) {
3022
3028
  }
3023
3029
  return value;
3024
3030
  }
3025
- // ../../node_modules/.pnpm/@deepseek-ai+dsh-util-crypto@0.2.1-rc.5_@deepseek-ai+cordis@4.0.5/node_modules/@deepseek-ai/dsh-util-crypto/lib/index.js
3031
+ // ../../node_modules/.pnpm/@deepseek-ai+dsh-util-crypto@0.2.2-rc.1_@deepseek-ai+cordis@4.1.0/node_modules/@deepseek-ai/dsh-util-crypto/lib/index.js
3026
3032
  /**
3027
3033
  * Random v4 UUID, minted from `crypto.getRandomValues`.
3028
3034
  * @returns the UUID string.
@@ -3034,7 +3040,7 @@ function randomUUID() {
3034
3040
  }).join("");
3035
3041
  return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
3036
3042
  }
3037
- // ../../node_modules/.pnpm/@deepseek-ai+dsh-brand@0.2.1-rc.5_@deepseek-ai+cordis@4.0.5/node_modules/@deepseek-ai/dsh-brand/lib/index.js
3043
+ // ../../node_modules/.pnpm/@deepseek-ai+dsh-brand@0.2.2-rc.1_@deepseek-ai+cordis@4.1.0/node_modules/@deepseek-ai/dsh-brand/lib/index.js
3038
3044
  /**
3039
3045
  * Duplicate-install-safe nominal primitive helpers.
3040
3046
  *
@@ -3056,10 +3062,10 @@ function randomUUID() {
3056
3062
  function brandString(value) {
3057
3063
  return value;
3058
3064
  }
3059
- // ../../node_modules/.pnpm/@deepseek-ai+dsh-timeout@0.2.1-rc.5_@deepseek-ai+cordis@4.0.5/node_modules/@deepseek-ai/dsh-timeout/lib/index.js
3065
+ // ../../node_modules/.pnpm/@deepseek-ai+dsh-timeout@0.2.2-rc.1_@deepseek-ai+cordis@4.1.0/node_modules/@deepseek-ai/dsh-timeout/lib/index.js
3060
3066
  /** Largest delay Node schedules without clamping it to one millisecond. */
3061
3067
  const MAX_TIMER_DELAY_MS = 2147483647;
3062
- // ../../node_modules/.pnpm/@deepseek-ai+dsh-llm@0.2.1-rc.5_@deepseek-ai+cordis@4.0.5/node_modules/@deepseek-ai/dsh-llm/lib/index.js
3068
+ // ../../node_modules/.pnpm/@deepseek-ai+dsh-llm@0.2.2-rc.1_@deepseek-ai+cordis@4.1.0/node_modules/@deepseek-ai/dsh-llm/lib/index.js
3063
3069
  /**
3064
3070
  * Detach and deep-freeze a message whose identity already exists.
3065
3071
  * @param message - complete message, including its stable identity.
@@ -4128,12 +4134,17 @@ var LlmError = class extends HarnessError {
4128
4134
  if (typeof model.provider !== "string" || model.provider !== provider || typeof model.id !== "string" || model.id.length === 0 || typeof model.name !== "string" || model.name.length === 0 || model.description !== void 0 && typeof model.description !== "string" || seen.has(model.id)) throw new LlmError(`adapter returned invalid or duplicate model metadata for provider "${provider}"`, "INVALID_CATALOG");
4129
4135
  seen.add(model.id);
4130
4136
  const inputModalities = this.detachedModalities(model.inputModalities);
4137
+ const badge = model.badge;
4131
4138
  return {
4132
4139
  provider: model.provider,
4133
4140
  id: model.id,
4134
4141
  name: model.name,
4135
4142
  ...model.description === void 0 ? {} : { description: model.description },
4136
- ...inputModalities === void 0 ? {} : { inputModalities }
4143
+ ...inputModalities === void 0 ? {} : { inputModalities },
4144
+ ...badge === void 0 ? {} : { badge: {
4145
+ text: typeof badge.text === "string" ? badge.text : { ...badge.text },
4146
+ tone: badge.tone
4147
+ } }
4137
4148
  };
4138
4149
  });
4139
4150
  }
@@ -5301,6 +5312,7 @@ const name = "dungsil-ui-vcs";
5301
5312
  const inject = [
5302
5313
  "connection",
5303
5314
  "sessionController",
5315
+ "sessionPersistence",
5304
5316
  "subprocess",
5305
5317
  "sandbox",
5306
5318
  "sandboxPolicy",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dungsil/dsh-plugin-ui-vcs",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Git actions and PR/MR review for GitHub, GitLab, Gitea and Forgejo.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -25,33 +25,35 @@
25
25
  "access": "public"
26
26
  },
27
27
  "devDependencies": {
28
- "@deepseek-ai/cordis": "4.0.5",
29
- "@deepseek-ai/dsh-agent": "0.2.1-rc.5",
30
- "@deepseek-ai/dsh-agent-loop-testkit": "0.2.1-rc.5",
31
- "@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.5",
32
- "@deepseek-ai/dsh-app-boot": "0.2.1-rc.5",
33
- "@deepseek-ai/dsh-client-connection": "0.2.1-rc.5",
34
- "@deepseek-ai/dsh-client-locale": "0.2.1-rc.5",
35
- "@deepseek-ai/dsh-client-store": "0.2.1-rc.5",
36
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.5",
37
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.5",
38
- "@deepseek-ai/dsh-client-ui-session": "0.2.1-rc.5",
39
- "@deepseek-ai/dsh-client-ui-settings": "0.2.1-rc.5",
40
- "@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.1-rc.5",
41
- "@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.5",
42
- "@deepseek-ai/dsh-client-ui-workspace": "0.2.1-rc.5",
43
- "@deepseek-ai/dsh-config-editor": "0.2.1-rc.5",
44
- "@deepseek-ai/dsh-credentials-local": "0.2.1-rc.5",
45
- "@deepseek-ai/dsh-fs": "0.2.1-rc.5",
46
- "@deepseek-ai/dsh-llm": "0.2.1-rc.5",
47
- "@deepseek-ai/dsh-sandbox": "0.2.1-rc.5",
48
- "@deepseek-ai/dsh-sandbox-local": "0.2.1-rc.5",
49
- "@deepseek-ai/dsh-sandbox-policy": "0.2.1-rc.5",
50
- "@deepseek-ai/dsh-session": "0.2.1-rc.5",
51
- "@deepseek-ai/dsh-subprocess": "0.2.1-rc.5",
52
- "@deepseek-ai/dsh-subprocess-local": "0.2.1-rc.5",
53
- "@deepseek-ai/dsh-working-directory": "0.2.1-rc.5",
54
- "@deepseek-ai/schemastery": "~3.18.5",
28
+ "@deepseek-ai/cordis": "4.1.0",
29
+ "@deepseek-ai/dsh-agent": "0.2.2-rc.1",
30
+ "@deepseek-ai/dsh-agent-loop-testkit": "0.2.2-rc.1",
31
+ "@deepseek-ai/dsh-api-session-controller": "0.2.2-rc.1",
32
+ "@deepseek-ai/dsh-app-boot": "0.2.2-rc.1",
33
+ "@deepseek-ai/dsh-client-connection": "0.2.2-rc.1",
34
+ "@deepseek-ai/dsh-client-locale": "0.2.2-rc.1",
35
+ "@deepseek-ai/dsh-client-store": "0.2.2-rc.1",
36
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.2-rc.1",
37
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.2-rc.1",
38
+ "@deepseek-ai/dsh-client-ui-session": "0.2.2-rc.1",
39
+ "@deepseek-ai/dsh-client-ui-settings": "0.2.2-rc.1",
40
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.2-rc.1",
41
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.2-rc.1",
42
+ "@deepseek-ai/dsh-client-ui-workspace": "0.2.2-rc.1",
43
+ "@deepseek-ai/dsh-config-editor": "0.2.2-rc.1",
44
+ "@deepseek-ai/dsh-credentials-local": "0.2.2-rc.1",
45
+ "@deepseek-ai/dsh-fs": "0.2.2-rc.1",
46
+ "@deepseek-ai/dsh-llm": "0.2.2-rc.1",
47
+ "@deepseek-ai/dsh-sandbox": "0.2.2-rc.1",
48
+ "@deepseek-ai/dsh-sandbox-local": "0.2.2-rc.1",
49
+ "@deepseek-ai/dsh-sandbox-policy": "0.2.2-rc.1",
50
+ "@deepseek-ai/dsh-session": "0.2.2-rc.1",
51
+ "@deepseek-ai/dsh-session-persistence": "0.2.2-rc.1",
52
+ "@deepseek-ai/dsh-session-persistence-jsonl": "0.2.2-rc.1",
53
+ "@deepseek-ai/dsh-subprocess": "0.2.2-rc.1",
54
+ "@deepseek-ai/dsh-subprocess-local": "0.2.2-rc.1",
55
+ "@deepseek-ai/dsh-working-directory": "0.2.2-rc.1",
56
+ "@deepseek-ai/schemastery": "3.19.0",
55
57
  "@dungsil/dsh-async": "0.0.0",
56
58
  "@dungsil/dsh-tsconfig": "0.0.0",
57
59
  "@dungsil/dsh-ui": "0.0.0",
@@ -68,13 +70,14 @@
68
70
  },
69
71
  "peerDependencies": {
70
72
  "@deepseek-ai/cordis": "^4.0.5",
71
- "@deepseek-ai/dsh-client-connection": "^0.2.1-rc.5",
72
- "@deepseek-ai/dsh-client-ui-primitives": "^0.2.1-rc.5",
73
- "@deepseek-ai/dsh-config-editor": "0.2.1-rc.5",
74
- "@deepseek-ai/dsh-session": "^0.2.1-rc.5"
73
+ "@deepseek-ai/dsh-client-connection": "^0.2.1-rc.5 || ^0.2.2-rc.1",
74
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.2.1-rc.5 || ^0.2.2-rc.1",
75
+ "@deepseek-ai/dsh-config-editor": "0.2.1-rc.5 || ^0.2.2-rc.1",
76
+ "@deepseek-ai/dsh-session": "^0.2.1-rc.5 || ^0.2.2-rc.1",
77
+ "@deepseek-ai/dsh-session-persistence": "^0.2.1-rc.5 || ^0.2.2-rc.1"
75
78
  },
76
79
  "engines": {
77
- "dsh": "^0.2.1-rc.5",
80
+ "dsh": "^0.2.1-rc.5 || ^0.2.2-rc.1",
78
81
  "node": ">=24.9.0"
79
82
  },
80
83
  "dsh": {