humanish 0.94.0 → 0.96.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 +10 -0
- package/dist/comms-agentmail.d.ts +25 -0
- package/dist/comms-agentmail.js +418 -0
- package/dist/comms-agentmail.js.map +1 -0
- package/dist/comms-connections.d.ts +52 -0
- package/dist/comms-connections.js +123 -0
- package/dist/comms-connections.js.map +1 -0
- package/dist/comms-lease-store.d.ts +90 -0
- package/dist/comms-lease-store.js +489 -0
- package/dist/comms-lease-store.js.map +1 -0
- package/dist/comms-receiving-evidence.d.ts +46 -0
- package/dist/comms-receiving-evidence.js +35 -0
- package/dist/comms-receiving-evidence.js.map +1 -0
- package/dist/comms-receiving-inbox.d.ts +16 -0
- package/dist/comms-receiving-inbox.js +410 -0
- package/dist/comms-receiving-inbox.js.map +1 -0
- package/dist/comms-receiving-runtime.d.ts +25 -0
- package/dist/comms-receiving-runtime.js +45 -0
- package/dist/comms-receiving-runtime.js.map +1 -0
- package/dist/comms-receiving-types.d.ts +98 -0
- package/dist/comms-receiving-types.js +2 -0
- package/dist/comms-receiving-types.js.map +1 -0
- package/dist/comms-receiving.d.ts +58 -0
- package/dist/comms-receiving.js +554 -0
- package/dist/comms-receiving.js.map +1 -0
- package/dist/comms-setup.d.ts +40 -0
- package/dist/comms-setup.js +121 -0
- package/dist/comms-setup.js.map +1 -0
- package/dist/concurrent-shared-world-lab.js +662 -624
- package/dist/concurrent-shared-world-lab.js.map +1 -1
- package/dist/cua-actor-lab.d.ts +4 -1
- package/dist/cua-actor-lab.js +98 -17
- package/dist/cua-actor-lab.js.map +1 -1
- package/dist/doctor-lab.d.ts +7 -0
- package/dist/doctor-lab.js +26 -7
- package/dist/doctor-lab.js.map +1 -1
- package/dist/e2b-terminal-lab.js +3 -0
- package/dist/e2b-terminal-lab.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/key-resolution.d.ts +1 -1
- package/dist/key-resolution.js +6 -4
- package/dist/key-resolution.js.map +1 -1
- package/dist/lab-config.d.ts +20 -3
- package/dist/lab-config.js +65 -3
- package/dist/lab-config.js.map +1 -1
- package/dist/lab-engine.js +8 -3
- package/dist/lab-engine.js.map +1 -1
- package/dist/lab-summary.d.ts +3 -2
- package/dist/lab-summary.js +17 -7
- package/dist/lab-summary.js.map +1 -1
- package/dist/observer-app.html +1 -1
- package/dist/observer-data.js +14 -1
- package/dist/observer-data.js.map +1 -1
- package/dist/oss-lab.d.ts +1 -1
- package/dist/oss-lab.js.map +1 -1
- package/dist/oss-meta-lab.d.ts +1 -1
- package/dist/oss-meta-lab.js.map +1 -1
- package/dist/program.d.ts +4 -0
- package/dist/program.js +231 -74
- package/dist/program.js.map +1 -1
- package/dist/run-narration-secrets.d.ts +5 -0
- package/dist/run-narration-secrets.js +68 -0
- package/dist/run-narration-secrets.js.map +1 -0
- package/dist/run.d.ts +7 -2
- package/dist/run.js +25 -3
- package/dist/run.js.map +1 -1
- package/dist/scripted-browser-lab.js +7 -0
- package/dist/scripted-browser-lab.js.map +1 -1
- package/dist/secret-prompt.d.ts +2 -0
- package/dist/secret-prompt.js +36 -0
- package/dist/secret-prompt.js.map +1 -0
- package/dist/shared-world-lab.js +4 -0
- package/dist/shared-world-lab.js.map +1 -1
- package/dist/study-analysis-engine.js +30 -1
- package/dist/study-analysis-engine.js.map +1 -1
- package/dist/study-analysis-evidence.js +9 -1
- package/dist/study-analysis-evidence.js.map +1 -1
- package/dist/tui-app.js +135 -135
- package/dist/tui-contract.d.ts +26 -1
- package/dist/tui-contract.js.map +1 -1
- package/dist/tui-launch.d.ts +2 -0
- package/dist/tui-launch.js +9 -1
- package/dist/tui-launch.js.map +1 -1
- package/docs/architecture/comms-inbox.md +4 -0
- package/docs/architecture/real-email-receiving.md +135 -0
- package/docs/contracts/run-bundle.md +9 -1
- package/docs/contracts/schemas.md +50 -5
- package/docs/goals/current.md +5 -5
- package/docs/ramp/README.md +13 -3
- package/docs/release/0.95.0-connections-setup.md +38 -0
- package/docs/release/0.96.0-real-email-receiving.md +47 -0
- package/package.json +4 -2
- package/skills/humanish/SKILL.md +55 -14
package/README.md
CHANGED
|
@@ -217,6 +217,16 @@ interactive stdin/stdout, and refuses detected coding-agent sessions even with
|
|
|
217
217
|
a TTY. Agents should use `lab list --json`, `lab inspect <lab> --json`, and
|
|
218
218
|
`runs --json`. Read [TUI behavior and JSON alternatives](https://humanish.dev/docs/review-surfaces#for-coding-agents-and-scripts).
|
|
219
219
|
|
|
220
|
+
Press **c** for Connections, then choose **Add API key** to enter an AgentMail
|
|
221
|
+
key with input hidden. Humanish saves the key in its user-level store (shared
|
|
222
|
+
across your projects) and non-secret connection metadata in
|
|
223
|
+
`.humanish/local/comms.yaml`. Ctrl+C cancels entry and returns to the TUI.
|
|
224
|
+
Existing environment or project keys take precedence over the saved key.
|
|
225
|
+
Saving a key runs a read-only authentication check. Choose **Configure a lab**
|
|
226
|
+
to preview a local copy that gives each participant a fresh real inbox. Email
|
|
227
|
+
is hosted by AgentMail and may be processed by actor/analysis models; these
|
|
228
|
+
recordings require local review. [Setup, tradeoffs and recovery](docs/architecture/real-email-receiving.md).
|
|
229
|
+
|
|
220
230
|
## Serve the Library
|
|
221
231
|
|
|
222
232
|
`humanish serve` serves your run library on loopback. The [Observer and terminal guide](https://humanish.dev/docs/review-surfaces#serve-the-run-library)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ReceivingAdapter } from "./comms-receiving-types.js";
|
|
2
|
+
/** Bounds apply to a whole operation, including every page, message and download. */
|
|
3
|
+
export declare const AGENTMAIL_RECEIVING_LIMITS: Readonly<{
|
|
4
|
+
timeoutMs: 30000;
|
|
5
|
+
maxTimeoutMs: 60000;
|
|
6
|
+
pages: 4;
|
|
7
|
+
pageSize: 25;
|
|
8
|
+
messages: 100;
|
|
9
|
+
requests: 160;
|
|
10
|
+
operationBytes: number;
|
|
11
|
+
responseBytes: number;
|
|
12
|
+
textBytes: number;
|
|
13
|
+
downloadRedirects: 2;
|
|
14
|
+
}>;
|
|
15
|
+
export type AgentMailReceivingErrorCode = "agentmail_auth_rejected" | "agentmail_rate_limited" | "agentmail_unavailable" | "agentmail_timeout" | "agentmail_cancelled" | "agentmail_invalid_response" | "agentmail_ownership_mismatch" | "agentmail_not_found" | "agentmail_resource_deleting" | "agentmail_download_blocked" | "agentmail_size_limit" | "agentmail_invalid_input" | "agentmail_request_limit";
|
|
16
|
+
/** Safe for callers to report. Never retains the response body, URL, key or caught cause. */
|
|
17
|
+
export declare class AgentMailReceivingError extends Error {
|
|
18
|
+
readonly code: AgentMailReceivingErrorCode;
|
|
19
|
+
constructor(code: AgentMailReceivingErrorCode);
|
|
20
|
+
}
|
|
21
|
+
/** Host-only transport; the management credential is never sent to a desktop or download host. */
|
|
22
|
+
export declare function createAgentMailReceiver(options: {
|
|
23
|
+
apiKey: string;
|
|
24
|
+
fetch?: typeof globalThis.fetch;
|
|
25
|
+
}): ReceivingAdapter;
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
import { inlineImageData, MAX_INLINE_IMAGE_BYTES, MAX_INLINE_IMAGES_BYTES, MAX_INLINE_IMAGES } from "./comms-images.js";
|
|
2
|
+
const API_ORIGIN = "https://api.agentmail.to";
|
|
3
|
+
const DOWNLOAD_ORIGIN = "https://cdn.agentmail.to";
|
|
4
|
+
/** Bounds apply to a whole operation, including every page, message and download. */
|
|
5
|
+
export const AGENTMAIL_RECEIVING_LIMITS = Object.freeze({
|
|
6
|
+
timeoutMs: 30_000, maxTimeoutMs: 60_000, pages: 4, pageSize: 25, messages: 100,
|
|
7
|
+
requests: 160, operationBytes: 12 * 1024 * 1024, responseBytes: 2 * 1024 * 1024,
|
|
8
|
+
textBytes: 256 * 1024, downloadRedirects: 2,
|
|
9
|
+
});
|
|
10
|
+
/** Safe for callers to report. Never retains the response body, URL, key or caught cause. */
|
|
11
|
+
export class AgentMailReceivingError extends Error {
|
|
12
|
+
code;
|
|
13
|
+
constructor(code) {
|
|
14
|
+
super(code);
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.name = "AgentMailReceivingError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function fail(code) { throw new AgentMailReceivingError(code); }
|
|
20
|
+
function safeCode(error) {
|
|
21
|
+
return error instanceof AgentMailReceivingError ? error.code : "agentmail_unavailable";
|
|
22
|
+
}
|
|
23
|
+
function object(value) {
|
|
24
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
25
|
+
fail("agentmail_invalid_response");
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
function identifier(value) {
|
|
29
|
+
if (typeof value !== "string" || !value.length || value.length > 1024 || /[\u0000-\u0020\u007f]/.test(value))
|
|
30
|
+
fail("agentmail_invalid_response");
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
function inputId(value) {
|
|
34
|
+
try {
|
|
35
|
+
return identifier(value);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return fail("agentmail_invalid_input");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function checkLease(lease) {
|
|
42
|
+
inputId(lease.resourceId);
|
|
43
|
+
inputId(lease.address);
|
|
44
|
+
inputId(lease.clientId);
|
|
45
|
+
}
|
|
46
|
+
const inboxPath = (lease) => `/v0/inboxes/${encodeURIComponent(lease.resourceId)}`;
|
|
47
|
+
const messagePath = (lease, id) => `${inboxPath(lease)}/messages/${encodeURIComponent(id)}`;
|
|
48
|
+
function abortCode(budget) { return budget.cancelled() ? "agentmail_cancelled" : "agentmail_timeout"; }
|
|
49
|
+
function checkAbort(budget) { if (budget.signal.aborted)
|
|
50
|
+
fail(abortCode(budget)); }
|
|
51
|
+
function bounded(promise, budget) {
|
|
52
|
+
if (budget.signal.aborted)
|
|
53
|
+
return Promise.reject(new AgentMailReceivingError(abortCode(budget)));
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
const onAbort = () => reject(new AgentMailReceivingError(abortCode(budget)));
|
|
56
|
+
budget.signal.addEventListener("abort", onAbort, { once: true });
|
|
57
|
+
promise.then(resolve, reject).finally(() => budget.signal.removeEventListener("abort", onAbort)).catch(() => { });
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async function operation(context, action) {
|
|
61
|
+
const timeout = context?.timeoutMs ?? AGENTMAIL_RECEIVING_LIMITS.timeoutMs;
|
|
62
|
+
if (!Number.isFinite(timeout) || timeout <= 0)
|
|
63
|
+
fail("agentmail_invalid_input");
|
|
64
|
+
const controller = new AbortController();
|
|
65
|
+
const onAbort = () => controller.abort();
|
|
66
|
+
const timer = setTimeout(onAbort, Math.min(timeout, AGENTMAIL_RECEIVING_LIMITS.maxTimeoutMs));
|
|
67
|
+
const budget = { signal: controller.signal, bytes: 0, requests: 0, cancelled: () => context?.signal?.aborted === true };
|
|
68
|
+
context?.signal?.addEventListener("abort", onAbort, { once: true });
|
|
69
|
+
if (context?.signal?.aborted)
|
|
70
|
+
controller.abort();
|
|
71
|
+
try {
|
|
72
|
+
checkAbort(budget);
|
|
73
|
+
return await action(budget);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new AgentMailReceivingError(safeCode(error));
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
clearTimeout(timer);
|
|
80
|
+
context?.signal?.removeEventListener("abort", onAbort);
|
|
81
|
+
controller.abort();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function bodyBytes(response, budget, maximum) {
|
|
85
|
+
checkAbort(budget);
|
|
86
|
+
const length = response.headers.get("content-length");
|
|
87
|
+
if (length && /^\d+$/.test(length) && Number(length) > maximum) {
|
|
88
|
+
void response.body?.cancel().catch(() => { });
|
|
89
|
+
fail("agentmail_size_limit");
|
|
90
|
+
}
|
|
91
|
+
if (!response.body)
|
|
92
|
+
return Buffer.alloc(0);
|
|
93
|
+
const reader = response.body.getReader();
|
|
94
|
+
const chunks = [];
|
|
95
|
+
let size = 0;
|
|
96
|
+
try {
|
|
97
|
+
while (true) {
|
|
98
|
+
const result = await bounded(reader.read(), budget);
|
|
99
|
+
if (result.done)
|
|
100
|
+
break;
|
|
101
|
+
size += result.value.byteLength;
|
|
102
|
+
budget.bytes += result.value.byteLength;
|
|
103
|
+
if (size > maximum || budget.bytes > AGENTMAIL_RECEIVING_LIMITS.operationBytes)
|
|
104
|
+
fail("agentmail_size_limit");
|
|
105
|
+
chunks.push(result.value);
|
|
106
|
+
}
|
|
107
|
+
return Buffer.concat(chunks, size);
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
void reader.cancel().catch(() => { });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function statusError(reply) {
|
|
114
|
+
if ([401, 403].includes(reply.status))
|
|
115
|
+
fail("agentmail_auth_rejected");
|
|
116
|
+
if (reply.status === 429)
|
|
117
|
+
fail("agentmail_rate_limited");
|
|
118
|
+
if (reply.status === 404 && object(reply.body).code === "not_found")
|
|
119
|
+
fail("agentmail_not_found");
|
|
120
|
+
if (reply.status === 409 && object(reply.body).code === "resource_deleting")
|
|
121
|
+
fail("agentmail_resource_deleting");
|
|
122
|
+
if (reply.status >= 500 || reply.status === 408)
|
|
123
|
+
fail("agentmail_unavailable");
|
|
124
|
+
fail("agentmail_invalid_response");
|
|
125
|
+
}
|
|
126
|
+
function success(reply) {
|
|
127
|
+
if (reply.status < 200 || reply.status >= 300)
|
|
128
|
+
statusError(reply);
|
|
129
|
+
return object(reply.body);
|
|
130
|
+
}
|
|
131
|
+
function absentOrDeleting(reply) {
|
|
132
|
+
if (reply.status === 404 && object(reply.body).code === "not_found")
|
|
133
|
+
return "absent";
|
|
134
|
+
if (reply.status === 409 && object(reply.body).code === "resource_deleting")
|
|
135
|
+
return "deleting";
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
function assertOwnership(raw, lease) {
|
|
139
|
+
if (raw.inbox_id !== lease.resourceId || raw.client_id !== lease.clientId || raw.email !== lease.address)
|
|
140
|
+
fail("agentmail_ownership_mismatch");
|
|
141
|
+
}
|
|
142
|
+
function limitedText(value, limitations) {
|
|
143
|
+
if (value === undefined || value === null)
|
|
144
|
+
return undefined;
|
|
145
|
+
if (typeof value !== "string")
|
|
146
|
+
fail("agentmail_invalid_response");
|
|
147
|
+
if (Buffer.byteLength(value) <= AGENTMAIL_RECEIVING_LIMITS.textBytes)
|
|
148
|
+
return value;
|
|
149
|
+
limitations.push("agentmail_content_truncated");
|
|
150
|
+
// Leave no partial UTF-8 sequence at the boundary.
|
|
151
|
+
return Buffer.from(value).subarray(0, AGENTMAIL_RECEIVING_LIMITS.textBytes).toString("utf8").replace(/\ufffd$/, "");
|
|
152
|
+
}
|
|
153
|
+
const transient = (code) => code === "agentmail_unavailable" || code === "agentmail_timeout";
|
|
154
|
+
/** Host-only transport; the management credential is never sent to a desktop or download host. */
|
|
155
|
+
export function createAgentMailReceiver(options) {
|
|
156
|
+
if (!options.apiKey || options.apiKey.length > 4096 || /[\u0000-\u0020\u007f]/.test(options.apiKey))
|
|
157
|
+
fail("agentmail_invalid_input");
|
|
158
|
+
const fetcher = options.fetch ?? globalThis.fetch;
|
|
159
|
+
const key = options.apiKey;
|
|
160
|
+
async function request(url, init, budget) {
|
|
161
|
+
checkAbort(budget);
|
|
162
|
+
if (++budget.requests > AGENTMAIL_RECEIVING_LIMITS.requests)
|
|
163
|
+
fail("agentmail_request_limit");
|
|
164
|
+
try {
|
|
165
|
+
return await bounded(fetcher(url, { ...init, signal: budget.signal, credentials: "omit" }).then((response) => {
|
|
166
|
+
if (budget.signal.aborted) {
|
|
167
|
+
void response.body?.cancel().catch(() => { });
|
|
168
|
+
fail(abortCode(budget));
|
|
169
|
+
}
|
|
170
|
+
return response;
|
|
171
|
+
}), budget);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
if (budget.signal.aborted)
|
|
175
|
+
fail(abortCode(budget));
|
|
176
|
+
throw new AgentMailReceivingError(safeCode(error));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function api(path, method, budget, payload) {
|
|
180
|
+
const response = await request(`${API_ORIGIN}${path}`, {
|
|
181
|
+
method, redirect: "error", headers: { Authorization: `Bearer ${key}`, Accept: "application/json", ...(payload === undefined ? {} : { "Content-Type": "application/json" }) },
|
|
182
|
+
...(payload === undefined ? {} : { body: JSON.stringify(payload) }),
|
|
183
|
+
}, budget);
|
|
184
|
+
const bytes = await bodyBytes(response, budget, AGENTMAIL_RECEIVING_LIMITS.responseBytes);
|
|
185
|
+
let body = null;
|
|
186
|
+
if (bytes.length) {
|
|
187
|
+
try {
|
|
188
|
+
body = JSON.parse(bytes.toString("utf8"));
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
if (response.ok)
|
|
192
|
+
fail("agentmail_invalid_response");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return { status: response.status, body };
|
|
196
|
+
}
|
|
197
|
+
async function download(rawUrl, budget) {
|
|
198
|
+
if (typeof rawUrl !== "string" || rawUrl.length > 16_384)
|
|
199
|
+
fail("agentmail_download_blocked");
|
|
200
|
+
let url;
|
|
201
|
+
try {
|
|
202
|
+
url = new URL(rawUrl);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return fail("agentmail_download_blocked");
|
|
206
|
+
}
|
|
207
|
+
for (let redirect = 0; redirect <= AGENTMAIL_RECEIVING_LIMITS.downloadRedirects; redirect++) {
|
|
208
|
+
// Exact origin established by live capture. No inferred S3 wildcard and no email-body fetches.
|
|
209
|
+
if (url.origin !== DOWNLOAD_ORIGIN || url.username || url.password || url.hash)
|
|
210
|
+
fail("agentmail_download_blocked");
|
|
211
|
+
const response = await request(url.href, { method: "GET", redirect: "manual" }, budget);
|
|
212
|
+
if ([301, 302, 303, 307, 308].includes(response.status)) {
|
|
213
|
+
void response.body?.cancel().catch(() => { });
|
|
214
|
+
const next = response.headers.get("location");
|
|
215
|
+
if (!next || redirect === AGENTMAIL_RECEIVING_LIMITS.downloadRedirects)
|
|
216
|
+
fail("agentmail_download_blocked");
|
|
217
|
+
try {
|
|
218
|
+
url = new URL(next, url);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return fail("agentmail_download_blocked");
|
|
222
|
+
}
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (!response.ok) {
|
|
226
|
+
void response.body?.cancel().catch(() => { });
|
|
227
|
+
fail("agentmail_unavailable");
|
|
228
|
+
}
|
|
229
|
+
return bodyBytes(response, budget, MAX_INLINE_IMAGE_BYTES);
|
|
230
|
+
}
|
|
231
|
+
return fail("agentmail_download_blocked");
|
|
232
|
+
}
|
|
233
|
+
async function getMessage(lease, id, budget) {
|
|
234
|
+
const raw = success(await api(messagePath(lease, id), "GET", budget));
|
|
235
|
+
if (raw.inbox_id !== lease.resourceId || raw.message_id !== id || !Array.isArray(raw.labels) || !raw.labels.includes("received"))
|
|
236
|
+
fail("agentmail_ownership_mismatch");
|
|
237
|
+
const limitations = [];
|
|
238
|
+
const from = limitedText(raw.from, limitations);
|
|
239
|
+
if (!from)
|
|
240
|
+
fail("agentmail_invalid_response");
|
|
241
|
+
const text = limitedText(raw.text, limitations) ?? "";
|
|
242
|
+
const html = limitedText(raw.html, limitations);
|
|
243
|
+
const subject = limitedText(raw.subject, limitations);
|
|
244
|
+
const message = { channel: "email", providerMessageId: id, from, text, ...(html === undefined ? {} : { html }), ...(subject === undefined ? {} : { subject }), inlineImages: [], limitations };
|
|
245
|
+
if (!text && !html)
|
|
246
|
+
limitations.push("agentmail_content_missing");
|
|
247
|
+
if (typeof raw.timestamp === "string" && raw.timestamp.length <= 64 && Number.isFinite(Date.parse(raw.timestamp)))
|
|
248
|
+
message.providerTimestamp = new Date(raw.timestamp).toISOString();
|
|
249
|
+
else
|
|
250
|
+
limitations.push("agentmail_timestamp_missing");
|
|
251
|
+
if (raw.attachments !== undefined && !Array.isArray(raw.attachments))
|
|
252
|
+
fail("agentmail_invalid_response");
|
|
253
|
+
const attachments = (raw.attachments ?? []);
|
|
254
|
+
if (attachments.length > MAX_INLINE_IMAGES)
|
|
255
|
+
limitations.push("agentmail_attachment_limit");
|
|
256
|
+
let imageBytes = 0;
|
|
257
|
+
for (const item of attachments.slice(0, MAX_INLINE_IMAGES)) {
|
|
258
|
+
try {
|
|
259
|
+
const attachment = object(item);
|
|
260
|
+
if (attachment.content_disposition !== "inline" || !["image/png", "image/jpeg", "image/gif", "image/webp"].includes(String(attachment.content_type))) {
|
|
261
|
+
limitations.push("agentmail_attachment_unsupported");
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const attachmentId = identifier(attachment.attachment_id);
|
|
265
|
+
const cid = identifier(attachment.content_id).replace(/^<|>$/g, "");
|
|
266
|
+
if (cid.length > 256)
|
|
267
|
+
fail("agentmail_invalid_response");
|
|
268
|
+
if (typeof attachment.size !== "number" || !Number.isSafeInteger(attachment.size) || attachment.size <= 0 || attachment.size > MAX_INLINE_IMAGE_BYTES || imageBytes + attachment.size > MAX_INLINE_IMAGES_BYTES)
|
|
269
|
+
fail("agentmail_size_limit");
|
|
270
|
+
const descriptor = success(await api(`${messagePath(lease, id)}/attachments/${encodeURIComponent(attachmentId)}`, "GET", budget));
|
|
271
|
+
if (descriptor.attachment_id !== attachmentId || descriptor.content_type !== attachment.content_type || descriptor.content_id !== attachment.content_id || descriptor.size !== attachment.size)
|
|
272
|
+
fail("agentmail_invalid_response");
|
|
273
|
+
const bytes = await download(descriptor.download_url, budget);
|
|
274
|
+
if (bytes.length !== attachment.size || imageBytes + bytes.length > MAX_INLINE_IMAGES_BYTES)
|
|
275
|
+
fail("agentmail_size_limit");
|
|
276
|
+
const image = { contentId: cid, contentType: String(attachment.content_type), base64: bytes.toString("base64") };
|
|
277
|
+
if (!inlineImageData(image))
|
|
278
|
+
fail("agentmail_invalid_response");
|
|
279
|
+
imageBytes += bytes.length;
|
|
280
|
+
message.inlineImages.push(image);
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
const code = safeCode(error);
|
|
284
|
+
if (code === "agentmail_cancelled")
|
|
285
|
+
throw error;
|
|
286
|
+
limitations.push(code, "agentmail_attachment_unavailable");
|
|
287
|
+
if (budget.signal.aborted || budget.bytes >= AGENTMAIL_RECEIVING_LIMITS.operationBytes || budget.requests >= AGENTMAIL_RECEIVING_LIMITS.requests)
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
message.limitations = [...new Set(limitations)];
|
|
292
|
+
return message;
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
provider: "agentmail",
|
|
296
|
+
authenticate: (context) => operation(context, async (budget) => {
|
|
297
|
+
const raw = success(await api("/v0/auth/me", "GET", budget));
|
|
298
|
+
if (raw.scope_type !== "organization" && raw.scope_type !== "pod" && raw.scope_type !== "inbox")
|
|
299
|
+
fail("agentmail_invalid_response");
|
|
300
|
+
return { provider: "agentmail", accountId: identifier(raw.organization_id), scopeType: raw.scope_type, scopeId: identifier(raw.scope_id) };
|
|
301
|
+
}),
|
|
302
|
+
acquire: (clientId, context) => operation(context, async (budget) => {
|
|
303
|
+
inputId(clientId);
|
|
304
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
305
|
+
try {
|
|
306
|
+
const raw = success(await api("/v0/inboxes", "POST", budget, { client_id: clientId }));
|
|
307
|
+
const lease = { resourceId: identifier(raw.inbox_id), address: identifier(raw.email), clientId };
|
|
308
|
+
if (raw.client_id !== clientId)
|
|
309
|
+
fail("agentmail_ownership_mismatch");
|
|
310
|
+
if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(lease.address))
|
|
311
|
+
fail("agentmail_invalid_response");
|
|
312
|
+
return lease;
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
if (attempt || !transient(safeCode(error)) || budget.signal.aborted)
|
|
316
|
+
throw error;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return fail("agentmail_unavailable");
|
|
320
|
+
}),
|
|
321
|
+
read: (lease, context) => operation(context, async (budget) => {
|
|
322
|
+
checkLease(lease);
|
|
323
|
+
const batch = { messages: [], complete: true, limitations: [] };
|
|
324
|
+
const ids = new Set();
|
|
325
|
+
const tokens = new Set();
|
|
326
|
+
let token;
|
|
327
|
+
for (let page = 0; page < AGENTMAIL_RECEIVING_LIMITS.pages; page++) {
|
|
328
|
+
try {
|
|
329
|
+
const query = new URLSearchParams({ limit: String(AGENTMAIL_RECEIVING_LIMITS.pageSize), labels: "received", ...(token === undefined ? {} : { page_token: token }) });
|
|
330
|
+
const raw = success(await api(`${inboxPath(lease)}/messages?${query}`, "GET", budget));
|
|
331
|
+
if (!Array.isArray(raw.messages) || raw.messages.length > AGENTMAIL_RECEIVING_LIMITS.pageSize)
|
|
332
|
+
fail("agentmail_invalid_response");
|
|
333
|
+
for (const item of raw.messages) {
|
|
334
|
+
const entry = object(item);
|
|
335
|
+
if (entry.inbox_id !== lease.resourceId)
|
|
336
|
+
fail("agentmail_ownership_mismatch");
|
|
337
|
+
if (!Array.isArray(entry.labels))
|
|
338
|
+
fail("agentmail_invalid_response");
|
|
339
|
+
if (!entry.labels.includes("received"))
|
|
340
|
+
continue;
|
|
341
|
+
const id = identifier(entry.message_id);
|
|
342
|
+
if (ids.has(id))
|
|
343
|
+
continue;
|
|
344
|
+
if (ids.size >= AGENTMAIL_RECEIVING_LIMITS.messages)
|
|
345
|
+
fail("agentmail_size_limit");
|
|
346
|
+
ids.add(id);
|
|
347
|
+
try {
|
|
348
|
+
const message = await getMessage(lease, id, budget);
|
|
349
|
+
batch.messages.push(message);
|
|
350
|
+
if (message.limitations.length) {
|
|
351
|
+
batch.complete = false;
|
|
352
|
+
batch.limitations.push(...message.limitations);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
if (safeCode(error) === "agentmail_cancelled")
|
|
357
|
+
throw error;
|
|
358
|
+
batch.complete = false;
|
|
359
|
+
batch.limitations.push(safeCode(error), "agentmail_message_unavailable");
|
|
360
|
+
if (budget.signal.aborted || budget.bytes >= AGENTMAIL_RECEIVING_LIMITS.operationBytes || budget.requests >= AGENTMAIL_RECEIVING_LIMITS.requests)
|
|
361
|
+
throw error;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (raw.next_page_token === undefined || raw.next_page_token === null || raw.next_page_token === "")
|
|
365
|
+
break;
|
|
366
|
+
token = identifier(raw.next_page_token);
|
|
367
|
+
if (tokens.has(token)) {
|
|
368
|
+
batch.complete = false;
|
|
369
|
+
batch.limitations.push("agentmail_pagination_stalled");
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
tokens.add(token);
|
|
373
|
+
if (page + 1 === AGENTMAIL_RECEIVING_LIMITS.pages) {
|
|
374
|
+
batch.complete = false;
|
|
375
|
+
batch.limitations.push("agentmail_page_limit");
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
if (safeCode(error) === "agentmail_cancelled")
|
|
380
|
+
throw error;
|
|
381
|
+
batch.complete = false;
|
|
382
|
+
batch.limitations.push(safeCode(error));
|
|
383
|
+
break;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
batch.limitations = [...new Set(batch.limitations)];
|
|
387
|
+
return batch;
|
|
388
|
+
}),
|
|
389
|
+
release: (lease, context) => operation(context, async (budget) => {
|
|
390
|
+
checkLease(lease);
|
|
391
|
+
const before = await api(inboxPath(lease), "GET", budget);
|
|
392
|
+
const existing = absentOrDeleting(before);
|
|
393
|
+
if (existing)
|
|
394
|
+
return { status: existing };
|
|
395
|
+
assertOwnership(success(before), lease);
|
|
396
|
+
const deleted = await api(inboxPath(lease), "DELETE", budget);
|
|
397
|
+
const state = absentOrDeleting(deleted);
|
|
398
|
+
if (state)
|
|
399
|
+
return { status: state };
|
|
400
|
+
if (![200, 202, 204].includes(deleted.status))
|
|
401
|
+
statusError(deleted);
|
|
402
|
+
try {
|
|
403
|
+
const after = await api(inboxPath(lease), "GET", budget);
|
|
404
|
+
const result = absentOrDeleting(after);
|
|
405
|
+
if (result)
|
|
406
|
+
return { status: result };
|
|
407
|
+
assertOwnership(success(after), lease);
|
|
408
|
+
return { status: "deleting" };
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
if (transient(safeCode(error)))
|
|
412
|
+
return { status: "deleting" };
|
|
413
|
+
throw error;
|
|
414
|
+
}
|
|
415
|
+
}),
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=comms-agentmail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comms-agentmail.js","sourceRoot":"","sources":["../src/comms-agentmail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type KeyResolutionDeps } from "./key-resolution.js";
|
|
2
|
+
import type { CommsCheckResult } from "./comms-setup.js";
|
|
3
|
+
export declare const COMMS_CONNECTIONS_SCHEMA = "humanish.comms-connections.v1";
|
|
4
|
+
export declare const COMMS_CONFIG_PATH = ".humanish/local/comms.yaml";
|
|
5
|
+
export declare const COMMS_PROVIDERS: readonly [{
|
|
6
|
+
readonly id: "agentmail";
|
|
7
|
+
readonly label: "AgentMail";
|
|
8
|
+
readonly channel: "email";
|
|
9
|
+
readonly keyEnv: "AGENTMAIL_API_KEY";
|
|
10
|
+
readonly setupAvailable: true;
|
|
11
|
+
readonly receivingAvailable: true;
|
|
12
|
+
readonly description: "A hosted email service with real inbox addresses.";
|
|
13
|
+
readonly setupUrl: "https://console.agentmail.to";
|
|
14
|
+
readonly limitation: "Fresh real inboxes for supported computer-use studies. Hosted processing; local evidence review only. Provider charges are separate.";
|
|
15
|
+
}];
|
|
16
|
+
export interface CommsConnection {
|
|
17
|
+
provider: "agentmail";
|
|
18
|
+
apiKeyEnv: string;
|
|
19
|
+
}
|
|
20
|
+
export interface CommsConnections {
|
|
21
|
+
schema: typeof COMMS_CONNECTIONS_SCHEMA;
|
|
22
|
+
connections: Record<string, CommsConnection>;
|
|
23
|
+
}
|
|
24
|
+
export interface CommsSetupStatus {
|
|
25
|
+
authentication?: CommsCheckResult;
|
|
26
|
+
schema: "humanish.comms-setup.v1";
|
|
27
|
+
ok: boolean;
|
|
28
|
+
configPath: string;
|
|
29
|
+
providers: typeof COMMS_PROVIDERS;
|
|
30
|
+
connections: {
|
|
31
|
+
name: string;
|
|
32
|
+
provider: "agentmail";
|
|
33
|
+
apiKeyEnv: string;
|
|
34
|
+
}[];
|
|
35
|
+
credential: {
|
|
36
|
+
present: boolean;
|
|
37
|
+
source: string | null;
|
|
38
|
+
stored: boolean;
|
|
39
|
+
strict: boolean;
|
|
40
|
+
explicitlyEmpty: boolean;
|
|
41
|
+
};
|
|
42
|
+
message: string;
|
|
43
|
+
}
|
|
44
|
+
export interface CommsSetupResult {
|
|
45
|
+
ok: boolean;
|
|
46
|
+
message: string;
|
|
47
|
+
}
|
|
48
|
+
/** Offline and non-mutating. Unsafe storage is an error, never an empty configuration. */
|
|
49
|
+
export declare function readCommsConnections(cwd: string): Promise<CommsConnections>;
|
|
50
|
+
/** Add one exact profile. No lab mutation, network, provider resources or credential values. */
|
|
51
|
+
export declare function saveCommsConnection(cwd: string, name?: string, apiKeyEnv?: string): Promise<CommsSetupResult>;
|
|
52
|
+
export declare function readCommsSetup(cwd: string, env: NodeJS.ProcessEnv, deps?: KeyResolutionDeps): Promise<CommsSetupStatus>;
|