mixdog 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/package.json +8 -1
  2. package/scripts/_bench-cwc.json +20 -0
  3. package/scripts/agent-loop-policy-test.mjs +37 -0
  4. package/scripts/agent-parallel-smoke.mjs +54 -10
  5. package/scripts/background-task-meta-smoke.mjs +1 -1
  6. package/scripts/bench-run.mjs +262 -0
  7. package/scripts/compact-smoke.mjs +12 -0
  8. package/scripts/compact-trigger-migration-smoke.mjs +67 -1
  9. package/scripts/ingest-pure-conversation-smoke.mjs +148 -0
  10. package/scripts/internal-comms-bench.mjs +727 -0
  11. package/scripts/internal-comms-smoke.mjs +75 -0
  12. package/scripts/lead-workflow-smoke.mjs +4 -4
  13. package/scripts/live-worker-smoke.mjs +9 -9
  14. package/scripts/output-style-bench.mjs +285 -0
  15. package/scripts/output-style-smoke.mjs +13 -10
  16. package/scripts/patch-replay.mjs +90 -0
  17. package/scripts/provider-stream-stall-test.mjs +276 -0
  18. package/scripts/provider-toolcall-test.mjs +599 -1
  19. package/scripts/routing-corpus.mjs +281 -0
  20. package/scripts/session-bench.mjs +1526 -0
  21. package/scripts/session-diag.mjs +595 -0
  22. package/scripts/task-bench.mjs +207 -0
  23. package/scripts/tool-failures.mjs +6 -6
  24. package/scripts/tool-smoke.mjs +306 -66
  25. package/scripts/toolcall-args-test.mjs +81 -0
  26. package/src/agents/debugger/AGENT.md +4 -4
  27. package/src/agents/heavy-worker/AGENT.md +4 -2
  28. package/src/agents/reviewer/AGENT.md +4 -4
  29. package/src/agents/worker/AGENT.md +4 -2
  30. package/src/app.mjs +10 -6
  31. package/src/defaults/{hidden-roles.json → agents.json} +7 -7
  32. package/src/examples/schedules/SCHEDULE.example.md +32 -0
  33. package/src/examples/webhooks/WEBHOOK.example.md +40 -0
  34. package/src/headless-role.mjs +14 -14
  35. package/src/help.mjs +1 -0
  36. package/src/lib/rules-builder.cjs +32 -54
  37. package/src/mixdog-session-runtime.mjs +710 -318
  38. package/src/output-styles/default.md +12 -7
  39. package/src/output-styles/minimal.md +25 -0
  40. package/src/output-styles/oneline.md +21 -0
  41. package/src/output-styles/simple.md +10 -9
  42. package/src/repl.mjs +12 -2
  43. package/src/rules/agent/00-common.md +7 -5
  44. package/src/rules/agent/30-explorer.md +7 -8
  45. package/src/rules/lead/01-general.md +3 -1
  46. package/src/rules/lead/lead-tool.md +7 -0
  47. package/src/rules/shared/01-tool.md +17 -12
  48. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +90 -32
  49. package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +32 -0
  50. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +18 -6
  51. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +23 -20
  52. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +48 -14
  53. package/src/runtime/agent/orchestrator/agent-trace.mjs +87 -12
  54. package/src/runtime/agent/orchestrator/config.mjs +3 -0
  55. package/src/runtime/agent/orchestrator/context/collect.mjs +131 -67
  56. package/src/runtime/agent/orchestrator/{internal-roles.mjs → internal-agents.mjs} +72 -72
  57. package/src/runtime/agent/orchestrator/internal-tools.mjs +13 -26
  58. package/src/runtime/agent/orchestrator/mcp/client.mjs +94 -16
  59. package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +7 -0
  60. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +188 -0
  61. package/src/runtime/agent/orchestrator/providers/anthropic-leaked-toolcall.mjs +444 -0
  62. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +332 -57
  63. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +59 -32
  64. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +27 -20
  65. package/src/runtime/agent/orchestrator/providers/gemini.mjs +184 -17
  66. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +8 -1
  67. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +18 -8
  68. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +210 -21
  69. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +78 -3
  70. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +202 -98
  71. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +183 -20
  72. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +18 -0
  73. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +11 -5
  74. package/src/runtime/agent/orchestrator/providers/registry.mjs +2 -1
  75. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +15 -9
  76. package/src/runtime/agent/orchestrator/session/compact.mjs +560 -51
  77. package/src/runtime/agent/orchestrator/session/context-utils.mjs +250 -3
  78. package/src/runtime/agent/orchestrator/session/loop.mjs +394 -132
  79. package/src/runtime/agent/orchestrator/session/manager.mjs +217 -170
  80. package/src/runtime/agent/orchestrator/session/store.mjs +4 -4
  81. package/src/runtime/agent/orchestrator/session/tool-envelope.mjs +61 -0
  82. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +5 -0
  83. package/src/runtime/agent/orchestrator/stall-policy.mjs +63 -15
  84. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +194 -24
  85. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.test.mjs +143 -0
  86. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +34 -18
  87. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +0 -0
  88. package/src/runtime/agent/orchestrator/tools/builtin/list-formatting.mjs +10 -0
  89. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +5 -4
  90. package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +15 -0
  91. package/src/runtime/agent/orchestrator/tools/builtin/read-args.mjs +9 -44
  92. package/src/runtime/agent/orchestrator/tools/builtin/read-constants.mjs +2 -1
  93. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +13 -4
  94. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +10 -17
  95. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +18 -2
  96. package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +3 -2
  97. package/src/runtime/agent/orchestrator/tools/builtin/tool-output-limit.mjs +10 -0
  98. package/src/runtime/agent/orchestrator/tools/builtin.mjs +59 -1
  99. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +5 -5
  100. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4076 -3985
  101. package/src/runtime/agent/orchestrator/tools/patch.mjs +116 -2
  102. package/src/runtime/channels/backends/discord.mjs +99 -9
  103. package/src/runtime/channels/backends/telegram.mjs +501 -0
  104. package/src/runtime/channels/index.mjs +441 -1224
  105. package/src/runtime/channels/lib/config.mjs +54 -2
  106. package/src/runtime/channels/lib/format.mjs +4 -2
  107. package/src/runtime/channels/lib/output-forwarder.mjs +80 -67
  108. package/src/runtime/channels/lib/runtime-paths.mjs +29 -0
  109. package/src/runtime/channels/lib/scheduler.mjs +1 -1
  110. package/src/runtime/channels/lib/telegram-format.mjs +283 -0
  111. package/src/runtime/channels/lib/tool-format.mjs +1 -1
  112. package/src/runtime/channels/lib/transcript-discovery.mjs +19 -1
  113. package/src/runtime/channels/lib/webhook.mjs +59 -31
  114. package/src/runtime/channels/tool-defs.mjs +1 -1
  115. package/src/runtime/memory/index.mjs +184 -19
  116. package/src/runtime/memory/lib/agent-ipc.mjs +2 -2
  117. package/src/runtime/memory/lib/core-memory-store.mjs +1 -1
  118. package/src/runtime/memory/lib/memory-cycle1.mjs +1 -1
  119. package/src/runtime/memory/lib/memory-cycle2.mjs +9 -6
  120. package/src/runtime/memory/lib/memory-cycle3.mjs +1 -1
  121. package/src/runtime/memory/lib/memory.mjs +101 -4
  122. package/src/runtime/memory/lib/pg/adapter.mjs +139 -15
  123. package/src/runtime/memory/lib/session-ingest.mjs +107 -0
  124. package/src/runtime/memory/lib/trace-store.mjs +69 -22
  125. package/src/runtime/memory/tool-defs.mjs +6 -3
  126. package/src/runtime/shared/channel-notification-routing.mjs +12 -0
  127. package/src/runtime/shared/channel-notification-routing.test.mjs +45 -0
  128. package/src/runtime/shared/config.mjs +9 -0
  129. package/src/runtime/shared/llm/http-agent.mjs +12 -5
  130. package/src/runtime/shared/schedules-store.mjs +21 -19
  131. package/src/runtime/shared/tool-surface.mjs +98 -13
  132. package/src/runtime/shared/transcript-writer.mjs +129 -0
  133. package/src/runtime/shared/update-checker.mjs +214 -0
  134. package/src/standalone/agent-tool.mjs +255 -109
  135. package/src/standalone/channel-admin.mjs +133 -40
  136. package/src/standalone/channel-worker.mjs +8 -291
  137. package/src/standalone/explore-tool.mjs +2 -2
  138. package/src/standalone/memory-runtime-proxy.mjs +3 -1
  139. package/src/standalone/provider-admin.mjs +11 -0
  140. package/src/standalone/usage-dashboard.mjs +1 -1
  141. package/src/tui/App.jsx +2096 -732
  142. package/src/tui/components/ConfirmBar.jsx +47 -0
  143. package/src/tui/components/ContextPanel.jsx +5 -3
  144. package/src/tui/components/ItemRightHintOverprint.jsx +54 -0
  145. package/src/tui/components/Markdown.jsx +22 -98
  146. package/src/tui/components/Message.jsx +14 -35
  147. package/src/tui/components/Picker.jsx +87 -12
  148. package/src/tui/components/PromptInput.jsx +83 -7
  149. package/src/tui/components/QueuedCommands.jsx +1 -1
  150. package/src/tui/components/SlashCommandPalette.jsx +8 -5
  151. package/src/tui/components/Spinner.jsx +7 -7
  152. package/src/tui/components/StatusLine.jsx +40 -21
  153. package/src/tui/components/TextEntryPanel.jsx +51 -7
  154. package/src/tui/components/ToolExecution.jsx +170 -98
  155. package/src/tui/components/TurnDone.jsx +4 -4
  156. package/src/tui/components/UsagePanel.jsx +1 -1
  157. package/src/tui/components/tool-output-format.mjs +159 -21
  158. package/src/tui/components/tool-output-format.test.mjs +87 -0
  159. package/src/tui/display-width.mjs +69 -0
  160. package/src/tui/display-width.test.mjs +35 -0
  161. package/src/tui/dist/index.mjs +6965 -2391
  162. package/src/tui/engine.mjs +287 -126
  163. package/src/tui/index.jsx +117 -7
  164. package/src/tui/keyboard-protocol.mjs +42 -0
  165. package/src/tui/lib/voice-recorder.mjs +453 -0
  166. package/src/tui/markdown/format-token.mjs +129 -76
  167. package/src/tui/markdown/format-token.test.mjs +61 -19
  168. package/src/tui/markdown/measure-rendered-rows.mjs +85 -0
  169. package/src/tui/markdown/render-ansi.test.mjs +1 -1
  170. package/src/tui/markdown/streaming-markdown.mjs +167 -0
  171. package/src/tui/markdown/streaming-markdown.test.mjs +70 -0
  172. package/src/tui/markdown/table-layout.mjs +9 -9
  173. package/src/tui/paste-attachments.mjs +0 -11
  174. package/src/tui/prompt-history-store.mjs +129 -0
  175. package/src/tui/prompt-history-store.test.mjs +52 -0
  176. package/src/tui/statusline-ansi-bridge.test.mjs +3 -3
  177. package/src/tui/theme.mjs +41 -657
  178. package/src/tui/themes/base.mjs +86 -0
  179. package/src/tui/themes/basic.mjs +85 -0
  180. package/src/tui/themes/catppuccin.mjs +72 -0
  181. package/src/tui/themes/dracula.mjs +70 -0
  182. package/src/tui/themes/everforest.mjs +71 -0
  183. package/src/tui/themes/gruvbox.mjs +71 -0
  184. package/src/tui/themes/index.mjs +71 -0
  185. package/src/tui/themes/indigo.mjs +78 -0
  186. package/src/tui/themes/kanagawa.mjs +80 -0
  187. package/src/tui/themes/light.mjs +81 -0
  188. package/src/tui/themes/nord.mjs +72 -0
  189. package/src/tui/themes/onedark.mjs +16 -0
  190. package/src/tui/themes/rosepine.mjs +70 -0
  191. package/src/tui/themes/teal.mjs +81 -0
  192. package/src/tui/themes/tokyonight.mjs +79 -0
  193. package/src/tui/themes/utils.mjs +106 -0
  194. package/src/tui/themes/warm.mjs +79 -0
  195. package/src/tui/transcript-tool-failures.mjs +13 -2
  196. package/src/ui/markdown.mjs +1 -1
  197. package/src/ui/model-display.mjs +2 -2
  198. package/src/ui/statusline.mjs +26 -27
  199. package/src/vendor/statusline/bin/statusline-route.mjs +5 -12
  200. package/src/vendor/statusline/src/gateway/claude-current.mjs +3 -3
  201. package/src/vendor/statusline/src/gateway/route-meta.mjs +30 -16
  202. package/src/workflows/default/WORKFLOW.md +39 -12
  203. package/src/workflows/sequential/WORKFLOW.md +46 -0
  204. package/src/workflows/solo/WORKFLOW.md +7 -0
  205. package/vendor/ink/build/display-width.js +62 -0
  206. package/vendor/ink/build/ink.js +100 -12
  207. package/vendor/ink/build/measure-text.js +4 -1
  208. package/vendor/ink/build/output.js +115 -9
  209. package/vendor/ink/build/render-node-to-output.js +4 -1
  210. package/vendor/ink/build/render.js +4 -0
  211. package/src/output-styles/extreme-simple.md +0 -20
  212. package/src/rules/lead/04-workflow.md +0 -51
  213. package/src/workflows/default/workflow.json +0 -13
  214. package/src/workflows/solo/workflow.json +0 -7
@@ -0,0 +1,214 @@
1
+ /**
2
+ * update-checker.mjs — npm registry version check + self-update for the
3
+ * globally-installed `mixdog` CLI package.
4
+ *
5
+ * checkLatestVersion({force}) hits the npm registry for the `latest`
6
+ * dist-tag, compares against the local package.json version, and caches
7
+ * the result on disk (TTL 24h) so repeated calls (e.g. on every TUI mount)
8
+ * don't hammer the registry. Network/parse failures are silent — this is a
9
+ * best-effort convenience check, never a boot-blocking dependency.
10
+ *
11
+ * runGlobalUpdate() shells out to `npm install -g mixdog@latest` in the
12
+ * background (windowsHide so no console flash on Windows) and resolves once
13
+ * the child exits, reporting the resolved version on success.
14
+ */
15
+
16
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
17
+ import { dirname, join } from 'node:path';
18
+ import { fileURLToPath } from 'node:url';
19
+ import { spawn } from 'node:child_process';
20
+ import { resolvePluginData } from './plugin-paths.mjs';
21
+
22
+ const PACKAGE_NAME = 'mixdog';
23
+ const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
24
+ const FETCH_TIMEOUT_MS = 5_000;
25
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
26
+ const CACHE_FILE_NAME = 'update-check-cache.json';
27
+
28
+ // Resolve the local package.json shipped alongside src/ (two levels up from
29
+ // src/runtime/shared/).
30
+ const _MODULE_DIR = dirname(fileURLToPath(import.meta.url));
31
+ const _PACKAGE_JSON_PATH = join(_MODULE_DIR, '..', '..', '..', 'package.json');
32
+
33
+ let _localVersionCache = null;
34
+ export function localPackageVersion() {
35
+ if (_localVersionCache) return _localVersionCache;
36
+ try {
37
+ const raw = JSON.parse(readFileSync(_PACKAGE_JSON_PATH, 'utf8'));
38
+ _localVersionCache = String(raw?.version || '0.0.0');
39
+ } catch {
40
+ _localVersionCache = '0.0.0';
41
+ }
42
+ return _localVersionCache;
43
+ }
44
+
45
+ function cacheFilePath(dataDir) {
46
+ const dir = dataDir || resolvePluginData();
47
+ return join(dir, CACHE_FILE_NAME);
48
+ }
49
+
50
+ function readCache(dataDir) {
51
+ try {
52
+ const raw = JSON.parse(readFileSync(cacheFilePath(dataDir), 'utf8'));
53
+ if (!raw || typeof raw !== 'object') return null;
54
+ return raw;
55
+ } catch {
56
+ return null;
57
+ }
58
+ }
59
+
60
+ function writeCache(dataDir, payload) {
61
+ try {
62
+ const dir = dataDir || resolvePluginData();
63
+ mkdirSync(dir, { recursive: true });
64
+ writeFileSync(cacheFilePath(dataDir), JSON.stringify(payload), 'utf8');
65
+ } catch {
66
+ // Best-effort — cache miss just means the next call re-fetches.
67
+ }
68
+ }
69
+
70
+ /** Parse a semver-ish string into { parts:[maj,min,patch], prerelease }. */
71
+ function parseSemver(value) {
72
+ const text = String(value || '').trim().replace(/^v/i, '');
73
+ const [core, ...preParts] = text.split('-');
74
+ const parts = core.split('.').map((n) => {
75
+ const num = Number.parseInt(n, 10);
76
+ return Number.isFinite(num) ? num : 0;
77
+ });
78
+ while (parts.length < 3) parts.push(0);
79
+ return { parts, prerelease: preParts.join('-') };
80
+ }
81
+
82
+ /**
83
+ * Compare two semver strings. Returns positive if `a` > `b`, negative if
84
+ * `a` < `b`, 0 if equal. A version with a prerelease tag is considered
85
+ * lower than the same core version without one (standard semver rule).
86
+ */
87
+ export function compareSemver(a, b) {
88
+ const pa = parseSemver(a);
89
+ const pb = parseSemver(b);
90
+ for (let i = 0; i < 3; i++) {
91
+ const diff = (pa.parts[i] || 0) - (pb.parts[i] || 0);
92
+ if (diff !== 0) return diff;
93
+ }
94
+ if (pa.prerelease && !pb.prerelease) return -1;
95
+ if (!pa.prerelease && pb.prerelease) return 1;
96
+ if (pa.prerelease !== pb.prerelease) return pa.prerelease < pb.prerelease ? -1 : 1;
97
+ return 0;
98
+ }
99
+
100
+ export function isNewerVersion(latest, current) {
101
+ if (!latest || !current) return false;
102
+ return compareSemver(latest, current) > 0;
103
+ }
104
+
105
+ async function fetchLatestFromRegistry() {
106
+ const controller = new AbortController();
107
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
108
+ try {
109
+ const res = await fetch(REGISTRY_URL, { signal: controller.signal });
110
+ if (!res.ok) return null;
111
+ const body = await res.json();
112
+ const version = body && typeof body === 'object' ? String(body.version || '').trim() : '';
113
+ return version || null;
114
+ } catch {
115
+ return null;
116
+ } finally {
117
+ clearTimeout(timer);
118
+ }
119
+ }
120
+
121
+ /**
122
+ * checkLatestVersion({force, dataDir}) — resolve the latest published
123
+ * version of the `mixdog` npm package.
124
+ *
125
+ * Returns:
126
+ * { currentVersion, latestVersion, updateAvailable, lastCheckedAt, fromCache }
127
+ * `latestVersion` is null when the registry could not be reached and no
128
+ * usable cache exists — this call never throws.
129
+ */
130
+ export async function checkLatestVersion({ force = false, dataDir } = {}) {
131
+ const currentVersion = localPackageVersion();
132
+ const cache = force ? null : readCache(dataDir);
133
+ const now = Date.now();
134
+ if (cache && typeof cache.lastCheckedAt === 'number' && now - cache.lastCheckedAt < CACHE_TTL_MS) {
135
+ return {
136
+ currentVersion,
137
+ latestVersion: cache.latestVersion || null,
138
+ updateAvailable: isNewerVersion(cache.latestVersion, currentVersion),
139
+ lastCheckedAt: cache.lastCheckedAt,
140
+ fromCache: true,
141
+ };
142
+ }
143
+ const latestVersion = await fetchLatestFromRegistry();
144
+ if (latestVersion) {
145
+ const payload = { latestVersion, lastCheckedAt: now };
146
+ writeCache(dataDir, payload);
147
+ return {
148
+ currentVersion,
149
+ latestVersion,
150
+ updateAvailable: isNewerVersion(latestVersion, currentVersion),
151
+ lastCheckedAt: now,
152
+ fromCache: false,
153
+ };
154
+ }
155
+ // Registry unreachable: fall back to a stale cache (if any) rather than
156
+ // reporting "no update info" every time the network hiccups.
157
+ if (cache && cache.latestVersion) {
158
+ return {
159
+ currentVersion,
160
+ latestVersion: cache.latestVersion,
161
+ updateAvailable: isNewerVersion(cache.latestVersion, currentVersion),
162
+ lastCheckedAt: cache.lastCheckedAt || now,
163
+ fromCache: true,
164
+ };
165
+ }
166
+ return {
167
+ currentVersion,
168
+ latestVersion: null,
169
+ updateAvailable: false,
170
+ lastCheckedAt: now,
171
+ fromCache: false,
172
+ };
173
+ }
174
+
175
+ /**
176
+ * runGlobalUpdate() — `npm install -g mixdog@latest` in a background child
177
+ * process (windowsHide so no console flash on Windows). Resolves once the
178
+ * child exits; never throws — failures come back as {ok:false, error}.
179
+ */
180
+ export function runGlobalUpdate() {
181
+ return new Promise((resolvePromise) => {
182
+ let child;
183
+ try {
184
+ const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
185
+ child = spawn(npmCmd, ['install', '-g', `${PACKAGE_NAME}@latest`], {
186
+ stdio: 'ignore',
187
+ windowsHide: true,
188
+ shell: process.platform === 'win32',
189
+ });
190
+ } catch (err) {
191
+ resolvePromise({ ok: false, error: err?.message || String(err) });
192
+ return;
193
+ }
194
+ child.once('error', (err) => {
195
+ resolvePromise({ ok: false, error: err?.message || String(err) });
196
+ });
197
+ // Detach from the event-loop keep-alive so a boot-time auto-update can
198
+ // never hold the TUI/node process open after the user quits; the exit
199
+ // listener still fires as long as the process is otherwise alive.
200
+ child.unref?.();
201
+ child.once('exit', async (code) => {
202
+ if (code === 0) {
203
+ // Best-effort: report whichever version the registry now reports as
204
+ // latest (the just-installed one), falling back to 'unknown'.
205
+ const version = await fetchLatestFromRegistry();
206
+ resolvePromise({ ok: true, version: version || 'unknown' });
207
+ } else {
208
+ resolvePromise({ ok: false, error: `npm install exited with code ${code}` });
209
+ }
210
+ });
211
+ });
212
+ }
213
+
214
+ export { PACKAGE_NAME as UPDATE_PACKAGE_NAME };