crewly 1.20.143 → 1.20.144

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 (154) hide show
  1. package/config/constants.ts +59 -0
  2. package/config/index.ts +2 -0
  3. package/config/skills/orchestrator/delegate-task/execute.sh +11 -0
  4. package/config/skills/orchestrator/delegate-task/execute.test.sh +38 -0
  5. package/config/skills/orchestrator/reply-chat/SKILL.md +11 -1
  6. package/config/skills/orchestrator/reply-chat/execute.sh +13 -1
  7. package/config/skills/orchestrator/reply-slack/SKILL.md +1 -0
  8. package/config/skills/orchestrator/reply-slack/execute.sh +11 -2
  9. package/dist/backend/backend/src/constants.d.ts +43 -0
  10. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  11. package/dist/backend/backend/src/constants.js +24 -1
  12. package/dist/backend/backend/src/constants.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  14. package/dist/backend/backend/src/controllers/chat/chat.controller.js +36 -1
  15. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  16. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/slack/slack.controller.js +69 -7
  18. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +4 -1
  20. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  21. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +9 -2
  22. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  23. package/dist/backend/backend/src/index.d.ts +8 -0
  24. package/dist/backend/backend/src/index.d.ts.map +1 -1
  25. package/dist/backend/backend/src/index.js +71 -2
  26. package/dist/backend/backend/src/index.js.map +1 -1
  27. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  28. package/dist/backend/backend/src/services/agent/agent-registration.service.js +5 -0
  29. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  30. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +15 -0
  31. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  32. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +20 -0
  33. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  34. package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts +217 -0
  35. package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -0
  36. package/dist/backend/backend/src/services/orc/orc-reply-route.service.js +300 -0
  37. package/dist/backend/backend/src/services/orc/orc-reply-route.service.js.map +1 -0
  38. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +32 -2
  39. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +59 -5
  41. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  42. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +4 -2
  43. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +6 -3
  45. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  46. package/dist/backend/backend/src/services/system/auto-update.service.d.ts +292 -0
  47. package/dist/backend/backend/src/services/system/auto-update.service.d.ts.map +1 -0
  48. package/dist/backend/backend/src/services/system/auto-update.service.js +590 -0
  49. package/dist/backend/backend/src/services/system/auto-update.service.js.map +1 -0
  50. package/dist/backend/backend/src/services/system/auto-update.utils.d.ts +265 -0
  51. package/dist/backend/backend/src/services/system/auto-update.utils.d.ts.map +1 -0
  52. package/dist/backend/backend/src/services/system/auto-update.utils.js +397 -0
  53. package/dist/backend/backend/src/services/system/auto-update.utils.js.map +1 -0
  54. package/dist/backend/backend/src/services/system/version-check.service.d.ts +15 -1
  55. package/dist/backend/backend/src/services/system/version-check.service.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/system/version-check.service.js +21 -2
  57. package/dist/backend/backend/src/services/system/version-check.service.js.map +1 -1
  58. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +7 -1
  59. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +14 -2
  61. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  62. package/dist/backend/backend/src/services/v3/cascade-request-status.d.ts.map +1 -1
  63. package/dist/backend/backend/src/services/v3/cascade-request-status.js +16 -1
  64. package/dist/backend/backend/src/services/v3/cascade-request-status.js.map +1 -1
  65. package/dist/backend/backend/src/services/v3/request-completion.d.ts +128 -0
  66. package/dist/backend/backend/src/services/v3/request-completion.d.ts.map +1 -0
  67. package/dist/backend/backend/src/services/v3/request-completion.js +311 -0
  68. package/dist/backend/backend/src/services/v3/request-completion.js.map +1 -0
  69. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.d.ts.map +1 -1
  70. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js +3 -0
  71. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js.map +1 -1
  72. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js +17 -3
  74. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js.map +1 -1
  75. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +8 -0
  76. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/v3/v3-data.service.js +11 -1
  78. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  79. package/dist/backend/backend/src/types/settings.types.d.ts +8 -0
  80. package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
  81. package/dist/backend/backend/src/types/settings.types.js +4 -0
  82. package/dist/backend/backend/src/types/settings.types.js.map +1 -1
  83. package/dist/backend/build-info.json +2 -2
  84. package/dist/backend/config/constants.d.ts +56 -0
  85. package/dist/backend/config/constants.d.ts.map +1 -1
  86. package/dist/backend/config/constants.js +57 -0
  87. package/dist/backend/config/constants.js.map +1 -1
  88. package/dist/backend/config/index.d.ts +2 -2
  89. package/dist/backend/config/index.d.ts.map +1 -1
  90. package/dist/backend/config/index.js +2 -2
  91. package/dist/backend/config/index.js.map +1 -1
  92. package/dist/cli/backend/src/constants.d.ts +43 -0
  93. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  94. package/dist/cli/backend/src/constants.js +24 -1
  95. package/dist/cli/backend/src/constants.js.map +1 -1
  96. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  97. package/dist/cli/backend/src/services/agent/agent-registration.service.js +5 -0
  98. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  99. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +15 -0
  100. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  101. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +20 -0
  102. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  103. package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts +217 -0
  104. package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -0
  105. package/dist/cli/backend/src/services/orc/orc-reply-route.service.js +300 -0
  106. package/dist/cli/backend/src/services/orc/orc-reply-route.service.js.map +1 -0
  107. package/dist/cli/backend/src/services/system/auto-update.utils.d.ts +265 -0
  108. package/dist/cli/backend/src/services/system/auto-update.utils.d.ts.map +1 -0
  109. package/dist/cli/backend/src/services/system/auto-update.utils.js +397 -0
  110. package/dist/cli/backend/src/services/system/auto-update.utils.js.map +1 -0
  111. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +7 -1
  112. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  113. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +14 -2
  114. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  115. package/dist/cli/backend/src/services/v3/request-completion.d.ts +128 -0
  116. package/dist/cli/backend/src/services/v3/request-completion.d.ts.map +1 -0
  117. package/dist/cli/backend/src/services/v3/request-completion.js +311 -0
  118. package/dist/cli/backend/src/services/v3/request-completion.js.map +1 -0
  119. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts +8 -0
  120. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  121. package/dist/cli/backend/src/services/v3/v3-data.service.js +11 -1
  122. package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
  123. package/dist/cli/backend/src/types/settings.types.d.ts +8 -0
  124. package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
  125. package/dist/cli/backend/src/types/settings.types.js +4 -0
  126. package/dist/cli/backend/src/types/settings.types.js.map +1 -1
  127. package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
  128. package/dist/cli/cli/src/commands/start.js +14 -3
  129. package/dist/cli/cli/src/commands/start.js.map +1 -1
  130. package/dist/cli/cli/src/commands/update-status.d.ts +85 -0
  131. package/dist/cli/cli/src/commands/update-status.d.ts.map +1 -0
  132. package/dist/cli/cli/src/commands/update-status.js +162 -0
  133. package/dist/cli/cli/src/commands/update-status.js.map +1 -0
  134. package/dist/cli/cli/src/constants.d.ts +1 -1
  135. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  136. package/dist/cli/cli/src/constants.js +1 -1
  137. package/dist/cli/cli/src/constants.js.map +1 -1
  138. package/dist/cli/cli/src/index.js +7 -0
  139. package/dist/cli/cli/src/index.js.map +1 -1
  140. package/dist/cli/cli/src/utils/backend-respawn.d.ts +50 -0
  141. package/dist/cli/cli/src/utils/backend-respawn.d.ts.map +1 -0
  142. package/dist/cli/cli/src/utils/backend-respawn.js +59 -0
  143. package/dist/cli/cli/src/utils/backend-respawn.js.map +1 -0
  144. package/dist/cli/config/constants.d.ts +56 -0
  145. package/dist/cli/config/constants.d.ts.map +1 -1
  146. package/dist/cli/config/constants.js +57 -0
  147. package/dist/cli/config/constants.js.map +1 -1
  148. package/dist/cli/config/index.d.ts +2 -2
  149. package/dist/cli/config/index.d.ts.map +1 -1
  150. package/dist/cli/config/index.js +2 -2
  151. package/dist/cli/config/index.js.map +1 -1
  152. package/frontend/dist/assets/{index-e05af897.js → index-71670b91.js} +22 -22
  153. package/frontend/dist/index.html +1 -1
  154. package/package.json +1 -1
@@ -0,0 +1,590 @@
1
+ /**
2
+ * Auto-Update Service
3
+ *
4
+ * Keeps an npm-installed Crewly on the latest release with nobody at the
5
+ * keyboard (specs/auto-update.md):
6
+ *
7
+ * 1. about 10 min after boot, then every 3 h, ask the npm registry for the
8
+ * latest `crewly`;
9
+ * 2. when it is newer and auto-update is on, wait for a quiet window — no
10
+ * agent in_progress and no turn in flight, seen twice ~60 s apart;
11
+ * 3. `npm install -g --prefix <the running copy's prefix> crewly@<version>`;
12
+ * 4. verify the installed package.json says `<version>`;
13
+ * 5. write a marker and ask for the graceful restart (drain, exit 120, the
14
+ * `crewly start` parent respawns the backend from the new files);
15
+ * 6. on the next boot, read the marker and DM the owner once.
16
+ *
17
+ * Failures (install error, verify mismatch, no restart path) back off 6 h
18
+ * and never restart onto a broken install. Dev checkouts, non-npm installs
19
+ * and backends without a respawning parent are skipped.
20
+ *
21
+ * All I/O goes through {@link AutoUpdateDeps} so the rules are unit-testable
22
+ * with a mocked registry, npm and clock; {@link createAutoUpdateService}
23
+ * wires the real ones.
24
+ *
25
+ * @module services/system/auto-update.service
26
+ */
27
+ import * as fs from 'fs';
28
+ import * as os from 'os';
29
+ import * as path from 'path';
30
+ import { spawn } from 'child_process';
31
+ import { AUTO_UPDATE_CONSTANTS, PROCESS_EXIT_CODES, CREWLY_CONSTANTS } from '../../constants.js';
32
+ import { LoggerService } from '../core/logger.service.js';
33
+ import { composeFailureNotice, composeUpgradedNotice, consumePendingMarker, detectInstall, hasRestartSupervisor, isNewerVersion, isSwitchOn, npmInstallArgs, readAutoUpdateState, readInstalledVersion, resolveAutoUpdateSwitch, resolveNpmCommand, resolveRunningPackageRoot, writeAutoUpdateState, writePendingMarker, } from './auto-update.utils.js';
34
+ /**
35
+ * Periodically upgrades the running npm install and restarts into it.
36
+ */
37
+ export class AutoUpdateService {
38
+ deps;
39
+ static instance = null;
40
+ timer = null;
41
+ running = false;
42
+ stopped = false;
43
+ lastLoggedMode = null;
44
+ busySince = null;
45
+ pendingNotice = null;
46
+ statePath;
47
+ markerPath;
48
+ /**
49
+ * @param deps - Injected I/O
50
+ */
51
+ constructor(deps) {
52
+ this.deps = deps;
53
+ this.statePath = path.join(deps.crewlyHome, AUTO_UPDATE_CONSTANTS.STATE_FILE);
54
+ this.markerPath = path.join(deps.crewlyHome, AUTO_UPDATE_CONSTANTS.MARKER_FILE);
55
+ }
56
+ /**
57
+ * Register the process-wide instance (index.ts).
58
+ *
59
+ * @param service - Instance, or null to clear
60
+ */
61
+ static setInstance(service) {
62
+ AutoUpdateService.instance = service;
63
+ }
64
+ /**
65
+ * The process-wide instance, when one was registered.
66
+ *
67
+ * @returns The instance or null
68
+ */
69
+ static getInstance() {
70
+ return AutoUpdateService.instance;
71
+ }
72
+ /**
73
+ * Boot: consume the pending-upgrade marker (and report it), log the mode,
74
+ * and schedule the first check.
75
+ */
76
+ start() {
77
+ this.stopped = false;
78
+ this.handleBootMarker();
79
+ void this.describeMode().then((mode) => this.logModeOnce(mode));
80
+ this.scheduleNext(AUTO_UPDATE_CONSTANTS.FIRST_CHECK_DELAY_MS);
81
+ }
82
+ /**
83
+ * Stop scheduling (shutdown).
84
+ */
85
+ stop() {
86
+ this.stopped = true;
87
+ if (this.timer !== null)
88
+ this.deps.cancel(this.timer);
89
+ this.timer = null;
90
+ }
91
+ /**
92
+ * Whether this boot is the result of an auto-upgrade whose notice is still
93
+ * owed — the generic "back online" announcement is skipped then, so the
94
+ * owner gets one message per upgrade, not two.
95
+ *
96
+ * @returns True while the upgrade notice is pending or was just sent
97
+ */
98
+ isUpgradeBoot() {
99
+ return this.pendingNotice !== null;
100
+ }
101
+ /**
102
+ * Current persisted status.
103
+ *
104
+ * @returns The state
105
+ */
106
+ getState() {
107
+ return readAutoUpdateState(this.statePath);
108
+ }
109
+ /**
110
+ * The on/off/skip mode as a short string (also what update-status shows).
111
+ *
112
+ * @returns e.g. `enabled`, `dev-checkout`, `disabled-env`
113
+ */
114
+ async describeMode() {
115
+ const { install } = this.deps;
116
+ if (install.kind === 'dev-checkout')
117
+ return 'dev-checkout';
118
+ if (install.kind === 'unmanaged')
119
+ return 'unmanaged';
120
+ let setting;
121
+ try {
122
+ setting = await this.deps.getSettingEnabled();
123
+ }
124
+ catch {
125
+ setting = undefined;
126
+ }
127
+ const sw = resolveAutoUpdateSwitch(setting, this.deps.env);
128
+ if (!isSwitchOn(sw))
129
+ return sw;
130
+ if (!this.deps.hasSupervisor())
131
+ return 'no-supervisor';
132
+ return sw;
133
+ }
134
+ /**
135
+ * One check → (maybe) install → verify → restart pass.
136
+ *
137
+ * @returns How it ended
138
+ */
139
+ async runCycle() {
140
+ if (this.running)
141
+ return { outcome: 'skipped', detail: 'cycle already running' };
142
+ this.running = true;
143
+ try {
144
+ return await this.runCycleInner();
145
+ }
146
+ finally {
147
+ this.running = false;
148
+ }
149
+ }
150
+ /**
151
+ * Body of {@link runCycle}.
152
+ *
153
+ * @returns How it ended
154
+ */
155
+ async runCycleInner() {
156
+ const mode = await this.describeMode();
157
+ this.logModeOnce(mode);
158
+ this.updateState({ mode, currentVersion: this.deps.currentVersion });
159
+ if (mode !== 'enabled' && mode !== 'enabled-env') {
160
+ return { outcome: 'skipped', detail: mode };
161
+ }
162
+ if (this.deps.isRestartInProgress()) {
163
+ return { outcome: 'skipped', detail: 'restart already in progress' };
164
+ }
165
+ const current = this.deps.currentVersion;
166
+ const packageRoot = this.deps.install.packageRoot;
167
+ const prefix = this.deps.install.prefix;
168
+ if (!current || !packageRoot || !prefix) {
169
+ return { outcome: 'skipped', detail: 'running version or prefix unknown' };
170
+ }
171
+ const state = this.getState();
172
+ const now = this.deps.now();
173
+ if (state.backoffUntil && Date.parse(state.backoffUntil) > now) {
174
+ return { outcome: 'backoff', detail: `until ${state.backoffUntil}` };
175
+ }
176
+ const latest = await this.deps.fetchLatestVersion(current);
177
+ this.updateState({ lastCheckAt: new Date(now).toISOString(), ...(latest ? { latestVersion: latest } : {}) });
178
+ if (!latest) {
179
+ this.log('Registry check failed; will retry at the next interval');
180
+ return { outcome: 'check-failed' };
181
+ }
182
+ if (!isNewerVersion(latest, current)) {
183
+ this.busySince = null;
184
+ return { outcome: 'up-to-date', version: latest };
185
+ }
186
+ // Quiet window: idle now, and still idle a minute later.
187
+ const quiet = await this.isQuiet();
188
+ if (!quiet.ok)
189
+ return this.deferBusy(latest, quiet.reason);
190
+ await this.deps.sleep(AUTO_UPDATE_CONSTANTS.QUIET_CONFIRM_MS);
191
+ const stillQuiet = await this.isQuiet();
192
+ if (!stillQuiet.ok)
193
+ return this.deferBusy(latest, stillQuiet.reason);
194
+ if (this.deps.isRestartInProgress()) {
195
+ return { outcome: 'skipped', detail: 'restart already in progress' };
196
+ }
197
+ this.busySince = null;
198
+ // Install into the prefix the running copy lives in.
199
+ const args = npmInstallArgs(prefix, latest);
200
+ this.log(`Installing ${AUTO_UPDATE_CONSTANTS.PACKAGE_NAME}@${latest} (running ${current}): ${this.deps.npmCommand} ${args.join(' ')}`);
201
+ let result;
202
+ try {
203
+ result = await this.deps.runInstall(this.deps.npmCommand, args);
204
+ }
205
+ catch (error) {
206
+ result = { ok: false, code: null, outputTail: error instanceof Error ? error.message : String(error) };
207
+ }
208
+ if (!result.ok) {
209
+ return this.recordFailure('install-failed', latest, `npm exited with ${result.code ?? 'a signal'}: ${lastLine(result.outputTail)}`);
210
+ }
211
+ const installed = this.deps.readInstalledVersion(packageRoot);
212
+ if (installed !== latest) {
213
+ return this.recordFailure('verify-failed', latest, `installed package.json says ${installed ?? 'nothing'}, expected ${latest}`);
214
+ }
215
+ this.log(`Installed and verified ${latest} at ${packageRoot}`);
216
+ try {
217
+ this.deps.afterInstall(packageRoot);
218
+ }
219
+ catch {
220
+ // Best-effort
221
+ }
222
+ const marker = { fromVersion: current, toVersion: latest, at: new Date(this.deps.now()).toISOString() };
223
+ try {
224
+ writePendingMarker(this.markerPath, marker);
225
+ }
226
+ catch (error) {
227
+ this.log(`Could not write the upgrade marker (the owner notice will be missing): ${error instanceof Error ? error.message : String(error)}`);
228
+ }
229
+ const restarting = this.deps.requestRestart(`auto-update ${current} -> ${latest}`);
230
+ if (!restarting) {
231
+ try {
232
+ fs.unlinkSync(this.markerPath);
233
+ }
234
+ catch {
235
+ // Not written
236
+ }
237
+ return this.recordFailure('restart-unavailable', latest, 'no graceful restart handler is registered');
238
+ }
239
+ this.log(`Restarting into ${latest}`);
240
+ this.updateState({ lastResult: { outcome: 'installed-restarting', at: new Date(this.deps.now()).toISOString(), version: latest } });
241
+ return { outcome: 'installed-restarting', version: latest };
242
+ }
243
+ /**
244
+ * Whether nothing is busy. A stale in_progress flag stops blocking after
245
+ * MAX_BUSY_DEFER_MS; a turn in flight always blocks.
246
+ *
247
+ * @returns ok, or the reason it is not
248
+ */
249
+ async isQuiet() {
250
+ let busy;
251
+ try {
252
+ busy = await this.deps.getBusy();
253
+ }
254
+ catch (error) {
255
+ return { ok: false, reason: `busy check failed: ${error instanceof Error ? error.message : String(error)}` };
256
+ }
257
+ if (busy.midTurn.length > 0)
258
+ return { ok: false, reason: `turns in flight: ${busy.midTurn.join(', ')}` };
259
+ if (busy.inProgress.length > 0) {
260
+ const deferredFor = this.busySince === null ? 0 : this.deps.now() - this.busySince;
261
+ if (deferredFor < AUTO_UPDATE_CONSTANTS.MAX_BUSY_DEFER_MS) {
262
+ return { ok: false, reason: `agents in_progress: ${busy.inProgress.join(', ')}` };
263
+ }
264
+ this.log(`Agents still marked in_progress after ${Math.round(deferredFor / 3_600_000)} h with no turn in flight; not waiting for them any longer: ${busy.inProgress.join(', ')}`);
265
+ }
266
+ return { ok: true, reason: '' };
267
+ }
268
+ /**
269
+ * Record a busy deferral.
270
+ *
271
+ * @param version - Target version
272
+ * @param reason - What is busy
273
+ * @returns Cycle result
274
+ */
275
+ deferBusy(version, reason) {
276
+ if (this.busySince === null)
277
+ this.busySince = this.deps.now();
278
+ this.log(`Update to ${version} deferred: ${reason}`);
279
+ this.updateState({ lastResult: { outcome: 'deferred-busy', at: new Date(this.deps.now()).toISOString(), version, message: reason } });
280
+ return { outcome: 'deferred-busy', version, detail: reason };
281
+ }
282
+ /**
283
+ * Record a failure, back off, and tell the owner once per target version
284
+ * after repeated failures.
285
+ *
286
+ * @param outcome - Failure kind
287
+ * @param version - Target version
288
+ * @param reason - Why
289
+ * @returns Cycle result
290
+ */
291
+ recordFailure(outcome, version, reason) {
292
+ const state = this.getState();
293
+ const failures = state.consecutiveFailures + 1;
294
+ const now = this.deps.now();
295
+ const backoffUntil = new Date(now + AUTO_UPDATE_CONSTANTS.FAILURE_BACKOFF_MS).toISOString();
296
+ this.log(`Auto-update to ${version} failed (${outcome}, ${failures} in a row): ${reason}. Next attempt after ${backoffUntil}; not restarting.`);
297
+ this.deps.logger.warn('Auto-update failed; backing off', { outcome, version, failures, reason });
298
+ const notify = failures >= AUTO_UPDATE_CONSTANTS.FAILURE_NOTIFY_THRESHOLD && state.failureNotifiedVersion !== version;
299
+ this.updateState({
300
+ consecutiveFailures: failures,
301
+ backoffUntil,
302
+ lastResult: { outcome, at: new Date(now).toISOString(), version, message: reason },
303
+ ...(notify ? { failureNotifiedVersion: version } : {}),
304
+ });
305
+ if (notify) {
306
+ void this.notify(async (device) => ({
307
+ title: `Crewly 自动升级失败(本机:${device})`,
308
+ message: composeFailureNotice(version, device, failures, reason),
309
+ }));
310
+ }
311
+ return { outcome, version, detail: reason };
312
+ }
313
+ /**
314
+ * Boot half of the upgrade: consume the marker; when this process runs the
315
+ * version it names, record success and DM the owner.
316
+ */
317
+ handleBootMarker() {
318
+ let marker = null;
319
+ try {
320
+ marker = consumePendingMarker(this.markerPath);
321
+ }
322
+ catch {
323
+ marker = null;
324
+ }
325
+ if (!marker)
326
+ return;
327
+ const age = this.deps.now() - Date.parse(marker.at);
328
+ if (!(age >= 0 && age < AUTO_UPDATE_CONSTANTS.MARKER_MAX_AGE_MS)) {
329
+ this.log(`Ignoring a stale upgrade marker (${marker.fromVersion} -> ${marker.toVersion}, written ${marker.at})`);
330
+ return;
331
+ }
332
+ const running = this.deps.currentVersion;
333
+ if (running !== marker.toVersion) {
334
+ this.log(`Restarted after installing ${marker.toVersion} but running ${running ?? 'unknown'}`);
335
+ this.recordFailure('verify-failed', marker.toVersion, `restarted onto ${running ?? 'an unknown version'} instead of ${marker.toVersion}`);
336
+ return;
337
+ }
338
+ this.pendingNotice = marker;
339
+ this.log(`Now running ${marker.toVersion} (upgraded from ${marker.fromVersion})`);
340
+ this.updateState({
341
+ consecutiveFailures: 0,
342
+ backoffUntil: null,
343
+ failureNotifiedVersion: null,
344
+ currentVersion: running,
345
+ lastResult: { outcome: 'upgraded', at: new Date(this.deps.now()).toISOString(), version: running, message: `from ${marker.fromVersion}` },
346
+ });
347
+ const { toVersion, fromVersion } = marker;
348
+ void this.notify(async (device) => ({ title: composeUpgradedNotice(toVersion, device), message: `之前版本:${fromVersion}` }));
349
+ }
350
+ /**
351
+ * Send an owner notice once the channel is up (waits up to NOTIFY_WAIT_MS).
352
+ *
353
+ * @param compose - Builds the notice from the device name
354
+ * @returns True when sent
355
+ */
356
+ async notify(compose) {
357
+ try {
358
+ const deadline = this.deps.now() + AUTO_UPDATE_CONSTANTS.NOTIFY_WAIT_MS;
359
+ while (!this.deps.isNotifyReady()) {
360
+ if (this.stopped || this.deps.now() >= deadline) {
361
+ this.log('Owner channel not connected; notice not sent');
362
+ return false;
363
+ }
364
+ await this.deps.sleep(AUTO_UPDATE_CONSTANTS.NOTIFY_POLL_MS);
365
+ }
366
+ let device;
367
+ try {
368
+ device = await this.deps.getDeviceName();
369
+ }
370
+ catch {
371
+ device = os.hostname();
372
+ }
373
+ const { title, message } = await compose(device);
374
+ await this.deps.notifyOwner(title, message);
375
+ this.log(`Owner notified: ${title}`);
376
+ return true;
377
+ }
378
+ catch (error) {
379
+ this.log(`Owner notice failed: ${error instanceof Error ? error.message : String(error)}`);
380
+ return false;
381
+ }
382
+ }
383
+ /**
384
+ * Schedule the next cycle.
385
+ *
386
+ * @param ms - Delay
387
+ */
388
+ scheduleNext(ms) {
389
+ if (this.stopped)
390
+ return;
391
+ if (this.timer !== null)
392
+ this.deps.cancel(this.timer);
393
+ this.timer = this.deps.schedule(() => {
394
+ this.timer = null;
395
+ void this.tick();
396
+ }, ms);
397
+ }
398
+ /**
399
+ * Timer body: run a cycle and pick the next delay from its outcome.
400
+ */
401
+ async tick() {
402
+ let result;
403
+ try {
404
+ result = await this.runCycle();
405
+ }
406
+ catch (error) {
407
+ this.deps.logger.error('Auto-update cycle crashed', { error: error instanceof Error ? error.message : String(error) });
408
+ result = { outcome: 'check-failed' };
409
+ }
410
+ if (result.outcome === 'installed-restarting')
411
+ return;
412
+ this.scheduleNext(result.outcome === 'deferred-busy' ? AUTO_UPDATE_CONSTANTS.BUSY_RETRY_MS : AUTO_UPDATE_CONSTANTS.CHECK_INTERVAL_MS);
413
+ }
414
+ /**
415
+ * Log the mode when it changes (so "dev checkout — auto-update off" is
416
+ * said once, not every 3 hours).
417
+ *
418
+ * @param mode - Current mode
419
+ */
420
+ logModeOnce(mode) {
421
+ if (mode === this.lastLoggedMode)
422
+ return;
423
+ this.lastLoggedMode = mode;
424
+ const line = describeModeLine(mode, this.deps.install);
425
+ this.deps.logger.info(line, { mode });
426
+ this.log(line);
427
+ }
428
+ /**
429
+ * Merge a patch into the status file (best-effort).
430
+ *
431
+ * @param patch - Fields to change
432
+ */
433
+ updateState(patch) {
434
+ try {
435
+ writeAutoUpdateState(this.statePath, { ...this.getState(), ...patch });
436
+ }
437
+ catch (error) {
438
+ this.deps.logger.warn('Could not write auto-update state', { error: error instanceof Error ? error.message : String(error) });
439
+ }
440
+ }
441
+ /**
442
+ * Append a timestamped line to auto-update.log.
443
+ *
444
+ * @param line - Text
445
+ */
446
+ log(line) {
447
+ try {
448
+ this.deps.appendLog(`${new Date(this.deps.now()).toISOString()} ${line}`);
449
+ }
450
+ catch {
451
+ // Logging must never break the updater
452
+ }
453
+ }
454
+ }
455
+ /**
456
+ * Human-readable line for a mode.
457
+ *
458
+ * @param mode - Mode from {@link AutoUpdateService.describeMode}
459
+ * @param install - Install info
460
+ * @returns Log line
461
+ */
462
+ export function describeModeLine(mode, install) {
463
+ switch (mode) {
464
+ case 'dev-checkout':
465
+ return `dev checkout — auto-update off (${install.packageRoot})`;
466
+ case 'unmanaged':
467
+ return `not an npm global install — auto-update off (${install.detail})`;
468
+ case 'disabled-setting':
469
+ return 'auto-update off (Settings → General)';
470
+ case 'disabled-env':
471
+ return `auto-update off (${AUTO_UPDATE_CONSTANTS.ENV_VAR})`;
472
+ case 'no-supervisor':
473
+ return 'auto-update off: no crewly start parent to bring the backend back after a restart';
474
+ default:
475
+ return `auto-update on (${install.detail})`;
476
+ }
477
+ }
478
+ /**
479
+ * Last non-empty line of a text.
480
+ *
481
+ * @param text - Output
482
+ * @returns The last line, trimmed
483
+ */
484
+ function lastLine(text) {
485
+ const lines = text.split('\n').map((l) => l.trim()).filter(Boolean);
486
+ return lines[lines.length - 1] ?? '';
487
+ }
488
+ /**
489
+ * Run npm, appending its output to the log, killing it after the timeout.
490
+ *
491
+ * @param command - npm executable
492
+ * @param args - Arguments
493
+ * @param appendLog - Log sink
494
+ * @param timeoutMs - Kill after this long
495
+ * @returns Exit status and output tail
496
+ */
497
+ export function runNpmInstall(command, args, appendLog, timeoutMs = AUTO_UPDATE_CONSTANTS.INSTALL_TIMEOUT_MS) {
498
+ return new Promise((resolve) => {
499
+ let output = '';
500
+ const child = spawn(command, args, {
501
+ stdio: ['ignore', 'pipe', 'pipe'],
502
+ // npm is npm.cmd on Windows; elsewhere no shell so paths with spaces stay one argument.
503
+ shell: process.platform === 'win32',
504
+ env: process.env,
505
+ });
506
+ const onData = (chunk) => {
507
+ const text = chunk.toString();
508
+ output = (output + text).slice(-8_000);
509
+ for (const line of text.split('\n'))
510
+ if (line.trim())
511
+ appendLog(` npm: ${line.trimEnd()}`);
512
+ };
513
+ child.stdout?.on('data', onData);
514
+ child.stderr?.on('data', onData);
515
+ const timer = setTimeout(() => {
516
+ appendLog(` npm: timed out after ${timeoutMs} ms; killing`);
517
+ child.kill('SIGKILL');
518
+ }, timeoutMs);
519
+ child.on('error', (error) => {
520
+ clearTimeout(timer);
521
+ resolve({ ok: false, code: null, outputTail: error.message });
522
+ });
523
+ child.on('close', (code) => {
524
+ clearTimeout(timer);
525
+ resolve({ ok: code === 0, code, outputTail: output });
526
+ });
527
+ });
528
+ }
529
+ /**
530
+ * Build the service with the real filesystem, npm, clock and timers.
531
+ *
532
+ * @param wiring - Server hooks
533
+ * @returns The service (not started)
534
+ */
535
+ export function createAutoUpdateService(wiring) {
536
+ const packageRoot = resolveRunningPackageRoot(process.argv[1], safeCwd());
537
+ const install = detectInstall(packageRoot);
538
+ const logDir = path.join(wiring.crewlyHome, CREWLY_CONSTANTS.PATHS.LOGS_DIR);
539
+ const logFile = path.join(logDir, AUTO_UPDATE_CONSTANTS.LOG_FILE);
540
+ const appendLog = (line) => {
541
+ fs.mkdirSync(logDir, { recursive: true });
542
+ fs.appendFileSync(logFile, `${line}\n`, 'utf-8');
543
+ };
544
+ const logger = LoggerService.getInstance().createComponentLogger('AutoUpdate');
545
+ return new AutoUpdateService({
546
+ crewlyHome: wiring.crewlyHome,
547
+ install,
548
+ currentVersion: packageRoot ? readInstalledVersion(packageRoot) : null,
549
+ getSettingEnabled: wiring.getSettingEnabled,
550
+ env: process.env,
551
+ hasSupervisor: () => hasRestartSupervisor(process.env),
552
+ fetchLatestVersion: wiring.fetchLatestVersion,
553
+ isRestartInProgress: wiring.isRestartInProgress,
554
+ getBusy: wiring.getBusy,
555
+ runInstall: (command, args) => runNpmInstall(command, args, appendLog),
556
+ npmCommand: resolveNpmCommand(),
557
+ readInstalledVersion,
558
+ requestRestart: (reason) => wiring.requestRestart(reason, PROCESS_EXIT_CODES.RESTART_REQUESTED),
559
+ isNotifyReady: wiring.isNotifyReady,
560
+ notifyOwner: wiring.notifyOwner,
561
+ getDeviceName: wiring.getDeviceName,
562
+ // npm replaced the package directory (new inode): the old cwd is gone,
563
+ // and anything calling process.cwd() during shutdown would throw ENOENT.
564
+ afterInstall: (root) => process.chdir(root),
565
+ appendLog,
566
+ logger,
567
+ now: Date.now,
568
+ sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
569
+ schedule: (fn, ms) => {
570
+ const t = setTimeout(fn, ms);
571
+ t.unref?.();
572
+ return t;
573
+ },
574
+ cancel: (handle) => clearTimeout(handle),
575
+ });
576
+ }
577
+ /**
578
+ * process.cwd(), or undefined when the cwd was deleted.
579
+ *
580
+ * @returns The cwd or undefined
581
+ */
582
+ function safeCwd() {
583
+ try {
584
+ return process.cwd();
585
+ }
586
+ catch {
587
+ return undefined;
588
+ }
589
+ }
590
+ //# sourceMappingURL=auto-update.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-update.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/system/auto-update.service.ts"],"names":[],"mappings":"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"}