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.
Files changed (232) hide show
  1. package/config/constants.ts +59 -0
  2. package/config/index.ts +2 -0
  3. package/config/roles/orchestrator/prompt.md +9 -0
  4. package/config/skills/orchestrator/delegate-task/execute.sh +11 -0
  5. package/config/skills/orchestrator/delegate-task/execute.test.sh +38 -0
  6. package/config/skills/orchestrator/harness-login/SKILL.md +88 -0
  7. package/config/skills/orchestrator/harness-login/execute.sh +75 -0
  8. package/config/skills/orchestrator/harness-login/execute.test.sh +72 -0
  9. package/config/skills/orchestrator/reply-chat/SKILL.md +11 -1
  10. package/config/skills/orchestrator/reply-chat/execute.sh +13 -1
  11. package/config/skills/orchestrator/reply-slack/SKILL.md +1 -0
  12. package/config/skills/orchestrator/reply-slack/execute.sh +11 -2
  13. package/dist/backend/backend/src/constants.d.ts +55 -0
  14. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  15. package/dist/backend/backend/src/constants.js +36 -1
  16. package/dist/backend/backend/src/constants.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  18. package/dist/backend/backend/src/controllers/chat/chat.controller.js +36 -1
  19. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  20. package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts +1 -0
  21. package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts.map +1 -1
  22. package/dist/backend/backend/src/controllers/harness/harness.routes.js +3 -0
  23. package/dist/backend/backend/src/controllers/harness/harness.routes.js.map +1 -1
  24. package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts +61 -0
  25. package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts.map +1 -0
  26. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +133 -0
  27. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js.map +1 -0
  28. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  29. package/dist/backend/backend/src/controllers/slack/slack.controller.js +69 -7
  30. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  31. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +4 -1
  32. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  33. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +9 -2
  34. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  35. package/dist/backend/backend/src/index.d.ts +8 -0
  36. package/dist/backend/backend/src/index.d.ts.map +1 -1
  37. package/dist/backend/backend/src/index.js +75 -3
  38. package/dist/backend/backend/src/index.js.map +1 -1
  39. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/agent/agent-registration.service.js +28 -1
  41. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  42. package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts +11 -1
  43. package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/agent/codex-runtime.service.js +18 -0
  45. package/dist/backend/backend/src/services/agent/codex-runtime.service.js.map +1 -1
  46. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +12 -0
  47. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +18 -3
  49. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  50. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +29 -0
  51. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +48 -0
  53. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  54. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -1
  56. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  57. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +15 -0
  58. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +20 -0
  60. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  61. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +147 -5
  62. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  63. package/dist/backend/backend/src/services/harness/harness-relogin.service.js +210 -20
  64. package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  65. package/dist/backend/backend/src/services/harness/owner-login-request.d.ts +87 -0
  66. package/dist/backend/backend/src/services/harness/owner-login-request.d.ts.map +1 -0
  67. package/dist/backend/backend/src/services/harness/owner-login-request.js +191 -0
  68. package/dist/backend/backend/src/services/harness/owner-login-request.js.map +1 -0
  69. package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts +217 -0
  70. package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -0
  71. package/dist/backend/backend/src/services/orc/orc-reply-route.service.js +300 -0
  72. package/dist/backend/backend/src/services/orc/orc-reply-route.service.js.map +1 -0
  73. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +32 -2
  74. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  75. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +59 -5
  76. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  77. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +4 -2
  78. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +6 -3
  80. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  81. package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts +68 -9
  82. package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.js +121 -11
  84. package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.js.map +1 -1
  85. package/dist/backend/backend/src/services/system/auto-update.service.d.ts +292 -0
  86. package/dist/backend/backend/src/services/system/auto-update.service.d.ts.map +1 -0
  87. package/dist/backend/backend/src/services/system/auto-update.service.js +590 -0
  88. package/dist/backend/backend/src/services/system/auto-update.service.js.map +1 -0
  89. package/dist/backend/backend/src/services/system/auto-update.utils.d.ts +265 -0
  90. package/dist/backend/backend/src/services/system/auto-update.utils.d.ts.map +1 -0
  91. package/dist/backend/backend/src/services/system/auto-update.utils.js +397 -0
  92. package/dist/backend/backend/src/services/system/auto-update.utils.js.map +1 -0
  93. package/dist/backend/backend/src/services/system/version-check.service.d.ts +15 -1
  94. package/dist/backend/backend/src/services/system/version-check.service.d.ts.map +1 -1
  95. package/dist/backend/backend/src/services/system/version-check.service.js +21 -2
  96. package/dist/backend/backend/src/services/system/version-check.service.js.map +1 -1
  97. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +7 -1
  98. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  99. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +14 -2
  100. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  101. package/dist/backend/backend/src/services/v3/cascade-request-status.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/v3/cascade-request-status.js +16 -1
  103. package/dist/backend/backend/src/services/v3/cascade-request-status.js.map +1 -1
  104. package/dist/backend/backend/src/services/v3/request-completion.d.ts +128 -0
  105. package/dist/backend/backend/src/services/v3/request-completion.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/v3/request-completion.js +311 -0
  107. package/dist/backend/backend/src/services/v3/request-completion.js.map +1 -0
  108. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.d.ts.map +1 -1
  109. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js +3 -0
  110. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js.map +1 -1
  111. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.d.ts.map +1 -1
  112. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js +17 -3
  113. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js.map +1 -1
  114. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +8 -0
  115. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  116. package/dist/backend/backend/src/services/v3/v3-data.service.js +11 -1
  117. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  118. package/dist/backend/backend/src/types/settings.types.d.ts +8 -0
  119. package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
  120. package/dist/backend/backend/src/types/settings.types.js +4 -0
  121. package/dist/backend/backend/src/types/settings.types.js.map +1 -1
  122. package/dist/backend/backend/src/utils/agent-reply-filter.utils.d.ts +75 -0
  123. package/dist/backend/backend/src/utils/agent-reply-filter.utils.d.ts.map +1 -0
  124. package/dist/backend/backend/src/utils/agent-reply-filter.utils.js +127 -0
  125. package/dist/backend/backend/src/utils/agent-reply-filter.utils.js.map +1 -0
  126. package/dist/backend/build-info.json +2 -2
  127. package/dist/backend/config/constants.d.ts +56 -0
  128. package/dist/backend/config/constants.d.ts.map +1 -1
  129. package/dist/backend/config/constants.js +57 -0
  130. package/dist/backend/config/constants.js.map +1 -1
  131. package/dist/backend/config/index.d.ts +2 -2
  132. package/dist/backend/config/index.d.ts.map +1 -1
  133. package/dist/backend/config/index.js +2 -2
  134. package/dist/backend/config/index.js.map +1 -1
  135. package/dist/cli/backend/src/constants.d.ts +55 -0
  136. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  137. package/dist/cli/backend/src/constants.js +36 -1
  138. package/dist/cli/backend/src/constants.js.map +1 -1
  139. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  140. package/dist/cli/backend/src/services/agent/agent-registration.service.js +28 -1
  141. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  142. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +11 -1
  143. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
  144. package/dist/cli/backend/src/services/agent/codex-runtime.service.js +18 -0
  145. package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -1
  146. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +12 -0
  147. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  148. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +18 -3
  149. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  150. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +29 -0
  151. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  152. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +48 -0
  153. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  154. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  155. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -1
  156. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  157. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +15 -0
  158. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  159. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +20 -0
  160. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  161. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +147 -5
  162. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  163. package/dist/cli/backend/src/services/harness/harness-relogin.service.js +210 -20
  164. package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  165. package/dist/cli/backend/src/services/harness/owner-login-request.d.ts +87 -0
  166. package/dist/cli/backend/src/services/harness/owner-login-request.d.ts.map +1 -0
  167. package/dist/cli/backend/src/services/harness/owner-login-request.js +191 -0
  168. package/dist/cli/backend/src/services/harness/owner-login-request.js.map +1 -0
  169. package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts +217 -0
  170. package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -0
  171. package/dist/cli/backend/src/services/orc/orc-reply-route.service.js +300 -0
  172. package/dist/cli/backend/src/services/orc/orc-reply-route.service.js.map +1 -0
  173. package/dist/cli/backend/src/services/system/auto-update.utils.d.ts +265 -0
  174. package/dist/cli/backend/src/services/system/auto-update.utils.d.ts.map +1 -0
  175. package/dist/cli/backend/src/services/system/auto-update.utils.js +397 -0
  176. package/dist/cli/backend/src/services/system/auto-update.utils.js.map +1 -0
  177. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +7 -1
  178. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  179. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +14 -2
  180. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  181. package/dist/cli/backend/src/services/v3/request-completion.d.ts +128 -0
  182. package/dist/cli/backend/src/services/v3/request-completion.d.ts.map +1 -0
  183. package/dist/cli/backend/src/services/v3/request-completion.js +311 -0
  184. package/dist/cli/backend/src/services/v3/request-completion.js.map +1 -0
  185. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts +8 -0
  186. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  187. package/dist/cli/backend/src/services/v3/v3-data.service.js +11 -1
  188. package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
  189. package/dist/cli/backend/src/types/settings.types.d.ts +8 -0
  190. package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
  191. package/dist/cli/backend/src/types/settings.types.js +4 -0
  192. package/dist/cli/backend/src/types/settings.types.js.map +1 -1
  193. package/dist/cli/backend/src/utils/agent-reply-filter.utils.d.ts +75 -0
  194. package/dist/cli/backend/src/utils/agent-reply-filter.utils.d.ts.map +1 -0
  195. package/dist/cli/backend/src/utils/agent-reply-filter.utils.js +127 -0
  196. package/dist/cli/backend/src/utils/agent-reply-filter.utils.js.map +1 -0
  197. package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
  198. package/dist/cli/cli/src/commands/start.js +14 -3
  199. package/dist/cli/cli/src/commands/start.js.map +1 -1
  200. package/dist/cli/cli/src/commands/update-status.d.ts +85 -0
  201. package/dist/cli/cli/src/commands/update-status.d.ts.map +1 -0
  202. package/dist/cli/cli/src/commands/update-status.js +162 -0
  203. package/dist/cli/cli/src/commands/update-status.js.map +1 -0
  204. package/dist/cli/cli/src/constants.d.ts +1 -1
  205. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  206. package/dist/cli/cli/src/constants.js +1 -1
  207. package/dist/cli/cli/src/constants.js.map +1 -1
  208. package/dist/cli/cli/src/index.js +7 -0
  209. package/dist/cli/cli/src/index.js.map +1 -1
  210. package/dist/cli/cli/src/utils/backend-respawn.d.ts +50 -0
  211. package/dist/cli/cli/src/utils/backend-respawn.d.ts.map +1 -0
  212. package/dist/cli/cli/src/utils/backend-respawn.js +59 -0
  213. package/dist/cli/cli/src/utils/backend-respawn.js.map +1 -0
  214. package/dist/cli/config/constants.d.ts +56 -0
  215. package/dist/cli/config/constants.d.ts.map +1 -1
  216. package/dist/cli/config/constants.js +57 -0
  217. package/dist/cli/config/constants.js.map +1 -1
  218. package/dist/cli/config/index.d.ts +2 -2
  219. package/dist/cli/config/index.d.ts.map +1 -1
  220. package/dist/cli/config/index.js +2 -2
  221. package/dist/cli/config/index.js.map +1 -1
  222. package/frontend/dist/assets/{index-e05af897.js → index-71670b91.js} +22 -22
  223. package/frontend/dist/index.html +1 -1
  224. package/package.json +1 -1
  225. package/packages/crewly-agent/src/runtime/agent-runner.service.test.ts +39 -0
  226. package/packages/crewly-agent/src/runtime/agent-runner.service.ts +17 -17
  227. package/packages/crewly-agent/src/runtime/interactive-login-guard.test.ts +60 -0
  228. package/packages/crewly-agent/src/runtime/interactive-login-guard.ts +76 -0
  229. package/packages/crewly-agent/src/runtime/reply-tool-calls.test.ts +53 -0
  230. package/packages/crewly-agent/src/runtime/reply-tool-calls.ts +76 -0
  231. package/packages/crewly-agent/src/runtime/tool-registry.test.ts +8 -0
  232. 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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"}