@anionex/dsh-vision-toolkit 0.1.12 → 0.1.13

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 (49) hide show
  1. package/README.i18n.yaml +3 -3
  2. package/README.md +192 -343
  3. package/README.zh.md +192 -357
  4. package/docs/requirements-traceability/README.i18n.yaml +2 -2
  5. package/docs/requirements-traceability/README.md +1 -1
  6. package/docs/requirements-traceability/README.zh.md +1 -1
  7. package/lib/client.js +172 -6
  8. package/lib/client.js.map +1 -1
  9. package/lib/plugin-update.js +1011 -0
  10. package/lib/plugin-update.js.map +1 -0
  11. package/lib/runtime-install.js +61 -1
  12. package/lib/runtime-install.js.map +1 -1
  13. package/lib/runtime.js +20 -3
  14. package/lib/runtime.js.map +1 -1
  15. package/lib/skill.js +7 -3
  16. package/lib/skill.js.map +1 -1
  17. package/lib/tools.js +3 -2
  18. package/lib/tools.js.map +1 -1
  19. package/lib/types/client/index.d.ts +55 -1
  20. package/lib/types/client/index.d.ts.map +1 -1
  21. package/lib/types/plugin-update.d.ts +111 -0
  22. package/lib/types/plugin-update.d.ts.map +1 -0
  23. package/lib/types/runtime-install.d.ts +11 -0
  24. package/lib/types/runtime-install.d.ts.map +1 -1
  25. package/lib/types/runtime.d.ts +3 -0
  26. package/lib/types/runtime.d.ts.map +1 -1
  27. package/lib/types/skill.d.ts +1 -1
  28. package/lib/types/skill.d.ts.map +1 -1
  29. package/lib/types/tools.d.ts.map +1 -1
  30. package/lib/types/upstream.d.ts +1 -0
  31. package/lib/types/upstream.d.ts.map +1 -1
  32. package/lib/types/web.d.ts +13 -1
  33. package/lib/types/web.d.ts.map +1 -1
  34. package/lib/upstream.js +20 -8
  35. package/lib/upstream.js.map +1 -1
  36. package/lib/web.js +46 -7
  37. package/lib/web.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/client/index.tsx +228 -5
  40. package/src/plugin-update.ts +1142 -0
  41. package/src/runtime-install.ts +77 -1
  42. package/src/runtime.ts +23 -3
  43. package/src/skill.ts +7 -3
  44. package/src/tools.ts +4 -2
  45. package/src/upstream.ts +21 -8
  46. package/src/web.ts +69 -3
  47. package/vendor/agent-vision-toolkit/UPSTREAM_MANIFEST.json +3 -3
  48. package/vendor/agent-vision-toolkit/skills/vision-tools/scripts/html_shot.py +323 -11
  49. /package/assets/{hero.png → hero-v2.png} +0 -0
package/lib/web.js CHANGED
@@ -9,6 +9,7 @@ import { SettingsConflictError } from '@deepseek-ai/dsh-settings';
9
9
  import { ARTIFACT_ROUTE_PREFIX } from "./artifact-access.js";
10
10
  import { PASTE_IMAGES_ROUTE, PASTE_POLICY_ROUTE, } from "./paste-images.js";
11
11
  import { resolveConfig, isBuiltInFreeVisionProvider, VISION_TOOLKIT_SETTINGS_NAMESPACE, } from "./config.js";
12
+ import { PluginUpdateError, VisionToolkitPluginUpdateService, } from "./plugin-update.js";
12
13
  import { PLUGIN_VERSION, UPSTREAM_COMMIT, UPSTREAM_REPOSITORY, UPSTREAM_VERSION } from "./version.js";
13
14
  import { sameOriginPost, sameOriginRequest } from "./web-request.js";
14
15
  /** Exact route used by the browser Settings page. */
@@ -103,6 +104,14 @@ function parseRequest(value) {
103
104
  value: secret,
104
105
  };
105
106
  }
107
+ if (value.action === 'check-update')
108
+ return { action: 'check-update' };
109
+ if (value.action === 'apply-update') {
110
+ if (typeof value.expectedVersion !== 'string' || value.expectedVersion.trim().length === 0) {
111
+ throw new TypeError('apply-update.expectedVersion must be a non-empty string');
112
+ }
113
+ return { action: 'apply-update', expectedVersion: value.expectedVersion.trim() };
114
+ }
106
115
  throw new TypeError(`unsupported action: ${value.action}`);
107
116
  }
108
117
  function publicMessage(error) {
@@ -116,11 +125,19 @@ export class VisionToolkitWebBackend {
116
125
  manager;
117
126
  artifacts;
118
127
  onRuntimeActivated;
119
- constructor(ctx, manager, artifacts, onRuntimeActivated) {
128
+ updater;
129
+ constructor(ctx, manager, artifacts, onRuntimeActivated, updater) {
120
130
  this.ctx = ctx;
121
131
  this.manager = manager;
122
132
  this.artifacts = artifacts;
123
133
  this.onRuntimeActivated = onRuntimeActivated;
134
+ this.updater = updater ?? new VisionToolkitPluginUpdateService(ctx, PLUGIN_VERSION, {
135
+ runtimeReady: () => this.manager.status().ready,
136
+ });
137
+ }
138
+ /** Supply the active listener address before the Settings route becomes reachable. */
139
+ configureWebServer(host, port) {
140
+ this.updater.configureWebServer?.(host, port);
124
141
  }
125
142
  async credential(config) {
126
143
  if (isBuiltInFreeVisionProvider(config.provider)) {
@@ -134,6 +151,7 @@ export class VisionToolkitWebBackend {
134
151
  const value = descriptor.value;
135
152
  const resolved = resolveConfig(value);
136
153
  const credential = await this.credential(resolved);
154
+ const update = await this.updater.capability();
137
155
  return {
138
156
  schemaVersion: 1,
139
157
  writable: this.ctx.settings.writable,
@@ -156,6 +174,7 @@ export class VisionToolkitWebBackend {
156
174
  upstreamRepository: UPSTREAM_REPOSITORY,
157
175
  upstreamVersion: UPSTREAM_VERSION,
158
176
  upstreamCommit: UPSTREAM_COMMIT,
177
+ update,
159
178
  },
160
179
  artifactRouteAvailable: this.artifacts.routeAvailable,
161
180
  };
@@ -251,21 +270,40 @@ export class VisionToolkitWebBackend {
251
270
  case 'credential':
252
271
  responseJson(res, 200, { ok: true, value: await this.saveCredential(parsed) });
253
272
  break;
273
+ case 'check-update':
274
+ responseJson(res, 200, { ok: true, value: await this.updater.check() });
275
+ break;
276
+ case 'apply-update':
277
+ responseJson(res, 200, { ok: true, value: await this.updater.installAndRestart(parsed.expectedVersion) });
278
+ break;
254
279
  }
255
280
  }
256
281
  catch (error) {
257
282
  const settingsConflict = error instanceof SettingsConflictError;
258
283
  const credentialConflict = error instanceof CredentialReferenceConflictError;
284
+ const updateError = error instanceof PluginUpdateError;
259
285
  const code = settingsConflict
260
286
  ? 'settings-conflict'
261
287
  : credentialConflict
262
288
  ? 'credential-conflict'
263
- : parsed.action === 'health'
264
- ? 'health-failed'
265
- : parsed.action === 'credential'
266
- ? 'credential-rejected'
267
- : 'settings-rejected';
268
- const status = settingsConflict || credentialConflict ? 409 : parsed.action === 'health' ? 503 : 400;
289
+ : updateError
290
+ ? error.code
291
+ : parsed.action === 'health'
292
+ ? 'health-failed'
293
+ : parsed.action === 'credential'
294
+ ? 'credential-rejected'
295
+ : 'settings-rejected';
296
+ const updateConflict = updateError && ['update-in-progress', 'update-stale', 'update-unavailable', 'already-current'].includes(error.code);
297
+ const updateGateway = updateError && error.code === 'update-check-failed';
298
+ const status = settingsConflict || credentialConflict || updateConflict
299
+ ? 409
300
+ : parsed.action === 'health'
301
+ ? 503
302
+ : updateGateway
303
+ ? 502
304
+ : updateError
305
+ ? 500
306
+ : 400;
269
307
  this.ctx.logger.warn('dsh-vision-toolkit Web action=%s failed: %s', parsed.action, publicMessage(error));
270
308
  requestError(res, status, code, publicMessage(error));
271
309
  }
@@ -352,6 +390,7 @@ export function createPastePolicyHandler(resolve) {
352
390
  export function installVisionToolkitWeb(ctx, backend, artifacts, pastedImages, pastePolicy) {
353
391
  ctx.inject(['webServer'], (webCtx) => {
354
392
  webCtx.effect(() => {
393
+ backend.configureWebServer(webCtx.webServer.host, webCtx.webServer.port);
355
394
  const detach = artifacts.attachRoute();
356
395
  const disposeArtifact = webCtx.webServer.register({
357
396
  kind: 'prefix',
package/lib/web.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anionex/dsh-vision-toolkit",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "DeepSeek Harness-native integration for agent-vision-toolkit: image Q&A, OCR, grounding, UI restoration, pixel diff, Artifacts, and Web UI.",
5
5
  "keywords": [
6
6
  "deepseek",
@@ -89,6 +89,33 @@ const en = {
89
89
  upstreamVersion: 'Upstream',
90
90
  activeGeneration: 'Runtime generation',
91
91
  activeGenerationValue: 'Generation {generation}',
92
+ updates: 'Plugin updates',
93
+ updatesHint: 'Check npm for a newer release, install it into this DSH profile, and restart DSH Web automatically.',
94
+ checkUpdate: 'Check for updates',
95
+ checkingUpdate: 'Checking for updates…',
96
+ updateAvailable: 'Update available',
97
+ updateAvailableDetail: 'Version {version} is available. Updating restarts DSH Web and may interrupt work that is currently running.',
98
+ upToDate: 'Up to date',
99
+ upToDateDetail: 'Version {version} is the latest release.',
100
+ updateNow: 'Update and restart',
101
+ updatingPlugin: 'Updating and restarting…',
102
+ updateConfirm: 'Install Vision Toolkit {version} and restart DSH Web now? Running work may be interrupted.',
103
+ restarting: 'Version {version} was installed. Waiting for DSH Web to restart…',
104
+ updateProfile: 'Profile',
105
+ updateInstalled: 'Installed',
106
+ updateLatest: 'Latest',
107
+ updateUnsupported: 'Automatic updates are unavailable for this installation.',
108
+ updateReasonProfileNotFound: 'The running plugin could not be matched to a DSH profile installation.',
109
+ updateReasonNotDependency: 'The plugin is not a direct dependency of this DSH profile.',
110
+ updateReasonLocalSource: 'This profile uses a local, workspace, URL, or git installation; update that source manually so local work is not overwritten.',
111
+ updateReasonReadOnly: 'The profile package manifest is read-only.',
112
+ updateReasonPnpm: 'pnpm is unavailable in the DSH execution environment.',
113
+ updateReasonPlatform: 'Automatic restart is unavailable on this operating system.',
114
+ updateReasonRestartUnmanaged: 'Detached self-restart is disabled. Use a supported process manager, or explicitly opt in with DSH_VISION_TOOLKIT_ALLOW_DETACHED_RESTART=1 for an unsupervised Web process.',
115
+ updateReasonRestartAddress: 'Automatic restart is unavailable when DSH Web uses an unknown or dynamically allocated port. Start it with a fixed --port value.',
116
+ updateSaveFirst: 'Save or discard the current Settings and API key changes before updating the plugin.',
117
+ restartTimedOut: 'DSH Web did not return with the target plugin version. Check the restart log and restart the Web profile through its original process manager.',
118
+ restartRolledBack: 'The new plugin did not become ready, so the previous version was restored. Check the restart log before trying again.',
92
119
  pluginKind: 'DSH native plugin',
93
120
  runtimeUnavailable: 'Runtime unavailable',
94
121
  runtimeCandidateRejected: 'Last runtime candidate was rejected; the active generation remains available.',
@@ -239,6 +266,33 @@ const zh: Record<LocaleKey, string> = {
239
266
  upstreamVersion: '工具包版本',
240
267
  activeGeneration: '本次运行已应用',
241
268
  activeGenerationValue: '{generation} 次',
269
+ updates: '插件更新',
270
+ updatesHint: '检查 npm 新版本,自动更新当前 DSH Profile 中的插件,然后重启 DSH Web。',
271
+ checkUpdate: '检查更新',
272
+ checkingUpdate: '正在检查更新…',
273
+ updateAvailable: '发现新版本',
274
+ updateAvailableDetail: '可更新到 {version}。更新会重启 DSH Web,正在运行的任务可能会被中断。',
275
+ upToDate: '已是最新版',
276
+ upToDateDetail: '当前 {version} 已是最新正式版本。',
277
+ updateNow: '自动更新并重启',
278
+ updatingPlugin: '正在更新并重启…',
279
+ updateConfirm: '现在安装 Vision Toolkit {version} 并重启 DSH Web 吗?正在运行的任务可能会被中断。',
280
+ restarting: '已安装 {version},正在等待 DSH Web 重启…',
281
+ updateProfile: 'Profile',
282
+ updateInstalled: '当前版本',
283
+ updateLatest: '最新版本',
284
+ updateUnsupported: '当前安装方式不支持自动更新。',
285
+ updateReasonProfileNotFound: '无法把正在运行的插件匹配到某个 DSH Profile 安装。',
286
+ updateReasonNotDependency: '该插件不是当前 DSH Profile 的直接依赖。',
287
+ updateReasonLocalSource: '当前使用本地、workspace、URL 或 git 安装;为避免覆盖本地修改,请手动更新对应来源。',
288
+ updateReasonReadOnly: '当前 Profile 的 package.json 不可写。',
289
+ updateReasonPnpm: 'DSH 运行环境中找不到 pnpm。',
290
+ updateReasonPlatform: '当前操作系统不支持安全的自动重启。',
291
+ updateReasonRestartUnmanaged: '默认禁用脱离原进程管理器的自重启。仅对无人监管的 Web 进程明确设置 DSH_VISION_TOOLKIT_ALLOW_DETACHED_RESTART=1 后开放。',
292
+ updateReasonRestartAddress: 'DSH Web 使用未知端口或动态端口时无法安全自动重启。请用固定的 --port 值启动。',
293
+ updateSaveFirst: '更新插件前,请先保存或放弃当前 Settings 和 API 密钥修改。',
294
+ restartTimedOut: 'DSH Web 未能以目标插件版本恢复。请检查重启日志,并通过原进程管理器重启 Web Profile。',
295
+ restartRolledBack: '新插件未能就绪,系统已恢复上一版本。再次尝试前请检查重启日志。',
242
296
  pluginKind: 'DSH 原生插件',
243
297
  runtimeUnavailable: '运行环境尚未就绪',
244
298
  runtimeCandidateRejected: '新设置未能生效,仍在使用上一次可用的设置。',
@@ -401,6 +455,39 @@ interface SettingsValue {
401
455
  allowedDirs?: string[]
402
456
  }
403
457
 
458
+ type PluginUpdateUnavailableReason =
459
+ | 'profile-not-found'
460
+ | 'not-direct-dependency'
461
+ | 'unsupported-install-source'
462
+ | 'profile-read-only'
463
+ | 'pnpm-unavailable'
464
+ | 'unsupported-platform'
465
+ | 'restart-unmanaged'
466
+ | 'restart-address-unavailable'
467
+
468
+ interface PluginUpdateCapability {
469
+ supported: boolean
470
+ checkSupported?: boolean
471
+ profile?: string
472
+ dependencySpec?: string
473
+ reason?: PluginUpdateUnavailableReason
474
+ }
475
+
476
+ interface PluginUpdateCheck extends PluginUpdateCapability {
477
+ currentVersion: string
478
+ latestVersion?: string
479
+ updateAvailable: boolean
480
+ checkedAt: string
481
+ }
482
+
483
+ interface PluginUpdateResult {
484
+ fromVersion: string
485
+ toVersion: string
486
+ profile: string
487
+ restarting: true
488
+ retryAfterMs: number
489
+ }
490
+
404
491
  interface SettingsSnapshot {
405
492
  schemaVersion: 1
406
493
  writable: boolean
@@ -424,6 +511,7 @@ interface SettingsSnapshot {
424
511
  upstreamRepository: string
425
512
  upstreamVersion: string
426
513
  upstreamCommit: string
514
+ update: PluginUpdateCapability
427
515
  }
428
516
  artifactRouteAvailable: boolean
429
517
  }
@@ -779,7 +867,9 @@ interface SettingsState {
779
867
  status: 'idle' | 'loading' | 'ready' | 'error'
780
868
  snapshot?: SettingsSnapshot | undefined
781
869
  health?: HealthResult | undefined
782
- action?: 'save' | 'health' | 'connection' | 'model' | undefined
870
+ update?: PluginUpdateCheck | undefined
871
+ restart?: PluginUpdateResult | undefined
872
+ action?: 'save' | 'health' | 'connection' | 'model' | 'check-update' | 'apply-update' | undefined
783
873
  message?: string | undefined
784
874
  error?: string | undefined
785
875
  }
@@ -808,7 +898,13 @@ export class VisionSettingsController {
808
898
  try {
809
899
  const snapshot = await apiRequest<SettingsSnapshot>()
810
900
  if (generation !== this.generation) return
811
- this.set({ status: 'ready', snapshot, health: this.state.health })
901
+ this.set({
902
+ status: 'ready',
903
+ snapshot,
904
+ health: this.state.health,
905
+ update: this.state.update,
906
+ restart: this.state.restart,
907
+ })
812
908
  } catch (error) {
813
909
  if (generation !== this.generation) return
814
910
  this.set({ ...this.state, status: 'error', error: error instanceof Error ? error.message : String(error) })
@@ -854,12 +950,21 @@ export class VisionSettingsController {
854
950
  status: 'ready',
855
951
  snapshot,
856
952
  health: this.state.health,
953
+ update: this.state.update,
954
+ restart: this.state.restart,
857
955
  error: error instanceof Error ? error.message : String(error),
858
956
  })
859
957
  return false
860
958
  }
861
959
  }
862
- this.set({ status: 'ready', snapshot, health: this.state.health, message: 'saved' })
960
+ this.set({
961
+ status: 'ready',
962
+ snapshot,
963
+ health: this.state.health,
964
+ update: this.state.update,
965
+ restart: this.state.restart,
966
+ message: 'saved',
967
+ })
863
968
  return true
864
969
  } catch (error) {
865
970
  this.set({ ...this.state, action: undefined, error: error instanceof Error ? error.message : String(error) })
@@ -882,6 +987,38 @@ export class VisionSettingsController {
882
987
  this.set({ ...this.state, action: undefined, error: error instanceof Error ? error.message : String(error) })
883
988
  }
884
989
  }
990
+
991
+ async checkUpdate(): Promise<void> {
992
+ this.set({ ...this.state, action: 'check-update', error: undefined, message: undefined })
993
+ try {
994
+ const update = await apiRequest<PluginUpdateCheck>({
995
+ method: 'POST',
996
+ headers: { 'Content-Type': 'application/json' },
997
+ body: JSON.stringify({ action: 'check-update' }),
998
+ })
999
+ this.set({ ...this.state, action: undefined, update })
1000
+ } catch (error) {
1001
+ this.set({ ...this.state, action: undefined, error: error instanceof Error ? error.message : String(error) })
1002
+ }
1003
+ }
1004
+
1005
+ async applyUpdate(expectedVersion: string): Promise<void> {
1006
+ this.set({ ...this.state, action: 'apply-update', error: undefined, message: undefined })
1007
+ try {
1008
+ const restart = await apiRequest<PluginUpdateResult>({
1009
+ method: 'POST',
1010
+ headers: { 'Content-Type': 'application/json' },
1011
+ body: JSON.stringify({ action: 'apply-update', expectedVersion }),
1012
+ })
1013
+ this.set({ ...this.state, action: undefined, restart, message: 'restarting' })
1014
+ } catch (error) {
1015
+ this.set({ ...this.state, action: undefined, error: error instanceof Error ? error.message : String(error) })
1016
+ }
1017
+ }
1018
+
1019
+ reportRestartTimeout(message: string): void {
1020
+ this.set({ ...this.state, restart: undefined, message: undefined, error: message })
1021
+ }
885
1022
  }
886
1023
 
887
1024
  interface Draft {
@@ -962,6 +1099,14 @@ function valueOf(draft: Draft, t: Translate): SettingsValue {
962
1099
  }
963
1100
  }
964
1101
 
1102
+ function settingsDraftChanged(draft: Draft, saved: SettingsValue, t: Translate): boolean {
1103
+ try {
1104
+ return JSON.stringify(valueOf(draft, t)) !== JSON.stringify(valueOf(draftOf(saved), t))
1105
+ } catch {
1106
+ return true
1107
+ }
1108
+ }
1109
+
965
1110
  function isBuiltInFreeVisionDraft(draft: Draft): boolean {
966
1111
  return draft.baseUrl.trim().replace(/\/+$/, '') === BUILT_IN_FREE_VISION_BASE_URL
967
1112
  && draft.credential.trim() === BUILT_IN_FREE_VISION_CREDENTIAL
@@ -1061,6 +1206,21 @@ function credentialSource(source: string, t: Translate): string {
1061
1206
  return source
1062
1207
  }
1063
1208
 
1209
+ const UPDATE_REASON_KEYS: Record<PluginUpdateUnavailableReason, LocaleKey> = {
1210
+ 'profile-not-found': 'updateReasonProfileNotFound',
1211
+ 'not-direct-dependency': 'updateReasonNotDependency',
1212
+ 'unsupported-install-source': 'updateReasonLocalSource',
1213
+ 'profile-read-only': 'updateReasonReadOnly',
1214
+ 'pnpm-unavailable': 'updateReasonPnpm',
1215
+ 'unsupported-platform': 'updateReasonPlatform',
1216
+ 'restart-unmanaged': 'updateReasonRestartUnmanaged',
1217
+ 'restart-address-unavailable': 'updateReasonRestartAddress',
1218
+ }
1219
+
1220
+ function wait(delayMs: number): Promise<void> {
1221
+ return new Promise(resolve => { setTimeout(resolve, delayMs) })
1222
+ }
1223
+
1064
1224
  function LoadedSettings({ controller, t }: SettingsInjected) {
1065
1225
  const state = useSyncExternalStore(controller.subscribe, controller.snapshot, controller.snapshot)
1066
1226
  const snapshot = state.snapshot
@@ -1072,6 +1232,35 @@ function LoadedSettings({ controller, t }: SettingsInjected) {
1072
1232
  useEffect(() => {
1073
1233
  if (snapshot !== undefined) setDraft(draftOf(snapshot.settings.value))
1074
1234
  }, [snapshot])
1235
+ useEffect(() => {
1236
+ const restart = state.restart
1237
+ if (restart === undefined) return
1238
+ let cancelled = false
1239
+ void (async () => {
1240
+ await wait(restart.retryAfterMs)
1241
+ const deadline = Date.now() + 390_000
1242
+ let outageSeen = false
1243
+ while (!cancelled && Date.now() < deadline) {
1244
+ try {
1245
+ const current = await apiRequest<SettingsSnapshot>()
1246
+ if (current.release.pluginVersion === restart.toVersion) {
1247
+ window.location.reload()
1248
+ return
1249
+ }
1250
+ if (outageSeen && current.release.pluginVersion === restart.fromVersion) {
1251
+ controller.reportRestartTimeout(t('restartRolledBack'))
1252
+ return
1253
+ }
1254
+ } catch {
1255
+ // The expected outage while the replacement process starts.
1256
+ outageSeen = true
1257
+ }
1258
+ await wait(1_000)
1259
+ }
1260
+ if (!cancelled) controller.reportRestartTimeout(t('restartTimedOut'))
1261
+ })()
1262
+ return () => { cancelled = true }
1263
+ }, [controller, state.restart, t])
1075
1264
 
1076
1265
  if (state.status === 'idle' || (state.status === 'loading' && snapshot === undefined)) {
1077
1266
  return <div className="dvt-settings"><div className="dvt-loading">{t('testing')}</div></div>
@@ -1109,6 +1298,17 @@ function LoadedSettings({ controller, t }: SettingsInjected) {
1109
1298
  && !builtInCredentialChangedProvider
1110
1299
  const canSave = snapshot.writable || (apiKey.length > 0 && !keyLocked)
1111
1300
  const runtimeErrorTitle = snapshot.runtime.ready ? t('runtimeCandidateRejected') : t('runtimeUnavailable')
1301
+ const pluginUpdate = state.update
1302
+ const updateCapability = pluginUpdate ?? snapshot.release.update
1303
+ const latestVersion = pluginUpdate?.latestVersion
1304
+ const updateReason = updateCapability.reason === undefined ? undefined : t(UPDATE_REASON_KEYS[updateCapability.reason])
1305
+ const updateCheckSupported = updateCapability.checkSupported ?? updateCapability.supported
1306
+ const updateHasUnsavedChanges = apiKey.length > 0 || settingsDraftChanged(draft, snapshot.settings.value, t)
1307
+ const applyUpdate = (): void => {
1308
+ if (latestVersion === undefined) return
1309
+ if (!window.confirm(t('updateConfirm', { version: latestVersion }))) return
1310
+ void controller.applyUpdate(latestVersion)
1311
+ }
1112
1312
 
1113
1313
  return (
1114
1314
  <div className="dvt-settings">
@@ -1117,6 +1317,7 @@ function LoadedSettings({ controller, t }: SettingsInjected) {
1117
1317
  {draftError === undefined ? null : <div className="dvt-alert error">{draftError}</div>}
1118
1318
  {state.error === undefined ? null : <div className="dvt-alert error">{state.error}</div>}
1119
1319
  {state.message === 'saved' ? <div className="dvt-alert success">{t('saved')}</div> : null}
1320
+ {state.message === 'restarting' && state.restart !== undefined ? <div className="dvt-alert success">{t('restarting', { version: state.restart.toVersion })}</div> : null}
1120
1321
  {snapshot.runtime.lastError === undefined ? null : <div className="dvt-alert error"><strong>{runtimeErrorTitle}</strong><span>{snapshot.runtime.lastError}</span></div>}
1121
1322
 
1122
1323
  <section className="dvt-panel dvt-essential"><div className="dvt-panel-title"><div><h3>{t('provider')}</h3><p>{t('providerHint')}</p></div><span className={`dvt-badge ${snapshot.credential.configured ? 'ok' : 'error'}`}>{snapshot.credential.configured ? t('configured') : t('missing')}</span></div>
@@ -1138,6 +1339,28 @@ function LoadedSettings({ controller, t }: SettingsInjected) {
1138
1339
  })}</div>}
1139
1340
  </section>
1140
1341
 
1342
+ <section className="dvt-panel dvt-update-panel">
1343
+ <div className="dvt-panel-title">
1344
+ <div><h3>{t('updates')}</h3><p>{t('updatesHint')}</p></div>
1345
+ <span className={`dvt-badge ${pluginUpdate?.updateAvailable ? 'warning' : pluginUpdate !== undefined && pluginUpdate.supported ? 'ok' : ''}`}>
1346
+ {pluginUpdate?.updateAvailable ? t('updateAvailable') : pluginUpdate !== undefined && pluginUpdate.supported ? t('upToDate') : t('pluginVersion')}
1347
+ </span>
1348
+ </div>
1349
+ <div className="dvt-update-grid">
1350
+ <div><span>{t('updateInstalled')}</span><strong>{snapshot.release.pluginVersion}</strong></div>
1351
+ <div><span>{t('updateLatest')}</span><strong>{latestVersion ?? '—'}</strong></div>
1352
+ <div><span>{t('updateProfile')}</span><strong>{updateCapability.profile ?? '—'}</strong></div>
1353
+ </div>
1354
+ {!updateCapability.supported ? <div className="dvt-alert warning"><strong>{t('updateUnsupported')}</strong><span>{updateReason}</span></div> : null}
1355
+ {updateCapability.supported && updateHasUnsavedChanges ? <div className="dvt-alert warning">{t('updateSaveFirst')}</div> : null}
1356
+ {pluginUpdate?.supported && pluginUpdate.updateAvailable && latestVersion !== undefined ? <p className="dvt-muted">{t('updateAvailableDetail', { version: latestVersion })}</p> : null}
1357
+ {pluginUpdate?.supported && !pluginUpdate.updateAvailable && latestVersion !== undefined ? <p className="dvt-muted">{t('upToDateDetail', { version: latestVersion })}</p> : null}
1358
+ <div className="dvt-actions">
1359
+ <Button variant="outline" disabled={busy || !updateCheckSupported || state.restart !== undefined} onClick={() => { void controller.checkUpdate() }}>{state.action === 'check-update' ? t('checkingUpdate') : t('checkUpdate')}</Button>
1360
+ {pluginUpdate?.supported && pluginUpdate.updateAvailable && latestVersion !== undefined ? <Button variant="primary" disabled={busy || state.restart !== undefined || updateHasUnsavedChanges} onClick={applyUpdate}>{state.action === 'apply-update' ? t('updatingPlugin') : t('updateNow')}</Button> : null}
1361
+ </div>
1362
+ </section>
1363
+
1141
1364
  <details className="dvt-advanced">
1142
1365
  <summary><span><strong>{t('advanced')}</strong><small>{t('advancedHint')}</small></span><span className="dvt-details-chevron" aria-hidden="true">⌄</span></summary>
1143
1366
  <div className="dvt-advanced-body">
@@ -1180,11 +1403,11 @@ const CSS = `
1180
1403
  .dvt-tool-head{width:100%;min-height:38px;display:flex;align-items:center;gap:7px;padding:8px 10px;border:0;background:transparent;color:inherit;text-align:left;cursor:pointer;font:inherit}.dvt-tool-head:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.dvt-tool-icon{width:20px;height:20px;display:grid;place-items:center;border-radius:6px;color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 12%,transparent);flex:none}.dvt-tool-title{font-size:12px;font-weight:650;white-space:nowrap}.dvt-tool-sep{opacity:.35}.dvt-tool-summary{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--dsw-alias-label-secondary)}.dvt-tool-status{margin-left:auto;font-size:11px;color:var(--dsw-alias-label-secondary);max-width:45%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dvt-tool[data-state=error] .dvt-tool-status{color:var(--dsw-alias-state-error-primary)}.dvt-chevron{margin-left:auto;transition:transform .16s ease;opacity:.55}.dvt-chevron[data-open=true]{transform:rotate(180deg)}.dvt-tool-body{padding:0 10px 10px}.dvt-stack{display:grid;gap:10px}.dvt-muted{margin:0;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.5}
1181
1404
  .dvt-metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.dvt-metrics>div,.dvt-diff-score{padding:10px;border-radius:9px;background:var(--dsw-alias-bg-layer-2);display:grid;gap:4px}.dvt-metrics span,.dvt-diff-score span{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--dsw-alias-label-secondary)}.dvt-metrics strong,.dvt-diff-score strong{font-size:13px}.dvt-list{list-style:none;margin:0;padding:0;display:grid;gap:4px;max-height:160px;overflow:auto}.dvt-list li{display:flex;justify-content:space-between;gap:12px;padding:6px 8px;border-radius:7px;background:var(--dsw-alias-bg-layer-2);font-size:11px}.dvt-list code{color:var(--dsw-alias-state-business-primary)}.dvt-table-wrap{max-height:220px;overflow:auto;border:1px solid var(--dsw-alias-border-l1);border-radius:9px}.dvt-table{width:100%;border-collapse:collapse;font-size:11px}.dvt-table th,.dvt-table td{padding:7px 8px;text-align:left;border-bottom:1px solid var(--dsw-alias-border-l1)}.dvt-table th{position:sticky;top:0;background:var(--dsw-alias-bg-layer-2);font-size:10px;text-transform:uppercase;letter-spacing:.05em}.dvt-table tr:last-child td{border-bottom:0}
1182
1405
  .dvt-artifact{border:1px solid var(--dsw-alias-border-l1);border-radius:10px;overflow:hidden;background:var(--dsw-alias-bg-layer-1)}.dvt-preview{display:block;width:100%;max-height:360px;object-fit:contain;background:repeating-conic-gradient(var(--dsw-alias-bg-module-platform) 0 25%,var(--dsw-alias-bg-layer-1) 0 50%) 50%/18px 18px;border:0}.dvt-svg{height:280px}.dvt-artifact-meta{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 10px}.dvt-artifact-meta>div:first-child{min-width:0;display:grid;gap:2px}.dvt-artifact-meta strong{font-size:12px;overflow:hidden;text-overflow:ellipsis}.dvt-artifact-meta span,.dvt-artifact-meta small{font-size:10px;color:var(--dsw-alias-label-secondary)}.dvt-actions{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.dvt-download{display:inline-flex;align-items:center;height:28px;padding:0 12px;border-radius:999px;background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground);text-decoration:none;font-size:12px;font-weight:600}.dvt-download:hover{background:var(--dsw-alias-button-primary-hover)}.dvt-download:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.dvt-artifact>.dvt-muted{padding:0 10px 10px}.dvt-diff-score>div{height:5px;border-radius:99px;background:var(--dsw-alias-border-l2);overflow:hidden}.dvt-diff-score i{display:block;height:100%;min-width:2px;background:linear-gradient(90deg,var(--dsw-alias-state-warn-primary),var(--dsw-alias-state-error-primary));border-radius:99px}.dvt-tool h4{font-size:11px;margin:0 0 6px}.dvt-palette{display:grid;grid-template-columns:repeat(auto-fit,minmax(112px,1fr));gap:7px}.dvt-palette>div{display:flex;align-items:center;gap:8px;padding:7px;border:1px solid var(--dsw-alias-border-l1);border-radius:9px}.dvt-palette i{width:28px;height:28px;border-radius:7px;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2)}.dvt-palette span{display:grid}.dvt-palette strong{font-size:11px}.dvt-palette small{font-size:10px;color:var(--dsw-alias-label-secondary)}
1183
- .dvt-settings{display:grid;gap:14px;max-width:900px;padding:8px 2px 32px;color:var(--dsw-alias-label-primary)}.dvt-settings-footer{display:flex;justify-content:space-between;gap:20px;align-items:flex-start;padding:8px 2px}.dvt-settings-footer h2{font-size:25px;letter-spacing:-.025em;margin:3px 0 6px}.dvt-settings-footer p{max-width:620px;margin:0;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55}.dvt-kicker{font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:var(--dsw-alias-state-business-primary);font-weight:700}.dvt-release{display:grid;gap:4px;min-width:170px;padding:9px 11px;border-radius:10px;background:var(--dsw-alias-bg-layer-2);font-size:10px;color:var(--dsw-alias-label-secondary)}.dvt-release span{display:flex;justify-content:space-between;gap:12px}.dvt-release strong{color:var(--dsw-alias-label-primary)}.dvt-alert{padding:10px 12px;border-radius:10px;font-size:12px;line-height:1.5;display:grid;gap:3px}.dvt-alert.notice{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent);color:var(--dsw-alias-state-business-primary)}.dvt-alert.warning{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 12%,transparent);color:var(--dsw-alias-state-warn-label)}.dvt-alert.error{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}.dvt-alert.success{background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 10%,transparent);color:var(--dsw-alias-state-success-primary)}.dvt-panel{display:grid;gap:12px;padding:15px;border:1px solid var(--dsw-alias-border-l1);border-radius:14px;background:var(--dsw-alias-bg-layer-1);box-shadow:var(--dsw-shadow-lv1)}.dvt-panel-title{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.dvt-panel-title h3{font-size:14px;margin:0}.dvt-panel-title p{font-size:11px;line-height:1.45;color:var(--dsw-alias-label-secondary);margin:4px 0 0;max-width:620px}.dvt-badge{font-size:10px;padding:3px 7px;border-radius:999px;font-weight:650}.dvt-badge.ok{background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 12%,transparent);color:var(--dsw-alias-state-success-primary)}.dvt-badge.error{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}.dvt-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.dvt-field{display:grid;gap:6px;align-content:start}.dvt-field>span{font-size:11px;font-weight:600}.dvt-field>small{font-size:10px;color:var(--dsw-alias-label-secondary);line-height:1.4}.dvt-field select,.dvt-field textarea{width:100%;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);border-radius:9px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;padding:8px 10px}.dvt-field select{height:36px}.dvt-field textarea{resize:vertical;min-height:76px}.dvt-runtime-facts{display:grid;gap:4px;padding:9px 10px;border-radius:9px;background:var(--dsw-alias-bg-layer-2);overflow:auto}.dvt-runtime-facts code{font-size:10px;white-space:nowrap;color:var(--dsw-alias-label-secondary)}.dvt-save-row{display:flex;gap:8px;padding:2px 0}
1406
+ .dvt-settings{display:grid;gap:14px;max-width:900px;padding:8px 2px 32px;color:var(--dsw-alias-label-primary)}.dvt-settings-footer{display:flex;justify-content:space-between;gap:20px;align-items:flex-start;padding:8px 2px}.dvt-settings-footer h2{font-size:25px;letter-spacing:-.025em;margin:3px 0 6px}.dvt-settings-footer p{max-width:620px;margin:0;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.55}.dvt-kicker{font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:var(--dsw-alias-state-business-primary);font-weight:700}.dvt-release{display:grid;gap:4px;min-width:170px;padding:9px 11px;border-radius:10px;background:var(--dsw-alias-bg-layer-2);font-size:10px;color:var(--dsw-alias-label-secondary)}.dvt-release span{display:flex;justify-content:space-between;gap:12px}.dvt-release strong{color:var(--dsw-alias-label-primary)}.dvt-alert{padding:10px 12px;border-radius:10px;font-size:12px;line-height:1.5;display:grid;gap:3px}.dvt-alert.notice{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 10%,transparent);color:var(--dsw-alias-state-business-primary)}.dvt-alert.warning{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 12%,transparent);color:var(--dsw-alias-state-warn-label)}.dvt-alert.error{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}.dvt-alert.success{background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 10%,transparent);color:var(--dsw-alias-state-success-primary)}.dvt-panel{display:grid;gap:12px;padding:15px;border:1px solid var(--dsw-alias-border-l1);border-radius:14px;background:var(--dsw-alias-bg-layer-1);box-shadow:var(--dsw-shadow-lv1)}.dvt-panel-title{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.dvt-panel-title h3{font-size:14px;margin:0}.dvt-panel-title p{font-size:11px;line-height:1.45;color:var(--dsw-alias-label-secondary);margin:4px 0 0;max-width:620px}.dvt-badge{font-size:10px;padding:3px 7px;border-radius:999px;font-weight:650}.dvt-badge.ok{background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 12%,transparent);color:var(--dsw-alias-state-success-primary)}.dvt-badge.warning{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 12%,transparent);color:var(--dsw-alias-state-warn-label)}.dvt-badge.error{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent);color:var(--dsw-alias-state-error-primary)}.dvt-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.dvt-field{display:grid;gap:6px;align-content:start}.dvt-field>span{font-size:11px;font-weight:600}.dvt-field>small{font-size:10px;color:var(--dsw-alias-label-secondary);line-height:1.4}.dvt-field select,.dvt-field textarea{width:100%;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);border-radius:9px;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;padding:8px 10px}.dvt-field select{height:36px}.dvt-field textarea{resize:vertical;min-height:76px}.dvt-runtime-facts{display:grid;gap:4px;padding:9px 10px;border-radius:9px;background:var(--dsw-alias-bg-layer-2);overflow:auto}.dvt-runtime-facts code{font-size:10px;white-space:nowrap;color:var(--dsw-alias-label-secondary)}.dvt-save-row{display:flex;gap:8px;padding:2px 0}.dvt-update-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.dvt-update-grid>div{display:grid;gap:3px;padding:9px 10px;border-radius:9px;background:var(--dsw-alias-bg-layer-2)}.dvt-update-grid span{font-size:9px;text-transform:uppercase;letter-spacing:.04em;color:var(--dsw-alias-label-caption)}.dvt-update-grid strong{font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
1184
1407
  .dvt-settings-footer{margin-top:8px;padding:20px 2px 4px;border-top:1px solid var(--dsw-alias-border-l1);opacity:.82}.dvt-settings-footer h2{font-size:18px;letter-spacing:-.015em;margin:3px 0 5px}.dvt-settings-footer p{font-size:11px;line-height:1.5}.dvt-release{min-width:220px}.dvt-release span{white-space:nowrap}.dvt-essential{border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary) 30%,var(--dsw-alias-border-l1));box-shadow:var(--dsw-shadow-lv1),0 0 0 3px color-mix(in srgb,var(--dsw-alias-state-business-primary) 5%,transparent)}.dvt-advanced{border:1px solid var(--dsw-alias-border-l1);border-radius:14px;background:var(--dsw-alias-bg-layer-1);overflow:hidden}.dvt-advanced>summary{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px 15px;cursor:pointer;list-style:none}.dvt-advanced>summary::-webkit-details-marker{display:none}.dvt-advanced>summary>span:first-child{display:grid;gap:3px}.dvt-advanced>summary strong{font-size:13px}.dvt-advanced>summary small{font-size:10px;line-height:1.45;color:var(--dsw-alias-label-secondary);font-weight:400}.dvt-details-chevron{font-size:15px;opacity:.55;transition:transform .16s ease}.dvt-advanced[open] .dvt-details-chevron{transform:rotate(180deg)}.dvt-advanced-body{display:grid;gap:12px;padding:0 12px 12px}.dvt-advanced-body>.dvt-panel{box-shadow:none}
1185
1408
  .dvt-health-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px}.dvt-health-grid>div{padding:9px 10px;border-radius:9px;background:var(--dsw-alias-bg-layer-2);border-left:3px solid var(--dsw-alias-border-l4)}.dvt-health-grid>div[data-status=ok]{border-left-color:var(--dsw-alias-state-success-primary)}.dvt-health-grid>div[data-status=warning],.dvt-health-grid>div[data-status=not_tested]{border-left-color:var(--dsw-alias-state-warn-primary)}.dvt-health-grid>div[data-status=error]{border-left-color:var(--dsw-alias-state-error-primary)}.dvt-health-grid span{font-size:10px;text-transform:capitalize}.dvt-health-grid strong{float:right;font-size:9px;text-transform:uppercase;color:var(--dsw-alias-label-secondary)}.dvt-health-test-tag{display:inline-flex;margin-left:6px;padding:1px 6px;border-radius:999px;background:var(--dsw-alias-bg-layer-1);font-size:9px;font-style:normal;font-weight:600;color:var(--dsw-alias-label-secondary)}.dvt-health-test-tag[data-status=ok]{background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 12%,transparent);color:var(--dsw-alias-state-success-primary)}.dvt-health-test-tag[data-status=warning]{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 12%,transparent);color:var(--dsw-alias-state-warn-label)}.dvt-health-test-tag[data-status=error]{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 12%,transparent);color:var(--dsw-alias-state-error-primary)}.dvt-health-grid p{clear:both;margin:5px 0 0;font-size:10px;line-height:1.4;color:var(--dsw-alias-label-secondary)}.dvt-loading{padding:24px;border-radius:12px;background:var(--dsw-alias-bg-layer-2);font-size:12px;color:var(--dsw-alias-label-secondary)}
1186
1409
  .dvt-paste-dock{box-sizing:border-box;width:calc(100% - 32px);max-width:var(--dsh-composer-card-max-width,960px);margin:0 auto;display:flex;flex-wrap:wrap;gap:6px;padding:0 2px 6px}.dvt-paste-chip{max-width:100%;height:32px;box-sizing:border-box;display:flex;align-items:center;gap:7px;padding:0 6px 0 10px;border:1px solid var(--dsw-alias-border-l1);border-radius:9px;background:var(--dsw-specific-tip);font-size:12px}.dvt-paste-chip[data-status=copying]{border-color:var(--dsw-alias-state-business-primary)}.dvt-paste-chip[data-status=error]{border-color:var(--dsw-alias-state-error-primary)}.dvt-paste-name{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dvt-paste-detail{color:var(--dsw-alias-label-caption);max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dvt-paste-chip[data-status=error] .dvt-paste-detail{color:var(--dsw-alias-state-error-primary)}.dvt-paste-chip button{width:20px;height:20px;display:grid;place-items:center;border:0;border-radius:50%;padding:0;background:transparent;color:var(--dsw-alias-label-caption);font:inherit;font-size:16px;cursor:pointer}.dvt-paste-chip button:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.dvt-paste-chip button:disabled{opacity:.4;cursor:default}
1187
- @media(max-width:720px){.dvt-settings-footer{display:grid}.dvt-release{width:auto}.dvt-form-grid{grid-template-columns:1fr}.dvt-metrics{grid-template-columns:1fr}.dvt-artifact-meta{align-items:flex-start;flex-direction:column}.dvt-panel-title{flex-direction:column}}
1410
+ @media(max-width:720px){.dvt-settings-footer{display:grid}.dvt-release{width:auto}.dvt-form-grid,.dvt-update-grid{grid-template-columns:1fr}.dvt-metrics{grid-template-columns:1fr}.dvt-artifact-meta{align-items:flex-start;flex-direction:column}.dvt-panel-title{flex-direction:column}}
1188
1411
  `
1189
1412
 
1190
1413
  function installStyles(): () => void {