crewly 1.20.143 → 1.20.145
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/roles/orchestrator/prompt.md +9 -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/harness-login/SKILL.md +88 -0
- package/config/skills/orchestrator/harness-login/execute.sh +75 -0
- package/config/skills/orchestrator/harness-login/execute.test.sh +72 -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 +55 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +36 -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/harness/harness.routes.d.ts +1 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/harness/harness.routes.js +3 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts +61 -0
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +133 -0
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.js.map +1 -0
- 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 +75 -3
- 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 +28 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts +11 -1
- package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/codex-runtime.service.js +18 -0
- package/dist/backend/backend/src/services/agent/codex-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +12 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +18 -3
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +29 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +48 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.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/harness/harness-relogin.service.d.ts +147 -5
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js +210 -20
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/owner-login-request.d.ts +87 -0
- package/dist/backend/backend/src/services/harness/owner-login-request.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/owner-login-request.js +191 -0
- package/dist/backend/backend/src/services/harness/owner-login-request.js.map +1 -0
- 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/slack/slack-relogin-dm.service.d.ts +68 -9
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.js +121 -11
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.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/backend/src/utils/agent-reply-filter.utils.d.ts +75 -0
- package/dist/backend/backend/src/utils/agent-reply-filter.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/agent-reply-filter.utils.js +127 -0
- package/dist/backend/backend/src/utils/agent-reply-filter.utils.js.map +1 -0
- 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 +55 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +36 -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 +28 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +11 -1
- package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/codex-runtime.service.js +18 -0
- package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +12 -0
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +18 -3
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +29 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +48 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.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/harness/harness-relogin.service.d.ts +147 -5
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js +210 -20
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/owner-login-request.d.ts +87 -0
- package/dist/cli/backend/src/services/harness/owner-login-request.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/owner-login-request.js +191 -0
- package/dist/cli/backend/src/services/harness/owner-login-request.js.map +1 -0
- 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/backend/src/utils/agent-reply-filter.utils.d.ts +75 -0
- package/dist/cli/backend/src/utils/agent-reply-filter.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/agent-reply-filter.utils.js +127 -0
- package/dist/cli/backend/src/utils/agent-reply-filter.utils.js.map +1 -0
- 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
- package/packages/crewly-agent/src/runtime/agent-runner.service.test.ts +39 -0
- package/packages/crewly-agent/src/runtime/agent-runner.service.ts +17 -17
- package/packages/crewly-agent/src/runtime/interactive-login-guard.test.ts +60 -0
- package/packages/crewly-agent/src/runtime/interactive-login-guard.ts +76 -0
- package/packages/crewly-agent/src/runtime/reply-tool-calls.test.ts +53 -0
- package/packages/crewly-agent/src/runtime/reply-tool-calls.ts +76 -0
- package/packages/crewly-agent/src/runtime/tool-registry.test.ts +8 -0
- package/packages/crewly-agent/src/runtime/tool-registry.ts +14 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-update helpers — pure / filesystem-only pieces of the self-update
|
|
3
|
+
* (specs/auto-update.md), kept apart from the service so each rule is
|
|
4
|
+
* testable without timers:
|
|
5
|
+
*
|
|
6
|
+
* - where the running copy lives and what kind of install it is (npm global,
|
|
7
|
+
* user-prefix npm, dev checkout, anything else);
|
|
8
|
+
* - the `npm install -g` arguments that target that same prefix;
|
|
9
|
+
* - the on/off decision (setting + env override);
|
|
10
|
+
* - whether a supervisor will bring the backend back after RESTART_REQUESTED;
|
|
11
|
+
* - the status file (`crewly update-status`) and the pending-upgrade marker.
|
|
12
|
+
*
|
|
13
|
+
* @module services/system/auto-update.utils
|
|
14
|
+
*/
|
|
15
|
+
/** What kind of install the running copy is. */
|
|
16
|
+
export type InstallKind = 'npm-global' | 'dev-checkout' | 'unmanaged';
|
|
17
|
+
/** Where and how the running copy is installed. */
|
|
18
|
+
export interface InstallInfo {
|
|
19
|
+
/** Install kind */
|
|
20
|
+
kind: InstallKind;
|
|
21
|
+
/** Real path of the Crewly package root (null when not found) */
|
|
22
|
+
packageRoot: string | null;
|
|
23
|
+
/** npm prefix the package lives under (npm-global only) */
|
|
24
|
+
prefix: string | null;
|
|
25
|
+
/** Human-readable reason, used in the skip log line */
|
|
26
|
+
detail: string;
|
|
27
|
+
}
|
|
28
|
+
/** Why auto-update is on or off. */
|
|
29
|
+
export type AutoUpdateSwitch = 'enabled' | 'disabled-setting' | 'disabled-env' | 'enabled-env';
|
|
30
|
+
/** How the last auto-update attempt ended. */
|
|
31
|
+
export type AutoUpdateOutcome = 'up-to-date' | 'deferred-busy' | 'installed-restarting' | 'upgraded' | 'install-failed' | 'verify-failed' | 'restart-unavailable' | 'check-failed' | 'skipped';
|
|
32
|
+
/** Persisted status of the auto-updater (`<crewlyHome>/auto-update-state.json`). */
|
|
33
|
+
export interface AutoUpdateState {
|
|
34
|
+
/** Version this backend is running */
|
|
35
|
+
currentVersion: string | null;
|
|
36
|
+
/** Latest version the registry reported */
|
|
37
|
+
latestVersion: string | null;
|
|
38
|
+
/** ISO time of the last registry check */
|
|
39
|
+
lastCheckAt: string | null;
|
|
40
|
+
/** Whether the updater would act, and why not when it would not */
|
|
41
|
+
mode: string;
|
|
42
|
+
/** How the last attempt ended */
|
|
43
|
+
lastResult: {
|
|
44
|
+
outcome: AutoUpdateOutcome;
|
|
45
|
+
at: string;
|
|
46
|
+
version?: string;
|
|
47
|
+
message?: string;
|
|
48
|
+
} | null;
|
|
49
|
+
/** Failed attempts in a row (reset on success) */
|
|
50
|
+
consecutiveFailures: number;
|
|
51
|
+
/** ISO time before which no new attempt is made */
|
|
52
|
+
backoffUntil: string | null;
|
|
53
|
+
/** Target version the owner was already told about (one failure DM per version) */
|
|
54
|
+
failureNotifiedVersion: string | null;
|
|
55
|
+
}
|
|
56
|
+
/** Marker persisted before an upgrade restart and read on the next boot. */
|
|
57
|
+
export interface PendingUpgradeMarker {
|
|
58
|
+
/** Version the process was running before the restart */
|
|
59
|
+
fromVersion: string;
|
|
60
|
+
/** Version that was installed */
|
|
61
|
+
toVersion: string;
|
|
62
|
+
/** ISO time the marker was written */
|
|
63
|
+
at: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Resolve symlinks when the path exists.
|
|
67
|
+
*
|
|
68
|
+
* @param p - Path
|
|
69
|
+
* @returns Real path, or the resolved path when it does not exist
|
|
70
|
+
*/
|
|
71
|
+
export declare function realOrResolved(p: string): string;
|
|
72
|
+
/**
|
|
73
|
+
* Walk up from `startDir` to the directory whose package.json is `crewly`.
|
|
74
|
+
*
|
|
75
|
+
* @param startDir - Directory to start from
|
|
76
|
+
* @returns The package root, or null when none is found
|
|
77
|
+
*/
|
|
78
|
+
export declare function findCrewlyPackageRoot(startDir: string): string | null;
|
|
79
|
+
/**
|
|
80
|
+
* Package root of the running backend, anchored on the entry script
|
|
81
|
+
* (`process.argv[1]`, e.g. `<root>/dist/backend/backend/src/index.js`) rather
|
|
82
|
+
* than the cwd — after `npm install -g` replaces the package directory the
|
|
83
|
+
* old cwd no longer exists.
|
|
84
|
+
*
|
|
85
|
+
* @param argv1 - Entry script path (defaults to process.argv[1])
|
|
86
|
+
* @param cwd - Fallback start directory
|
|
87
|
+
* @returns Real path of the package root, or null
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveRunningPackageRoot(argv1?: string | undefined, cwd?: string): string | null;
|
|
90
|
+
/**
|
|
91
|
+
* The npm prefix a package root was installed under, when it is a global
|
|
92
|
+
* install: `<prefix>/lib/node_modules/crewly` on POSIX,
|
|
93
|
+
* `<prefix>\node_modules\crewly` on Windows. Covers the default global prefix
|
|
94
|
+
* (nvm, Homebrew, /usr/local) and the user prefix (`<crewlyHome>/npm-global`)
|
|
95
|
+
* alike — installing with `--prefix <that>` replaces exactly the running copy
|
|
96
|
+
* even when a different `npm` is first on PATH.
|
|
97
|
+
*
|
|
98
|
+
* @param packageRoot - Real path of the package root
|
|
99
|
+
* @param platform - Platform (tests)
|
|
100
|
+
* @returns The prefix, or null for anything that is not a global install
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* derivePrefixFromPackageRoot('/usr/local/lib/node_modules/crewly'); // '/usr/local'
|
|
105
|
+
* derivePrefixFromPackageRoot('/home/me/.crewly/npm-global/lib/node_modules/crewly'); // '/home/me/.crewly/npm-global'
|
|
106
|
+
* derivePrefixFromPackageRoot('/home/me/proj/node_modules/crewly'); // null (local dependency)
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export declare function derivePrefixFromPackageRoot(packageRoot: string, platform?: NodeJS.Platform): string | null;
|
|
110
|
+
/**
|
|
111
|
+
* Whether a directory is a git working tree root (`.git` directory, or the
|
|
112
|
+
* `.git` file of a worktree).
|
|
113
|
+
*
|
|
114
|
+
* @param dir - Directory
|
|
115
|
+
* @returns True when `.git` exists there
|
|
116
|
+
*/
|
|
117
|
+
export declare function isGitWorkingTree(dir: string): boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Classify the running install.
|
|
120
|
+
*
|
|
121
|
+
* - `dev-checkout`: the package root is a git working tree (e.g. the owner's
|
|
122
|
+
* `crewly/` repo running its own build, or an `npm link` that resolves into
|
|
123
|
+
* it). It must never npm-install over itself.
|
|
124
|
+
* - `npm-global`: the root sits in `<prefix>/lib/node_modules/crewly`.
|
|
125
|
+
* - `unmanaged`: anything else (Docker image at /app, a local dependency, an
|
|
126
|
+
* npx cache) — nobody owns an in-place upgrade there.
|
|
127
|
+
*
|
|
128
|
+
* @param packageRoot - Real path of the package root (null when unknown)
|
|
129
|
+
* @param platform - Platform (tests)
|
|
130
|
+
* @returns Install info
|
|
131
|
+
*/
|
|
132
|
+
export declare function detectInstall(packageRoot: string | null, platform?: NodeJS.Platform): InstallInfo;
|
|
133
|
+
/**
|
|
134
|
+
* `npm` arguments that install `crewly@<version>` over the running copy.
|
|
135
|
+
*
|
|
136
|
+
* @param prefix - Prefix from {@link derivePrefixFromPackageRoot}
|
|
137
|
+
* @param version - Exact target version
|
|
138
|
+
* @returns Arguments for npm
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```ts
|
|
142
|
+
* npmInstallArgs('/usr/local', '1.20.144');
|
|
143
|
+
* // ['install', '-g', '--prefix', '/usr/local', 'crewly@1.20.144']
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export declare function npmInstallArgs(prefix: string, version: string): string[];
|
|
147
|
+
/**
|
|
148
|
+
* The npm executable that belongs to the running node, when it sits next to
|
|
149
|
+
* it (nvm, official installers); plain `npm` from PATH otherwise.
|
|
150
|
+
*
|
|
151
|
+
* @param execPath - Running node binary (defaults to process.execPath)
|
|
152
|
+
* @param platform - Platform (tests)
|
|
153
|
+
* @returns Command to run
|
|
154
|
+
*/
|
|
155
|
+
export declare function resolveNpmCommand(execPath?: string, platform?: NodeJS.Platform): string;
|
|
156
|
+
/**
|
|
157
|
+
* Version in `<packageRoot>/package.json`, read fresh from disk.
|
|
158
|
+
*
|
|
159
|
+
* @param packageRoot - Package root
|
|
160
|
+
* @returns The version, or null when unreadable
|
|
161
|
+
*/
|
|
162
|
+
export declare function readInstalledVersion(packageRoot: string): string | null;
|
|
163
|
+
/**
|
|
164
|
+
* Whether `latest` is a strictly newer semver than `current`
|
|
165
|
+
* (numeric major.minor.patch; pre-release tags are ignored).
|
|
166
|
+
*
|
|
167
|
+
* @param latest - Candidate version
|
|
168
|
+
* @param current - Running version
|
|
169
|
+
* @returns True when latest > current
|
|
170
|
+
*/
|
|
171
|
+
export declare function isNewerVersion(latest: string, current: string): boolean;
|
|
172
|
+
/**
|
|
173
|
+
* Resolve the on/off switch: the env override wins over the setting.
|
|
174
|
+
*
|
|
175
|
+
* @param settingValue - `settings.general.autoUpdate` (undefined = default on)
|
|
176
|
+
* @param env - Environment
|
|
177
|
+
* @returns The switch state
|
|
178
|
+
*
|
|
179
|
+
* @example
|
|
180
|
+
* ```ts
|
|
181
|
+
* resolveAutoUpdateSwitch(true, { CREWLY_AUTO_UPDATE: '0' }); // 'disabled-env'
|
|
182
|
+
* resolveAutoUpdateSwitch(false, {}); // 'disabled-setting'
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
export declare function resolveAutoUpdateSwitch(settingValue: boolean | undefined, env?: NodeJS.ProcessEnv): AutoUpdateSwitch;
|
|
186
|
+
/**
|
|
187
|
+
* Whether a switch state means "on".
|
|
188
|
+
*
|
|
189
|
+
* @param state - Switch state
|
|
190
|
+
* @returns True when enabled
|
|
191
|
+
*/
|
|
192
|
+
export declare function isSwitchOn(state: AutoUpdateSwitch): boolean;
|
|
193
|
+
/**
|
|
194
|
+
* Read the command line of a process (POSIX only; `/proc` on Linux, `ps`
|
|
195
|
+
* elsewhere).
|
|
196
|
+
*
|
|
197
|
+
* @param pid - Process id
|
|
198
|
+
* @returns The command line, or null
|
|
199
|
+
*/
|
|
200
|
+
export declare function readProcessCommandLine(pid: number): string | null;
|
|
201
|
+
/**
|
|
202
|
+
* Whether a supervisor will respawn the backend after it exits with
|
|
203
|
+
* RESTART_REQUESTED. That supervisor is `crewly start` (foreground, under the
|
|
204
|
+
* macOS login-item wrapper, under systemd, or under the desktop app). New
|
|
205
|
+
* CLIs say so in the env; an older CLI parent is recognised by its command line.
|
|
206
|
+
*
|
|
207
|
+
* @param env - Environment
|
|
208
|
+
* @param parentCommandLine - Reader for the parent's command line (tests)
|
|
209
|
+
* @returns True when a respawning parent is present
|
|
210
|
+
*/
|
|
211
|
+
export declare function hasRestartSupervisor(env?: NodeJS.ProcessEnv, parentCommandLine?: () => string | null): boolean;
|
|
212
|
+
/**
|
|
213
|
+
* A fresh, empty state.
|
|
214
|
+
*
|
|
215
|
+
* @returns Default state
|
|
216
|
+
*/
|
|
217
|
+
export declare function emptyAutoUpdateState(): AutoUpdateState;
|
|
218
|
+
/**
|
|
219
|
+
* Read the status file; missing or malformed → empty state.
|
|
220
|
+
*
|
|
221
|
+
* @param file - Path of the status file
|
|
222
|
+
* @returns The state
|
|
223
|
+
*/
|
|
224
|
+
export declare function readAutoUpdateState(file: string): AutoUpdateState;
|
|
225
|
+
/**
|
|
226
|
+
* Write the status file atomically (temp file + rename).
|
|
227
|
+
*
|
|
228
|
+
* @param file - Path of the status file
|
|
229
|
+
* @param state - State to write
|
|
230
|
+
*/
|
|
231
|
+
export declare function writeAutoUpdateState(file: string, state: AutoUpdateState): void;
|
|
232
|
+
/**
|
|
233
|
+
* Write the pending-upgrade marker.
|
|
234
|
+
*
|
|
235
|
+
* @param file - Marker path
|
|
236
|
+
* @param marker - Contents
|
|
237
|
+
*/
|
|
238
|
+
export declare function writePendingMarker(file: string, marker: PendingUpgradeMarker): void;
|
|
239
|
+
/**
|
|
240
|
+
* Read and delete the pending-upgrade marker. It is removed even when
|
|
241
|
+
* malformed, so a crash loop can never repeat the notice.
|
|
242
|
+
*
|
|
243
|
+
* @param file - Marker path
|
|
244
|
+
* @returns The marker, or null when absent or malformed
|
|
245
|
+
*/
|
|
246
|
+
export declare function consumePendingMarker(file: string): PendingUpgradeMarker | null;
|
|
247
|
+
/**
|
|
248
|
+
* Owner notice after a successful auto-upgrade.
|
|
249
|
+
*
|
|
250
|
+
* @param version - New version
|
|
251
|
+
* @param deviceName - This machine's name
|
|
252
|
+
* @returns The one-line notice
|
|
253
|
+
*/
|
|
254
|
+
export declare function composeUpgradedNotice(version: string, deviceName: string): string;
|
|
255
|
+
/**
|
|
256
|
+
* Owner notice after repeated failures.
|
|
257
|
+
*
|
|
258
|
+
* @param version - Target version
|
|
259
|
+
* @param deviceName - This machine's name
|
|
260
|
+
* @param failures - Failures in a row
|
|
261
|
+
* @param reason - Last failure reason
|
|
262
|
+
* @returns The notice text
|
|
263
|
+
*/
|
|
264
|
+
export declare function composeFailureNotice(version: string, deviceName: string, failures: number, reason: string): string;
|
|
265
|
+
//# sourceMappingURL=auto-update.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.utils.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/system/auto-update.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-update helpers — pure / filesystem-only pieces of the self-update
|
|
3
|
+
* (specs/auto-update.md), kept apart from the service so each rule is
|
|
4
|
+
* testable without timers:
|
|
5
|
+
*
|
|
6
|
+
* - where the running copy lives and what kind of install it is (npm global,
|
|
7
|
+
* user-prefix npm, dev checkout, anything else);
|
|
8
|
+
* - the `npm install -g` arguments that target that same prefix;
|
|
9
|
+
* - the on/off decision (setting + env override);
|
|
10
|
+
* - whether a supervisor will bring the backend back after RESTART_REQUESTED;
|
|
11
|
+
* - the status file (`crewly update-status`) and the pending-upgrade marker.
|
|
12
|
+
*
|
|
13
|
+
* @module services/system/auto-update.utils
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'fs';
|
|
16
|
+
import * as path from 'path';
|
|
17
|
+
import { execFileSync } from 'child_process';
|
|
18
|
+
import { AUTO_UPDATE_CONSTANTS } from '../../constants.js';
|
|
19
|
+
/** Name of the directory npm installs packages into. */
|
|
20
|
+
const NODE_MODULES_DIR = 'node_modules';
|
|
21
|
+
/** Directory between the prefix and node_modules for POSIX global installs. */
|
|
22
|
+
const POSIX_GLOBAL_LIB_DIR = 'lib';
|
|
23
|
+
/** Env values that force auto-update off. */
|
|
24
|
+
const ENV_OFF_VALUES = ['0', 'false', 'off', 'no'];
|
|
25
|
+
/** Env values that force auto-update on. */
|
|
26
|
+
const ENV_ON_VALUES = ['1', 'true', 'on', 'yes'];
|
|
27
|
+
/** Pattern matching the `crewly start` command line of a supervising CLI parent. */
|
|
28
|
+
const CLI_START_CMDLINE_PATTERN = /(?:\bcrewly|cli[\\/]src[\\/]index\.[jt]s)\S*\s+start\b/;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve symlinks when the path exists.
|
|
31
|
+
*
|
|
32
|
+
* @param p - Path
|
|
33
|
+
* @returns Real path, or the resolved path when it does not exist
|
|
34
|
+
*/
|
|
35
|
+
export function realOrResolved(p) {
|
|
36
|
+
try {
|
|
37
|
+
return fs.realpathSync(p);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return path.resolve(p);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Walk up from `startDir` to the directory whose package.json is `crewly`.
|
|
45
|
+
*
|
|
46
|
+
* @param startDir - Directory to start from
|
|
47
|
+
* @returns The package root, or null when none is found
|
|
48
|
+
*/
|
|
49
|
+
export function findCrewlyPackageRoot(startDir) {
|
|
50
|
+
let current = path.resolve(startDir);
|
|
51
|
+
for (;;) {
|
|
52
|
+
const pkgPath = path.join(current, 'package.json');
|
|
53
|
+
if (fs.existsSync(pkgPath)) {
|
|
54
|
+
try {
|
|
55
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
56
|
+
if (pkg.name === AUTO_UPDATE_CONSTANTS.PACKAGE_NAME)
|
|
57
|
+
return current;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Malformed package.json — keep walking
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const parent = path.dirname(current);
|
|
64
|
+
if (parent === current)
|
|
65
|
+
return null;
|
|
66
|
+
current = parent;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Package root of the running backend, anchored on the entry script
|
|
71
|
+
* (`process.argv[1]`, e.g. `<root>/dist/backend/backend/src/index.js`) rather
|
|
72
|
+
* than the cwd — after `npm install -g` replaces the package directory the
|
|
73
|
+
* old cwd no longer exists.
|
|
74
|
+
*
|
|
75
|
+
* @param argv1 - Entry script path (defaults to process.argv[1])
|
|
76
|
+
* @param cwd - Fallback start directory
|
|
77
|
+
* @returns Real path of the package root, or null
|
|
78
|
+
*/
|
|
79
|
+
export function resolveRunningPackageRoot(argv1 = process.argv[1], cwd) {
|
|
80
|
+
const anchors = [];
|
|
81
|
+
if (argv1)
|
|
82
|
+
anchors.push(path.dirname(realOrResolved(argv1)));
|
|
83
|
+
if (cwd)
|
|
84
|
+
anchors.push(cwd);
|
|
85
|
+
for (const anchor of anchors) {
|
|
86
|
+
const root = findCrewlyPackageRoot(anchor);
|
|
87
|
+
if (root)
|
|
88
|
+
return realOrResolved(root);
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The npm prefix a package root was installed under, when it is a global
|
|
94
|
+
* install: `<prefix>/lib/node_modules/crewly` on POSIX,
|
|
95
|
+
* `<prefix>\node_modules\crewly` on Windows. Covers the default global prefix
|
|
96
|
+
* (nvm, Homebrew, /usr/local) and the user prefix (`<crewlyHome>/npm-global`)
|
|
97
|
+
* alike — installing with `--prefix <that>` replaces exactly the running copy
|
|
98
|
+
* even when a different `npm` is first on PATH.
|
|
99
|
+
*
|
|
100
|
+
* @param packageRoot - Real path of the package root
|
|
101
|
+
* @param platform - Platform (tests)
|
|
102
|
+
* @returns The prefix, or null for anything that is not a global install
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* derivePrefixFromPackageRoot('/usr/local/lib/node_modules/crewly'); // '/usr/local'
|
|
107
|
+
* derivePrefixFromPackageRoot('/home/me/.crewly/npm-global/lib/node_modules/crewly'); // '/home/me/.crewly/npm-global'
|
|
108
|
+
* derivePrefixFromPackageRoot('/home/me/proj/node_modules/crewly'); // null (local dependency)
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export function derivePrefixFromPackageRoot(packageRoot, platform = process.platform) {
|
|
112
|
+
const p = platform === 'win32' ? path.win32 : path.posix;
|
|
113
|
+
if (p.basename(packageRoot) !== AUTO_UPDATE_CONSTANTS.PACKAGE_NAME)
|
|
114
|
+
return null;
|
|
115
|
+
const nodeModules = p.dirname(packageRoot);
|
|
116
|
+
if (p.basename(nodeModules) !== NODE_MODULES_DIR)
|
|
117
|
+
return null;
|
|
118
|
+
const parent = p.dirname(nodeModules);
|
|
119
|
+
if (platform === 'win32')
|
|
120
|
+
return parent;
|
|
121
|
+
if (p.basename(parent) !== POSIX_GLOBAL_LIB_DIR)
|
|
122
|
+
return null;
|
|
123
|
+
return p.dirname(parent);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Whether a directory is a git working tree root (`.git` directory, or the
|
|
127
|
+
* `.git` file of a worktree).
|
|
128
|
+
*
|
|
129
|
+
* @param dir - Directory
|
|
130
|
+
* @returns True when `.git` exists there
|
|
131
|
+
*/
|
|
132
|
+
export function isGitWorkingTree(dir) {
|
|
133
|
+
return fs.existsSync(path.join(dir, '.git'));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Classify the running install.
|
|
137
|
+
*
|
|
138
|
+
* - `dev-checkout`: the package root is a git working tree (e.g. the owner's
|
|
139
|
+
* `crewly/` repo running its own build, or an `npm link` that resolves into
|
|
140
|
+
* it). It must never npm-install over itself.
|
|
141
|
+
* - `npm-global`: the root sits in `<prefix>/lib/node_modules/crewly`.
|
|
142
|
+
* - `unmanaged`: anything else (Docker image at /app, a local dependency, an
|
|
143
|
+
* npx cache) — nobody owns an in-place upgrade there.
|
|
144
|
+
*
|
|
145
|
+
* @param packageRoot - Real path of the package root (null when unknown)
|
|
146
|
+
* @param platform - Platform (tests)
|
|
147
|
+
* @returns Install info
|
|
148
|
+
*/
|
|
149
|
+
export function detectInstall(packageRoot, platform = process.platform) {
|
|
150
|
+
if (!packageRoot) {
|
|
151
|
+
return { kind: 'unmanaged', packageRoot: null, prefix: null, detail: 'package root not found' };
|
|
152
|
+
}
|
|
153
|
+
if (isGitWorkingTree(packageRoot)) {
|
|
154
|
+
return { kind: 'dev-checkout', packageRoot, prefix: null, detail: `dev checkout (${packageRoot})` };
|
|
155
|
+
}
|
|
156
|
+
const prefix = derivePrefixFromPackageRoot(packageRoot, platform);
|
|
157
|
+
if (!prefix) {
|
|
158
|
+
return { kind: 'unmanaged', packageRoot, prefix: null, detail: `not a global npm install (${packageRoot})` };
|
|
159
|
+
}
|
|
160
|
+
return { kind: 'npm-global', packageRoot, prefix, detail: `npm global install under ${prefix}` };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* `npm` arguments that install `crewly@<version>` over the running copy.
|
|
164
|
+
*
|
|
165
|
+
* @param prefix - Prefix from {@link derivePrefixFromPackageRoot}
|
|
166
|
+
* @param version - Exact target version
|
|
167
|
+
* @returns Arguments for npm
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```ts
|
|
171
|
+
* npmInstallArgs('/usr/local', '1.20.144');
|
|
172
|
+
* // ['install', '-g', '--prefix', '/usr/local', 'crewly@1.20.144']
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
export function npmInstallArgs(prefix, version) {
|
|
176
|
+
return ['install', '-g', '--prefix', prefix, `${AUTO_UPDATE_CONSTANTS.PACKAGE_NAME}@${version}`];
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* The npm executable that belongs to the running node, when it sits next to
|
|
180
|
+
* it (nvm, official installers); plain `npm` from PATH otherwise.
|
|
181
|
+
*
|
|
182
|
+
* @param execPath - Running node binary (defaults to process.execPath)
|
|
183
|
+
* @param platform - Platform (tests)
|
|
184
|
+
* @returns Command to run
|
|
185
|
+
*/
|
|
186
|
+
export function resolveNpmCommand(execPath = process.execPath, platform = process.platform) {
|
|
187
|
+
const name = platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
188
|
+
const sibling = path.join(path.dirname(execPath), name);
|
|
189
|
+
return fs.existsSync(sibling) ? sibling : name;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Version in `<packageRoot>/package.json`, read fresh from disk.
|
|
193
|
+
*
|
|
194
|
+
* @param packageRoot - Package root
|
|
195
|
+
* @returns The version, or null when unreadable
|
|
196
|
+
*/
|
|
197
|
+
export function readInstalledVersion(packageRoot) {
|
|
198
|
+
try {
|
|
199
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf-8'));
|
|
200
|
+
return typeof pkg.version === 'string' ? pkg.version : null;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Whether `latest` is a strictly newer semver than `current`
|
|
208
|
+
* (numeric major.minor.patch; pre-release tags are ignored).
|
|
209
|
+
*
|
|
210
|
+
* @param latest - Candidate version
|
|
211
|
+
* @param current - Running version
|
|
212
|
+
* @returns True when latest > current
|
|
213
|
+
*/
|
|
214
|
+
export function isNewerVersion(latest, current) {
|
|
215
|
+
const parse = (v) => v.split('-')[0].split('.').map((n) => Number.parseInt(n, 10) || 0);
|
|
216
|
+
const l = parse(latest);
|
|
217
|
+
const c = parse(current);
|
|
218
|
+
for (let i = 0; i < Math.max(l.length, c.length); i++) {
|
|
219
|
+
const a = l[i] ?? 0;
|
|
220
|
+
const b = c[i] ?? 0;
|
|
221
|
+
if (a !== b)
|
|
222
|
+
return a > b;
|
|
223
|
+
}
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Resolve the on/off switch: the env override wins over the setting.
|
|
228
|
+
*
|
|
229
|
+
* @param settingValue - `settings.general.autoUpdate` (undefined = default on)
|
|
230
|
+
* @param env - Environment
|
|
231
|
+
* @returns The switch state
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```ts
|
|
235
|
+
* resolveAutoUpdateSwitch(true, { CREWLY_AUTO_UPDATE: '0' }); // 'disabled-env'
|
|
236
|
+
* resolveAutoUpdateSwitch(false, {}); // 'disabled-setting'
|
|
237
|
+
* ```
|
|
238
|
+
*/
|
|
239
|
+
export function resolveAutoUpdateSwitch(settingValue, env = process.env) {
|
|
240
|
+
const raw = env[AUTO_UPDATE_CONSTANTS.ENV_VAR]?.trim().toLowerCase();
|
|
241
|
+
if (raw && ENV_OFF_VALUES.includes(raw))
|
|
242
|
+
return 'disabled-env';
|
|
243
|
+
if (raw && ENV_ON_VALUES.includes(raw))
|
|
244
|
+
return 'enabled-env';
|
|
245
|
+
return settingValue === false ? 'disabled-setting' : 'enabled';
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Whether a switch state means "on".
|
|
249
|
+
*
|
|
250
|
+
* @param state - Switch state
|
|
251
|
+
* @returns True when enabled
|
|
252
|
+
*/
|
|
253
|
+
export function isSwitchOn(state) {
|
|
254
|
+
return state === 'enabled' || state === 'enabled-env';
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Read the command line of a process (POSIX only; `/proc` on Linux, `ps`
|
|
258
|
+
* elsewhere).
|
|
259
|
+
*
|
|
260
|
+
* @param pid - Process id
|
|
261
|
+
* @returns The command line, or null
|
|
262
|
+
*/
|
|
263
|
+
export function readProcessCommandLine(pid) {
|
|
264
|
+
if (process.platform === 'win32' || !Number.isInteger(pid) || pid <= 1)
|
|
265
|
+
return null;
|
|
266
|
+
try {
|
|
267
|
+
const procFile = `/proc/${pid}/cmdline`;
|
|
268
|
+
if (fs.existsSync(procFile)) {
|
|
269
|
+
return fs.readFileSync(procFile, 'utf-8').split('\0').join(' ').trim();
|
|
270
|
+
}
|
|
271
|
+
return execFileSync('ps', ['-o', 'command=', '-p', String(pid)], { encoding: 'utf-8', timeout: 2000 }).trim();
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Whether a supervisor will respawn the backend after it exits with
|
|
279
|
+
* RESTART_REQUESTED. That supervisor is `crewly start` (foreground, under the
|
|
280
|
+
* macOS login-item wrapper, under systemd, or under the desktop app). New
|
|
281
|
+
* CLIs say so in the env; an older CLI parent is recognised by its command line.
|
|
282
|
+
*
|
|
283
|
+
* @param env - Environment
|
|
284
|
+
* @param parentCommandLine - Reader for the parent's command line (tests)
|
|
285
|
+
* @returns True when a respawning parent is present
|
|
286
|
+
*/
|
|
287
|
+
export function hasRestartSupervisor(env = process.env, parentCommandLine = () => readProcessCommandLine(process.ppid)) {
|
|
288
|
+
if (env[AUTO_UPDATE_CONSTANTS.SUPERVISOR_ENV_VAR] === AUTO_UPDATE_CONSTANTS.SUPERVISOR_CLI_START)
|
|
289
|
+
return true;
|
|
290
|
+
const cmd = parentCommandLine();
|
|
291
|
+
return !!cmd && CLI_START_CMDLINE_PATTERN.test(cmd);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* A fresh, empty state.
|
|
295
|
+
*
|
|
296
|
+
* @returns Default state
|
|
297
|
+
*/
|
|
298
|
+
export function emptyAutoUpdateState() {
|
|
299
|
+
return {
|
|
300
|
+
currentVersion: null,
|
|
301
|
+
latestVersion: null,
|
|
302
|
+
lastCheckAt: null,
|
|
303
|
+
mode: 'unknown',
|
|
304
|
+
lastResult: null,
|
|
305
|
+
consecutiveFailures: 0,
|
|
306
|
+
backoffUntil: null,
|
|
307
|
+
failureNotifiedVersion: null,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Read the status file; missing or malformed → empty state.
|
|
312
|
+
*
|
|
313
|
+
* @param file - Path of the status file
|
|
314
|
+
* @returns The state
|
|
315
|
+
*/
|
|
316
|
+
export function readAutoUpdateState(file) {
|
|
317
|
+
try {
|
|
318
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
319
|
+
return { ...emptyAutoUpdateState(), ...parsed };
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
return emptyAutoUpdateState();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Write the status file atomically (temp file + rename).
|
|
327
|
+
*
|
|
328
|
+
* @param file - Path of the status file
|
|
329
|
+
* @param state - State to write
|
|
330
|
+
*/
|
|
331
|
+
export function writeAutoUpdateState(file, state) {
|
|
332
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
333
|
+
const tmp = `${file}.tmp`;
|
|
334
|
+
fs.writeFileSync(tmp, JSON.stringify(state, null, 2), 'utf-8');
|
|
335
|
+
fs.renameSync(tmp, file);
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Write the pending-upgrade marker.
|
|
339
|
+
*
|
|
340
|
+
* @param file - Marker path
|
|
341
|
+
* @param marker - Contents
|
|
342
|
+
*/
|
|
343
|
+
export function writePendingMarker(file, marker) {
|
|
344
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
345
|
+
fs.writeFileSync(file, JSON.stringify(marker, null, 2), 'utf-8');
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Read and delete the pending-upgrade marker. It is removed even when
|
|
349
|
+
* malformed, so a crash loop can never repeat the notice.
|
|
350
|
+
*
|
|
351
|
+
* @param file - Marker path
|
|
352
|
+
* @returns The marker, or null when absent or malformed
|
|
353
|
+
*/
|
|
354
|
+
export function consumePendingMarker(file) {
|
|
355
|
+
if (!fs.existsSync(file))
|
|
356
|
+
return null;
|
|
357
|
+
let marker = null;
|
|
358
|
+
try {
|
|
359
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
360
|
+
if (typeof parsed.fromVersion === 'string' && typeof parsed.toVersion === 'string' && typeof parsed.at === 'string') {
|
|
361
|
+
marker = { fromVersion: parsed.fromVersion, toVersion: parsed.toVersion, at: parsed.at };
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
marker = null;
|
|
366
|
+
}
|
|
367
|
+
try {
|
|
368
|
+
fs.unlinkSync(file);
|
|
369
|
+
}
|
|
370
|
+
catch {
|
|
371
|
+
// Already gone
|
|
372
|
+
}
|
|
373
|
+
return marker;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Owner notice after a successful auto-upgrade.
|
|
377
|
+
*
|
|
378
|
+
* @param version - New version
|
|
379
|
+
* @param deviceName - This machine's name
|
|
380
|
+
* @returns The one-line notice
|
|
381
|
+
*/
|
|
382
|
+
export function composeUpgradedNotice(version, deviceName) {
|
|
383
|
+
return `Crewly 已自动升级到 ${version}(本机:${deviceName})`;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Owner notice after repeated failures.
|
|
387
|
+
*
|
|
388
|
+
* @param version - Target version
|
|
389
|
+
* @param deviceName - This machine's name
|
|
390
|
+
* @param failures - Failures in a row
|
|
391
|
+
* @param reason - Last failure reason
|
|
392
|
+
* @returns The notice text
|
|
393
|
+
*/
|
|
394
|
+
export function composeFailureNotice(version, deviceName, failures, reason) {
|
|
395
|
+
return `Crewly 自动升级到 ${version} 失败(本机:${deviceName},已连续 ${failures} 次):${reason}。会稍后重试;也可以在这台机器上运行 crewly upgrade。`;
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=auto-update.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.utils.js","sourceRoot":"","sources":["../../../../../../backend/src/services/system/auto-update.utils.ts"],"names":[],"mappings":"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"}
|