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,302 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AssistantService = void 0;
7
+ exports.describeAssistantError = describeAssistantError;
8
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
9
+ const assistant_tools_1 = require("./assistant-tools");
10
+ const i18n_1 = require("./i18n");
11
+ /**
12
+ * Claude kijkt mee bij een probleem met een container, of in de terminal op de Docker-host.
13
+ *
14
+ * Alles hier draait in main: de sleutel, de aanroepen naar de API en de tools. De renderer
15
+ * krijgt alleen de events van het antwoord. Een gesprek begint met de diagnose uit fase 21,
16
+ * zonder geheimen, en Claude vraagt daarna zelf op wat hij nog nodig heeft.
17
+ */
18
+ /**
19
+ * Vast, zodat hij met de tool-definities in de cache blijft. Wat per container verschilt, staat
20
+ * in het eerste bericht. In het Engels; in welke taal Claude antwoordt, zegt `answerIn`.
21
+ */
22
+ const SYSTEM_CONTAINER = [
23
+ 'You help someone understand a problem with a Docker container, from Docker Client MX:',
24
+ 'a desktop app for Docker in WSL on Windows.',
25
+ '',
26
+ 'Answer briefly and concretely: first the likely cause, then what the user can do. Say so when',
27
+ 'you are not sure about something, and what would confirm it.',
28
+ '',
29
+ 'The first message contains a diagnosis of the container. Use the tools to ask for more: logs,',
30
+ 'inspect, a measurement, events, and the other containers or the compose project. Only ask for',
31
+ 'what you need; every request costs the user time and money.',
32
+ '',
33
+ 'You cannot change anything. If starting, stopping or restarting a container, or compose up for',
34
+ 'a project would help, use propose_action: the user gets a button and decides. You may mention',
35
+ 'commands for the terminal or changes to a compose file.',
36
+ '',
37
+ 'Values of environment variables and anything that looks like a password, token or key have',
38
+ 'been replaced with <omitted> (or <weggelaten> in Dutch). Do not ask for them and do not guess them.',
39
+ ].join('\n');
40
+ /** Voor de host-terminal: meelezen in een root-shell op de machine waar de daemon draait. */
41
+ const SYSTEM_HOST = [
42
+ 'You are looking along in a terminal of Docker Client MX, a desktop app for Docker in WSL on',
43
+ 'Windows. The user has a root shell on the machine where the Docker daemon runs, usually a',
44
+ 'Linux distro in WSL. The docker CLI works there.',
45
+ '',
46
+ 'Answer briefly and concretely. Say so when you are not sure about something, and what would',
47
+ 'confirm it.',
48
+ '',
49
+ 'The first message contains an overview of the engine and the containers. With terminal_output',
50
+ 'you read what is in the terminal: do that when the question is about the terminal ("what does',
51
+ 'this error mean"). With the other tools you ask for logs, inspect, events or a measurement of',
52
+ 'a container. Only ask for what you need.',
53
+ '',
54
+ 'You do not type anything yourself. You suggest a command with propose_command: after a click it',
55
+ 'appears at the prompt and the user presses Enter. The shell is root, so be careful with anything',
56
+ 'that changes or removes something, and say so when a command does. Starting, stopping or',
57
+ 'restarting a container can also be done with propose_action.',
58
+ '',
59
+ 'Values of environment variables and anything that looks like a password, token or key have',
60
+ 'been replaced with <omitted> (or <weggelaten> in Dutch). Do not ask for them and do not guess them.',
61
+ ].join('\n');
62
+ /**
63
+ * De taal van het antwoord, per aanroep: de app kan van taal wisselen midden in een gesprek.
64
+ * Achter de vaste prompt, zodat die per taal in de cache blijft.
65
+ */
66
+ function answerIn() {
67
+ return (0, i18n_1.language)() === 'nl' ? 'Answer in Dutch.' : 'Answer in English.';
68
+ }
69
+ /** Ruim genoeg voor een antwoord met een stuk compose-bestand erin. */
70
+ const MAX_TOKENS = 16_000;
71
+ /** Bij een weigering draait de API de vraag op een ander model, gekozen op de reden. */
72
+ const FALLBACK_BETA = 'server-side-fallback-2026-07-01';
73
+ /** Een fout van de SDK in gewone taal. Op type, niet op tekst: die verandert per versie. */
74
+ function describeAssistantError(err) {
75
+ if (err instanceof sdk_1.default.APIUserAbortError) {
76
+ return null;
77
+ }
78
+ if (err instanceof sdk_1.default.AuthenticationError) {
79
+ return (0, i18n_1.t)({
80
+ en: 'The key is not accepted. Check it in the settings.',
81
+ nl: 'De sleutel wordt niet geaccepteerd. Kijk hem na in de instellingen.',
82
+ de: 'Der Schlüssel wird nicht akzeptiert. Prüfen Sie ihn in den Einstellungen.',
83
+ fr: 'La clé n’est pas acceptée. Vérifiez-la dans les paramètres.',
84
+ es: 'No se acepta la clave. Compruébala en los ajustes.',
85
+ });
86
+ }
87
+ if (err instanceof sdk_1.default.PermissionDeniedError) {
88
+ return (0, i18n_1.t)({
89
+ en: 'This key is not allowed to use this model.',
90
+ nl: 'Deze sleutel mag dit model niet gebruiken.',
91
+ de: 'Dieser Schlüssel darf dieses Modell nicht benutzen.',
92
+ fr: 'Cette clé n’a pas le droit d’utiliser ce modèle.',
93
+ es: 'Esta clave no tiene permiso para usar este modelo.',
94
+ });
95
+ }
96
+ if (err instanceof sdk_1.default.RateLimitError) {
97
+ return (0, i18n_1.t)({
98
+ en: 'Too many requests in a row. Try again in a moment.',
99
+ nl: 'Te veel vragen achter elkaar. Probeer het zo nog eens.',
100
+ de: 'Zu viele Anfragen hintereinander. Versuchen Sie es gleich noch einmal.',
101
+ fr: 'Trop de requêtes à la suite. Réessayez dans un instant.',
102
+ es: 'Demasiadas peticiones seguidas. Inténtalo de nuevo en un momento.',
103
+ });
104
+ }
105
+ if (err instanceof sdk_1.default.APIConnectionError) {
106
+ return (0, i18n_1.t)({
107
+ en: 'Claude cannot be reached. Are you online?',
108
+ nl: 'Claude is niet bereikbaar. Is er internet?',
109
+ de: 'Claude ist nicht erreichbar. Sind Sie online?',
110
+ fr: 'Claude est injoignable. Êtes-vous en ligne ?',
111
+ es: 'No se puede contactar con Claude. ¿Tienes conexión?',
112
+ });
113
+ }
114
+ if (err instanceof sdk_1.default.InternalServerError) {
115
+ return (0, i18n_1.t)({
116
+ en: 'Claude is busy or had an outage. Try again in a moment.',
117
+ nl: 'Claude heeft het even te druk of had een storing. Probeer het zo nog eens.',
118
+ de: 'Claude ist ausgelastet oder hatte eine Störung. Versuchen Sie es gleich noch einmal.',
119
+ fr: 'Claude est surchargé ou a subi une panne. Réessayez dans un instant.',
120
+ es: 'Claude está saturado o ha tenido una caída. Inténtalo de nuevo en un momento.',
121
+ });
122
+ }
123
+ if (err instanceof sdk_1.default.APIError) {
124
+ return (0, i18n_1.t)({
125
+ en: `The API returned an error: ${err.message}`,
126
+ nl: `De API gaf een fout: ${err.message}`,
127
+ de: `Die API hat einen Fehler zurückgegeben: ${err.message}`,
128
+ fr: `L’API a renvoyé une erreur : ${err.message}`,
129
+ es: `La API ha devuelto un error: ${err.message}`,
130
+ });
131
+ }
132
+ return err instanceof Error ? err.message : String(err);
133
+ }
134
+ /** De gesprekken van alle vensters. Eén exemplaar, gemaakt door ipc.ts. */
135
+ class AssistantService {
136
+ deps;
137
+ conversations = new Map();
138
+ counter = 0;
139
+ constructor(deps) {
140
+ this.deps = deps;
141
+ }
142
+ /** Begint een gesprek over een container, of met `null` over de host. De vraag komt met `ask`. */
143
+ start(ownerId, containerId, send) {
144
+ this.counter += 1;
145
+ const id = `assistant-${String(this.counter)}`;
146
+ this.conversations.set(id, { id, ownerId, containerId, send: (event) => send(id, event), messages: [], abort: null });
147
+ return id;
148
+ }
149
+ /**
150
+ * Stelt een vraag. Wacht tot het antwoord af is; fouten gaan als event naar het paneel.
151
+ *
152
+ * Alleen het venster dat het gesprek begon, mag erin vragen. De ids zijn opeenvolgend en dus
153
+ * te raden; zonder deze controle kon een ander venster een vraag in dit gesprek stellen.
154
+ */
155
+ async ask(ownerId, id, question) {
156
+ const conversation = this.conversations.get(id);
157
+ if (conversation === undefined || conversation.ownerId !== ownerId) {
158
+ return;
159
+ }
160
+ if (conversation.abort !== null) {
161
+ conversation.send({ type: 'error', problem: (0, i18n_1.t)({
162
+ en: 'An answer is already in progress.',
163
+ nl: 'Er loopt al een antwoord.',
164
+ de: 'Eine Antwort läuft bereits.',
165
+ fr: 'Une réponse est déjà en cours.',
166
+ es: 'Ya hay una respuesta en marcha.',
167
+ }) });
168
+ return;
169
+ }
170
+ const apiKey = this.deps.apiKey();
171
+ if (apiKey === null) {
172
+ conversation.send({
173
+ type: 'error',
174
+ problem: (0, i18n_1.t)({
175
+ en: 'No key has been set. You can add one in the settings.',
176
+ nl: 'Er is geen sleutel ingesteld. Dat kan in de instellingen.',
177
+ de: 'Es ist kein Schlüssel hinterlegt. In den Einstellungen können Sie einen eintragen.',
178
+ fr: 'Aucune clé n’est enregistrée. Vous pouvez en ajouter une dans les paramètres.',
179
+ es: 'No hay ninguna clave guardada. Puedes añadir una en los ajustes.',
180
+ }),
181
+ });
182
+ return;
183
+ }
184
+ const abort = new AbortController();
185
+ const before = conversation.messages;
186
+ conversation.abort = abort;
187
+ try {
188
+ const content = before.length === 0 ? await this.firstMessage(conversation, question) : question;
189
+ await this.run(conversation, apiKey, [...before, { role: 'user', content }], abort.signal);
190
+ }
191
+ catch (err) {
192
+ // Terug naar voor de vraag: een half antwoord met een tool-aanroep zonder resultaat maakt
193
+ // de volgende vraag ongeldig.
194
+ conversation.messages = before;
195
+ const problem = describeAssistantError(err);
196
+ if (problem !== null) {
197
+ conversation.send({ type: 'error', problem });
198
+ }
199
+ }
200
+ finally {
201
+ conversation.abort = null;
202
+ }
203
+ }
204
+ /** Breekt een lopend antwoord af en vergeet het gesprek. Ook hier alleen het eigen venster. */
205
+ close(ownerId, id) {
206
+ const conversation = this.conversations.get(id);
207
+ if (conversation === undefined || conversation.ownerId !== ownerId) {
208
+ return;
209
+ }
210
+ conversation.abort?.abort();
211
+ this.conversations.delete(id);
212
+ }
213
+ /** Ruimt de gesprekken van een venster op dat weg is. */
214
+ closeOwner(ownerId) {
215
+ for (const conversation of [...this.conversations.values()]) {
216
+ if (conversation.ownerId === ownerId) {
217
+ this.close(ownerId, conversation.id);
218
+ }
219
+ }
220
+ }
221
+ async firstMessage({ containerId }, question) {
222
+ if (containerId === null) {
223
+ return `${await this.deps.describeHost()}\n---\n\n${question}`;
224
+ }
225
+ const diagnosis = await this.deps.diagnose(containerId);
226
+ if (!diagnosis.ok) {
227
+ return `The diagnosis of container ${containerId} failed: ${diagnosis.problem}\n\n${question}`;
228
+ }
229
+ return `${diagnosis.markdown}\n---\n\n${question}`;
230
+ }
231
+ async run(conversation, apiKey, messages, signal) {
232
+ const client = this.deps.createClient?.(apiKey) ?? new sdk_1.default({ apiKey });
233
+ const tools = (0, assistant_tools_1.createTools)({
234
+ source: this.deps.source,
235
+ onTool: (label) => conversation.send({ type: 'tool', label }),
236
+ onProposal: (proposal) => conversation.send({ type: 'proposal', proposal }),
237
+ ...(conversation.containerId === null
238
+ ? { terminal: (lines) => this.deps.terminal(conversation.ownerId, lines) }
239
+ : {}),
240
+ });
241
+ const runner = client.beta.messages.toolRunner({
242
+ model: this.deps.model(),
243
+ max_tokens: MAX_TOKENS,
244
+ system: `${conversation.containerId === null ? SYSTEM_HOST : SYSTEM_CONTAINER}\n\n${answerIn()}`,
245
+ tools,
246
+ messages,
247
+ stream: true,
248
+ // Eén ronde meer dan er tools mogen: na de laatste opvraging komt nog het antwoord.
249
+ max_iterations: assistant_tools_1.MAX_TOOL_CALLS + 2,
250
+ // De vaste systeemprompt en de tools komen elke ronde terug; die uit de cache.
251
+ cache_control: { type: 'ephemeral' },
252
+ betas: [FALLBACK_BETA],
253
+ fallbacks: 'default',
254
+ }, { signal });
255
+ let inputTokens = 0;
256
+ let outputTokens = 0;
257
+ let cachedTokens = 0;
258
+ let wroteText = false;
259
+ for await (const stream of runner) {
260
+ let separated = false;
261
+ for await (const event of stream) {
262
+ if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
263
+ // Tekst van een volgende ronde, na een opvraging, begint op een nieuwe alinea.
264
+ if (wroteText && !separated) {
265
+ conversation.send({ type: 'text', text: '\n\n' });
266
+ }
267
+ separated = true;
268
+ wroteText = true;
269
+ conversation.send({ type: 'text', text: event.delta.text });
270
+ }
271
+ }
272
+ const message = await stream.finalMessage();
273
+ inputTokens += message.usage.input_tokens + (message.usage.cache_creation_input_tokens ?? 0);
274
+ cachedTokens += message.usage.cache_read_input_tokens ?? 0;
275
+ outputTokens += message.usage.output_tokens;
276
+ // Een weigering kan een tool-aanroep halverwege afbreken; die ronde nooit uitvoeren.
277
+ if (message.stop_reason === 'refusal') {
278
+ throw new Error((0, i18n_1.t)({
279
+ en: 'Claude declined to answer this.',
280
+ nl: 'Claude wilde hier niet op antwoorden.',
281
+ de: 'Claude wollte darauf nicht antworten.',
282
+ fr: 'Claude a refusé de répondre à cela.',
283
+ es: 'Claude no ha querido responder a esto.',
284
+ }));
285
+ }
286
+ // Een afgekapte tool-invoer kan toch geldig lijken; niet uitvoeren.
287
+ if (message.stop_reason === 'max_tokens' && message.content.some((block) => block.type === 'tool_use')) {
288
+ throw new Error((0, i18n_1.t)({
289
+ en: 'The answer got too long and was cut off.',
290
+ nl: 'Het antwoord werd te lang en is afgebroken.',
291
+ de: 'Die Antwort wurde zu lang und ist abgeschnitten.',
292
+ fr: 'La réponse est devenue trop longue et a été coupée.',
293
+ es: 'La respuesta se ha hecho demasiado larga y se ha cortado.',
294
+ }));
295
+ }
296
+ }
297
+ conversation.messages = [...runner.params.messages];
298
+ conversation.send({ type: 'done', inputTokens, outputTokens, cachedTokens });
299
+ }
300
+ }
301
+ exports.AssistantService = AssistantService;
302
+ //# sourceMappingURL=assistant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../electron/assistant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CRASH_LOOP_AT = void 0;
4
+ exports.crashesInLastHour = crashesInLastHour;
5
+ exports.buildAttention = buildAttention;
6
+ /**
7
+ * Wat er over alle containers heen aandacht nodig heeft.
8
+ *
9
+ * Alles wat hier staat, wist de app al, maar verspreid: een crashlus in de tab Gebeurtenissen,
10
+ * unhealthy in de statusregel, een ontbrekend netwerk in de lijst en een ontbrekende poort pas op
11
+ * de detailpagina. Per container, en je moest weten waar je moest kijken. Hier komt het samen.
12
+ *
13
+ * Zonder Docker: de bronnen komen als functies binnen, zodat het met gewone objecten te testen is.
14
+ */
15
+ /** Zo lang terug telt een crash mee. */
16
+ const CRASH_WINDOW_MS = 60 * 60 * 1000;
17
+ /** Vanaf zoveel crashes in dat uur is het een lus; dezelfde grens als de tab Gebeurtenissen. */
18
+ exports.CRASH_LOOP_AT = 4;
19
+ /** Na een `kill` telt een `die` als bewust gestopt; dezelfde grens als de crashmelding. */
20
+ const STOP_GRACE_MS = 30_000;
21
+ /** De volgorde in de lijst: het ernstigste bovenaan. */
22
+ const ORDER = { crashLoop: 0, restarting: 1, unhealthy: 2, network: 3, ports: 4 };
23
+ /**
24
+ * Hoe vaak een container het afgelopen uur uit zichzelf omviel: een `die` met een foutcode zonder
25
+ * `kill` vlak ervoor, of een `oom`. Dezelfde regel als de crashmelding en de tab Gebeurtenissen.
26
+ */
27
+ function crashesInLastHour(events, now) {
28
+ const oldestFirst = [...events].sort((a, b) => a.time - b.time);
29
+ let lastKill = -Infinity;
30
+ let crashes = 0;
31
+ for (const event of oldestFirst) {
32
+ if (event.action === 'kill') {
33
+ lastKill = event.time;
34
+ }
35
+ else if (event.time >= now - CRASH_WINDOW_MS) {
36
+ const crashed = event.action === 'oom' || (event.action === 'die' && event.exitCode !== 0 && event.time - lastKill > STOP_GRACE_MS);
37
+ crashes += crashed ? 1 : 0;
38
+ }
39
+ }
40
+ return crashes;
41
+ }
42
+ /** Stelt de lijst samen, het ernstigste eerst en daarbinnen op naam. */
43
+ async function buildAttention(sources) {
44
+ const items = [];
45
+ for (const container of sources.containers) {
46
+ const { id, name } = container;
47
+ const crashes = crashesInLastHour(sources.eventsOf(name), sources.now);
48
+ if (crashes >= exports.CRASH_LOOP_AT) {
49
+ items.push({ kind: 'crashLoop', id, name, crashes });
50
+ }
51
+ // Bij een crashlus is herstarten het gevolg, geen tweede probleem: één regel is genoeg.
52
+ if (container.state === 'restarting' && crashes < exports.CRASH_LOOP_AT) {
53
+ items.push({ kind: 'restarting', id, name });
54
+ }
55
+ // Docker zet het in zijn statuszin, en die is niet vertaald: "Up 3 hours (unhealthy)".
56
+ if (container.state === 'running' && container.status.includes('(unhealthy)')) {
57
+ items.push({ kind: 'unhealthy', id, name });
58
+ }
59
+ if (container.missingNetwork !== null) {
60
+ items.push({ kind: 'network', id, name, network: container.missingNetwork });
61
+ }
62
+ }
63
+ // De poorten vragen een inspect per container, dus alleen waar het iets kan opleveren, en
64
+ // tegelijk. Zonder netwerk ontbreken de poorten sowieso; dat zegt de regel over het netwerk al.
65
+ const candidates = sources.containers.filter((container) => container.state === 'running' && container.missingNetwork === null);
66
+ const wirings = await Promise.all(candidates.map((container) => sources.wiringOf(container.id).catch(() => null)));
67
+ candidates.forEach((container, index) => {
68
+ const ports = wirings[index]?.missingPorts ?? [];
69
+ if (ports.length > 0) {
70
+ items.push({ kind: 'ports', id: container.id, name: container.name, ports });
71
+ }
72
+ });
73
+ return items.sort((a, b) => ORDER[a.kind] - ORDER[b.kind] || a.name.localeCompare(b.name));
74
+ }
75
+ //# sourceMappingURL=attention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attention.js","sourceRoot":"","sources":["../electron/attention.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CHANNELS = void 0;
4
+ /**
5
+ * De namen van de IPC-kanalen, op één plek en zonder imports.
6
+ *
7
+ * Dat laatste is de reden dat ze hier staan en niet in stats.ts of events.ts: preload heeft
8
+ * ze ook nodig, en die draait gesandboxed. Een import daar die uiteindelijk bij dockerode
9
+ * uitkomt, laadt niet eens.
10
+ */
11
+ exports.CHANNELS = {
12
+ engineStatus: 'engine:status',
13
+ engineStartWsl: 'engine:startWsl',
14
+ engineStartWslDaemon: 'engine:startWslDaemon',
15
+ containersList: 'containers:list',
16
+ containersAction: 'containers:action',
17
+ containersInspect: 'containers:inspect',
18
+ containersHealth: 'containers:health',
19
+ containersEvents: 'containers:events',
20
+ containersWiring: 'containers:wiring',
21
+ containersAttention: 'containers:attention',
22
+ containersRunCommand: 'containers:runCommand',
23
+ containersRestartPolicy: 'containers:restartPolicy',
24
+ containersSetRestartPolicy: 'containers:setRestartPolicy',
25
+ containersDiagnose: 'containers:diagnose',
26
+ assistantStatus: 'assistant:status',
27
+ assistantSetKey: 'assistant:setKey',
28
+ assistantClearKey: 'assistant:clearKey',
29
+ assistantStart: 'assistant:start',
30
+ assistantAsk: 'assistant:ask',
31
+ assistantClose: 'assistant:close',
32
+ /** Van main naar renderer, met het gesprek-id erachter: `assistant:event:assistant-1`. */
33
+ assistantEvent: 'assistant:event',
34
+ containersWatchStats: 'containers:watchStats',
35
+ imagesList: 'images:list',
36
+ imagesHistory: 'images:history',
37
+ imagesRemove: 'images:remove',
38
+ imagesPrune: 'images:prune',
39
+ imagesRun: 'images:run',
40
+ imagesPull: 'images:pull',
41
+ imagesPullClose: 'images:pullClose',
42
+ imagesCheckUpdates: 'images:checkUpdates',
43
+ imagesStale: 'images:stale',
44
+ imagesRenew: 'images:renew',
45
+ /** Van main naar renderer, met het stream-id erachter: `images:pullProgress:pull-2`. */
46
+ imagesPullProgress: 'images:pullProgress',
47
+ volumesList: 'volumes:list',
48
+ volumesSizes: 'volumes:sizes',
49
+ volumesCreate: 'volumes:create',
50
+ volumesRemove: 'volumes:remove',
51
+ volumesPrune: 'volumes:prune',
52
+ volumesBrowse: 'volumes:browse',
53
+ volumesCloseBrowser: 'volumes:closeBrowser',
54
+ volumesBackup: 'volumes:backup',
55
+ volumesRestore: 'volumes:restore',
56
+ networksList: 'networks:list',
57
+ networksCreate: 'networks:create',
58
+ networksRemove: 'networks:remove',
59
+ networksPrune: 'networks:prune',
60
+ networksMembers: 'networks:members',
61
+ networksOfContainer: 'networks:of-container',
62
+ networksConnect: 'networks:connect',
63
+ networksDisconnect: 'networks:disconnect',
64
+ composeStatus: 'compose:status',
65
+ composeUp: 'compose:up',
66
+ composeDown: 'compose:down',
67
+ composeRecreate: 'compose:recreate',
68
+ composeFiles: 'compose:files',
69
+ composeConfig: 'compose:config',
70
+ systemDiskUsage: 'system:diskUsage',
71
+ systemPrune: 'system:prune',
72
+ contextsList: 'contexts:list',
73
+ contextsUse: 'contexts:use',
74
+ contextsCreate: 'contexts:create',
75
+ contextsRemove: 'contexts:remove',
76
+ contextsTest: 'contexts:test',
77
+ contextsTrustHostKey: 'contexts:trustHostKey',
78
+ execOpen: 'exec:open',
79
+ execOpenHost: 'exec:openHost',
80
+ execWrite: 'exec:write',
81
+ execResize: 'exec:resize',
82
+ execClose: 'exec:close',
83
+ /** Van main naar renderer, met het stream-id erachter. */
84
+ execData: 'exec:data',
85
+ execEnd: 'exec:end',
86
+ logsOpen: 'logs:open',
87
+ logsClose: 'logs:close',
88
+ /** Van main naar renderer, met het stream-id erachter: `logs:lines:logs-3`. */
89
+ logsWatchAll: 'logs:watchAll',
90
+ logsAllLines: 'logs:allLines',
91
+ logsLines: 'logs:lines',
92
+ /** Van main naar renderer: een bundel metingen, hooguit één per seconde. */
93
+ containersStats: 'containers:stats',
94
+ /** Van main naar renderer: welke lijsten verouderd zijn. */
95
+ dockerEvents: 'docker:events',
96
+ navigationTakePending: 'navigation:takePending',
97
+ settingsGet: 'settings:get',
98
+ settingsUpdate: 'settings:update',
99
+ appQuit: 'app:quit',
100
+ appUpdateGet: 'appUpdate:get',
101
+ appUpdateCheck: 'appUpdate:check',
102
+ appUpdateInstall: 'appUpdate:install',
103
+ /** Van main naar renderer: de nieuwe stand van het bijwerken. */
104
+ appUpdateChanged: 'appUpdate:changed',
105
+ filesList: 'files:list',
106
+ filesChanges: 'files:changes',
107
+ filesDownload: 'files:download',
108
+ filesUpload: 'files:upload',
109
+ filesChooseAndUpload: 'files:chooseAndUpload',
110
+ /** Van main naar renderer: ga naar deze route. */
111
+ navigationNavigate: 'navigation:navigate',
112
+ };
113
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../electron/channels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readablePath = readablePath;
4
+ exports.readProjectFiles = readProjectFiles;
5
+ exports.readResolvedConfig = readResolvedConfig;
6
+ const promises_1 = require("node:fs/promises");
7
+ const compose_1 = require("./compose");
8
+ const i18n_1 = require("./i18n");
9
+ /**
10
+ * Het compose-bestand van een project laten zien, en wat compose er zelf van maakt.
11
+ *
12
+ * Alleen lezen. Een editor komt er niet: een compose-bestand is broncode in een repo en hoort
13
+ * bij de editor die toch al openstaat, en bewerken zou main een schrijfrecht geven op het
14
+ * bestandssysteem van de gebruiker. Tonen kan wél zonder die grens over te gaan.
15
+ *
16
+ * De renderer stuurt een projectnaam en nooit een pad. Welke bestanden er gelezen worden bepaalt
17
+ * main uit de labels op de containers, net als bij `up` en `down`.
18
+ */
19
+ /** Zoveel per bestand. Een compose-bestand van meer dan een megabyte bestaat niet echt. */
20
+ const MAX_BYTES = 1024 * 1024;
21
+ /** De melding als we van een project niet weten waar het staat. Gelijk aan die bij up en down. */
22
+ function unknownLocation(projectName) {
23
+ return (0, i18n_1.t)({
24
+ en: `It is not known where '${projectName}' is located. That label is on the containers, so this only works while containers of this project still exist.`,
25
+ nl: `Van '${projectName}' is niet bekend waar het staat. Dat label zit op de containers, dus het lukt alleen zolang er nog containers van dit project bestaan.`,
26
+ de: `Es ist nicht bekannt, wo '${projectName}' liegt. Dieses Label steht auf den Containern, das geht also nur, solange es noch Container dieses Projekts gibt.`,
27
+ fr: `L’emplacement de '${projectName}' est inconnu. Ce label est porté par les conteneurs, cela ne marche donc que tant qu’il existe encore des conteneurs de ce projet.`,
28
+ es: `No se sabe dónde está '${projectName}'. Esa label está en los contenedores, así que esto solo funciona mientras sigan existiendo contenedores de este proyecto.`,
29
+ });
30
+ }
31
+ /**
32
+ * Waar dit pad vanaf hier te lezen is, of `null` als dat niet kan.
33
+ *
34
+ * De labels dragen het pad zoals compose het zag. Draait compose in WSL, dan is dat een
35
+ * POSIX-pad; onder `/mnt/<schijf>` wijst dat naar dezelfde schijf als Windows, en daarbuiten
36
+ * ligt het ín de distro en komen we er van hieraf niet bij.
37
+ */
38
+ function readablePath(configPath, platform = process.platform) {
39
+ if (platform !== 'win32' || !configPath.startsWith('/')) {
40
+ return configPath;
41
+ }
42
+ return (0, compose_1.windowsPathOf)(configPath);
43
+ }
44
+ /** De compose-bestanden van dit project, zoals ze op schijf staan. */
45
+ async function readProjectFiles(projectName) {
46
+ const location = await (0, compose_1.resolveProjectLocation)(projectName);
47
+ if (location === null) {
48
+ return { ok: false, problem: unknownLocation(projectName) };
49
+ }
50
+ if (location.configFiles.length === 0) {
51
+ return { ok: false, problem: (0, i18n_1.t)({
52
+ en: 'The containers of this project do not say which file they came from.',
53
+ nl: 'De containers van dit project zeggen niet uit welk bestand ze komen.',
54
+ de: 'Die Container dieses Projekts sagen nicht, aus welcher Datei sie stammen.',
55
+ fr: 'Les conteneurs de ce projet n’indiquent pas de quel fichier ils viennent.',
56
+ es: 'Los contenedores de este proyecto no indican de qué archivo vienen.',
57
+ }) };
58
+ }
59
+ const files = [];
60
+ for (const configPath of location.configFiles) {
61
+ const local = readablePath(configPath);
62
+ if (local === null) {
63
+ // Een pad binnen de distro zelf. `docker compose config` komt er wel bij, want dat draait daar.
64
+ files.push({ path: configPath, content: '', problem: (0, i18n_1.t)({
65
+ en: 'This file is inside the WSL distro and cannot be read from here. Use the resolved view.',
66
+ nl: 'Dit bestand ligt in de WSL-distro en is van hieraf niet te lezen. Gebruik de samengevoegde weergave.',
67
+ de: 'Diese Datei liegt in der WSL-Distro und ist von hier nicht lesbar. Nutzen Sie die zusammengeführte Ansicht.',
68
+ fr: 'Ce fichier est dans la distro WSL et n’est pas lisible d’ici. Utilisez la vue fusionnée.',
69
+ es: 'Este archivo está dentro de la distro de WSL y no se puede leer desde aquí. Usa la vista combinada.',
70
+ }) });
71
+ continue;
72
+ }
73
+ try {
74
+ const content = await (0, promises_1.readFile)(local, 'utf8');
75
+ files.push({ path: configPath, content: content.length > MAX_BYTES ? content.slice(0, MAX_BYTES) : content, problem: null });
76
+ }
77
+ catch (err) {
78
+ files.push({ path: configPath, content: '', problem: (0, i18n_1.t)({
79
+ en: `Could not read ${local}: ${err instanceof Error ? err.message : String(err)}`,
80
+ nl: `Kon ${local} niet lezen: ${err instanceof Error ? err.message : String(err)}`,
81
+ de: `${local} konnte nicht gelesen werden: ${err instanceof Error ? err.message : String(err)}`,
82
+ fr: `Impossible de lire ${local} : ${err instanceof Error ? err.message : String(err)}`,
83
+ es: `No se ha podido leer ${local}: ${err instanceof Error ? err.message : String(err)}`,
84
+ }) });
85
+ }
86
+ }
87
+ return { ok: true, files };
88
+ }
89
+ /**
90
+ * Wat compose er zelf van maakt: overrides samengevoegd, `${VAR}` ingevuld, standaarden erbij.
91
+ *
92
+ * Vaker het antwoord op je vraag dan het ruwe bestand, want dit is waar het draaiende project op
93
+ * gebaseerd is. Draait compose in de distro, dan draait dit commando daar ook, en dan werkt het
94
+ * ook voor een bestand dat we zelf niet kunnen lezen.
95
+ */
96
+ async function readResolvedConfig(projectName) {
97
+ const location = await (0, compose_1.resolveProjectLocation)(projectName);
98
+ if (location === null) {
99
+ return { ok: false, problem: unknownLocation(projectName) };
100
+ }
101
+ const result = await (0, compose_1.runComposeCapture)(location, [...(0, compose_1.projectArgs)(projectName, location), 'config'], 'config');
102
+ return result.ok ? { ok: true, yaml: result.stdout } : result;
103
+ }
104
+ //# sourceMappingURL=compose-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-files.js","sourceRoot":"","sources":["../electron/compose-files.ts"],"names":[],"mappings":"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"}