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.
- package/README.md +307 -0
- package/dist/cli.js +521 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +156 -0
- package/dist/config.js.map +1 -0
- package/dist/contracts/account.js +9 -0
- package/dist/contracts/account.js.map +1 -0
- package/dist/contracts/mail.js +2 -0
- package/dist/contracts/mail.js.map +1 -0
- package/dist/e2e/gmail-v1.js +247 -0
- package/dist/e2e/gmail-v1.js.map +1 -0
- package/dist/e2e/outlook-v1.js +179 -0
- package/dist/e2e/outlook-v1.js.map +1 -0
- package/dist/lib/errors.js +47 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/json.js +4 -0
- package/dist/lib/json.js.map +1 -0
- package/dist/lib/public-mail.js +29 -0
- package/dist/lib/public-mail.js.map +1 -0
- package/dist/lib/remote-auth.js +407 -0
- package/dist/lib/remote-auth.js.map +1 -0
- package/dist/lib/time.js +4 -0
- package/dist/lib/time.js.map +1 -0
- package/dist/lib/write-safety.js +34 -0
- package/dist/lib/write-safety.js.map +1 -0
- package/dist/paths.js +29 -0
- package/dist/paths.js.map +1 -0
- package/dist/providers/gmail/adapter.js +1102 -0
- package/dist/providers/gmail/adapter.js.map +1 -0
- package/dist/providers/gmail/api.js +99 -0
- package/dist/providers/gmail/api.js.map +1 -0
- package/dist/providers/gmail/normalize.js +336 -0
- package/dist/providers/gmail/normalize.js.map +1 -0
- package/dist/providers/gmail/oauth.js +328 -0
- package/dist/providers/gmail/oauth.js.map +1 -0
- package/dist/providers/index.js +12 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/outlook/adapter.js +1443 -0
- package/dist/providers/outlook/adapter.js.map +1 -0
- package/dist/providers/outlook/extract.js +416 -0
- package/dist/providers/outlook/extract.js.map +1 -0
- package/dist/providers/outlook/normalize.js +126 -0
- package/dist/providers/outlook/normalize.js.map +1 -0
- package/dist/providers/outlook/session.js +178 -0
- package/dist/providers/outlook/session.js.map +1 -0
- package/dist/providers/shared/html.js +88 -0
- package/dist/providers/shared/html.js.map +1 -0
- package/dist/providers/shared/types.js +2 -0
- package/dist/providers/shared/types.js.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/refs.js +18 -0
- package/dist/refs.js.map +1 -0
- package/dist/runtime.js +23 -0
- package/dist/runtime.js.map +1 -0
- package/dist/state/database.js +731 -0
- package/dist/state/database.js.map +1 -0
- package/dist/summarizer.js +217 -0
- package/dist/summarizer.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { htmlToText } from "../shared/html.js";
|
|
2
|
+
export function mailboxFromExchange(value) {
|
|
3
|
+
const mailbox = value?.Mailbox ?? value;
|
|
4
|
+
const email = typeof mailbox?.EmailAddress === "string" ? mailbox.EmailAddress : "";
|
|
5
|
+
const name = typeof mailbox?.Name === "string" ? mailbox.Name : "";
|
|
6
|
+
if (!email && !name) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
return { name, email };
|
|
10
|
+
}
|
|
11
|
+
export function mailboxesFromExchange(values) {
|
|
12
|
+
const result = [];
|
|
13
|
+
for (const value of values ?? []) {
|
|
14
|
+
const mailbox = mailboxFromExchange(value);
|
|
15
|
+
if (mailbox) {
|
|
16
|
+
result.push(mailbox);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
export function normalizeResponseObjects(values) {
|
|
22
|
+
const result = [];
|
|
23
|
+
for (const value of values ?? []) {
|
|
24
|
+
const rawType = typeof value.__type === "string" ? value.__type : "";
|
|
25
|
+
const normalized = rawType.split(":", 1)[0];
|
|
26
|
+
if (normalized) {
|
|
27
|
+
result.push(normalized);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
export function itemIdData(value) {
|
|
33
|
+
if (!value) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const id = typeof value.Id === "string" ? value.Id : "";
|
|
37
|
+
const changeKey = typeof value.ChangeKey === "string" ? value.ChangeKey : "";
|
|
38
|
+
if (!id && !changeKey) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return { id, change_key: changeKey };
|
|
42
|
+
}
|
|
43
|
+
export function messageIdentity(item, conversationId) {
|
|
44
|
+
const itemId = item.ItemId?.Id;
|
|
45
|
+
const internetMessageId = item.InternetMessageId;
|
|
46
|
+
const instanceKey = item.InstanceKey;
|
|
47
|
+
if (typeof itemId === "string" && itemId) {
|
|
48
|
+
return itemId;
|
|
49
|
+
}
|
|
50
|
+
if (typeof internetMessageId === "string" && internetMessageId) {
|
|
51
|
+
return internetMessageId;
|
|
52
|
+
}
|
|
53
|
+
if (typeof instanceKey === "string" && instanceKey) {
|
|
54
|
+
return instanceKey;
|
|
55
|
+
}
|
|
56
|
+
return `${conversationId}:${String(item.DateTimeReceived ?? item.Subject ?? "unknown")}`;
|
|
57
|
+
}
|
|
58
|
+
export function normalizeOutlookBody(item) {
|
|
59
|
+
const uniqueBody = item.UniqueBody;
|
|
60
|
+
const body = item.Body;
|
|
61
|
+
const preview = typeof item.Preview === "string" ? item.Preview : "";
|
|
62
|
+
const bodyHtml = (typeof uniqueBody?.Value === "string" ? uniqueBody.Value : "") ||
|
|
63
|
+
(typeof body?.Value === "string" ? body.Value : "");
|
|
64
|
+
return {
|
|
65
|
+
text: bodyHtml ? htmlToText(bodyHtml) : preview,
|
|
66
|
+
html: bodyHtml,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function normalizeResponseType(value) {
|
|
70
|
+
if (typeof value !== "string" || !value) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
switch (value.toLowerCase()) {
|
|
74
|
+
case "accept":
|
|
75
|
+
return "accept";
|
|
76
|
+
case "decline":
|
|
77
|
+
return "decline";
|
|
78
|
+
case "tentative":
|
|
79
|
+
return "tentative";
|
|
80
|
+
case "unknown":
|
|
81
|
+
return null;
|
|
82
|
+
default:
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function buildOutlookInvite(item) {
|
|
87
|
+
const itemClass = typeof item.ItemClass === "string" ? item.ItemClass : "";
|
|
88
|
+
const responseObjects = normalizeResponseObjects(item.ResponseObjects);
|
|
89
|
+
const isInvite = itemClass === "IPM.Schedule.Meeting.Request";
|
|
90
|
+
if (!isInvite) {
|
|
91
|
+
return {
|
|
92
|
+
is_invite: false,
|
|
93
|
+
rsvp_supported: false,
|
|
94
|
+
response_status: null,
|
|
95
|
+
available_rsvp_responses: [],
|
|
96
|
+
meeting: null,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const meeting = {
|
|
100
|
+
request_type: item.MeetingRequestType ?? null,
|
|
101
|
+
response_type: item.ResponseType ?? null,
|
|
102
|
+
organizer: mailboxFromExchange(item.Organizer ?? null)
|
|
103
|
+
?? mailboxFromExchange(item.Sender ?? null),
|
|
104
|
+
location: item.Location?.DisplayName ?? null,
|
|
105
|
+
start: item.Start ?? null,
|
|
106
|
+
end: item.End ?? null,
|
|
107
|
+
associated_calendar_item: itemIdData(item.AssociatedCalendarItemId ?? null),
|
|
108
|
+
available_rsvp_actions: responseObjects.filter((action) => ["AcceptItem", "TentativelyAcceptItem", "DeclineItem", "ProposeNewTime"].includes(action)),
|
|
109
|
+
};
|
|
110
|
+
const availableRsvpResponses = Array.from(new Set([
|
|
111
|
+
...(meeting.available_rsvp_actions.includes("AcceptItem") ? ["accept"] : []),
|
|
112
|
+
...(meeting.available_rsvp_actions.includes("DeclineItem") ? ["decline"] : []),
|
|
113
|
+
...(meeting.available_rsvp_actions.includes("TentativelyAcceptItem") ? ["tentative"] : []),
|
|
114
|
+
...(meeting.available_rsvp_actions.length === 0 && meeting.associated_calendar_item
|
|
115
|
+
? ["accept", "decline", "tentative"]
|
|
116
|
+
: []),
|
|
117
|
+
]));
|
|
118
|
+
return {
|
|
119
|
+
is_invite: true,
|
|
120
|
+
rsvp_supported: availableRsvpResponses.length > 0,
|
|
121
|
+
response_status: normalizeResponseType(item.ResponseType),
|
|
122
|
+
available_rsvp_responses: availableRsvpResponses,
|
|
123
|
+
meeting,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/providers/outlook/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { cpSync, existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { createInterface } from "node:readline/promises";
|
|
5
|
+
import { stdin, stdout } from "node:process";
|
|
6
|
+
import { chromium, errors } from "playwright-core";
|
|
7
|
+
const DEFAULT_OUTLOOK_URL = "https://outlook.office.com/mail/";
|
|
8
|
+
function resolveChromeExecutablePath() {
|
|
9
|
+
const explicitPath = process.env.SURFACE_CHROME_PATH;
|
|
10
|
+
if (explicitPath) {
|
|
11
|
+
return explicitPath;
|
|
12
|
+
}
|
|
13
|
+
const candidates = process.platform === "darwin"
|
|
14
|
+
? [
|
|
15
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
16
|
+
"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
|
|
17
|
+
]
|
|
18
|
+
: process.platform === "linux"
|
|
19
|
+
? ["/usr/bin/google-chrome", "/usr/bin/google-chrome-stable", "/usr/bin/chromium"]
|
|
20
|
+
: [];
|
|
21
|
+
for (const candidate of candidates) {
|
|
22
|
+
if (existsSync(candidate)) {
|
|
23
|
+
return candidate;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
throw new Error("Could not find a Chrome executable for Outlook Playwright auth. Set SURFACE_CHROME_PATH explicitly.");
|
|
27
|
+
}
|
|
28
|
+
export async function launchOutlookSession(profileDir, options) {
|
|
29
|
+
mkdirSync(profileDir, { recursive: true });
|
|
30
|
+
let effectiveProfileDir = profileDir;
|
|
31
|
+
let cleanup;
|
|
32
|
+
if (options.headless && existsSync(profileDir) && readdirSync(profileDir).length > 0) {
|
|
33
|
+
effectiveProfileDir = join(tmpdir(), `surface-outlook-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
34
|
+
cpSync(profileDir, effectiveProfileDir, { recursive: true });
|
|
35
|
+
cleanup = () => rmSync(effectiveProfileDir, { recursive: true, force: true });
|
|
36
|
+
}
|
|
37
|
+
const context = await chromium.launchPersistentContext(effectiveProfileDir, {
|
|
38
|
+
executablePath: resolveChromeExecutablePath(),
|
|
39
|
+
headless: options.headless,
|
|
40
|
+
viewport: { width: 1440, height: 960 },
|
|
41
|
+
});
|
|
42
|
+
const page = context.pages()[0] ?? (await context.newPage());
|
|
43
|
+
page.setDefaultTimeout(15_000);
|
|
44
|
+
return {
|
|
45
|
+
context,
|
|
46
|
+
page,
|
|
47
|
+
...(cleanup ? { cleanup } : {}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async function bodyText(page) {
|
|
51
|
+
try {
|
|
52
|
+
return await page.locator("body").innerText({ timeout: 3_000 });
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function maybeAdvanceAccountPicker(page) {
|
|
59
|
+
const text = await bodyText(page);
|
|
60
|
+
if (!text.includes("Pick an account")) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const candidates = page.locator('button, [role="button"]');
|
|
64
|
+
const count = Math.min(await candidates.count(), 12);
|
|
65
|
+
for (let index = 0; index < count; index += 1) {
|
|
66
|
+
const candidate = candidates.nth(index);
|
|
67
|
+
let candidateText = "";
|
|
68
|
+
try {
|
|
69
|
+
candidateText = (await candidate.innerText({ timeout: 1_000 })).trim();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const lowered = candidateText.toLowerCase();
|
|
75
|
+
if (!candidateText) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (lowered.includes("use another account") || lowered.includes("terms of use") || lowered.includes("privacy")) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (!candidateText.includes("@") && !candidateText.includes("\n")) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
await candidate.click();
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
async function waitForMessageList(page, timeoutMs) {
|
|
90
|
+
await page.locator('[role="listbox"]').first().waitFor({ timeout: timeoutMs });
|
|
91
|
+
}
|
|
92
|
+
async function waitForMailboxReady(page, timeoutMs) {
|
|
93
|
+
const deadline = Date.now() + timeoutMs;
|
|
94
|
+
let lastError = null;
|
|
95
|
+
while (Date.now() < deadline) {
|
|
96
|
+
if (await maybeAdvanceAccountPicker(page)) {
|
|
97
|
+
await page.waitForTimeout(1_500);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
await waitForMessageList(page, Math.min(2_000, Math.max(500, deadline - Date.now())));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
lastError = error;
|
|
106
|
+
await page.waitForTimeout(750);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
throw lastError instanceof Error ? lastError : new Error("Timed out waiting for Outlook mailbox UI.");
|
|
110
|
+
}
|
|
111
|
+
function classifyAuthBody(text, pageUrl) {
|
|
112
|
+
const lowered = text.toLowerCase();
|
|
113
|
+
const loginUrls = ["login.microsoftonline.com", "login.live.com", "/common/oauth2/"];
|
|
114
|
+
if (loginUrls.some((fragment) => pageUrl.includes(fragment))) {
|
|
115
|
+
return { status: "unauthenticated", detail: "Outlook is on a Microsoft login page." };
|
|
116
|
+
}
|
|
117
|
+
const unauthenticatedMarkers = [
|
|
118
|
+
"sign in",
|
|
119
|
+
"enter password",
|
|
120
|
+
"stay signed in",
|
|
121
|
+
"pick an account",
|
|
122
|
+
"use another account",
|
|
123
|
+
"microsoft account",
|
|
124
|
+
];
|
|
125
|
+
if (unauthenticatedMarkers.some((marker) => lowered.includes(marker))) {
|
|
126
|
+
return { status: "unauthenticated", detail: "Outlook profile needs interactive sign-in." };
|
|
127
|
+
}
|
|
128
|
+
return { status: "unknown", detail: "Could not determine whether Outlook is authenticated." };
|
|
129
|
+
}
|
|
130
|
+
export async function probeOutlookAuth(page, options) {
|
|
131
|
+
const outlookUrl = options.outlookUrl ?? DEFAULT_OUTLOOK_URL;
|
|
132
|
+
await page.goto(outlookUrl, { waitUntil: "domcontentloaded", timeout: options.timeoutMs });
|
|
133
|
+
try {
|
|
134
|
+
await waitForMailboxReady(page, options.timeoutMs);
|
|
135
|
+
return {
|
|
136
|
+
status: "authenticated",
|
|
137
|
+
detail: "Outlook mailbox UI loaded successfully with the current persistent profile.",
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const text = await bodyText(page);
|
|
142
|
+
const classified = classifyAuthBody(text, page.url());
|
|
143
|
+
if (classified.status !== "unknown") {
|
|
144
|
+
return classified;
|
|
145
|
+
}
|
|
146
|
+
if (error instanceof errors.TimeoutError) {
|
|
147
|
+
return {
|
|
148
|
+
status: "unknown",
|
|
149
|
+
detail: "Timed out while probing Outlook auth state. The session may still require manual interaction.",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
status: "unknown",
|
|
154
|
+
detail: error instanceof Error ? error.message : "Unknown Outlook auth probe failure.",
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export async function promptForOutlookLogin(profileDir) {
|
|
159
|
+
console.error("");
|
|
160
|
+
console.error("One-time Outlook profile bootstrap");
|
|
161
|
+
console.error(`Profile directory: ${profileDir}`);
|
|
162
|
+
console.error(`URL: ${DEFAULT_OUTLOOK_URL}`);
|
|
163
|
+
console.error("1. A Chrome window will open using the persistent Surface profile.");
|
|
164
|
+
console.error("2. Sign in to Outlook and complete MFA if prompted.");
|
|
165
|
+
console.error("3. Wait until the inbox is fully loaded.");
|
|
166
|
+
if (!stdin.isTTY || !stdout.isTTY) {
|
|
167
|
+
console.error("No interactive TTY detected, so Surface will not wait for Enter.");
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const readline = createInterface({ input: stdin, output: stdout });
|
|
171
|
+
try {
|
|
172
|
+
await readline.question("Press Enter here once Outlook is signed in and the inbox is visible...");
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
readline.close();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/providers/outlook/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
class HtmlTextExtractor {
|
|
2
|
+
static BLOCK_TAGS = new Set(["br", "div", "p", "li", "tr", "hr"]);
|
|
3
|
+
static IGNORED_TAGS = new Set(["head", "script", "style"]);
|
|
4
|
+
parts = [];
|
|
5
|
+
ignoredDepth = 0;
|
|
6
|
+
onOpenTag(tag) {
|
|
7
|
+
if (HtmlTextExtractor.IGNORED_TAGS.has(tag)) {
|
|
8
|
+
this.ignoredDepth += 1;
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (this.ignoredDepth > 0) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (HtmlTextExtractor.BLOCK_TAGS.has(tag)) {
|
|
15
|
+
this.parts.push("\n");
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
onCloseTag(tag) {
|
|
19
|
+
if (HtmlTextExtractor.IGNORED_TAGS.has(tag)) {
|
|
20
|
+
this.ignoredDepth = Math.max(0, this.ignoredDepth - 1);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (this.ignoredDepth > 0) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (HtmlTextExtractor.BLOCK_TAGS.has(tag)) {
|
|
27
|
+
this.parts.push("\n");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
onText(text) {
|
|
31
|
+
if (this.ignoredDepth > 0) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.parts.push(text);
|
|
35
|
+
}
|
|
36
|
+
text() {
|
|
37
|
+
return this.parts.join("");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function decodeEntities(value) {
|
|
41
|
+
return value
|
|
42
|
+
.replace(/ /g, " ")
|
|
43
|
+
.replace(/</g, "<")
|
|
44
|
+
.replace(/>/g, ">")
|
|
45
|
+
.replace(/&/g, "&")
|
|
46
|
+
.replace(/"/g, '"')
|
|
47
|
+
.replace(/'/g, "'");
|
|
48
|
+
}
|
|
49
|
+
function walkHtml(value, parser) {
|
|
50
|
+
const tagPattern = /<\/?([a-zA-Z0-9]+)(?:\s[^>]*?)?>/g;
|
|
51
|
+
let cursor = 0;
|
|
52
|
+
let match = null;
|
|
53
|
+
while ((match = tagPattern.exec(value)) !== null) {
|
|
54
|
+
if (match.index > cursor) {
|
|
55
|
+
parser.onText(decodeEntities(value.slice(cursor, match.index)));
|
|
56
|
+
}
|
|
57
|
+
const rawTag = match[0];
|
|
58
|
+
const tagName = (match[1] ?? "").toLowerCase();
|
|
59
|
+
if (rawTag.startsWith("</")) {
|
|
60
|
+
parser.onCloseTag(tagName);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
parser.onOpenTag(tagName);
|
|
64
|
+
if (rawTag.endsWith("/>")) {
|
|
65
|
+
parser.onCloseTag(tagName);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
cursor = match.index + rawTag.length;
|
|
69
|
+
}
|
|
70
|
+
if (cursor < value.length) {
|
|
71
|
+
parser.onText(decodeEntities(value.slice(cursor)));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function htmlToText(value) {
|
|
75
|
+
if (!value) {
|
|
76
|
+
return "";
|
|
77
|
+
}
|
|
78
|
+
const parser = new HtmlTextExtractor();
|
|
79
|
+
walkHtml(value, parser);
|
|
80
|
+
return parser
|
|
81
|
+
.text()
|
|
82
|
+
.replace(/\r/g, "")
|
|
83
|
+
.replace(/\n\s*\n\s*\n+/g, "\n\n")
|
|
84
|
+
.replace(/[ \t]+\n/g, "\n")
|
|
85
|
+
.replace(/\n[ \t]+/g, "\n")
|
|
86
|
+
.trim();
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/providers/shared/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/shared/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
|
package/dist/refs.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { monotonicFactory } from "ulid";
|
|
2
|
+
const createUlid = monotonicFactory();
|
|
3
|
+
function buildRef(prefix) {
|
|
4
|
+
return `${prefix}_${createUlid()}`;
|
|
5
|
+
}
|
|
6
|
+
export function makeAccountId() {
|
|
7
|
+
return buildRef("acc");
|
|
8
|
+
}
|
|
9
|
+
export function makeThreadRef() {
|
|
10
|
+
return buildRef("thr");
|
|
11
|
+
}
|
|
12
|
+
export function makeMessageRef() {
|
|
13
|
+
return buildRef("msg");
|
|
14
|
+
}
|
|
15
|
+
export function makeAttachmentId() {
|
|
16
|
+
return buildRef("att");
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=refs.js.map
|
package/dist/refs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAExC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;AAEtC,SAAS,QAAQ,CAAC,MAAc;IAC9B,OAAO,GAAG,MAAM,IAAI,UAAU,EAAE,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { loadConfig } from "./config.js";
|
|
2
|
+
import { buildAccountPaths, buildSurfacePaths, ensureSurfacePaths } from "./paths.js";
|
|
3
|
+
import { SurfaceDatabase } from "./state/database.js";
|
|
4
|
+
export function createRuntimeContext(options = {}) {
|
|
5
|
+
const { config, configPath } = loadConfig(options);
|
|
6
|
+
const paths = buildSurfacePaths(config, configPath);
|
|
7
|
+
ensureSurfacePaths(paths);
|
|
8
|
+
const db = new SurfaceDatabase(paths.stateDbPath);
|
|
9
|
+
return {
|
|
10
|
+
config,
|
|
11
|
+
configPath,
|
|
12
|
+
paths,
|
|
13
|
+
db,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function createAccountRuntimeContext(context, account) {
|
|
17
|
+
return {
|
|
18
|
+
...context,
|
|
19
|
+
account,
|
|
20
|
+
accountPaths: buildAccountPaths(context.paths, account),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAetD,MAAM,UAAU,oBAAoB,CAAC,UAAmC,EAAE;IACxE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpD,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAElD,OAAO;QACL,MAAM;QACN,UAAU;QACV,KAAK;QACL,EAAE;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,OAAuB,EACvB,OAAoB;IAEpB,OAAO;QACL,GAAG,OAAO;QACV,OAAO;QACP,YAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;KACxD,CAAC;AACJ,CAAC"}
|