@agenticmail/cli 0.8.35 → 0.9.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 +7 -1
- package/dist/public/js/icons.js +2 -0
- package/dist/public/js/list-view.js +154 -4
- package/dist/public/js/message-view.js +20 -0
- package/dist/public/js/sidebar.js +1 -0
- package/dist/public/styles.css +28 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -23,7 +23,13 @@ It bundles a setup wizard, API server launcher, and a full interactive shell wit
|
|
|
23
23
|
>
|
|
24
24
|
> Zero prompts, ~2 minutes, fully autonomous. Then tell the user to restart Claude Code. Full agent-facing runbook — including verification, common failures, and "what if Node < 22" — is at [`AGENTS.md`](https://github.com/agenticmail/agenticmail/blob/main/AGENTS.md) in the repo (the [agents.md](https://agents.md) convention).
|
|
25
25
|
|
|
26
|
-
## ✨ What's new in 0.
|
|
26
|
+
## ✨ What's new in 0.9.0
|
|
27
|
+
|
|
28
|
+
- **🧠 Layered wake-context** — every wake gets a `## Thread context` block prepended to the prompt: facts from the dispatcher's ThreadCache (last 10 envelopes per thread) + your own AgentMemory (markdown you write at end-of-wake via the new `save_thread_memory` MCP tool). Re-reading the full thread on every wake is no longer required.
|
|
29
|
+
- **🎯 `wake` default = `To:` only** — the giant token saver. CC'd local agents accumulate context but don't wake unless explicitly named. `wake: 'all'` opts back into the pre-0.9.0 "wake everyone CC'd" behaviour. The wake-thrash failure mode (one agent producing 4 status reports for one logical handoff) is gone.
|
|
30
|
+
- **⏱ Wake coalescing** — back-to-back wakes on the same `(agent, thread)` inside 30 s collapse into ONE Agent turn that sees the burst as a batch. Wake budget charges once. Configurable via `wakeCoalesceMs`.
|
|
31
|
+
|
|
32
|
+
## ✨ Earlier — 0.8.31
|
|
27
33
|
|
|
28
34
|
- **⏱ Compact-and-continue** — workers run across multiple SDK turns when one turn isn't enough. On context overflow the dispatcher synthesises a breadcrumb checkpoint from the captured log, builds a "resuming after context reset / do NOT redo" continuation prompt, and loops (4-iter cap so cost is bounded).
|
|
29
35
|
- **📐 Typed task contracts** — `call_agent` / `POST /tasks/assign` accept an `outputSchema` (JSON Schema, draft-7 subset). The wake prompt renders the schema into the worker's instructions and `submit_result` validates against it; mismatches return 400 with a flat `schemaErrors: [{ path, message }]` list so the worker can retry with a corrected shape.
|
package/dist/public/js/icons.js
CHANGED
|
@@ -32,6 +32,8 @@ const PATHS = {
|
|
|
32
32
|
|
|
33
33
|
// ─── Sidebar folders ────────────────────────────────────────────
|
|
34
34
|
inbox: 'M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zm0 12h-4c0 1.66-1.35 3-3 3s-3-1.34-3-3H5V5h14v10z',
|
|
35
|
+
// Material-style archive: lidded box with horizontal slot.
|
|
36
|
+
archive: 'M20.54 5.23l-1.39-1.68A1.45 1.45 0 0 0 18 3H6c-.47 0-.88.21-1.16.55L3.46 5.23A2 2 0 0 0 3 6.5V19a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.5c0-.5-.18-.96-.46-1.27zM12 17.5L6.5 12H10v-2h4v2h3.5L12 17.5zM5.12 5l.82-1h12l.93 1H5.12z',
|
|
35
37
|
sent: 'M2.01 21 23 12 2.01 3 2 10l15 2-15 2z',
|
|
36
38
|
drafts: 'M19 3H4.99c-1.11 0-1.98.9-1.98 2L3 19a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2v-7l-8 5-8-5V5l8 5 8-5v2h2V5a2 2 0 0 0-2-2z',
|
|
37
39
|
allMail: 'M22 4h-2v9.38l-2.79-2.79L16 12l4 4 4-4-1.21-1.21L22 13.38V4zM4 4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8h-2v10H4V6h12V4H4z',
|
|
@@ -38,6 +38,11 @@ const FOLDER_MATCHERS = {
|
|
|
38
38
|
drafts: /^drafts?\b|\[gmail\]\/drafts/i,
|
|
39
39
|
spam: /^junk\b|junk mail|^spam\b|\[gmail\]\/spam/i,
|
|
40
40
|
trash: /^trash\b|deleted items|deleted messages|\[gmail\]\/trash|\[gmail\]\/bin/i,
|
|
41
|
+
// Archive is a Gmail/Outlook concept — most servers don't ship
|
|
42
|
+
// with one by default. We auto-create on demand (see the API's
|
|
43
|
+
// archive endpoint) so this matcher only needs to recognise
|
|
44
|
+
// existing folders.
|
|
45
|
+
archive: /^archives?\b|^all archive\b/i,
|
|
41
46
|
all: /^all mail\b|\[gmail\]\/all/i,
|
|
42
47
|
};
|
|
43
48
|
|
|
@@ -72,10 +77,11 @@ export async function ensureFolderCache(agent) {
|
|
|
72
77
|
} catch {
|
|
73
78
|
// Discovery failed — fall back to the most common defaults so
|
|
74
79
|
// at least Inbox + Sent work for vanilla Stalwart.
|
|
75
|
-
state.folderNames.sent
|
|
76
|
-
state.folderNames.drafts
|
|
77
|
-
state.folderNames.spam
|
|
78
|
-
state.folderNames.trash
|
|
80
|
+
state.folderNames.sent = 'Sent Items';
|
|
81
|
+
state.folderNames.drafts = 'Drafts';
|
|
82
|
+
state.folderNames.spam = 'Junk Mail';
|
|
83
|
+
state.folderNames.trash = 'Trash';
|
|
84
|
+
state.folderNames.archive = 'Archive';
|
|
79
85
|
}
|
|
80
86
|
}
|
|
81
87
|
|
|
@@ -91,6 +97,14 @@ export async function loadList(agent, folder) {
|
|
|
91
97
|
<input type="checkbox" id="list-select-all-input" />
|
|
92
98
|
</label>
|
|
93
99
|
<button class="icon-btn list-refresh" title="Refresh" id="list-refresh-btn">${icon('refresh', { size: 18 })}</button>
|
|
100
|
+
<div class="bulk-actions" id="bulk-actions" hidden>
|
|
101
|
+
<button class="icon-btn bulk-btn" id="bulk-archive" title="Archive selected">${icon('archive', { size: 18 })}</button>
|
|
102
|
+
<button class="icon-btn bulk-btn" id="bulk-delete" title="Delete selected">${icon('trash', { size: 18 })}</button>
|
|
103
|
+
<button class="icon-btn bulk-btn" id="bulk-spam" title="Report as spam">${icon('spam', { size: 18 })}</button>
|
|
104
|
+
<button class="icon-btn bulk-btn" id="bulk-mark-read" title="Mark as read">${icon('check', { size: 18 })}</button>
|
|
105
|
+
<button class="icon-btn bulk-btn" id="bulk-mark-unread" title="Mark as unread">${icon('mailUnread', { size: 18 })}</button>
|
|
106
|
+
<span class="bulk-count" id="bulk-count"></span>
|
|
107
|
+
</div>
|
|
94
108
|
<div class="list-toolbar-spacer"></div>
|
|
95
109
|
<span class="count-text" id="list-count"></span>
|
|
96
110
|
</div>
|
|
@@ -101,7 +115,17 @@ export async function loadList(agent, folder) {
|
|
|
101
115
|
const checked = e.target.checked;
|
|
102
116
|
document.querySelectorAll('#list-rows .row-check input[type=checkbox]')
|
|
103
117
|
.forEach(cb => { cb.checked = checked; });
|
|
118
|
+
updateBulkActions();
|
|
104
119
|
});
|
|
120
|
+
// Wire bulk-action handlers — each gathers the selected UIDs,
|
|
121
|
+
// calls the matching batch endpoint, and reloads the list. The
|
|
122
|
+
// toolbar visibility is driven by `updateBulkActions` which is
|
|
123
|
+
// called every time a checkbox flips.
|
|
124
|
+
document.getElementById('bulk-archive')?.addEventListener('click', () => runBulkAction(agent, folder, 'archive'));
|
|
125
|
+
document.getElementById('bulk-delete')?.addEventListener('click', () => runBulkAction(agent, folder, 'delete'));
|
|
126
|
+
document.getElementById('bulk-spam')?.addEventListener('click', () => runBulkAction(agent, folder, 'spam'));
|
|
127
|
+
document.getElementById('bulk-mark-read')?.addEventListener('click', () => runBulkAction(agent, folder, 'mark-read'));
|
|
128
|
+
document.getElementById('bulk-mark-unread')?.addEventListener('click', () => runBulkAction(agent, folder, 'mark-unread'));
|
|
105
129
|
|
|
106
130
|
// Drafts are a SQL-backed app primitive, not an IMAP mailbox.
|
|
107
131
|
// The autosave path writes to /drafts (sqlite) and the agent
|
|
@@ -204,6 +228,20 @@ export function renderList() {
|
|
|
204
228
|
if (state.selectedFolder === 'starred') {
|
|
205
229
|
filtered = filtered.filter(m => flagsHas(m.flags, '\\Flagged'));
|
|
206
230
|
}
|
|
231
|
+
// Defensive Sent-folder filter. The API serves the IMAP Sent
|
|
232
|
+
// mailbox directly, but some Stalwart configurations (or
|
|
233
|
+
// misconfigured saveSentCopy targets) can land messages whose
|
|
234
|
+
// sender ISN'T the active agent in Sent. Filter client-side
|
|
235
|
+
// so the user only ever sees messages they actually sent.
|
|
236
|
+
// This is a safety net — the server-side fix lives in
|
|
237
|
+
// saveSentCopy and the dispatcher's send path.
|
|
238
|
+
if (state.selectedFolder === 'sent' && state.selectedAgent?.email) {
|
|
239
|
+
const me = state.selectedAgent.email.toLowerCase();
|
|
240
|
+
filtered = filtered.filter(m => {
|
|
241
|
+
const fromAddr = (m.from?.[0]?.address ?? '').toLowerCase();
|
|
242
|
+
return fromAddr === me;
|
|
243
|
+
});
|
|
244
|
+
}
|
|
207
245
|
|
|
208
246
|
const hlTerm = filters?.subject || filters?.from || filters?.text || '';
|
|
209
247
|
|
|
@@ -270,6 +308,12 @@ export function renderList() {
|
|
|
270
308
|
}).join('');
|
|
271
309
|
|
|
272
310
|
root.querySelectorAll('.list-row').forEach(el => {
|
|
311
|
+
// Checkbox change on individual rows — drives the bulk-action
|
|
312
|
+
// toolbar visibility. Attached separately from the row click
|
|
313
|
+
// handler so clicking the box doesn't propagate to "open
|
|
314
|
+
// message".
|
|
315
|
+
const cb = el.querySelector('.row-check input[type=checkbox]');
|
|
316
|
+
cb?.addEventListener('change', updateBulkActions);
|
|
273
317
|
el.addEventListener('click', (e) => {
|
|
274
318
|
// Star click — toggle via API and optimistically update the
|
|
275
319
|
// local flags so the icon flips without a reload.
|
|
@@ -298,6 +342,112 @@ export function renderList() {
|
|
|
298
342
|
});
|
|
299
343
|
}
|
|
300
344
|
|
|
345
|
+
/**
|
|
346
|
+
* Read every checked row's UID. Empty array when nothing is
|
|
347
|
+
* selected. Used by the bulk-action handlers and toolbar
|
|
348
|
+
* visibility logic.
|
|
349
|
+
*/
|
|
350
|
+
function getSelectedUids() {
|
|
351
|
+
const uids = [];
|
|
352
|
+
document.querySelectorAll('#list-rows .list-row').forEach(row => {
|
|
353
|
+
const cb = row.querySelector('.row-check input[type=checkbox]');
|
|
354
|
+
if (cb?.checked) {
|
|
355
|
+
const uid = Number(row.dataset.uid);
|
|
356
|
+
if (Number.isFinite(uid)) uids.push(uid);
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
return uids;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Toggle the visibility of the bulk-action toolbar based on
|
|
364
|
+
* current selection. Also updates the count label so the user
|
|
365
|
+
* sees "3 selected" etc. Called on every checkbox change +
|
|
366
|
+
* after each successful bulk action.
|
|
367
|
+
*/
|
|
368
|
+
function updateBulkActions() {
|
|
369
|
+
const uids = getSelectedUids();
|
|
370
|
+
const bar = document.getElementById('bulk-actions');
|
|
371
|
+
const count = document.getElementById('bulk-count');
|
|
372
|
+
if (!bar || !count) return;
|
|
373
|
+
if (uids.length === 0) {
|
|
374
|
+
bar.hidden = true;
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
bar.hidden = false;
|
|
378
|
+
count.textContent = `${uids.length} selected`;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Execute a bulk action against every currently-selected row.
|
|
383
|
+
* Maps the action name to the matching batch endpoint, fires
|
|
384
|
+
* one request, then reloads the list so the rows disappear /
|
|
385
|
+
* change visibly. Confirm dialogs only on destructive actions
|
|
386
|
+
* (delete, spam) — archive + mark-read/unread are silent.
|
|
387
|
+
*/
|
|
388
|
+
async function runBulkAction(agent, folder, action) {
|
|
389
|
+
const uids = getSelectedUids();
|
|
390
|
+
if (uids.length === 0) return;
|
|
391
|
+
const imap = state.folderNames?.[folder] ?? 'INBOX';
|
|
392
|
+
let confirmTitle = '';
|
|
393
|
+
let confirmBody = '';
|
|
394
|
+
let confirmLabel = '';
|
|
395
|
+
let endpoint = '';
|
|
396
|
+
let body = { uids, folder: imap };
|
|
397
|
+
let danger = false;
|
|
398
|
+
switch (action) {
|
|
399
|
+
case 'archive':
|
|
400
|
+
endpoint = '/mail/batch/archive';
|
|
401
|
+
break;
|
|
402
|
+
case 'delete':
|
|
403
|
+
// From Trash, batch/trash falls through to permanent
|
|
404
|
+
// expunge; everywhere else it's a move-to-trash.
|
|
405
|
+
endpoint = '/mail/batch/trash';
|
|
406
|
+
danger = true;
|
|
407
|
+
confirmTitle = folder === 'trash' ? `Delete ${uids.length} message${uids.length === 1 ? '' : 's'} forever?` : `Move ${uids.length} message${uids.length === 1 ? '' : 's'} to Trash?`;
|
|
408
|
+
confirmBody = folder === 'trash' ? "This can't be undone." : 'You can recover them from Trash.';
|
|
409
|
+
confirmLabel = folder === 'trash' ? 'Delete forever' : 'Move to Trash';
|
|
410
|
+
break;
|
|
411
|
+
case 'spam':
|
|
412
|
+
// No batch/spam route yet — fall back to batch/move with
|
|
413
|
+
// the auto-discovered Spam folder.
|
|
414
|
+
endpoint = '/mail/batch/move';
|
|
415
|
+
body.toFolder = state.folderNames?.spam ?? 'Junk Mail';
|
|
416
|
+
danger = true;
|
|
417
|
+
confirmTitle = `Report ${uids.length} message${uids.length === 1 ? '' : 's'} as spam?`;
|
|
418
|
+
confirmBody = 'They will be moved to the Junk folder.';
|
|
419
|
+
confirmLabel = 'Report spam';
|
|
420
|
+
break;
|
|
421
|
+
case 'mark-read':
|
|
422
|
+
endpoint = '/mail/batch/seen';
|
|
423
|
+
break;
|
|
424
|
+
case 'mark-unread':
|
|
425
|
+
endpoint = '/mail/batch/unseen';
|
|
426
|
+
break;
|
|
427
|
+
default:
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
if (confirmTitle) {
|
|
431
|
+
const { confirmModal } = await import('./modal.js');
|
|
432
|
+
const ok = await confirmModal({ title: confirmTitle, body: confirmBody, confirm: confirmLabel, danger });
|
|
433
|
+
if (!ok) return;
|
|
434
|
+
}
|
|
435
|
+
try {
|
|
436
|
+
await apiPost(endpoint, body, { agentKey: agent.apiKey });
|
|
437
|
+
toast(`${uids.length} message${uids.length === 1 ? '' : 's'} ${
|
|
438
|
+
action === 'archive' ? 'archived' :
|
|
439
|
+
action === 'delete' ? (folder === 'trash' ? 'deleted' : 'moved to Trash') :
|
|
440
|
+
action === 'spam' ? 'reported as spam' :
|
|
441
|
+
action === 'mark-read' ? 'marked as read' :
|
|
442
|
+
'marked as unread'
|
|
443
|
+
}.`);
|
|
444
|
+
// Reload so the rows that moved/changed visibly update.
|
|
445
|
+
await loadList(agent, folder);
|
|
446
|
+
} catch (err) {
|
|
447
|
+
toast(`Bulk ${action} failed: ${err.message}`, true);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
301
451
|
/**
|
|
302
452
|
* Toggle the IMAP \Flagged flag on a message via the API. Updates
|
|
303
453
|
* the in-memory message object on success so renderList reflects
|
|
@@ -19,6 +19,7 @@ export async function openMessage(uid) {
|
|
|
19
19
|
<button class="icon-btn" id="msg-back" title="Back to list">${icon('back')}</button>
|
|
20
20
|
<button class="icon-btn" id="msg-reply" title="Reply">${icon('reply')}</button>
|
|
21
21
|
<button class="icon-btn" id="msg-reply-all" title="Reply all">${icon('replyAll')}</button>
|
|
22
|
+
<button class="icon-btn" id="msg-archive" title="Archive">${icon('archive')}</button>
|
|
22
23
|
<button class="icon-btn" id="msg-unread" title="Mark unread">${icon('mailUnread')}</button>
|
|
23
24
|
<button class="icon-btn" id="msg-spam" title="Report spam">${icon('spam')}</button>
|
|
24
25
|
<button class="icon-btn" id="msg-delete" title="Delete">${icon('trash')}</button>
|
|
@@ -29,6 +30,7 @@ export async function openMessage(uid) {
|
|
|
29
30
|
document.getElementById('msg-back').addEventListener('click', () => { location.hash = `#/folder/${state.selectedFolder ?? 'inbox'}`; });
|
|
30
31
|
document.getElementById('msg-reply').addEventListener('click', () => openReply(false));
|
|
31
32
|
document.getElementById('msg-reply-all').addEventListener('click', () => openReply(true));
|
|
33
|
+
document.getElementById('msg-archive').addEventListener('click', () => archiveMessage());
|
|
32
34
|
document.getElementById('msg-unread').addEventListener('click', () => markUnread());
|
|
33
35
|
document.getElementById('msg-spam').addEventListener('click', () => markSpam());
|
|
34
36
|
document.getElementById('msg-delete').addEventListener('click', () => deleteMessage());
|
|
@@ -219,6 +221,24 @@ async function markUnread() {
|
|
|
219
221
|
* route is POST /mail/messages/:uid/spam — it does the move +
|
|
220
222
|
* flags the message so future scans treat it as known spam.
|
|
221
223
|
*/
|
|
224
|
+
/**
|
|
225
|
+
* Archive the open message — move it to the Archive folder.
|
|
226
|
+
* No confirm dialog; archive is non-destructive (Gmail UX) so
|
|
227
|
+
* the user can always go to Archive and move things back.
|
|
228
|
+
*/
|
|
229
|
+
async function archiveMessage() {
|
|
230
|
+
if (!state.currentMessage || !state.selectedAgent) return;
|
|
231
|
+
try {
|
|
232
|
+
const imap = state.folderNames?.[state.selectedFolder] ?? 'INBOX';
|
|
233
|
+
await apiPost(`/mail/messages/${state.selectedUid}/archive`, { folder: imap }, { agentKey: state.selectedAgent.apiKey });
|
|
234
|
+
toast('Archived.');
|
|
235
|
+
location.hash = `#/folder/${state.selectedFolder ?? 'inbox'}`;
|
|
236
|
+
await loadList(state.selectedAgent, state.selectedFolder);
|
|
237
|
+
} catch (err) {
|
|
238
|
+
toast(`Archive failed: ${err.message}`, true);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
222
242
|
async function markSpam() {
|
|
223
243
|
if (!state.currentMessage || !state.selectedAgent) return;
|
|
224
244
|
const ok = await confirmModal({
|
|
@@ -19,6 +19,7 @@ export const FOLDERS = [
|
|
|
19
19
|
{ id: 'starred', label: 'Starred', icon: 'starOutline' },
|
|
20
20
|
{ id: 'sent', label: 'Sent', icon: 'sent' },
|
|
21
21
|
{ id: 'drafts', label: 'Drafts', icon: 'drafts' },
|
|
22
|
+
{ id: 'archive', label: 'Archive', icon: 'archive' },
|
|
22
23
|
{ id: 'all', label: 'All Mail', icon: 'allMail', requiresDiscovery: true },
|
|
23
24
|
{ id: 'spam', label: 'Spam', icon: 'spam' },
|
|
24
25
|
{ id: 'trash', label: 'Trash', icon: 'trash' },
|
package/dist/public/styles.css
CHANGED
|
@@ -419,6 +419,27 @@ a { color: var(--accent-strong); }
|
|
|
419
419
|
font-size: 12px; color: var(--muted);
|
|
420
420
|
}
|
|
421
421
|
|
|
422
|
+
/* Bulk-action toolbar — appears between select-all and refresh
|
|
423
|
+
when one or more rows are checked. Replaces the visual idle
|
|
424
|
+
state of the row (toolbar) with action buttons + a "N selected"
|
|
425
|
+
indicator on the right. */
|
|
426
|
+
.bulk-actions {
|
|
427
|
+
display: flex; align-items: center; gap: 4px;
|
|
428
|
+
margin-left: 8px;
|
|
429
|
+
padding-left: 12px;
|
|
430
|
+
border-left: 1px solid var(--line);
|
|
431
|
+
}
|
|
432
|
+
.bulk-actions[hidden] { display: none; }
|
|
433
|
+
.bulk-actions .bulk-btn {
|
|
434
|
+
width: 36px; height: 36px;
|
|
435
|
+
color: var(--ink-soft);
|
|
436
|
+
}
|
|
437
|
+
.bulk-actions .bulk-btn:hover { background: var(--bg-hover); color: var(--ink); }
|
|
438
|
+
.bulk-count {
|
|
439
|
+
font-size: 12px; font-weight: 500; color: var(--accent-strong);
|
|
440
|
+
margin-left: 8px;
|
|
441
|
+
}
|
|
442
|
+
|
|
422
443
|
/* Gmail-style compact rows.
|
|
423
444
|
Single line per message; subject + preview share one truncated
|
|
424
445
|
cell so longer previews tail off with ellipsis instead of
|
|
@@ -576,6 +597,13 @@ mark.search-hl {
|
|
|
576
597
|
max-width: 840px;
|
|
577
598
|
margin: 0 auto;
|
|
578
599
|
width: 100%;
|
|
600
|
+
/* Clear visual end-of-message marker. The reply / quoted-thread
|
|
601
|
+
chrome above made the body's bottom ambiguous; a hairline rule
|
|
602
|
+
gives the reader a definite stop and separates from the
|
|
603
|
+
attachments / next message in stack views. */
|
|
604
|
+
border-bottom: 1px solid var(--line);
|
|
605
|
+
padding-bottom: 28px;
|
|
606
|
+
margin-bottom: 8px;
|
|
579
607
|
}
|
|
580
608
|
.message-body h1, .message-body h2, .message-body h3 {
|
|
581
609
|
color: var(--pink); margin: 1.2em 0 .4em;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agenticmail/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Email and SMS infrastructure for AI agents — the first platform to give agents real email addresses and phone numbers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,12 +29,12 @@
|
|
|
29
29
|
"prepublishOnly": "npm run build"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@agenticmail/api": "^0.
|
|
33
|
-
"@agenticmail/core": "^0.
|
|
32
|
+
"@agenticmail/api": "^0.9.0",
|
|
33
|
+
"@agenticmail/core": "^0.9.0",
|
|
34
34
|
"json5": "^2.2.3"
|
|
35
35
|
},
|
|
36
36
|
"optionalDependencies": {
|
|
37
|
-
"@agenticmail/claudecode": "^0.
|
|
37
|
+
"@agenticmail/claudecode": "^0.2.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"tsup": "^8.4.0",
|