@bobfrankston/rmfmail 1.2.163 → 1.2.165
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/bin/mailx.js +100 -82
- package/bin/mailx.js.map +1 -1
- package/bin/mailx.ts +89 -71
- package/client/android-bootstrap.bundle.js.map +2 -2
- package/client/app.bundle.js +79 -18
- package/client/app.bundle.js.map +3 -3
- package/client/app.js +48 -0
- package/client/app.js.map +1 -1
- package/client/app.ts +47 -0
- package/client/components/calendar-sidebar.js +45 -20
- package/client/components/calendar-sidebar.js.map +1 -1
- package/client/components/calendar-sidebar.ts +41 -16
- package/client/compose/compose.bundle.js +7 -0
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/index.html +1 -0
- package/client/lib/api-client.js +7 -0
- package/client/lib/api-client.js.map +1 -1
- package/client/lib/api-client.ts +8 -1
- package/client/lib/mailxapi.js +7 -0
- package/package.json +9 -9
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +1 -1
- package/packages/mailx-service/index.d.ts +23 -0
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +187 -5
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-service/index.ts +171 -5
- package/packages/mailx-service/jsonrpc.js +2 -0
- package/packages/mailx-service/jsonrpc.js.map +1 -1
- package/packages/mailx-service/jsonrpc.ts +2 -0
- package/packages/mailx-service/package.json +1 -1
- package/packages/mailx-settings/docs/annotation-registry.md +74 -0
- package/packages/mailx-settings/package.json +1 -1
- package/packages/mailx-store/package.json +1 -1
- package/packages/mailx-store-web/package.json +1 -1
- package/packages/mailx-types/index.d.ts +8 -1
- package/packages/mailx-types/index.d.ts.map +1 -1
- package/packages/mailx-types/index.js.map +1 -1
- package/packages/mailx-types/index.ts +8 -1
- package/packages/mailx-types/mailx-api.d.ts +6 -0
- package/packages/mailx-types/mailx-api.d.ts.map +1 -1
- package/packages/mailx-types/mailx-api.ts +3 -0
- package/packages/mailx-types/package.json +1 -1
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-74216 → node_modules.npmglobalize-stash-52720}/.package-lock.json +0 -0
package/client/app.bundle.js
CHANGED
|
@@ -97,6 +97,7 @@ __export(api_client_exports, {
|
|
|
97
97
|
reauthGoogleScopes: () => reauthGoogleScopes,
|
|
98
98
|
reauthenticate: () => reauthenticate,
|
|
99
99
|
recordSpamReport: () => recordSpamReport,
|
|
100
|
+
registerMailto: () => registerMailto,
|
|
100
101
|
removeUserDictWord: () => removeUserDictWord,
|
|
101
102
|
renameFolder: () => renameFolder,
|
|
102
103
|
repairAccounts: () => repairAccounts,
|
|
@@ -631,6 +632,12 @@ async function openAttachment(accountId, uid, attachmentId, folderId, filename)
|
|
|
631
632
|
async function getMessageSource(accountId, uid, folderId) {
|
|
632
633
|
return ipc().getMessageSource(accountId, uid, folderId);
|
|
633
634
|
}
|
|
635
|
+
async function registerMailto() {
|
|
636
|
+
const fn = ipc().registerMailto;
|
|
637
|
+
if (!fn)
|
|
638
|
+
return { ok: false, message: "Not available in this host \u2014 run `rmfmail -register-mailto` from a terminal." };
|
|
639
|
+
return fn();
|
|
640
|
+
}
|
|
634
641
|
async function popoutWindow(accountId, uid, folderId, subject) {
|
|
635
642
|
const fn = ipc().popoutWindow;
|
|
636
643
|
if (!fn)
|
|
@@ -5605,6 +5612,7 @@ function openNewEventDialog() {
|
|
|
5605
5612
|
createBtn.click();
|
|
5606
5613
|
}
|
|
5607
5614
|
});
|
|
5615
|
+
let asTextMode = false;
|
|
5608
5616
|
createBtn.addEventListener("click", async () => {
|
|
5609
5617
|
const text = ta.value.trim();
|
|
5610
5618
|
if (!text) {
|
|
@@ -5614,26 +5622,39 @@ function openNewEventDialog() {
|
|
|
5614
5622
|
createBtn.disabled = true;
|
|
5615
5623
|
cancelBtn.disabled = true;
|
|
5616
5624
|
status.textContent = "Parsing\u2026";
|
|
5617
|
-
let
|
|
5618
|
-
|
|
5619
|
-
|
|
5620
|
-
|
|
5621
|
-
|
|
5622
|
-
|
|
5623
|
-
|
|
5624
|
-
|
|
5625
|
-
|
|
5626
|
-
|
|
5627
|
-
|
|
5628
|
-
|
|
5629
|
-
|
|
5625
|
+
let events = [];
|
|
5626
|
+
if (!asTextMode) {
|
|
5627
|
+
try {
|
|
5628
|
+
const { aiTransform: aiTransform2 } = await Promise.resolve().then(() => (init_api_client(), api_client_exports));
|
|
5629
|
+
const r = await aiTransform2({
|
|
5630
|
+
action: "extractEvent",
|
|
5631
|
+
text,
|
|
5632
|
+
nowISO: (/* @__PURE__ */ new Date()).toISOString()
|
|
5633
|
+
});
|
|
5634
|
+
events = r?.events || (r?.event ? [r.event] : []);
|
|
5635
|
+
if (events.length === 0) {
|
|
5636
|
+
status.textContent = `AI parse failed${r?.reason ? `: ${r.reason}` : ""}.`;
|
|
5637
|
+
}
|
|
5638
|
+
} catch (e) {
|
|
5639
|
+
status.textContent = `AI call failed: ${e.message}`;
|
|
5640
|
+
}
|
|
5641
|
+
if (events.length === 0) {
|
|
5642
|
+
createBtn.textContent = "Create as text";
|
|
5643
|
+
createBtn.disabled = false;
|
|
5644
|
+
cancelBtn.disabled = false;
|
|
5645
|
+
asTextMode = true;
|
|
5646
|
+
return;
|
|
5647
|
+
}
|
|
5630
5648
|
}
|
|
5631
|
-
const url = buildGoogleEventUrl(event, text);
|
|
5632
5649
|
const api = window.mailxapi;
|
|
5633
|
-
|
|
5634
|
-
|
|
5635
|
-
|
|
5636
|
-
|
|
5650
|
+
const targets = events.length ? events : [null];
|
|
5651
|
+
for (const ev of targets) {
|
|
5652
|
+
const url = buildGoogleEventUrl(ev, text);
|
|
5653
|
+
if (api?.openExternal)
|
|
5654
|
+
api.openExternal(url);
|
|
5655
|
+
else
|
|
5656
|
+
window.open(url, "_blank");
|
|
5657
|
+
}
|
|
5637
5658
|
close();
|
|
5638
5659
|
});
|
|
5639
5660
|
}
|
|
@@ -5670,6 +5691,8 @@ function buildGoogleEventUrl(event, fallbackText) {
|
|
|
5670
5691
|
params.push(`location=${encodeURIComponent(event.location)}`);
|
|
5671
5692
|
if (event?.notes)
|
|
5672
5693
|
params.push(`details=${encodeURIComponent(event.notes)}`);
|
|
5694
|
+
if (event?.timeZone)
|
|
5695
|
+
params.push(`ctz=${encodeURIComponent(event.timeZone)}`);
|
|
5673
5696
|
return `${base}&${params.join("&")}`;
|
|
5674
5697
|
}
|
|
5675
5698
|
async function showCalendarSidebar() {
|
|
@@ -11123,6 +11146,44 @@ document.getElementById("btn-edit-jsonc")?.addEventListener("click", async () =>
|
|
|
11123
11146
|
if (settingsDropdown2) settingsDropdown2.hidden = true;
|
|
11124
11147
|
await openJsoncEditor("accounts.jsonc");
|
|
11125
11148
|
});
|
|
11149
|
+
document.getElementById("btn-register-mailto")?.addEventListener("click", async () => {
|
|
11150
|
+
const settingsDropdown2 = document.getElementById("settings-dropdown");
|
|
11151
|
+
if (settingsDropdown2) settingsDropdown2.hidden = true;
|
|
11152
|
+
const { registerMailto: registerMailto2 } = await Promise.resolve().then(() => (init_api_client(), api_client_exports));
|
|
11153
|
+
const r = await registerMailto2();
|
|
11154
|
+
const backdrop = document.createElement("div");
|
|
11155
|
+
backdrop.className = "mailx-modal-backdrop";
|
|
11156
|
+
backdrop.style.cssText = "position:fixed;inset:0;z-index:2000;background:rgba(0,0,0,0.4);display:flex;align-items:center;justify-content:center;";
|
|
11157
|
+
const panel = document.createElement("div");
|
|
11158
|
+
panel.style.cssText = "background:var(--color-bg,#fff);color:var(--color-text,#000);border-radius:8px;box-shadow:0 8px 32px rgba(0,0,0,0.3);width:min(520px,90vw);padding:18px;display:flex;flex-direction:column;gap:12px;";
|
|
11159
|
+
const heading = document.createElement("div");
|
|
11160
|
+
heading.style.cssText = "font-weight:600;font-size:1.05em;";
|
|
11161
|
+
heading.textContent = r.ok ? "rmfmail registered as an email handler" : "Registration failed";
|
|
11162
|
+
const body = document.createElement("div");
|
|
11163
|
+
body.style.cssText = "font-size:0.92em;line-height:1.45;white-space:pre-wrap;";
|
|
11164
|
+
body.textContent = r.ok ? 'One manual step remains \u2014 Windows only lets YOU flip the default:\n\nSettings \u2192 Apps \u2192 Default apps \u2192 search "rmfmail" \u2192 set it for MAILTO.\n\nIf a picker warns the app must be from the Store, choose "More options" / "Choose an app on this PC".' : r.message;
|
|
11165
|
+
const btnRow = document.createElement("div");
|
|
11166
|
+
btnRow.style.cssText = "display:flex;gap:8px;justify-content:flex-end;";
|
|
11167
|
+
const closeBtn = document.createElement("button");
|
|
11168
|
+
closeBtn.textContent = "Close";
|
|
11169
|
+
closeBtn.style.cssText = "padding:6px 14px;";
|
|
11170
|
+
closeBtn.addEventListener("click", () => backdrop.remove());
|
|
11171
|
+
btnRow.append(closeBtn);
|
|
11172
|
+
if (r.ok) {
|
|
11173
|
+
const openBtn = document.createElement("button");
|
|
11174
|
+
openBtn.textContent = "Open Default-apps settings";
|
|
11175
|
+
openBtn.style.cssText = "padding:6px 14px;font-weight:500;";
|
|
11176
|
+
openBtn.addEventListener("click", () => {
|
|
11177
|
+
const api = window.mailxapi;
|
|
11178
|
+
if (api?.openExternal) api.openExternal("ms-settings:defaultapps");
|
|
11179
|
+
backdrop.remove();
|
|
11180
|
+
});
|
|
11181
|
+
btnRow.append(openBtn);
|
|
11182
|
+
}
|
|
11183
|
+
panel.append(heading, body, btnRow);
|
|
11184
|
+
backdrop.append(panel);
|
|
11185
|
+
document.body.append(backdrop);
|
|
11186
|
+
});
|
|
11126
11187
|
document.addEventListener("mailx-open-jsonc-editor", async (ev) => {
|
|
11127
11188
|
const file = ev.detail?.file || "accounts.jsonc";
|
|
11128
11189
|
await openJsoncEditor(file);
|