surface-cli 0.1.0

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 (60) hide show
  1. package/README.md +307 -0
  2. package/dist/cli.js +521 -0
  3. package/dist/cli.js.map +1 -0
  4. package/dist/config.js +156 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/contracts/account.js +9 -0
  7. package/dist/contracts/account.js.map +1 -0
  8. package/dist/contracts/mail.js +2 -0
  9. package/dist/contracts/mail.js.map +1 -0
  10. package/dist/e2e/gmail-v1.js +247 -0
  11. package/dist/e2e/gmail-v1.js.map +1 -0
  12. package/dist/e2e/outlook-v1.js +179 -0
  13. package/dist/e2e/outlook-v1.js.map +1 -0
  14. package/dist/lib/errors.js +47 -0
  15. package/dist/lib/errors.js.map +1 -0
  16. package/dist/lib/json.js +4 -0
  17. package/dist/lib/json.js.map +1 -0
  18. package/dist/lib/public-mail.js +29 -0
  19. package/dist/lib/public-mail.js.map +1 -0
  20. package/dist/lib/remote-auth.js +407 -0
  21. package/dist/lib/remote-auth.js.map +1 -0
  22. package/dist/lib/time.js +4 -0
  23. package/dist/lib/time.js.map +1 -0
  24. package/dist/lib/write-safety.js +34 -0
  25. package/dist/lib/write-safety.js.map +1 -0
  26. package/dist/paths.js +29 -0
  27. package/dist/paths.js.map +1 -0
  28. package/dist/providers/gmail/adapter.js +1102 -0
  29. package/dist/providers/gmail/adapter.js.map +1 -0
  30. package/dist/providers/gmail/api.js +99 -0
  31. package/dist/providers/gmail/api.js.map +1 -0
  32. package/dist/providers/gmail/normalize.js +336 -0
  33. package/dist/providers/gmail/normalize.js.map +1 -0
  34. package/dist/providers/gmail/oauth.js +328 -0
  35. package/dist/providers/gmail/oauth.js.map +1 -0
  36. package/dist/providers/index.js +12 -0
  37. package/dist/providers/index.js.map +1 -0
  38. package/dist/providers/outlook/adapter.js +1443 -0
  39. package/dist/providers/outlook/adapter.js.map +1 -0
  40. package/dist/providers/outlook/extract.js +416 -0
  41. package/dist/providers/outlook/extract.js.map +1 -0
  42. package/dist/providers/outlook/normalize.js +126 -0
  43. package/dist/providers/outlook/normalize.js.map +1 -0
  44. package/dist/providers/outlook/session.js +178 -0
  45. package/dist/providers/outlook/session.js.map +1 -0
  46. package/dist/providers/shared/html.js +88 -0
  47. package/dist/providers/shared/html.js.map +1 -0
  48. package/dist/providers/shared/types.js +2 -0
  49. package/dist/providers/shared/types.js.map +1 -0
  50. package/dist/providers/types.js +2 -0
  51. package/dist/providers/types.js.map +1 -0
  52. package/dist/refs.js +18 -0
  53. package/dist/refs.js.map +1 -0
  54. package/dist/runtime.js +23 -0
  55. package/dist/runtime.js.map +1 -0
  56. package/dist/state/database.js +731 -0
  57. package/dist/state/database.js.map +1 -0
  58. package/dist/summarizer.js +217 -0
  59. package/dist/summarizer.js.map +1 -0
  60. package/package.json +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outlook-v1.js","sourceRoot":"","sources":["../../src/e2e/outlook-v1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export class SurfaceError extends Error {
2
+ code;
3
+ retryable;
4
+ account;
5
+ messageRef;
6
+ threadRef;
7
+ constructor(code, message, options) {
8
+ super(message);
9
+ this.name = "SurfaceError";
10
+ this.code = code;
11
+ this.retryable = options?.retryable ?? false;
12
+ this.account = options?.account ?? null;
13
+ this.messageRef = options?.messageRef ?? null;
14
+ this.threadRef = options?.threadRef ?? null;
15
+ }
16
+ }
17
+ export function errorToEnvelope(error) {
18
+ if (error instanceof SurfaceError) {
19
+ return {
20
+ schema_version: "1",
21
+ error: {
22
+ code: error.code,
23
+ message: error.message,
24
+ retryable: error.retryable,
25
+ account: error.account,
26
+ message_ref: error.messageRef,
27
+ thread_ref: error.threadRef,
28
+ },
29
+ };
30
+ }
31
+ const message = error instanceof Error ? error.message : String(error);
32
+ return {
33
+ schema_version: "1",
34
+ error: {
35
+ code: "internal_error",
36
+ message,
37
+ retryable: false,
38
+ account: null,
39
+ message_ref: null,
40
+ thread_ref: null,
41
+ },
42
+ };
43
+ }
44
+ export function notImplemented(message, account) {
45
+ throw new SurfaceError("not_implemented", message, { account: account ?? null });
46
+ }
47
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAS;IACb,SAAS,CAAU;IACnB,OAAO,CAAgB;IACvB,UAAU,CAAgB;IAC1B,SAAS,CAAgB;IAElC,YACE,IAAY,EACZ,OAAe,EACf,OAKC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,OAAO;YACL,cAAc,EAAE,GAAG;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,WAAW,EAAE,KAAK,CAAC,UAAU;gBAC7B,UAAU,EAAE,KAAK,CAAC,SAAS;aAC5B;SACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO;QACL,cAAc,EAAE,GAAG;QACnB,KAAK,EAAE;YACL,IAAI,EAAE,gBAAgB;YACtB,OAAO;YACP,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,IAAI;SACjB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,OAAgB;IAC9D,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;AACnF,CAAC"}
@@ -0,0 +1,4 @@
1
+ export function writeJson(payload) {
2
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
3
+ }
4
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/lib/json.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,29 @@
1
+ function toPublicAttachment(attachment) {
2
+ return {
3
+ attachment_id: attachment.attachment_id,
4
+ filename: attachment.filename,
5
+ mime_type: attachment.mime_type,
6
+ size_bytes: attachment.size_bytes,
7
+ inline: attachment.inline,
8
+ };
9
+ }
10
+ function toPublicMessage(message) {
11
+ return {
12
+ message_ref: message.message_ref,
13
+ envelope: message.envelope,
14
+ snippet: message.snippet,
15
+ body: message.body,
16
+ attachments: message.attachments.map(toPublicAttachment),
17
+ ...(message.invite ? { invite: message.invite } : {}),
18
+ };
19
+ }
20
+ export function toPublicThread(thread) {
21
+ return {
22
+ thread_ref: thread.thread_ref,
23
+ source: thread.source,
24
+ envelope: thread.envelope,
25
+ summary: thread.summary,
26
+ messages: thread.messages.map(toPublicMessage),
27
+ };
28
+ }
29
+ //# sourceMappingURL=public-mail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-mail.js","sourceRoot":"","sources":["../../src/lib/public-mail.ts"],"names":[],"mappings":"AASA,SAAS,kBAAkB,CAAC,UAAsC;IAChE,OAAO;QACL,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAgC;IACvD,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACxD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAA8B;IAC3D,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;KAC/C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,407 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { Socket } from "node:net";
4
+ import { homedir } from "node:os";
5
+ import { join, resolve } from "node:path";
6
+ import { createInterface } from "node:readline/promises";
7
+ import { stdin, stdout, stderr } from "node:process";
8
+ import { promisify } from "node:util";
9
+ import { parse as parseToml } from "smol-toml";
10
+ import { buildAccountPaths } from "../paths.js";
11
+ import { SurfaceError } from "./errors.js";
12
+ import { gmailClientSecretPath } from "../providers/gmail/oauth.js";
13
+ import { launchOutlookSession, probeOutlookAuth, promptForOutlookLogin, } from "../providers/outlook/session.js";
14
+ const execFileAsync = promisify(execFile);
15
+ const DEFAULT_GMAIL_CALLBACK_PORT = 8765;
16
+ const SSH_TIMEOUT_MS = 30_000;
17
+ const SSH_MAX_BUFFER = 1024 * 1024;
18
+ const REMOTE_AUTH_PREFLIGHT_TIMEOUT_MS = 8_000;
19
+ const REMOTE_AUTH_VALIDATE_TIMEOUT_MS = 20_000;
20
+ function shellEscape(value) {
21
+ return `'${value.replace(/'/g, `'\"'\"'`)}'`;
22
+ }
23
+ function shellPath(value) {
24
+ if (value === "~") {
25
+ return "$HOME";
26
+ }
27
+ if (value.startsWith("~/")) {
28
+ return `$HOME/${value.slice(2)}`;
29
+ }
30
+ return shellEscape(value);
31
+ }
32
+ function remoteLoginShellWrapper(command) {
33
+ const escapedCommand = shellEscape(command);
34
+ return [
35
+ `if [ -x /bin/zsh ]; then exec /bin/zsh -lc ${escapedCommand}; fi`,
36
+ `if [ -x /bin/bash ]; then exec /bin/bash -lc ${escapedCommand}; fi`,
37
+ `exec /bin/sh -lc ${escapedCommand}`,
38
+ ].join("; ");
39
+ }
40
+ function extractJsonEnvelope(rawOutput) {
41
+ const trimmed = rawOutput.trim();
42
+ const start = trimmed.indexOf("{");
43
+ const end = trimmed.lastIndexOf("}");
44
+ if (start >= 0 && end > start) {
45
+ return trimmed.slice(start, end + 1);
46
+ }
47
+ return trimmed;
48
+ }
49
+ function remoteSurfaceExecArgs(remoteHost, args, env = {}) {
50
+ const execEnv = [
51
+ "PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin",
52
+ ...Object.entries(env).map(([key, value]) => `${key}=${value}`),
53
+ ];
54
+ return ["-T", remoteHost, "/usr/bin/env", ...execEnv, "surface", ...args];
55
+ }
56
+ async function runRemoteShell(remoteHost, command) {
57
+ try {
58
+ return await execFileAsync("ssh", ["-T", remoteHost, remoteLoginShellWrapper(command)], {
59
+ timeout: SSH_TIMEOUT_MS,
60
+ maxBuffer: SSH_MAX_BUFFER,
61
+ });
62
+ }
63
+ catch (error) {
64
+ const failure = error;
65
+ throw new SurfaceError("remote_command_failed", `Remote command on '${remoteHost}' failed: ${failure.stderr?.trim() || failure.message}`);
66
+ }
67
+ }
68
+ async function runRemoteSurfaceProcess(remoteHost, args, env = {}, options = {}) {
69
+ try {
70
+ return await execFileAsync("ssh", remoteSurfaceExecArgs(remoteHost, args, env), {
71
+ timeout: options.timeoutMs ?? SSH_TIMEOUT_MS,
72
+ maxBuffer: SSH_MAX_BUFFER,
73
+ });
74
+ }
75
+ catch (error) {
76
+ const failure = error;
77
+ throw new SurfaceError("remote_command_failed", `Remote surface ${args.join(" ")} on '${remoteHost}' failed: ${failure.stderr?.trim() || failure.message}`);
78
+ }
79
+ }
80
+ async function runRemoteSurfaceJson(remoteHost, args, env = {}, options = {}) {
81
+ try {
82
+ const result = await runRemoteSurfaceProcess(remoteHost, args, env, options);
83
+ return JSON.parse(extractJsonEnvelope(result.stdout));
84
+ }
85
+ catch (error) {
86
+ const failure = error;
87
+ if (typeof failure.stdout === "string" && failure.stdout.trim()) {
88
+ try {
89
+ return JSON.parse(extractJsonEnvelope(failure.stdout));
90
+ }
91
+ catch {
92
+ // fall through to the normalized error below
93
+ }
94
+ }
95
+ throw new SurfaceError("remote_command_failed", error instanceof Error
96
+ ? error.message
97
+ : `Remote surface ${args.join(" ")} on '${remoteHost}' returned invalid JSON.`);
98
+ }
99
+ }
100
+ async function resolveRemoteAccount(remoteHost, accountName) {
101
+ const payload = await runRemoteSurfaceJson(remoteHost, ["account", "list"]);
102
+ const account = payload.accounts.find((candidate) => candidate.name === accountName);
103
+ if (!account) {
104
+ throw new SurfaceError("not_found", `Account '${accountName}' was not found on remote host '${remoteHost}'.`, { account: accountName });
105
+ }
106
+ return account;
107
+ }
108
+ async function resolveRemoteAuthStatus(remoteHost, accountName, options = {}) {
109
+ try {
110
+ const payload = await runRemoteSurfaceJson(remoteHost, ["auth", "status", accountName], {}, options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {});
111
+ return payload.status;
112
+ }
113
+ catch (error) {
114
+ if (options.bestEffort) {
115
+ return {
116
+ status: "unknown",
117
+ detail: error instanceof Error
118
+ ? `Remote auth status probe failed: ${error.message}`
119
+ : "Remote auth status probe failed.",
120
+ };
121
+ }
122
+ throw error;
123
+ }
124
+ }
125
+ async function promptForRemoteReplacement(remoteHost, account, status) {
126
+ if (status.status !== "authenticated") {
127
+ return;
128
+ }
129
+ if (!stdin.isTTY || !stdout.isTTY) {
130
+ throw new SurfaceError("interactive_required", `Remote account '${account.name}' on '${remoteHost}' already appears authenticated. Re-run this command from an interactive terminal to confirm replacement.`, { account: account.name });
131
+ }
132
+ const replacementLabel = account.provider === "outlook"
133
+ ? "Replacing it will overwrite the current Outlook browser profile on the remote host."
134
+ : "Replacing it will overwrite the current Gmail token state on the remote host.";
135
+ const prompt = [
136
+ `Remote account '${account.name}' on '${remoteHost}' already appears authenticated.`,
137
+ replacementLabel,
138
+ "Continue? [y/N] ",
139
+ ].join("\n");
140
+ const interfaceHandle = createInterface({ input: stdin, output: stdout });
141
+ try {
142
+ const answer = (await interfaceHandle.question(prompt)).trim().toLowerCase();
143
+ if (!["y", "yes"].includes(answer)) {
144
+ throw new SurfaceError("user_aborted", "Remote auth login cancelled by user.", {
145
+ account: account.name,
146
+ });
147
+ }
148
+ }
149
+ finally {
150
+ interfaceHandle.close();
151
+ }
152
+ }
153
+ function gmailCallbackPort() {
154
+ const rawValue = process.env.SURFACE_GMAIL_CALLBACK_PORT;
155
+ if (!rawValue) {
156
+ return DEFAULT_GMAIL_CALLBACK_PORT;
157
+ }
158
+ const parsed = Number.parseInt(rawValue, 10);
159
+ if (!Number.isFinite(parsed) || parsed <= 0 || parsed > 65535) {
160
+ throw new SurfaceError("invalid_configuration", "SURFACE_GMAIL_CALLBACK_PORT must be a valid TCP port between 1 and 65535.");
161
+ }
162
+ return parsed;
163
+ }
164
+ function resolveLocalGmailClientSecretSource(context, accountName) {
165
+ const localAccount = context.db.findAccountByName(accountName);
166
+ if (localAccount) {
167
+ const candidate = gmailClientSecretPath({
168
+ config: context.config,
169
+ paths: context.paths,
170
+ db: context.db,
171
+ accountPaths: buildAccountPaths(context.paths, localAccount),
172
+ });
173
+ if (existsSync(candidate)) {
174
+ return candidate;
175
+ }
176
+ }
177
+ const envPath = process.env.SURFACE_GMAIL_CLIENT_SECRET_FILE;
178
+ if (envPath) {
179
+ const resolvedPath = resolve(envPath);
180
+ if (!existsSync(resolvedPath)) {
181
+ throw new SurfaceError("not_found", `SURFACE_GMAIL_CLIENT_SECRET_FILE points to a missing file: ${resolvedPath}`);
182
+ }
183
+ return resolvedPath;
184
+ }
185
+ const cwdPath = resolve(process.cwd(), "client_secret.json");
186
+ if (existsSync(cwdPath)) {
187
+ return cwdPath;
188
+ }
189
+ throw new SurfaceError("not_found", "Missing Gmail OAuth desktop client credentials. Set SURFACE_GMAIL_CLIENT_SECRET_FILE or place client_secret.json in the current working directory before running remote Gmail auth login.", { account: accountName });
190
+ }
191
+ async function resolveRemoteSurfaceRoot(remoteHost) {
192
+ const defaultRoot = "~/.surface-cli";
193
+ const command = "if [ -f ~/.surface-cli/config.toml ]; then cat ~/.surface-cli/config.toml; fi";
194
+ const result = await runRemoteShell(remoteHost, command);
195
+ if (!result.stdout.trim()) {
196
+ return defaultRoot;
197
+ }
198
+ try {
199
+ const parsed = parseToml(result.stdout);
200
+ return typeof parsed.cache_dir === "string" && parsed.cache_dir.trim().length > 0
201
+ ? parsed.cache_dir.trim()
202
+ : defaultRoot;
203
+ }
204
+ catch {
205
+ return defaultRoot;
206
+ }
207
+ }
208
+ async function ensureRemoteDirectory(remoteHost, directory) {
209
+ await runRemoteShell(remoteHost, `mkdir -p ${shellPath(directory)}`);
210
+ }
211
+ async function syncPathToRemote(localPath, remoteHost, remotePath, options = {}) {
212
+ const args = ["-a"];
213
+ if (options.delete) {
214
+ args.push("--delete");
215
+ }
216
+ args.push(localPath, `${remoteHost}:${remotePath}`);
217
+ await new Promise((resolvePromise, rejectPromise) => {
218
+ const child = spawn("rsync", args, {
219
+ stdio: ["inherit", "pipe", "pipe"],
220
+ });
221
+ child.stdout.on("data", (chunk) => {
222
+ stderr.write(chunk);
223
+ });
224
+ child.stderr.on("data", (chunk) => {
225
+ stderr.write(chunk);
226
+ });
227
+ child.on("error", rejectPromise);
228
+ child.on("close", (code) => {
229
+ if (code === 0) {
230
+ resolvePromise();
231
+ return;
232
+ }
233
+ rejectPromise(new SurfaceError("remote_command_failed", `rsync to '${remoteHost}:${remotePath}' failed with exit code ${code ?? "unknown"}.`));
234
+ });
235
+ });
236
+ }
237
+ async function waitForTunnelReady(tunnel, remoteHost, port) {
238
+ let tunnelExited = false;
239
+ let tunnelErrorMessage = null;
240
+ tunnel.once("error", (error) => {
241
+ tunnelErrorMessage = error.message;
242
+ });
243
+ tunnel.once("close", () => {
244
+ tunnelExited = true;
245
+ });
246
+ const deadline = Date.now() + 15_000;
247
+ while (Date.now() < deadline) {
248
+ if (tunnelErrorMessage) {
249
+ throw new SurfaceError("remote_command_failed", `Could not start SSH tunnel to '${remoteHost}': ${tunnelErrorMessage}`);
250
+ }
251
+ if (tunnelExited) {
252
+ throw new SurfaceError("remote_command_failed", `SSH tunnel to '${remoteHost}' exited before Gmail auth completed.`);
253
+ }
254
+ const isListening = await new Promise((resolvePromise) => {
255
+ const socket = new Socket();
256
+ const finish = (result) => {
257
+ socket.removeAllListeners();
258
+ socket.destroy();
259
+ resolvePromise(result);
260
+ };
261
+ socket.setTimeout(250);
262
+ socket.once("connect", () => finish(true));
263
+ socket.once("timeout", () => finish(false));
264
+ socket.once("error", () => finish(false));
265
+ socket.connect(port, "127.0.0.1");
266
+ });
267
+ if (isListening) {
268
+ return;
269
+ }
270
+ await new Promise((resolvePromise) => setTimeout(resolvePromise, 150));
271
+ }
272
+ throw new SurfaceError("remote_command_failed", `SSH tunnel to '${remoteHost}' did not start listening on localhost:${port} in time.`);
273
+ }
274
+ async function stopTunnel(tunnel) {
275
+ if (!tunnel || tunnel.exitCode !== null) {
276
+ return;
277
+ }
278
+ tunnel.kill("SIGTERM");
279
+ await new Promise((resolvePromise) => {
280
+ const timer = setTimeout(() => {
281
+ if (tunnel.exitCode === null) {
282
+ tunnel.kill("SIGKILL");
283
+ }
284
+ resolvePromise();
285
+ }, 2_000);
286
+ tunnel.once("close", () => {
287
+ clearTimeout(timer);
288
+ resolvePromise();
289
+ });
290
+ });
291
+ }
292
+ async function runRemoteSurfaceStreaming(remoteHost, args, env = {}) {
293
+ return await new Promise((resolvePromise, rejectPromise) => {
294
+ const child = spawn("ssh", remoteSurfaceExecArgs(remoteHost, args, env), {
295
+ stdio: ["inherit", "pipe", "pipe"],
296
+ });
297
+ let stdoutBuffer = "";
298
+ let stderrBuffer = "";
299
+ child.stdout.on("data", (chunk) => {
300
+ stdoutBuffer += chunk.toString("utf8");
301
+ });
302
+ child.stderr.on("data", (chunk) => {
303
+ const text = chunk.toString("utf8");
304
+ stderrBuffer += text;
305
+ stderr.write(text);
306
+ });
307
+ child.on("error", rejectPromise);
308
+ child.on("close", (code) => {
309
+ if (code === 0) {
310
+ resolvePromise(stdoutBuffer);
311
+ return;
312
+ }
313
+ rejectPromise(new SurfaceError("remote_command_failed", `Remote surface ${args.join(" ")} on '${remoteHost}' failed with exit code ${code ?? "unknown"}${stderrBuffer.trim() ? `: ${stderrBuffer.trim()}` : "."}`));
314
+ });
315
+ });
316
+ }
317
+ async function runRemoteGmailLogin(remoteHost, account, context) {
318
+ const callbackPort = gmailCallbackPort();
319
+ const surfaceRoot = await resolveRemoteSurfaceRoot(remoteHost);
320
+ const remoteAuthDir = `${surfaceRoot}/auth/${account.account_id}`;
321
+ const localClientSecret = resolveLocalGmailClientSecretSource(context, account.name);
322
+ await ensureRemoteDirectory(remoteHost, remoteAuthDir);
323
+ await syncPathToRemote(localClientSecret, remoteHost, `${remoteAuthDir}/client_secret.json`);
324
+ const tunnel = spawn("ssh", ["-N", "-L", `${callbackPort}:127.0.0.1:${callbackPort}`, remoteHost], {
325
+ stdio: ["inherit", "ignore", "pipe"],
326
+ });
327
+ tunnel.stderr.on("data", (chunk) => {
328
+ stderr.write(chunk.toString("utf8"));
329
+ });
330
+ try {
331
+ await waitForTunnelReady(tunnel, remoteHost, callbackPort);
332
+ stderr.write(`Remote Gmail auth: forwarding localhost:${callbackPort} to '${remoteHost}' before OAuth approval.\n`);
333
+ const rawOutput = await runRemoteSurfaceStreaming(remoteHost, ["auth", "login", account.name], { SURFACE_GMAIL_CALLBACK_PORT: String(callbackPort) });
334
+ const parsed = JSON.parse(extractJsonEnvelope(rawOutput));
335
+ return {
336
+ ...parsed,
337
+ remote_host: remoteHost,
338
+ };
339
+ }
340
+ catch (error) {
341
+ if (error instanceof SurfaceError) {
342
+ throw error;
343
+ }
344
+ throw new SurfaceError("remote_command_failed", `Remote Gmail auth login for '${account.name}' on '${remoteHost}' failed: ${error instanceof Error ? error.message : String(error)}`, { account: account.name });
345
+ }
346
+ finally {
347
+ await stopTunnel(tunnel);
348
+ }
349
+ }
350
+ function localRemoteOutlookProfileDir(accountName) {
351
+ const safeName = accountName.replace(/[^a-zA-Z0-9._-]+/g, "-");
352
+ if (process.platform === "darwin") {
353
+ return join(homedir(), "Library", "Application Support", "SurfaceChrome", safeName);
354
+ }
355
+ return join(homedir(), ".surface-cli", "local-profiles", "outlook", safeName);
356
+ }
357
+ async function runRemoteOutlookLogin(remoteHost, account, context) {
358
+ const localProfileDir = localRemoteOutlookProfileDir(account.name);
359
+ const session = await launchOutlookSession(localProfileDir, { headless: false });
360
+ try {
361
+ await session.page.goto("https://outlook.office.com/mail/", { waitUntil: "domcontentloaded" });
362
+ await promptForOutlookLogin(localProfileDir);
363
+ const localStatus = await probeOutlookAuth(session.page, {
364
+ timeoutMs: context.config.providerTimeoutMs,
365
+ });
366
+ if (localStatus.status !== "authenticated") {
367
+ throw new SurfaceError("auth_failed", localStatus.detail ?? "Outlook login did not reach an authenticated mailbox state locally.", { account: account.name });
368
+ }
369
+ }
370
+ finally {
371
+ await session.context.close();
372
+ session.cleanup?.();
373
+ }
374
+ const surfaceRoot = await resolveRemoteSurfaceRoot(remoteHost);
375
+ const remoteProfileDir = `${surfaceRoot}/auth/${account.account_id}/profile`;
376
+ await ensureRemoteDirectory(remoteHost, remoteProfileDir);
377
+ await syncPathToRemote(`${localProfileDir}/`, remoteHost, `${remoteProfileDir}/`, { delete: true });
378
+ const remoteStatus = await resolveRemoteAuthStatus(remoteHost, account.name, {
379
+ timeoutMs: REMOTE_AUTH_VALIDATE_TIMEOUT_MS,
380
+ bestEffort: true,
381
+ });
382
+ return {
383
+ schema_version: "1",
384
+ command: "auth-login",
385
+ account: account.name,
386
+ provider: account.provider,
387
+ transport: account.transport,
388
+ remote_host: remoteHost,
389
+ status: remoteStatus,
390
+ };
391
+ }
392
+ export async function runRemoteAuthLogin(context, accountName, remoteHost) {
393
+ const remoteAccount = await resolveRemoteAccount(remoteHost, accountName);
394
+ const remoteStatus = await resolveRemoteAuthStatus(remoteHost, accountName, {
395
+ timeoutMs: REMOTE_AUTH_PREFLIGHT_TIMEOUT_MS,
396
+ bestEffort: true,
397
+ });
398
+ await promptForRemoteReplacement(remoteHost, remoteAccount, remoteStatus);
399
+ if (remoteAccount.provider === "gmail" && remoteAccount.transport === "gmail-api") {
400
+ return await runRemoteGmailLogin(remoteHost, remoteAccount, context);
401
+ }
402
+ if (remoteAccount.provider === "outlook" && remoteAccount.transport === "outlook-web-playwright") {
403
+ return await runRemoteOutlookLogin(remoteHost, remoteAccount, context);
404
+ }
405
+ throw new SurfaceError("not_implemented", `Remote auth login is not implemented for provider '${remoteAccount.provider}' and transport '${remoteAccount.transport}'.`, { account: accountName });
406
+ }
407
+ //# sourceMappingURL=remote-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-auth.js","sourceRoot":"","sources":["../../src/lib/remote-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export function nowIsoUtc() {
2
+ return new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
3
+ }
4
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/lib/time.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { SurfaceError } from "./errors.js";
2
+ export function collectWriteRecipients(input) {
3
+ return {
4
+ to: "to" in input ? input.to : [],
5
+ cc: input.cc,
6
+ bcc: input.bcc,
7
+ };
8
+ }
9
+ export function assertWriteAllowed(config, account, recipients, options = {}) {
10
+ if (!config.writesEnabled) {
11
+ throw new SurfaceError("writes_disabled", "Write actions are disabled. Set SURFACE_WRITES_ENABLED=1 to enable them locally.", { account: account.name });
12
+ }
13
+ if (config.testAccountAllowlist.length > 0 && !config.testAccountAllowlist.includes(account.name)) {
14
+ throw new SurfaceError("writes_disabled", `Account '${account.name}' is not on the configured write allowlist.`, { account: account.name });
15
+ }
16
+ const disposition = options.disposition ?? "send";
17
+ if (disposition === "non_send") {
18
+ return {
19
+ sendMode: config.sendMode,
20
+ };
21
+ }
22
+ if (disposition === "send" && config.sendMode !== "allow_send") {
23
+ throw new SurfaceError("writes_disabled", "Live send is disabled unless SURFACE_SEND_MODE=allow_send. Rerun with --draft or enable live send locally.", { account: account.name });
24
+ }
25
+ const requestedRecipients = [...recipients.to, ...recipients.cc, ...recipients.bcc];
26
+ const disallowed = requestedRecipients.filter((recipient) => !config.testRecipients.includes(recipient));
27
+ if (disallowed.length > 0) {
28
+ throw new SurfaceError("writes_disabled", `Recipients are not on the configured test allowlist: ${disallowed.join(", ")}`, { account: account.name });
29
+ }
30
+ return {
31
+ sendMode: config.sendMode,
32
+ };
33
+ }
34
+ //# sourceMappingURL=write-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-safety.js","sourceRoot":"","sources":["../../src/lib/write-safety.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,UAAU,sBAAsB,CACpC,KAAmD;IAEnD,OAAO;QACL,EAAE,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACjC,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAAqB,EACrB,OAAoB,EACpB,UAAmC,EACnC,UAA2D,EAAE;IAE7D,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,IAAI,YAAY,CACpB,iBAAiB,EACjB,kFAAkF,EAClF,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAC1B,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAClG,MAAM,IAAI,YAAY,CACpB,iBAAiB,EACjB,YAAY,OAAO,CAAC,IAAI,6CAA6C,EACrE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAC1B,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;IAClD,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC/D,MAAM,IAAI,YAAY,CACpB,iBAAiB,EACjB,4GAA4G,EAC5G,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAC1B,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACzG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,YAAY,CACpB,iBAAiB,EACjB,wDAAwD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC/E,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAC1B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC"}
package/dist/paths.js ADDED
@@ -0,0 +1,29 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ export function buildSurfacePaths(config, configPath) {
4
+ return {
5
+ rootDir: config.cacheDir,
6
+ configPath,
7
+ stateDbPath: join(config.cacheDir, "state.db"),
8
+ authDir: join(config.cacheDir, "auth"),
9
+ cacheDir: join(config.cacheDir, "cache"),
10
+ downloadsDir: join(config.cacheDir, "downloads"),
11
+ };
12
+ }
13
+ export function ensureSurfacePaths(paths) {
14
+ mkdirSync(paths.rootDir, { recursive: true });
15
+ mkdirSync(paths.authDir, { recursive: true });
16
+ mkdirSync(paths.cacheDir, { recursive: true });
17
+ mkdirSync(paths.downloadsDir, { recursive: true });
18
+ }
19
+ export function buildAccountPaths(paths, account) {
20
+ const authDir = join(paths.authDir, account.account_id);
21
+ const cacheDir = join(paths.cacheDir, account.account_id);
22
+ return {
23
+ authDir,
24
+ cacheDir,
25
+ messagesDir: join(cacheDir, "messages"),
26
+ downloadsDir: join(paths.downloadsDir, account.account_id),
27
+ };
28
+ }
29
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAqBjC,MAAM,UAAU,iBAAiB,CAAC,MAAqB,EAAE,UAAkB;IACzE,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,QAAQ;QACxB,UAAU;QACV,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC9C,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;QACtC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;QACxC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IACpD,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAmB,EAAE,OAAoB;IACzE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1D,OAAO;QACL,OAAO;QACP,QAAQ;QACR,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;QACvC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC;KAC3D,CAAC;AACJ,CAAC"}