docker-client-mx 1.35.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 (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -0
  3. package/bin/docker-client-mx.js +42 -0
  4. package/build/icons/icon-1024.png +0 -0
  5. package/build/icons/icon-128.png +0 -0
  6. package/build/icons/icon-16.png +0 -0
  7. package/build/icons/icon-256.png +0 -0
  8. package/build/icons/icon-32.png +0 -0
  9. package/build/icons/icon-48.png +0 -0
  10. package/build/icons/icon-512.png +0 -0
  11. package/build/icons/icon-64.png +0 -0
  12. package/build/icons/icon.ico +0 -0
  13. package/build/icons/icon.iconset/icon_128x128.png +0 -0
  14. package/build/icons/icon.iconset/icon_128x128@2x.png +0 -0
  15. package/build/icons/icon.iconset/icon_16x16.png +0 -0
  16. package/build/icons/icon.iconset/icon_16x16@2x.png +0 -0
  17. package/build/icons/icon.iconset/icon_256x256.png +0 -0
  18. package/build/icons/icon.iconset/icon_256x256@2x.png +0 -0
  19. package/build/icons/icon.iconset/icon_32x32.png +0 -0
  20. package/build/icons/icon.iconset/icon_32x32@2x.png +0 -0
  21. package/build/icons/icon.iconset/icon_512x512.png +0 -0
  22. package/build/icons/icon.iconset/icon_512x512@2x.png +0 -0
  23. package/build/icons/icon.png +0 -0
  24. package/dist/docker-desktop-mx/browser/chunk-64WWLMUP.js +39 -0
  25. package/dist/docker-desktop-mx/browser/chunk-N4VBBC4W.js +1 -0
  26. package/dist/docker-desktop-mx/browser/favicon.ico +0 -0
  27. package/dist/docker-desktop-mx/browser/index.html +14 -0
  28. package/dist/docker-desktop-mx/browser/main-CTIRTSOI.js +5 -0
  29. package/dist/docker-desktop-mx/browser/styles-JS3HDDI4.css +1 -0
  30. package/dist-electron/api.js +10 -0
  31. package/dist-electron/api.js.map +1 -0
  32. package/dist-electron/assistant-key.js +70 -0
  33. package/dist-electron/assistant-key.js.map +1 -0
  34. package/dist-electron/assistant-models.js +19 -0
  35. package/dist-electron/assistant-models.js.map +1 -0
  36. package/dist-electron/assistant-tools.js +335 -0
  37. package/dist-electron/assistant-tools.js.map +1 -0
  38. package/dist-electron/assistant.js +302 -0
  39. package/dist-electron/assistant.js.map +1 -0
  40. package/dist-electron/attention.js +75 -0
  41. package/dist-electron/attention.js.map +1 -0
  42. package/dist-electron/channels.js +113 -0
  43. package/dist-electron/channels.js.map +1 -0
  44. package/dist-electron/compose-files.js +104 -0
  45. package/dist-electron/compose-files.js.map +1 -0
  46. package/dist-electron/compose.js +271 -0
  47. package/dist-electron/compose.js.map +1 -0
  48. package/dist-electron/container-events.js +188 -0
  49. package/dist-electron/container-events.js.map +1 -0
  50. package/dist-electron/containers.js +165 -0
  51. package/dist-electron/containers.js.map +1 -0
  52. package/dist-electron/context-menu.js +56 -0
  53. package/dist-electron/context-menu.js.map +1 -0
  54. package/dist-electron/contexts.js +346 -0
  55. package/dist-electron/contexts.js.map +1 -0
  56. package/dist-electron/crash.js +129 -0
  57. package/dist-electron/crash.js.map +1 -0
  58. package/dist-electron/diagnosis.js +338 -0
  59. package/dist-electron/diagnosis.js.map +1 -0
  60. package/dist-electron/docker-client.js +284 -0
  61. package/dist-electron/docker-client.js.map +1 -0
  62. package/dist-electron/engine.js +145 -0
  63. package/dist-electron/engine.js.map +1 -0
  64. package/dist-electron/event-store.js +146 -0
  65. package/dist-electron/event-store.js.map +1 -0
  66. package/dist-electron/events.js +132 -0
  67. package/dist-electron/events.js.map +1 -0
  68. package/dist-electron/exec.js +138 -0
  69. package/dist-electron/exec.js.map +1 -0
  70. package/dist-electron/files.js +407 -0
  71. package/dist-electron/files.js.map +1 -0
  72. package/dist-electron/health.js +92 -0
  73. package/dist-electron/health.js.map +1 -0
  74. package/dist-electron/host-overview.js +50 -0
  75. package/dist-electron/host-overview.js.map +1 -0
  76. package/dist-electron/host-shell.js +196 -0
  77. package/dist-electron/host-shell.js.map +1 -0
  78. package/dist-electron/i18n.js +58 -0
  79. package/dist-electron/i18n.js.map +1 -0
  80. package/dist-electron/image-history.js +87 -0
  81. package/dist-electron/image-history.js.map +1 -0
  82. package/dist-electron/images.js +141 -0
  83. package/dist-electron/images.js.map +1 -0
  84. package/dist-electron/ipc.js +783 -0
  85. package/dist-electron/ipc.js.map +1 -0
  86. package/dist-electron/links.js +46 -0
  87. package/dist-electron/links.js.map +1 -0
  88. package/dist-electron/logs.js +153 -0
  89. package/dist-electron/logs.js.map +1 -0
  90. package/dist-electron/main.js +494 -0
  91. package/dist-electron/main.js.map +1 -0
  92. package/dist-electron/merged-logs.js +127 -0
  93. package/dist-electron/merged-logs.js.map +1 -0
  94. package/dist-electron/navigation.js +37 -0
  95. package/dist-electron/navigation.js.map +1 -0
  96. package/dist-electron/ndjson.js +30 -0
  97. package/dist-electron/ndjson.js.map +1 -0
  98. package/dist-electron/networks.js +507 -0
  99. package/dist-electron/networks.js.map +1 -0
  100. package/dist-electron/port-conflicts.js +106 -0
  101. package/dist-electron/port-conflicts.js.map +1 -0
  102. package/dist-electron/preload.js +257 -0
  103. package/dist-electron/preload.js.map +1 -0
  104. package/dist-electron/pull.js +220 -0
  105. package/dist-electron/pull.js.map +1 -0
  106. package/dist-electron/redact.js +129 -0
  107. package/dist-electron/redact.js.map +1 -0
  108. package/dist-electron/registry-auth.js +150 -0
  109. package/dist-electron/registry-auth.js.map +1 -0
  110. package/dist-electron/renew.js +162 -0
  111. package/dist-electron/renew.js.map +1 -0
  112. package/dist-electron/restart-policy.js +58 -0
  113. package/dist-electron/restart-policy.js.map +1 -0
  114. package/dist-electron/run-command.js +146 -0
  115. package/dist-electron/run-command.js.map +1 -0
  116. package/dist-electron/run.js +151 -0
  117. package/dist-electron/run.js.map +1 -0
  118. package/dist-electron/self-update.js +163 -0
  119. package/dist-electron/self-update.js.map +1 -0
  120. package/dist-electron/servers.js +108 -0
  121. package/dist-electron/servers.js.map +1 -0
  122. package/dist-electron/settings.js +146 -0
  123. package/dist-electron/settings.js.map +1 -0
  124. package/dist-electron/ssh.js +574 -0
  125. package/dist-electron/ssh.js.map +1 -0
  126. package/dist-electron/stats.js +209 -0
  127. package/dist-electron/stats.js.map +1 -0
  128. package/dist-electron/streams.js +63 -0
  129. package/dist-electron/streams.js.map +1 -0
  130. package/dist-electron/system.js +123 -0
  131. package/dist-electron/system.js.map +1 -0
  132. package/dist-electron/terminal-transcript.js +55 -0
  133. package/dist-electron/terminal-transcript.js.map +1 -0
  134. package/dist-electron/updates.js +136 -0
  135. package/dist-electron/updates.js.map +1 -0
  136. package/dist-electron/volume-backup.js +203 -0
  137. package/dist-electron/volume-backup.js.map +1 -0
  138. package/dist-electron/volume-files.js +124 -0
  139. package/dist-electron/volume-files.js.map +1 -0
  140. package/dist-electron/volumes.js +253 -0
  141. package/dist-electron/volumes.js.map +1 -0
  142. package/dist-electron/wiring-watch.js +93 -0
  143. package/dist-electron/wiring-watch.js.map +1 -0
  144. package/dist-electron/wiring.js +71 -0
  145. package/dist-electron/wiring.js.map +1 -0
  146. package/dist-electron/wsl.js +167 -0
  147. package/dist-electron/wsl.js.map +1 -0
  148. package/package.json +125 -0
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HIDDEN_LABELS = exports.LOG_TAIL = void 0;
4
+ exports.renderDiagnosis = renderDiagnosis;
5
+ exports.readLogs = readLogs;
6
+ exports.readEvents = readEvents;
7
+ exports.buildDiagnosis = buildDiagnosis;
8
+ const docker_client_1 = require("./docker-client");
9
+ const engine_1 = require("./engine");
10
+ const i18n_1 = require("./i18n");
11
+ const logs_1 = require("./logs");
12
+ const ndjson_1 = require("./ndjson");
13
+ const redact_1 = require("./redact");
14
+ /**
15
+ * Een diagnose van één container: alles wat je nodig hebt om te begrijpen waarom hij stopte of
16
+ * unhealthy is, als één blok Markdown om in een chat of een issue te plakken.
17
+ *
18
+ * Wat erin staat, gaat eerst door redact.ts. De gebruiker ziet het blok voordat hij het
19
+ * kopieert, maar leest niet elke logregel na; het opschonen moet dus hier al goed zijn.
20
+ *
21
+ * In de taal van de app: de gebruiker leest het blok, en plakt het in zijn eigen chat of issue.
22
+ */
23
+ /** Zoveel logregels. Genoeg voor een stacktrace en wat eraan voorafging. */
24
+ exports.LOG_TAIL = 300;
25
+ /** Events van zo ver terug. De events-stream van Docker bewaart ze niet eindeloos. */
26
+ const EVENTS_SINCE_S = 60 * 60;
27
+ /** Zoveel events, de laatste. */
28
+ const MAX_EVENTS = 20;
29
+ /** Een regel uit de health-log wordt ingekort; een check die een hele HTML-pagina teruggeeft, past er niet in. */
30
+ const HEALTH_OUTPUT_MAX = 200;
31
+ /** Labels die naar een bestand met geheimen wijzen. Het pad is geen geheim, maar zegt waar ze staan. */
32
+ exports.HIDDEN_LABELS = /env(?:ironment)?_?files?|secret|password|token/i;
33
+ /** De namen van compose, als ze er zijn. */
34
+ const COMPOSE_PROJECT = 'com.docker.compose.project';
35
+ const COMPOSE_SERVICE = 'com.docker.compose.service';
36
+ /**
37
+ * Een code-blok met een omheining die langer is dan elke reeks backticks in de inhoud. Een
38
+ * logregel met ``` erin zou het blok anders halverwege afsluiten.
39
+ */
40
+ function fenced(text, language = '') {
41
+ const longest = Math.max(2, ...[...text.matchAll(/`+/g)].map((match) => match[0].length));
42
+ const fence = '`'.repeat(longest + 1);
43
+ return `${fence}${language}\n${text}\n${fence}`;
44
+ }
45
+ /** Inline code, met genoeg backticks eromheen. */
46
+ function code(text) {
47
+ const fence = text.includes('`') ? '``' : '`';
48
+ return `${fence}${text}${fence}`;
49
+ }
50
+ /** Een tijd uit Docker (RFC 3339 met nanoseconden) zonder de fractie; `null` voor Docker's nul-tijd. */
51
+ function shortTime(value) {
52
+ if (value === undefined || value.startsWith('0001-')) {
53
+ return null;
54
+ }
55
+ return value.replace(/\.\d+(?=Z|[+-]\d\d:\d\d$)/, '');
56
+ }
57
+ function oneLine(text, max) {
58
+ const flat = text.replace(/\s+/g, ' ').trim();
59
+ return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;
60
+ }
61
+ /** Houdt bij hoeveel er in totaal weggelaten is, over alle delen heen. */
62
+ class Cleaner {
63
+ count = 0;
64
+ text(value) {
65
+ const result = (0, redact_1.redactText)(value);
66
+ this.count += result.count;
67
+ return result.text;
68
+ }
69
+ }
70
+ function describeState(inspect) {
71
+ const state = inspect.State ?? {};
72
+ const lines = [];
73
+ const status = state.Status ?? (0, i18n_1.t)({ en: 'unknown', nl: 'onbekend', de: 'unbekannt', fr: 'inconnu', es: 'desconocido' });
74
+ const exitCode = `, ${(0, i18n_1.t)({ en: 'exit code', nl: 'exitcode', de: 'Exit-Code', fr: 'code de sortie', es: 'código de salida' })} ${String(state.ExitCode ?? '?')}`;
75
+ lines.push(`- Status: ${status}${status === 'running' ? '' : exitCode}${state.OOMKilled === true ? ', **OOMKilled**' : ''}`);
76
+ const started = shortTime(state.StartedAt);
77
+ const finished = shortTime(state.FinishedAt);
78
+ if (started !== null) {
79
+ lines.push((0, i18n_1.t)({
80
+ en: `- Started: ${started}${finished === null ? '' : ` · stopped: ${finished}`}`,
81
+ nl: `- Gestart: ${started}${finished === null ? '' : ` · gestopt: ${finished}`}`,
82
+ de: `- Gestartet: ${started}${finished === null ? '' : ` · gestoppt: ${finished}`}`,
83
+ fr: `- Démarré : ${started}${finished === null ? '' : ` · arrêté : ${finished}`}`,
84
+ es: `- Iniciado: ${started}${finished === null ? '' : ` · detenido: ${finished}`}`,
85
+ }));
86
+ }
87
+ const policy = inspect.HostConfig?.RestartPolicy;
88
+ const policyName = policy?.Name === undefined || policy.Name === '' ? 'no' : policy.Name;
89
+ const maximum = String(policy?.MaximumRetryCount ?? 0);
90
+ const retries = policy?.MaximumRetryCount !== undefined && policy.MaximumRetryCount > 0 ? (0, i18n_1.t)({
91
+ en: ` (at most ${maximum})`,
92
+ nl: ` (hooguit ${maximum})`,
93
+ de: ` (höchstens ${maximum})`,
94
+ fr: ` (au plus ${maximum})`,
95
+ es: ` (como mucho ${maximum})`,
96
+ }) : '';
97
+ const restarts = inspect.RestartCount ?? 0;
98
+ lines.push((0, i18n_1.t)({
99
+ en: `- Restarts: ${String(restarts)} ${restarts === 1 ? 'time' : 'times'}, policy ${code(policyName)}${retries}`,
100
+ nl: `- Herstart: ${String(restarts)} keer, beleid ${code(policyName)}${retries}`,
101
+ de: `- Neustarts: ${String(restarts)} mal, Policy ${code(policyName)}${retries}`,
102
+ fr: `- Redémarrages : ${String(restarts)} fois, policy ${code(policyName)}${retries}`,
103
+ es: `- Reinicios: ${String(restarts)} veces, policy ${code(policyName)}${retries}`,
104
+ }));
105
+ if (inspect.HostConfig?.Memory !== undefined && inspect.HostConfig.Memory > 0) {
106
+ const mebibytes = String(Math.round(inspect.HostConfig.Memory / 1024 / 1024));
107
+ lines.push((0, i18n_1.t)({
108
+ en: `- Memory limit: ${mebibytes} MiB`,
109
+ nl: `- Geheugenlimiet: ${mebibytes} MiB`,
110
+ de: `- Speicherlimit: ${mebibytes} MiB`,
111
+ fr: `- Limite de mémoire : ${mebibytes} MiB`,
112
+ es: `- Límite de memoria: ${mebibytes} MiB`,
113
+ }));
114
+ }
115
+ return lines;
116
+ }
117
+ function describeCommand(inspect, clean) {
118
+ const entrypoint = inspect.Config?.Entrypoint ?? [];
119
+ const cmd = inspect.Config?.Cmd ?? [];
120
+ const parts = [...entrypoint, ...cmd];
121
+ if (parts.length === 0) {
122
+ return null;
123
+ }
124
+ return `${(0, i18n_1.t)({ en: '- Command', nl: '- Commando', de: '- Befehl', fr: '- Commande', es: '- Comando' })}: ${code(clean.text(parts.join(' ')))}`;
125
+ }
126
+ function describeHealth(inspect, clean) {
127
+ const health = inspect.State?.Health;
128
+ if (health?.Status === undefined) {
129
+ return [];
130
+ }
131
+ const streak = String(health.FailingStreak ?? 0);
132
+ const lines = [
133
+ (0, i18n_1.t)({
134
+ en: `Status ${code(health.Status)}, failed ${streak} times in a row.`,
135
+ nl: `Status ${code(health.Status)}, ${streak} keer op rij mislukt.`,
136
+ de: `Status ${code(health.Status)}, ${streak} mal hintereinander fehlgeschlagen.`,
137
+ fr: `Statut ${code(health.Status)}, échoué ${streak} fois de suite.`,
138
+ es: `Estado ${code(health.Status)}, ha fallado ${streak} veces seguidas.`,
139
+ }),
140
+ '',
141
+ ];
142
+ for (const entry of (health.Log ?? []).slice(-5)) {
143
+ const output = oneLine(clean.text(entry.Output ?? ''), HEALTH_OUTPUT_MAX);
144
+ const exitCode = `${(0, i18n_1.t)({ en: 'exit code', nl: 'exitcode', de: 'Exit-Code', fr: 'code de sortie', es: 'código de salida' })} ${String(entry.ExitCode ?? '?')}`;
145
+ lines.push(`- ${shortTime(entry.End) ?? '?'}: ${exitCode}${output === '' ? '' : `: ${output}`}`);
146
+ }
147
+ return lines;
148
+ }
149
+ function describePorts(inspect) {
150
+ const lines = [];
151
+ for (const [containerPort, bindings] of Object.entries(inspect.NetworkSettings?.Ports ?? {})) {
152
+ if (bindings === null || bindings.length === 0) {
153
+ lines.push(`- ${containerPort} (${(0, i18n_1.t)({ en: 'not published', nl: 'niet gepubliceerd', de: 'nicht veröffentlicht', fr: 'non publié', es: 'no publicado' })})`);
154
+ continue;
155
+ }
156
+ // IPv4 en IPv6 geven dezelfde poort twee keer; één regel per hostpoort is genoeg.
157
+ for (const hostPort of new Set(bindings.map((binding) => binding.HostPort ?? '?'))) {
158
+ lines.push(`- ${hostPort} → ${containerPort}`);
159
+ }
160
+ }
161
+ return lines;
162
+ }
163
+ function describeMounts(inspect) {
164
+ return (inspect.Mounts ?? []).map((mount) => {
165
+ const source = mount.Type === 'volume' ? `volume ${code(mount.Name ?? '?')}` : `${mount.Type ?? 'mount'} ${code(mount.Source ?? '?')}`;
166
+ const access = mount.RW === false ? (0, i18n_1.t)({
167
+ en: 'read-only',
168
+ nl: 'alleen lezen',
169
+ de: 'nur lesen',
170
+ fr: 'lecture seule',
171
+ es: 'solo lectura',
172
+ }) : (0, i18n_1.t)({ en: 'read-write', nl: 'lezen en schrijven', de: 'lesen und schreiben', fr: 'lecture-écriture', es: 'lectura y escritura' });
173
+ return `- ${source} → ${code(mount.Destination ?? '?')} (${access})`;
174
+ });
175
+ }
176
+ function describeNetworks(inspect) {
177
+ return Object.entries(inspect.NetworkSettings?.Networks ?? {}).map(([name, network]) => {
178
+ const address = network.IPAddress === undefined || network.IPAddress === '' ? '' : ` (${network.IPAddress})`;
179
+ return `- ${code(name)}${address}`;
180
+ });
181
+ }
182
+ function describeLabels(labels, clean) {
183
+ return Object.entries(labels)
184
+ .filter(([name]) => !exports.HIDDEN_LABELS.test(name))
185
+ .sort(([a], [b]) => a.localeCompare(b))
186
+ .map(([name, value]) => clean.text(`${name}=${value}`));
187
+ }
188
+ function describeEvents(events) {
189
+ return events
190
+ .filter((event) => event.Action !== undefined && !event.Action.startsWith('exec_'))
191
+ .slice(-MAX_EVENTS)
192
+ .map((event) => {
193
+ const when = event.time === undefined ? '?' : new Date(event.time * 1000).toISOString().replace(/\.\d+Z$/, 'Z');
194
+ const exitCode = event.Actor?.Attributes?.['exitCode'];
195
+ return `- ${when} ${event.Action ?? ''}${exitCode === undefined ? '' : ` (${(0, i18n_1.t)({
196
+ en: 'exit code',
197
+ nl: 'exitcode',
198
+ de: 'Exit-Code',
199
+ fr: 'code de sortie',
200
+ es: 'código de salida',
201
+ })} ${exitCode})`}`;
202
+ });
203
+ }
204
+ function describeEngine(engine, context) {
205
+ if (!engine.connected || engine.version === undefined) {
206
+ return (0, i18n_1.t)({
207
+ en: `- Engine unreachable via ${code(engine.endpoint)}, context ${code(context)}`,
208
+ nl: `- Engine niet bereikbaar via ${code(engine.endpoint)}, context ${code(context)}`,
209
+ de: `- Engine nicht erreichbar über ${code(engine.endpoint)}, Context ${code(context)}`,
210
+ fr: `- Engine injoignable via ${code(engine.endpoint)}, context ${code(context)}`,
211
+ es: `- Engine inaccesible por ${code(engine.endpoint)}, context ${code(context)}`,
212
+ });
213
+ }
214
+ const { version } = engine;
215
+ return `- Docker ${version.version} (API ${version.apiVersion}), ${version.os}/${version.arch}, context ${code(context)}, ${code(engine.endpoint)}`;
216
+ }
217
+ /** Een kop met een lijst eronder, of niets als de lijst leeg is. */
218
+ function section(title, lines) {
219
+ return lines.length === 0 ? [] : [`### ${title}`, '', ...lines, ''];
220
+ }
221
+ /** Bouwt het blok. Zonder Docker, zodat het los te testen is. */
222
+ function renderDiagnosis(input) {
223
+ const { inspect } = input;
224
+ const clean = new Cleaner();
225
+ const name = (inspect.Name ?? inspect.Id ?? '?').replace(/^\//, '');
226
+ const labels = inspect.Config?.Labels ?? {};
227
+ const project = labels[COMPOSE_PROJECT];
228
+ const service = labels[COMPOSE_SERVICE];
229
+ const env = (0, redact_1.redactEnv)(inspect.Config?.Env ?? []);
230
+ clean.count += env.count;
231
+ const logText = clean.text(input.logs.map((line) => (line.timestamp === null ? line.text : `${shortTime(line.timestamp) ?? line.timestamp} ${line.text}`)).join('\n'));
232
+ const container = [
233
+ `${(0, i18n_1.t)({ en: '- Name', nl: '- Naam', de: '- Name', fr: '- Nom', es: '- Nombre' })}: ${code(name)} (${code((inspect.Id ?? '').slice(0, 12))})`,
234
+ `- Image: ${code(inspect.Config?.Image ?? '?')} (${code((inspect.Image ?? '').replace(/^sha256:/, '').slice(0, 12))})`,
235
+ ...describeState(inspect),
236
+ ...(project === undefined ? [] : [`- Compose: project ${code(project)}${service === undefined ? '' : `, service ${code(service)}`}`]),
237
+ ...[describeCommand(inspect, clean)].filter((line) => line !== null),
238
+ ...(inspect.State?.Error === undefined || inspect.State.Error === ''
239
+ ? []
240
+ : [`${(0, i18n_1.t)({ en: '- Error from Docker', nl: '- Fout van Docker', de: '- Fehler von Docker', fr: '- Erreur renvoyée par Docker', es: '- Error de Docker' })}: ${clean.text(inspect.State.Error)}`]),
241
+ ];
242
+ const labelLines = describeLabels(labels, clean);
243
+ const generatedAt = input.generatedAt.toISOString().replace(/\.\d+Z$/, 'Z');
244
+ const markdown = [
245
+ (0, i18n_1.t)({ en: `## Diagnosis of ${code(name)}`, nl: `## Diagnose van ${code(name)}`, de: `## Diagnose von ${code(name)}`, fr: `## Diagnostic de ${code(name)}`, es: `## Diagnóstico de ${code(name)}` }),
246
+ '',
247
+ (0, i18n_1.t)({
248
+ en: `_Made with Docker Client MX ${input.appVersion} at ${generatedAt}. ` +
249
+ 'Values of environment variables and anything that looks like a password, token or key have been omitted._',
250
+ nl: `_Gemaakt met Docker Client MX ${input.appVersion} op ${generatedAt}. ` +
251
+ 'Waarden van omgevingsvariabelen en wat op een wachtwoord, token of sleutel lijkt, zijn weggelaten._',
252
+ de: `_Erstellt mit Docker Client MX ${input.appVersion} am ${generatedAt}. ` +
253
+ 'Werte von Umgebungsvariablen und alles, was nach einem Passwort, Token oder Schlüssel aussieht, wurden ausgelassen._',
254
+ fr: `_Généré avec Docker Client MX ${input.appVersion} le ${generatedAt}. ` +
255
+ 'Les valeurs des variables d’environnement et tout ce qui ressemble à un mot de passe, un token ou une clé ont été omis._',
256
+ es: `_Generado con Docker Client MX ${input.appVersion} el ${generatedAt}. ` +
257
+ 'Se han omitido los valores de las variables de entorno y todo lo que parece una contraseña, un token o una clave._',
258
+ }),
259
+ '',
260
+ ...section('Container', container),
261
+ ...section('Health', describeHealth(inspect, clean)),
262
+ ...section((0, i18n_1.t)({ en: 'Ports', nl: 'Poorten', de: 'Ports', fr: 'Ports', es: 'Puertos' }), describePorts(inspect)),
263
+ ...section('Mounts', describeMounts(inspect)),
264
+ ...section((0, i18n_1.t)({ en: 'Networks', nl: 'Netwerken', de: 'Netzwerke', fr: 'Réseaux', es: 'Redes' }), describeNetworks(inspect)),
265
+ ...section((0, i18n_1.t)({
266
+ en: 'Environment variables (names only)',
267
+ nl: 'Omgevingsvariabelen (alleen de namen)',
268
+ de: 'Umgebungsvariablen (nur Namen)',
269
+ fr: 'Variables d’environnement (noms seulement)',
270
+ es: 'Variables de entorno (solo los nombres)',
271
+ }), env.entries.length === 0 ? [] : [fenced(env.entries.join('\n'))]),
272
+ ...section('Labels', labelLines.length === 0 ? [] : [fenced(labelLines.join('\n'))]),
273
+ ...section((0, i18n_1.t)({
274
+ en: 'Events of the last hour',
275
+ nl: 'Events van het laatste uur',
276
+ de: 'Events der letzten Stunde',
277
+ fr: 'Events de la dernière heure',
278
+ es: 'Events de la última hora',
279
+ }), describeEvents(input.events)),
280
+ ...section((0, i18n_1.t)({
281
+ en: `Logs (last ${String(exports.LOG_TAIL)} lines)`,
282
+ nl: `Logs (laatste ${String(exports.LOG_TAIL)} regels)`,
283
+ de: `Logs (letzte ${String(exports.LOG_TAIL)} Zeilen)`,
284
+ fr: `Logs (${String(exports.LOG_TAIL)} dernières lignes)`,
285
+ es: `Logs (últimas ${String(exports.LOG_TAIL)} líneas)`,
286
+ }), [
287
+ input.logs.length === 0 ? (0, i18n_1.t)({ en: '_No log lines._', nl: '_Geen logregels._', de: '_Keine Logzeilen._', fr: '_Aucune ligne de log._', es: '_No hay líneas de log._' }) : fenced(logText),
288
+ ]),
289
+ ...section('Engine', [describeEngine(input.engine, input.context)]),
290
+ ].join('\n');
291
+ return { name, markdown: `${markdown.trimEnd()}\n`, redactions: clean.count };
292
+ }
293
+ /** De laatste logregels, zonder stream: `follow: false` geeft ze in één keer. */
294
+ async function readLogs(containerId, tty, tail = exports.LOG_TAIL) {
295
+ const { docker } = (0, docker_client_1.getConnection)();
296
+ const raw = (await docker.getContainer(containerId).logs({ follow: false, stdout: true, stderr: true, timestamps: true, tail }));
297
+ const lines = [];
298
+ const parser = (0, logs_1.createLogParser)(tty, (line) => lines.push(line));
299
+ parser.feed(Buffer.isBuffer(raw) ? raw : Buffer.from(String(raw)));
300
+ parser.flush();
301
+ return lines;
302
+ }
303
+ /** De events van deze container in het laatste uur. Met `until` sluit Docker de stream zelf. */
304
+ async function readEvents(containerId, now) {
305
+ const { docker } = (0, docker_client_1.getConnection)();
306
+ const until = Math.floor(now.getTime() / 1000);
307
+ const events = [];
308
+ const stream = (await docker.getEvents({
309
+ since: until - EVENTS_SINCE_S,
310
+ until,
311
+ filters: JSON.stringify({ type: ['container'], container: [containerId] }),
312
+ }));
313
+ await new Promise((resolve) => {
314
+ stream.on('data', (0, ndjson_1.ndjson)((value) => events.push(value)));
315
+ stream.on('end', resolve);
316
+ // Zonder events is de diagnose nog steeds bruikbaar.
317
+ stream.on('error', resolve);
318
+ });
319
+ return events;
320
+ }
321
+ /** Haalt alles op en bouwt de diagnose. Faalt niet: een fout komt terug als `ok: false`. */
322
+ async function buildDiagnosis(containerId, context) {
323
+ const now = new Date();
324
+ try {
325
+ const { docker, endpoint } = (0, docker_client_1.getConnection)();
326
+ const inspect = (await docker.getContainer(containerId).inspect());
327
+ const [logs, events, engine] = await Promise.all([
328
+ readLogs(containerId, inspect.Config?.Tty === true).catch(() => []),
329
+ readEvents(containerId, now).catch(() => []),
330
+ (0, engine_1.readEngineStatus)().catch(() => ({ connected: false, endpoint })),
331
+ ]);
332
+ return { ok: true, ...renderDiagnosis({ inspect, logs, events, engine, context: context.context, appVersion: context.appVersion, generatedAt: now }) };
333
+ }
334
+ catch (err) {
335
+ return { ok: false, problem: (0, docker_client_1.readableError)(err, (0, docker_client_1.getConnection)().endpoint).message };
336
+ }
337
+ }
338
+ //# sourceMappingURL=diagnosis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosis.js","sourceRoot":"","sources":["../electron/diagnosis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.connectionFromHost = connectionFromHost;
40
+ exports.resolveConnection = resolveConnection;
41
+ exports.getConnection = getConnection;
42
+ exports.setConnection = setConnection;
43
+ exports.resetConnection = resetConnection;
44
+ exports.describeConnectionProblem = describeConnectionProblem;
45
+ exports.readableError = readableError;
46
+ exports.describeActionProblem = describeActionProblem;
47
+ const node_fs_1 = require("node:fs");
48
+ const path = __importStar(require("node:path"));
49
+ const dockerode_1 = __importDefault(require("dockerode"));
50
+ const i18n_1 = require("./i18n");
51
+ const ssh_1 = require("./ssh");
52
+ /**
53
+ * De verbinding met de daemon. Geleend van docker-mcp-mx' src/docker-client.ts, met twee
54
+ * verschillen: die server draait in een container op Linux en kent dus alleen een unix-socket,
55
+ * en hij bouwt zijn client één keer op moduleniveau. Hier moet de client vervangbaar zijn,
56
+ * want je kunt van docker context wisselen zonder de app te herstarten.
57
+ */
58
+ const WINDOWS_PIPE = '//./pipe/docker_engine';
59
+ const UNIX_SOCKET = '/var/run/docker.sock';
60
+ let connection = null;
61
+ /**
62
+ * Bouwt een verbinding uit een docker-adres.
63
+ *
64
+ * `npipe://` en `unix://` zijn paden, geen TCP-adressen; `new URL()` maakt er anders een
65
+ * hostnaam van en dan verbindt dockerode met niets.
66
+ */
67
+ function connectionFromHost(host, tlsDir = null) {
68
+ const pathPrefix = /^(npipe|unix):\/\//.exec(host);
69
+ if (pathPrefix !== null) {
70
+ const socketPath = host.slice(pathPrefix[0].length);
71
+ return { docker: new dockerode_1.default({ socketPath }), endpoint: socketPath };
72
+ }
73
+ if (host.startsWith('ssh://')) {
74
+ return sshConnection(host);
75
+ }
76
+ const url = new URL(host.replace(/^tcp:/, 'http:'));
77
+ const port = Number(url.port) || 2375;
78
+ const endpoint = `${url.hostname}:${String(port)}`;
79
+ return { docker: new dockerode_1.default({ host: url.hostname, port, ...readTls(tlsDir) }), endpoint };
80
+ }
81
+ /**
82
+ * Een verbinding over ssh. dockerode praat gewoon http; de agent maakt van elke verbinding een
83
+ * ssh-kanaal met `docker system dial-stdio` aan de andere kant. Host en poort gaan alleen mee
84
+ * voor de Host-header, want de agent kiest zelf waar hij heen gaat.
85
+ */
86
+ function sshConnection(host) {
87
+ const target = (0, ssh_1.parseSshHost)(host);
88
+ const dialer = new ssh_1.SshDialer(target);
89
+ return {
90
+ docker: new dockerode_1.default((0, ssh_1.sshDockerOptions)(target, dialer)),
91
+ endpoint: (0, ssh_1.sshEndpoint)(target),
92
+ close: () => dialer.close(),
93
+ };
94
+ }
95
+ /**
96
+ * De certificaten van een context, als die er zijn. Een context zonder TLS-map praat gewoon
97
+ * onversleuteld; dat is de gebruikelijke opstelling voor een socket-proxy in een eigen netwerk.
98
+ *
99
+ * Niet getest tegen een echte TLS-daemon: er was er geen om tegenaan te praten.
100
+ */
101
+ function readTls(tlsDir) {
102
+ if (tlsDir === null) {
103
+ return {};
104
+ }
105
+ try {
106
+ return {
107
+ ca: (0, node_fs_1.readFileSync)(path.join(tlsDir, 'ca.pem')),
108
+ cert: (0, node_fs_1.readFileSync)(path.join(tlsDir, 'cert.pem')),
109
+ key: (0, node_fs_1.readFileSync)(path.join(tlsDir, 'key.pem')),
110
+ };
111
+ }
112
+ catch {
113
+ // Onvolledige TLS-map: dan maar zonder, en de daemon zegt het wel als hij het eist.
114
+ return {};
115
+ }
116
+ }
117
+ /**
118
+ * Leidt af waar de daemon zit als er geen context gekozen is. `DOCKER_HOST` wint altijd — dat
119
+ * is de afspraak die de docker CLI ook hanteert, en het is de ontsnapping voor een opstelling
120
+ * die wij nog niet kennen.
121
+ */
122
+ function resolveConnection(env = process.env, platform = process.platform) {
123
+ const host = env['DOCKER_HOST'];
124
+ if (host !== undefined && host !== '') {
125
+ return connectionFromHost(host);
126
+ }
127
+ const socketPath = platform === 'win32' ? WINDOWS_PIPE : UNIX_SOCKET;
128
+ return { docker: new dockerode_1.default({ socketPath }), endpoint: socketPath };
129
+ }
130
+ /** De huidige verbinding, opgebouwd bij het eerste gebruik. */
131
+ function getConnection() {
132
+ connection ??= resolveConnection();
133
+ return connection;
134
+ }
135
+ /** Zet de verbinding om naar een ander adres. Hoort alleen aangeroepen te worden vanuit het omschakelen van een context. */
136
+ function setConnection(next) {
137
+ if (connection !== null && connection !== next) {
138
+ connection.close?.();
139
+ }
140
+ connection = next;
141
+ }
142
+ /** Gooit de opgebouwde verbinding weg, zodat de volgende aanroep hem opnieuw afleidt. */
143
+ function resetConnection() {
144
+ connection?.close?.();
145
+ connection = null;
146
+ }
147
+ function statusCode(err) {
148
+ return err?.statusCode;
149
+ }
150
+ function errorCode(err) {
151
+ return err?.code;
152
+ }
153
+ function describeError(err) {
154
+ if (err instanceof Error) {
155
+ return err.message;
156
+ }
157
+ return String(err);
158
+ }
159
+ /**
160
+ * Vertaalt een fout van dockerode naar iets waar een gebruiker wat aan heeft. De
161
+ * systeemfoutcodes staan voorop omdat die in de praktijk het vaakst langskomen: een daemon
162
+ * die niet draait geeft ENOENT (het pad bestaat niet) of ECONNREFUSED (er luistert niets),
163
+ * en "ENOENT" op zichzelf zegt niemand iets.
164
+ */
165
+ function describeConnectionProblem(err, endpoint) {
166
+ const code = errorCode(err);
167
+ // Bij ssh weigert de ssh-server, niet de daemon: "draait Docker?" stuurt je dan de verkeerde kant op.
168
+ if (endpoint.startsWith('ssh://') && (code === 'ECONNREFUSED' || code === 'ENOTFOUND' || code === 'EHOSTUNREACH')) {
169
+ return (0, i18n_1.t)({
170
+ en: `No ssh server reachable at ${endpoint}.`,
171
+ nl: `Geen ssh-server bereikbaar op ${endpoint}.`,
172
+ de: `Unter ${endpoint} ist kein ssh-Server erreichbar.`,
173
+ fr: `Aucun serveur ssh joignable à ${endpoint}.`,
174
+ es: `No hay ningún servidor ssh accesible en ${endpoint}.`,
175
+ });
176
+ }
177
+ if (code === 'ENOENT' || code === 'ECONNREFUSED') {
178
+ return (0, i18n_1.t)({
179
+ en: `No Docker daemon found at ${endpoint}. Is Docker running?`,
180
+ nl: `Geen Docker-daemon gevonden op ${endpoint}. Draait Docker?`,
181
+ de: `Unter ${endpoint} wurde kein Docker-Daemon gefunden. Läuft Docker?`,
182
+ fr: `Aucun démon Docker trouvé à ${endpoint}. Docker tourne-t-il ?`,
183
+ es: `No se ha encontrado ningún daemon de Docker en ${endpoint}. ¿Está Docker en marcha?`,
184
+ });
185
+ }
186
+ if (code === 'EACCES' || code === 'EPERM') {
187
+ return (0, i18n_1.t)({
188
+ en: `No access to ${endpoint}. On Linux, your user must be in the 'docker' group.`,
189
+ nl: `Geen toegang tot ${endpoint}. Op Linux moet je gebruiker in de groep 'docker' zitten.`,
190
+ de: `Kein Zugriff auf ${endpoint}. Unter Linux muss Ihr Benutzer in der Gruppe 'docker' sein.`,
191
+ fr: `Aucun accès à ${endpoint}. Sous Linux, votre utilisateur doit être dans le groupe 'docker'.`,
192
+ es: `Sin acceso a ${endpoint}. En Linux, tu usuario debe estar en el grupo 'docker'.`,
193
+ });
194
+ }
195
+ if (code === 'ETIMEDOUT') {
196
+ return (0, i18n_1.t)({
197
+ en: `The daemon at ${endpoint} did not respond in time.`,
198
+ nl: `De daemon op ${endpoint} reageerde niet op tijd.`,
199
+ de: `Der Daemon unter ${endpoint} hat nicht rechtzeitig geantwortet.`,
200
+ fr: `Le démon à ${endpoint} n’a pas répondu à temps.`,
201
+ es: `El daemon de ${endpoint} no ha respondido a tiempo.`,
202
+ });
203
+ }
204
+ if (statusCode(err) === 401 || statusCode(err) === 403) {
205
+ return (0, i18n_1.t)({
206
+ en: `The daemon at ${endpoint} refused the connection.`,
207
+ nl: `De daemon op ${endpoint} weigerde de verbinding.`,
208
+ de: `Der Daemon unter ${endpoint} hat die Verbindung abgelehnt.`,
209
+ fr: `Le démon à ${endpoint} a refusé la connexion.`,
210
+ es: `El daemon de ${endpoint} ha rechazado la conexión.`,
211
+ });
212
+ }
213
+ return (0, i18n_1.t)({
214
+ en: `Cannot talk to the Docker daemon at ${endpoint}: ${describeError(err)}`,
215
+ nl: `Kan niet met de Docker-daemon op ${endpoint} praten: ${describeError(err)}`,
216
+ de: `Keine Verbindung zum Docker-Daemon unter ${endpoint}: ${describeError(err)}`,
217
+ fr: `Impossible de dialoguer avec le démon Docker à ${endpoint} : ${describeError(err)}`,
218
+ es: `No se puede hablar con el daemon de Docker en ${endpoint}: ${describeError(err)}`,
219
+ });
220
+ }
221
+ /** Foutcodes die zeggen dat de daemon zelf niet te bereiken is, los van wat je vroeg. */
222
+ const CONNECTION_CODES = new Set(['ENOENT', 'ECONNREFUSED', 'ECONNRESET', 'EACCES', 'EPERM', 'ETIMEDOUT', 'EHOSTUNREACH']);
223
+ /**
224
+ * Maakt van een fout die door ipcMain heen gaat iets leesbaars.
225
+ *
226
+ * Een daemon die niet antwoordt wordt dezelfde zin als in de statusbalk. Nodig omdat Node bij
227
+ * `localhost` zowel IPv6 als IPv4 probeert en dan een `AggregateError` gooit zonder eigen
228
+ * melding: in de renderer stond er dan letterlijk alleen "AggregateError". Een andere fout,
229
+ * zoals een 404 op inspect, houdt zijn eigen melding; die heeft niets met de verbinding te maken.
230
+ */
231
+ function readableError(err, endpoint) {
232
+ const code = errorCode(err);
233
+ if (code !== undefined && CONNECTION_CODES.has(code)) {
234
+ return new Error(describeConnectionProblem(err, endpoint));
235
+ }
236
+ if (err instanceof Error) {
237
+ return err.message === '' ? new Error(err.name) : err;
238
+ }
239
+ return new Error(String(err));
240
+ }
241
+ const ACTION_LABELS = {
242
+ start: { en: 'start', nl: 'starten', de: 'starten', fr: 'démarrer', es: 'iniciar' },
243
+ stop: { en: 'stop', nl: 'stoppen', de: 'stoppen', fr: 'arrêter', es: 'detener' },
244
+ restart: { en: 'restart', nl: 'herstarten', de: 'neu starten', fr: 'redémarrer', es: 'reiniciar' },
245
+ pause: { en: 'pause', nl: 'pauzeren', de: 'pausieren', fr: 'mettre en pause', es: 'pausar' },
246
+ unpause: { en: 'unpause', nl: 'hervatten', de: 'fortsetzen', fr: 'reprendre', es: 'reanudar' },
247
+ remove: { en: 'remove', nl: 'verwijderen', de: 'entfernen', fr: 'supprimer', es: 'eliminar' },
248
+ };
249
+ /**
250
+ * Vertaalt een mislukte handeling naar iets dat in een melding past. Overgenomen van
251
+ * docker-mcp-mx' toActionableError, maar zonder de verwijzing naar een tool-naam: hier zit
252
+ * de gebruiker voor een lijst en die ziet zelf wel welke containers er zijn.
253
+ */
254
+ function describeActionProblem(err, action, ref) {
255
+ const status = statusCode(err);
256
+ const label = ACTION_LABELS[action];
257
+ if (status === 404) {
258
+ return (0, i18n_1.t)({ en: `'${ref}' no longer exists.`, nl: `'${ref}' bestaat niet meer.`, de: `'${ref}' existiert nicht mehr.`, fr: `'${ref}' n’existe plus.`, es: `'${ref}' ya no existe.` });
259
+ }
260
+ // 304 Not Modified: de container was al in de gevraagde toestand. Geen fout om mee te
261
+ // schrikken, dus zeggen we gewoon wat er aan de hand is.
262
+ if (status === 304) {
263
+ return action === 'start'
264
+ ? (0, i18n_1.t)({ en: `'${ref}' was already started.`, nl: `'${ref}' was al gestart.`, de: `'${ref}' war schon gestartet.`, fr: `'${ref}' était déjà démarré.`, es: `'${ref}' ya estaba iniciado.` })
265
+ : (0, i18n_1.t)({ en: `'${ref}' was already stopped.`, nl: `'${ref}' was al gestopt.`, de: `'${ref}' war schon gestoppt.`, fr: `'${ref}' était déjà arrêté.`, es: `'${ref}' ya estaba detenido.` });
266
+ }
267
+ if (status === 409) {
268
+ return (0, i18n_1.t)({
269
+ en: `Cannot ${label.en} '${ref}': ${describeError(err)}`,
270
+ nl: `Kan '${ref}' niet ${label.nl}: ${describeError(err)}`,
271
+ de: `'${ref}' lässt sich nicht ${label.de}: ${describeError(err)}`,
272
+ fr: `Impossible de ${label.fr} '${ref}' : ${describeError(err)}`,
273
+ es: `No se puede ${label.es} '${ref}': ${describeError(err)}`,
274
+ });
275
+ }
276
+ return (0, i18n_1.t)({
277
+ en: `Failed to ${label.en} '${ref}': ${describeError(err)}`,
278
+ nl: `${label.nl[0].toUpperCase()}${label.nl.slice(1)} van '${ref}' mislukte: ${describeError(err)}`,
279
+ de: `'${ref}' ${label.de} ist fehlgeschlagen: ${describeError(err)}`,
280
+ fr: `Échec pour ${label.fr} '${ref}' : ${describeError(err)}`,
281
+ es: `No se ha podido ${label.es} '${ref}': ${describeError(err)}`,
282
+ });
283
+ }
284
+ //# sourceMappingURL=docker-client.js.map