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.
- package/config/constants.ts +59 -0
- package/config/index.ts +2 -0
- package/config/skills/orchestrator/delegate-task/execute.sh +11 -0
- package/config/skills/orchestrator/delegate-task/execute.test.sh +38 -0
- package/config/skills/orchestrator/reply-chat/SKILL.md +11 -1
- package/config/skills/orchestrator/reply-chat/execute.sh +13 -1
- package/config/skills/orchestrator/reply-slack/SKILL.md +1 -0
- package/config/skills/orchestrator/reply-slack/execute.sh +11 -2
- package/dist/backend/backend/src/constants.d.ts +43 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +24 -1
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +36 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +69 -7
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +4 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +9 -2
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +8 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +71 -2
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +5 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +15 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +20 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts +217 -0
- package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/orc-reply-route.service.js +300 -0
- package/dist/backend/backend/src/services/orc/orc-reply-route.service.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +32 -2
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +59 -5
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +4 -2
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +6 -3
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/system/auto-update.service.d.ts +292 -0
- package/dist/backend/backend/src/services/system/auto-update.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/system/auto-update.service.js +590 -0
- package/dist/backend/backend/src/services/system/auto-update.service.js.map +1 -0
- package/dist/backend/backend/src/services/system/auto-update.utils.d.ts +265 -0
- package/dist/backend/backend/src/services/system/auto-update.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/system/auto-update.utils.js +397 -0
- package/dist/backend/backend/src/services/system/auto-update.utils.js.map +1 -0
- package/dist/backend/backend/src/services/system/version-check.service.d.ts +15 -1
- package/dist/backend/backend/src/services/system/version-check.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/system/version-check.service.js +21 -2
- package/dist/backend/backend/src/services/system/version-check.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +7 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +14 -2
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/cascade-request-status.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/cascade-request-status.js +16 -1
- package/dist/backend/backend/src/services/v3/cascade-request-status.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request-completion.d.ts +128 -0
- package/dist/backend/backend/src/services/v3/request-completion.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/request-completion.js +311 -0
- package/dist/backend/backend/src/services/v3/request-completion.js.map +1 -0
- package/dist/backend/backend/src/services/v3/request-decompose.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js +3 -0
- package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request-status-update.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js +17 -3
- package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +8 -0
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.js +11 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts +8 -0
- package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.js +4 -0
- package/dist/backend/backend/src/types/settings.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +56 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +57 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +2 -2
- package/dist/backend/config/index.d.ts.map +1 -1
- package/dist/backend/config/index.js +2 -2
- package/dist/backend/config/index.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +43 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +24 -1
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +5 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +15 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +20 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts +217 -0
- package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/orc-reply-route.service.js +300 -0
- package/dist/cli/backend/src/services/orc/orc-reply-route.service.js.map +1 -0
- package/dist/cli/backend/src/services/system/auto-update.utils.d.ts +265 -0
- package/dist/cli/backend/src/services/system/auto-update.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/system/auto-update.utils.js +397 -0
- package/dist/cli/backend/src/services/system/auto-update.utils.js.map +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +7 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +14 -2
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/request-completion.d.ts +128 -0
- package/dist/cli/backend/src/services/v3/request-completion.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/request-completion.js +311 -0
- package/dist/cli/backend/src/services/v3/request-completion.js.map +1 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts +8 -0
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/v3-data.service.js +11 -1
- package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts +8 -0
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +4 -0
- package/dist/cli/backend/src/types/settings.types.js.map +1 -1
- package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/start.js +14 -3
- package/dist/cli/cli/src/commands/start.js.map +1 -1
- package/dist/cli/cli/src/commands/update-status.d.ts +85 -0
- package/dist/cli/cli/src/commands/update-status.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/update-status.js +162 -0
- package/dist/cli/cli/src/commands/update-status.js.map +1 -0
- package/dist/cli/cli/src/constants.d.ts +1 -1
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +1 -1
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +7 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/backend-respawn.d.ts +50 -0
- package/dist/cli/cli/src/utils/backend-respawn.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/backend-respawn.js +59 -0
- package/dist/cli/cli/src/utils/backend-respawn.js.map +1 -0
- package/dist/cli/config/constants.d.ts +56 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +57 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +2 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +2 -2
- package/dist/cli/config/index.js.map +1 -1
- package/frontend/dist/assets/{index-e05af897.js → index-71670b91.js} +22 -22
- package/frontend/dist/index.html +1 -1
- 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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"}
|