crewly 1.20.148 → 1.20.149
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 +43 -0
- package/dist/backend/backend/src/constants.d.ts +19 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +2 -1
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +11 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +57 -1
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts +200 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +485 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +163 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +176 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-login-runner.d.ts +106 -0
- package/dist/backend/backend/src/services/cloud/cloud-login-runner.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-login-runner.js +238 -0
- package/dist/backend/backend/src/services/cloud/cloud-login-runner.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +16 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +38 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +14 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-owner-direct-dm.d.ts +55 -0
- package/dist/backend/backend/src/services/slack/slack-owner-direct-dm.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-owner-direct-dm.js +114 -0
- package/dist/backend/backend/src/services/slack/slack-owner-direct-dm.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +42 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +42 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +19 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +2 -1
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts +16 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +38 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +14 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/cli/config/constants.d.ts +42 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +42 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-disconnect-notice.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-disconnect-notice.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud disconnect notice — pure rules.
|
|
3
|
+
*
|
|
4
|
+
* Detection ({@link evaluateDisconnect}), the notice rate limit
|
|
5
|
+
* ({@link shouldNotify}), the owner-facing Chinese texts and the persisted
|
|
6
|
+
* state file. No timers, no network: {@link CloudDisconnectNoticeService}
|
|
7
|
+
* drives these.
|
|
8
|
+
*
|
|
9
|
+
* Background (2026-09-27): a second Mac stopped heart-beating to Crewly
|
|
10
|
+
* Cloud and never reconnected, while its agents kept posting to Slack with
|
|
11
|
+
* their own bot tokens. Inbound Slack only reaches a machine through Cloud →
|
|
12
|
+
* relay, so every DM to its agents queued in Cloud for hours and nobody was
|
|
13
|
+
* told.
|
|
14
|
+
*
|
|
15
|
+
* @module services/cloud/cloud-disconnect-notice.utils
|
|
16
|
+
*/
|
|
17
|
+
import type { CloudSyncHealth } from './cloud-sync.types.js';
|
|
18
|
+
/** Why this machine cannot talk to Cloud. */
|
|
19
|
+
export type DisconnectReason = 'auth' | 'unreachable';
|
|
20
|
+
/** Inputs to {@link evaluateDisconnect}. */
|
|
21
|
+
export interface DisconnectInput {
|
|
22
|
+
/** A Cloud config exists on disk (the machine was signed in and nobody logged out) */
|
|
23
|
+
signedIn: boolean;
|
|
24
|
+
/** CloudSyncService health */
|
|
25
|
+
health: CloudSyncHealth;
|
|
26
|
+
/** When the monitor started (epoch ms) — the baseline when sync never ran */
|
|
27
|
+
monitorStartedAt: number;
|
|
28
|
+
/** Now (epoch ms) */
|
|
29
|
+
now: number;
|
|
30
|
+
/** No successful Cloud request for this long = disconnected (ms) */
|
|
31
|
+
thresholdMs: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Result of {@link evaluateDisconnect}:
|
|
35
|
+
* - `signed_out` — no Cloud config (never signed in, or logged out on purpose)
|
|
36
|
+
* - `connected` — Cloud answered within the threshold
|
|
37
|
+
* - `pending` — no answer yet since this start, still within the threshold
|
|
38
|
+
* - `disconnected` — see `reason`; `since` is the last contact (or the start)
|
|
39
|
+
*/
|
|
40
|
+
export type DisconnectVerdict = {
|
|
41
|
+
status: 'signed_out' | 'connected' | 'pending';
|
|
42
|
+
} | {
|
|
43
|
+
status: 'disconnected';
|
|
44
|
+
reason: DisconnectReason;
|
|
45
|
+
since: number;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Decide whether this machine is disconnected from Cloud.
|
|
49
|
+
*
|
|
50
|
+
* Disconnected = signed in AND (sync is `auth_expired`, OR Cloud has not
|
|
51
|
+
* answered a request for `thresholdMs`). Never fires on a machine that was
|
|
52
|
+
* never signed in or was logged out on purpose — both leave no Cloud config.
|
|
53
|
+
* `connected` needs a real answer from Cloud, so a restart that has not
|
|
54
|
+
* reached Cloud yet reads `pending`, not `connected`.
|
|
55
|
+
*
|
|
56
|
+
* @param input - Sign-in, health, clock and threshold
|
|
57
|
+
* @returns The verdict
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* evaluateDisconnect({ signedIn: true, health: { state: 'auth_expired', lastContactAt: t0, startedAt: t0, authRejected: true },
|
|
62
|
+
* monitorStartedAt: t0, now: t0 + 60_000, thresholdMs: 900_000 });
|
|
63
|
+
* // { status: 'disconnected', reason: 'auth', since: t0 }
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function evaluateDisconnect(input: DisconnectInput): DisconnectVerdict;
|
|
67
|
+
/** State persisted under the Crewly home so a restart does not re-notify. */
|
|
68
|
+
export interface DisconnectNoticeState {
|
|
69
|
+
/** When this disconnect episode began (ISO) */
|
|
70
|
+
episodeStartedAt: string;
|
|
71
|
+
/** Last reason seen */
|
|
72
|
+
reason: DisconnectReason;
|
|
73
|
+
/** When the owner was last notified (ISO), null = not yet */
|
|
74
|
+
lastNotifiedAt: string | null;
|
|
75
|
+
/** Slack DM channel of the last notice (for edits and the follow-up) */
|
|
76
|
+
channelId?: string;
|
|
77
|
+
/** Slack ts of the last notice (for edits) */
|
|
78
|
+
messageTs?: string;
|
|
79
|
+
/** Whether the last notice carries a working login link */
|
|
80
|
+
hasLink?: boolean;
|
|
81
|
+
/** No further login runs before this time (ISO) — set after a failed login */
|
|
82
|
+
loginBlockedUntil?: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Whether a new notice may go out: none yet in this episode, or the last one
|
|
86
|
+
* is at least `repeatMs` old.
|
|
87
|
+
*
|
|
88
|
+
* @param state - Persisted state (null = no episode yet)
|
|
89
|
+
* @param now - Now (epoch ms)
|
|
90
|
+
* @param repeatMs - Minimum gap between notices
|
|
91
|
+
* @returns True when a notice may be sent
|
|
92
|
+
*/
|
|
93
|
+
export declare function shouldNotify(state: DisconnectNoticeState | null, now: number, repeatMs: number): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Whether the notice is switched on (`CREWLY_CLOUD_DISCONNECT_NOTICE`).
|
|
96
|
+
*
|
|
97
|
+
* @param value - The env value
|
|
98
|
+
* @returns False for `0`, `false`, `off`, `no`; true otherwise (default on)
|
|
99
|
+
*/
|
|
100
|
+
export declare function isNoticeEnabled(value: string | undefined): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Local time in the owner's reading format, e.g. `9月27日 23:38`.
|
|
103
|
+
*
|
|
104
|
+
* @param ms - Epoch ms
|
|
105
|
+
* @returns Local month/day hour:minute
|
|
106
|
+
*/
|
|
107
|
+
export declare function formatLocalTime(ms: number): string;
|
|
108
|
+
/** Inputs to {@link composeDisconnectNotice}. */
|
|
109
|
+
export interface DisconnectNoticeInput {
|
|
110
|
+
/** This machine's name */
|
|
111
|
+
deviceName: string;
|
|
112
|
+
/** Why */
|
|
113
|
+
reason: DisconnectReason;
|
|
114
|
+
/** Episode start (epoch ms) */
|
|
115
|
+
since: number;
|
|
116
|
+
/** Re-login link (the approve page with the code filled in), when one is live */
|
|
117
|
+
loginUrl?: string | null;
|
|
118
|
+
/** Code shown on the approve page, when known */
|
|
119
|
+
userCode?: string | null;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The notice DMed to the owner.
|
|
123
|
+
*
|
|
124
|
+
* @param input - Device, reason, start time and the login link (if any)
|
|
125
|
+
* @returns Plain text (the sender escapes it for Slack)
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```ts
|
|
129
|
+
* composeDisconnectNotice({ deviceName: 'iriss-air.lan', reason: 'auth', since, loginUrl: 'https://crewlyai.com/cloud/pair?code=ABCD-2345' });
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export declare function composeDisconnectNotice(input: DisconnectNoticeInput): string;
|
|
133
|
+
/** Follow-up once the machine is back. */
|
|
134
|
+
export declare const RECONNECTED_NOTICE = "\u5DF2\u91CD\u65B0\u8FDE\u4E0A Cloud\uFF0C\u6392\u961F\u7684\u6D88\u606F\u6B63\u5728\u9001\u8FBE\u3002";
|
|
135
|
+
/**
|
|
136
|
+
* Brief note when a re-login did not finish.
|
|
137
|
+
*
|
|
138
|
+
* @param detail - What happened (e.g. 登录被拒绝)
|
|
139
|
+
* @param retryAt - When the next link goes out (epoch ms)
|
|
140
|
+
* @returns The note
|
|
141
|
+
*/
|
|
142
|
+
export declare function composeLoginFailedNotice(detail: string, retryAt: number): string;
|
|
143
|
+
/**
|
|
144
|
+
* Read the persisted state.
|
|
145
|
+
*
|
|
146
|
+
* @param file - State file
|
|
147
|
+
* @returns The state, or null when missing / unreadable
|
|
148
|
+
*/
|
|
149
|
+
export declare function readNoticeState(file: string): DisconnectNoticeState | null;
|
|
150
|
+
/**
|
|
151
|
+
* Persist the state.
|
|
152
|
+
*
|
|
153
|
+
* @param file - State file
|
|
154
|
+
* @param state - State to write
|
|
155
|
+
*/
|
|
156
|
+
export declare function writeNoticeState(file: string, state: DisconnectNoticeState): void;
|
|
157
|
+
/**
|
|
158
|
+
* Remove the state (episode over).
|
|
159
|
+
*
|
|
160
|
+
* @param file - State file
|
|
161
|
+
*/
|
|
162
|
+
export declare function clearNoticeState(file: string): void;
|
|
163
|
+
//# sourceMappingURL=cloud-disconnect-notice.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-disconnect-notice.utils.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-disconnect-notice.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,6CAA6C;AAC7C,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,aAAa,CAAC;AAEtD,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC/B,sFAAsF;IACtF,QAAQ,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAC1B;IAAE,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,SAAS,CAAA;CAAE,GAClD;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,iBAAiB,CAO5E;AAED,6EAA6E;AAC7E,MAAM,WAAW,qBAAqB;IACrC,+CAA+C;IAC/C,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKxG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGlE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIlD;AAQD,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACrC,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU;IACV,MAAM,EAAE,gBAAgB,CAAC;IACzB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAY5E;AAED,0CAA0C;AAC1C,eAAO,MAAM,kBAAkB,2GAA2B,CAAC;AAE3D;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAgB1E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAGjF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMnD"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud disconnect notice — pure rules.
|
|
3
|
+
*
|
|
4
|
+
* Detection ({@link evaluateDisconnect}), the notice rate limit
|
|
5
|
+
* ({@link shouldNotify}), the owner-facing Chinese texts and the persisted
|
|
6
|
+
* state file. No timers, no network: {@link CloudDisconnectNoticeService}
|
|
7
|
+
* drives these.
|
|
8
|
+
*
|
|
9
|
+
* Background (2026-09-27): a second Mac stopped heart-beating to Crewly
|
|
10
|
+
* Cloud and never reconnected, while its agents kept posting to Slack with
|
|
11
|
+
* their own bot tokens. Inbound Slack only reaches a machine through Cloud →
|
|
12
|
+
* relay, so every DM to its agents queued in Cloud for hours and nobody was
|
|
13
|
+
* told.
|
|
14
|
+
*
|
|
15
|
+
* @module services/cloud/cloud-disconnect-notice.utils
|
|
16
|
+
*/
|
|
17
|
+
import * as fs from 'fs';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
/**
|
|
20
|
+
* Decide whether this machine is disconnected from Cloud.
|
|
21
|
+
*
|
|
22
|
+
* Disconnected = signed in AND (sync is `auth_expired`, OR Cloud has not
|
|
23
|
+
* answered a request for `thresholdMs`). Never fires on a machine that was
|
|
24
|
+
* never signed in or was logged out on purpose — both leave no Cloud config.
|
|
25
|
+
* `connected` needs a real answer from Cloud, so a restart that has not
|
|
26
|
+
* reached Cloud yet reads `pending`, not `connected`.
|
|
27
|
+
*
|
|
28
|
+
* @param input - Sign-in, health, clock and threshold
|
|
29
|
+
* @returns The verdict
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* evaluateDisconnect({ signedIn: true, health: { state: 'auth_expired', lastContactAt: t0, startedAt: t0, authRejected: true },
|
|
34
|
+
* monitorStartedAt: t0, now: t0 + 60_000, thresholdMs: 900_000 });
|
|
35
|
+
* // { status: 'disconnected', reason: 'auth', since: t0 }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export function evaluateDisconnect(input) {
|
|
39
|
+
const { signedIn, health, monitorStartedAt, now, thresholdMs } = input;
|
|
40
|
+
if (!signedIn)
|
|
41
|
+
return { status: 'signed_out' };
|
|
42
|
+
const since = health.lastContactAt ?? health.startedAt ?? monitorStartedAt;
|
|
43
|
+
if (health.state === 'auth_expired')
|
|
44
|
+
return { status: 'disconnected', reason: 'auth', since };
|
|
45
|
+
if (now - since < thresholdMs)
|
|
46
|
+
return { status: health.lastContactAt !== null ? 'connected' : 'pending' };
|
|
47
|
+
return { status: 'disconnected', reason: health.authRejected ? 'auth' : 'unreachable', since };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Whether a new notice may go out: none yet in this episode, or the last one
|
|
51
|
+
* is at least `repeatMs` old.
|
|
52
|
+
*
|
|
53
|
+
* @param state - Persisted state (null = no episode yet)
|
|
54
|
+
* @param now - Now (epoch ms)
|
|
55
|
+
* @param repeatMs - Minimum gap between notices
|
|
56
|
+
* @returns True when a notice may be sent
|
|
57
|
+
*/
|
|
58
|
+
export function shouldNotify(state, now, repeatMs) {
|
|
59
|
+
if (!state?.lastNotifiedAt)
|
|
60
|
+
return true;
|
|
61
|
+
const last = Date.parse(state.lastNotifiedAt);
|
|
62
|
+
if (Number.isNaN(last))
|
|
63
|
+
return true;
|
|
64
|
+
return now - last >= repeatMs;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Whether the notice is switched on (`CREWLY_CLOUD_DISCONNECT_NOTICE`).
|
|
68
|
+
*
|
|
69
|
+
* @param value - The env value
|
|
70
|
+
* @returns False for `0`, `false`, `off`, `no`; true otherwise (default on)
|
|
71
|
+
*/
|
|
72
|
+
export function isNoticeEnabled(value) {
|
|
73
|
+
if (value === undefined)
|
|
74
|
+
return true;
|
|
75
|
+
return !['0', 'false', 'off', 'no'].includes(value.trim().toLowerCase());
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Local time in the owner's reading format, e.g. `9月27日 23:38`.
|
|
79
|
+
*
|
|
80
|
+
* @param ms - Epoch ms
|
|
81
|
+
* @returns Local month/day hour:minute
|
|
82
|
+
*/
|
|
83
|
+
export function formatLocalTime(ms) {
|
|
84
|
+
const d = new Date(ms);
|
|
85
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
86
|
+
return `${d.getMonth() + 1}月${d.getDate()}日 ${pad(d.getHours())}:${pad(d.getMinutes())}`;
|
|
87
|
+
}
|
|
88
|
+
/** Owner-facing reason text. */
|
|
89
|
+
const REASON_TEXT = {
|
|
90
|
+
auth: '登录已过期',
|
|
91
|
+
unreachable: '网络连不上 Cloud',
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* The notice DMed to the owner.
|
|
95
|
+
*
|
|
96
|
+
* @param input - Device, reason, start time and the login link (if any)
|
|
97
|
+
* @returns Plain text (the sender escapes it for Slack)
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```ts
|
|
101
|
+
* composeDisconnectNotice({ deviceName: 'iriss-air.lan', reason: 'auth', since, loginUrl: 'https://crewlyai.com/cloud/pair?code=ABCD-2345' });
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export function composeDisconnectNotice(input) {
|
|
105
|
+
const head = `Crewly(本机:${input.deviceName})连不上 Crewly Cloud 了(${REASON_TEXT[input.reason]},从 ${formatLocalTime(input.since)} 起)。` +
|
|
106
|
+
'发给这台机器上 agent 的 Slack 消息会在 Cloud 排队,收不到。';
|
|
107
|
+
if (input.loginUrl) {
|
|
108
|
+
const code = input.userCode ? `,核对码 ${input.userCode}` : '';
|
|
109
|
+
return `${head}点这里重新登录:${input.loginUrl}(在手机上点一下即可${code}),登录后排队的消息会自动送到。`;
|
|
110
|
+
}
|
|
111
|
+
if (input.reason === 'auth') {
|
|
112
|
+
return `${head}暂时拿不到重新登录的链接,Crewly 会继续重试,拿到后会更新这条消息。`;
|
|
113
|
+
}
|
|
114
|
+
return `${head}Crewly 会继续自动重连,连上后排队的消息会自动送到。`;
|
|
115
|
+
}
|
|
116
|
+
/** Follow-up once the machine is back. */
|
|
117
|
+
export const RECONNECTED_NOTICE = '已重新连上 Cloud,排队的消息正在送达。';
|
|
118
|
+
/**
|
|
119
|
+
* Brief note when a re-login did not finish.
|
|
120
|
+
*
|
|
121
|
+
* @param detail - What happened (e.g. 登录被拒绝)
|
|
122
|
+
* @param retryAt - When the next link goes out (epoch ms)
|
|
123
|
+
* @returns The note
|
|
124
|
+
*/
|
|
125
|
+
export function composeLoginFailedNotice(detail, retryAt) {
|
|
126
|
+
return `重新登录没有完成(${detail})。Crewly 会在 ${formatLocalTime(retryAt)} 再发一次新链接。`;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Read the persisted state.
|
|
130
|
+
*
|
|
131
|
+
* @param file - State file
|
|
132
|
+
* @returns The state, or null when missing / unreadable
|
|
133
|
+
*/
|
|
134
|
+
export function readNoticeState(file) {
|
|
135
|
+
try {
|
|
136
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
137
|
+
if (typeof parsed.episodeStartedAt !== 'string')
|
|
138
|
+
return null;
|
|
139
|
+
return {
|
|
140
|
+
episodeStartedAt: parsed.episodeStartedAt,
|
|
141
|
+
reason: parsed.reason === 'auth' ? 'auth' : 'unreachable',
|
|
142
|
+
lastNotifiedAt: typeof parsed.lastNotifiedAt === 'string' ? parsed.lastNotifiedAt : null,
|
|
143
|
+
...(typeof parsed.channelId === 'string' ? { channelId: parsed.channelId } : {}),
|
|
144
|
+
...(typeof parsed.messageTs === 'string' ? { messageTs: parsed.messageTs } : {}),
|
|
145
|
+
...(typeof parsed.hasLink === 'boolean' ? { hasLink: parsed.hasLink } : {}),
|
|
146
|
+
...(typeof parsed.loginBlockedUntil === 'string' ? { loginBlockedUntil: parsed.loginBlockedUntil } : {}),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Persist the state.
|
|
155
|
+
*
|
|
156
|
+
* @param file - State file
|
|
157
|
+
* @param state - State to write
|
|
158
|
+
*/
|
|
159
|
+
export function writeNoticeState(file, state) {
|
|
160
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
161
|
+
fs.writeFileSync(file, JSON.stringify(state, null, 2), 'utf-8');
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Remove the state (episode over).
|
|
165
|
+
*
|
|
166
|
+
* @param file - State file
|
|
167
|
+
*/
|
|
168
|
+
export function clearNoticeState(file) {
|
|
169
|
+
try {
|
|
170
|
+
fs.unlinkSync(file);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Already gone
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=cloud-disconnect-notice.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-disconnect-notice.utils.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-disconnect-notice.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs `crewly cloud login` in a PTY on the owner's behalf.
|
|
3
|
+
*
|
|
4
|
+
* Same pattern as the harness login broker (login-broker.service.ts): spawn
|
|
5
|
+
* the real login command in a wide PTY, normalize the screen, read the
|
|
6
|
+
* sign-in link and code off it, type the owner's reply in when the command
|
|
7
|
+
* asks for one, and report success / failure from the output and exit code.
|
|
8
|
+
* The CLI does the rest itself — device pairing with crewly-auth, saving
|
|
9
|
+
* `$CREWLY_HOME/cloud/config.json`, and `POST /api/cloud/connect` on this
|
|
10
|
+
* backend.
|
|
11
|
+
*
|
|
12
|
+
* Secrets: the device-code flow prints no token. A reply typed into the PTY
|
|
13
|
+
* (a pasted token in the `--paste` flow) is echoed by the terminal, so the
|
|
14
|
+
* screen is never logged or exposed — only the link, the code and the state.
|
|
15
|
+
*
|
|
16
|
+
* @module services/cloud/cloud-login-runner
|
|
17
|
+
*/
|
|
18
|
+
import type { BrokerPtySpawner } from '../harness/login-broker.service.js';
|
|
19
|
+
/** Where a CLI login run stands. */
|
|
20
|
+
export type CloudLoginState = 'starting' | 'awaiting_user' | 'verifying' | 'succeeded' | 'failed' | 'expired' | 'timed_out' | 'cancelled';
|
|
21
|
+
/** Snapshot of a run (never contains the screen). */
|
|
22
|
+
export interface CloudLoginSnapshot {
|
|
23
|
+
state: CloudLoginState;
|
|
24
|
+
/** Approve page with the code filled in */
|
|
25
|
+
url: string | null;
|
|
26
|
+
/** Code shown on the approve page */
|
|
27
|
+
userCode: string | null;
|
|
28
|
+
/** The CLI is waiting for typed input */
|
|
29
|
+
needsInput: boolean;
|
|
30
|
+
/** Short reason for a failure (from the CLI's ✗ line) */
|
|
31
|
+
message: string | null;
|
|
32
|
+
}
|
|
33
|
+
/** A live CLI login run. */
|
|
34
|
+
export interface CloudLoginHandle {
|
|
35
|
+
/** Current snapshot */
|
|
36
|
+
get(): CloudLoginSnapshot;
|
|
37
|
+
/** Resolves once a link is shown, the run ends, or `timeoutMs` passes */
|
|
38
|
+
waitForLink(timeoutMs: number): Promise<CloudLoginSnapshot>;
|
|
39
|
+
/** Resolves when the run ends */
|
|
40
|
+
done: Promise<CloudLoginSnapshot>;
|
|
41
|
+
/** Type a reply followed by Enter */
|
|
42
|
+
input(text: string): void;
|
|
43
|
+
/** Kill the run */
|
|
44
|
+
cancel(): void;
|
|
45
|
+
/** Subscribe to changes */
|
|
46
|
+
onChange(listener: (snapshot: CloudLoginSnapshot) => void): void;
|
|
47
|
+
}
|
|
48
|
+
/** Dependencies (injectable for tests). */
|
|
49
|
+
export interface CloudLoginRunnerDeps {
|
|
50
|
+
/** Node executable (defaults to the running one — never trust PATH) */
|
|
51
|
+
nodePath?: string;
|
|
52
|
+
/** CLI entry script (`<package>/dist/cli/cli/src/index.js`) */
|
|
53
|
+
cliEntry: string;
|
|
54
|
+
env?: NodeJS.ProcessEnv;
|
|
55
|
+
spawnPty?: BrokerPtySpawner;
|
|
56
|
+
timeoutMs?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Pick the sign-in link off the screen: the approve page with the code filled
|
|
60
|
+
* in when present, else the first link.
|
|
61
|
+
*
|
|
62
|
+
* @param text - Normalized screen
|
|
63
|
+
* @param hyperlinks - OSC 8 link targets
|
|
64
|
+
* @returns The link, or null
|
|
65
|
+
*/
|
|
66
|
+
export declare function extractLoginUrl(text: string, hyperlinks?: string[]): string | null;
|
|
67
|
+
/**
|
|
68
|
+
* Read the run's state off the screen.
|
|
69
|
+
*
|
|
70
|
+
* @param screenText - Normalized screen
|
|
71
|
+
* @param sinceInput - Normalized output after the last typed reply
|
|
72
|
+
* @param hyperlinks - OSC 8 link targets
|
|
73
|
+
* @returns Link, code, input prompt, success, expiry and the last ✗ line
|
|
74
|
+
*/
|
|
75
|
+
export declare function parseCloudLoginScreen(screenText: string, sinceInput: string, hyperlinks?: string[]): {
|
|
76
|
+
url: string | null;
|
|
77
|
+
userCode: string | null;
|
|
78
|
+
needsInput: boolean;
|
|
79
|
+
succeeded: boolean;
|
|
80
|
+
expired: boolean;
|
|
81
|
+
failure: string | null;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Environment for the CLI: the backend's own (CREWLY_HOME, CREWLY_CLOUD_URL
|
|
85
|
+
* carry over), no colours, and no browser on this machine.
|
|
86
|
+
*
|
|
87
|
+
* @param env - Source environment
|
|
88
|
+
* @returns String-only env map
|
|
89
|
+
*/
|
|
90
|
+
export declare function buildCloudLoginEnv(env: NodeJS.ProcessEnv): Record<string, string>;
|
|
91
|
+
/**
|
|
92
|
+
* Start `crewly cloud login --no-browser` in a PTY.
|
|
93
|
+
*
|
|
94
|
+
* @param deps - CLI location and injectables
|
|
95
|
+
* @returns The run
|
|
96
|
+
* @throws Error when the PTY cannot be spawned
|
|
97
|
+
*/
|
|
98
|
+
export declare function startCloudLogin(deps: CloudLoginRunnerDeps): CloudLoginHandle;
|
|
99
|
+
/**
|
|
100
|
+
* Whether a run has ended.
|
|
101
|
+
*
|
|
102
|
+
* @param state - Run state
|
|
103
|
+
* @returns True for a terminal state
|
|
104
|
+
*/
|
|
105
|
+
export declare function isCloudLoginFinished(state: CloudLoginState): boolean;
|
|
106
|
+
//# sourceMappingURL=cloud-login-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-login-runner.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-login-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAAa,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAItF,oCAAoC;AACpC,MAAM,MAAM,eAAe,GACxB,UAAU,GACV,eAAe,GACf,WAAW,GACX,WAAW,GACX,QAAQ,GACR,SAAS,GACT,WAAW,GACX,WAAW,CAAC;AAEf,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,2CAA2C;IAC3C,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,yDAAyD;IACzD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,4BAA4B;AAC5B,MAAM,WAAW,gBAAgB;IAChC,uBAAuB;IACvB,GAAG,IAAI,kBAAkB,CAAC;IAC1B,yEAAyE;IACzE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5D,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClC,qCAAqC;IACrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mBAAmB;IACnB,MAAM,IAAI,IAAI,CAAC;IACf,2BAA2B;IAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;CACjE;AAED,2CAA2C;AAC3C,MAAM,WAAW,oBAAoB;IACpC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAiBD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,MAAM,GAAG,IAAI,CAItF;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACpC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAM,EAAO,GACvB;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAWpI;AAaD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUjF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CAsH5E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAEpE"}
|