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.
Files changed (53) hide show
  1. package/config/constants.ts +43 -0
  2. package/dist/backend/backend/src/constants.d.ts +19 -0
  3. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  4. package/dist/backend/backend/src/constants.js +2 -1
  5. package/dist/backend/backend/src/constants.js.map +1 -1
  6. package/dist/backend/backend/src/index.d.ts +11 -0
  7. package/dist/backend/backend/src/index.d.ts.map +1 -1
  8. package/dist/backend/backend/src/index.js +57 -1
  9. package/dist/backend/backend/src/index.js.map +1 -1
  10. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts +200 -0
  11. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts.map +1 -0
  12. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +485 -0
  13. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -0
  14. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +163 -0
  15. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -0
  16. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +176 -0
  17. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -0
  18. package/dist/backend/backend/src/services/cloud/cloud-login-runner.d.ts +106 -0
  19. package/dist/backend/backend/src/services/cloud/cloud-login-runner.d.ts.map +1 -0
  20. package/dist/backend/backend/src/services/cloud/cloud-login-runner.js +238 -0
  21. package/dist/backend/backend/src/services/cloud/cloud-login-runner.js.map +1 -0
  22. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +16 -1
  23. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  24. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +38 -0
  25. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  26. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +14 -0
  27. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  28. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  29. package/dist/backend/backend/src/services/slack/slack-owner-direct-dm.d.ts +55 -0
  30. package/dist/backend/backend/src/services/slack/slack-owner-direct-dm.d.ts.map +1 -0
  31. package/dist/backend/backend/src/services/slack/slack-owner-direct-dm.js +114 -0
  32. package/dist/backend/backend/src/services/slack/slack-owner-direct-dm.js.map +1 -0
  33. package/dist/backend/build-info.json +2 -2
  34. package/dist/backend/config/constants.d.ts +42 -0
  35. package/dist/backend/config/constants.d.ts.map +1 -1
  36. package/dist/backend/config/constants.js +42 -0
  37. package/dist/backend/config/constants.js.map +1 -1
  38. package/dist/cli/backend/src/constants.d.ts +19 -0
  39. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  40. package/dist/cli/backend/src/constants.js +2 -1
  41. package/dist/cli/backend/src/constants.js.map +1 -1
  42. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts +16 -1
  43. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  44. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +38 -0
  45. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  46. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +14 -0
  47. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  48. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  49. package/dist/cli/config/constants.d.ts +42 -0
  50. package/dist/cli/config/constants.d.ts.map +1 -1
  51. package/dist/cli/config/constants.js +42 -0
  52. package/dist/cli/config/constants.js.map +1 -1
  53. 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"}