@agentcomms/resend 0.27.1 → 0.29.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 CHANGED
@@ -117,6 +117,11 @@ terminal), `approve` (under `confirm`, a person at a terminal) and `mcp` (it sta
117
117
  | `agent-resend mcp install --client <client>` | `comms_server_install` (core) |
118
118
  | `agent-resend mcp prune` | `comms_server_prune` (core) |
119
119
 
120
+ Every command that reads or changes an account — all but `account`, `doctor`, `send wait`, `approve` and `mcp` — is
121
+ recorded in core's private activity log, the same from a command and a tool: the email ids, subjects and senders it
122
+ touched, a download's file names and sizes, a send's recipients and approval, and how it ended. Never a body or an
123
+ attachment's bytes. `agentcomms activity sessions` shows it, and `agentcomms activity record off` stops it.
124
+
120
125
  Every command takes `--json` for the whole result, with stable exit codes: `0` ok, `10` a send or a change was
121
126
  refused or needs approval, `64` usage, `65` bad data, `66` not found, `69` Resend or the secret store unavailable,
122
127
  `75` temporary, `77` key or permission needed, `78` configuration problem.
package/dist/cli.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { $ as colorEnabled, A as removeAccountChange, Bt as VERSION, C as inspectKey, Ct as serverPruneChange, D as policyChange, Dt as truncateDisplay, E as policyApprovalRefusal, Ft as RESEND_CALLER, G as UPDATE_CHECK_CHILD_COMMAND, H as CommsError, J as approveRefusedHint, K as agentMarker, M as showAccount, Mt as wholeNumber, Nt as writeResult, O as policyReport, Ot as updateNoticeAtTerminal, P as ResendContext, Q as cliHandoffs, R as checkNewName, S as addAccountChange, St as serverInstallChange, T as modeOf, Tt as terminalUpdateHooks, U as EXIT_CODES, V as CHANNEL_SERVERS, W as PATH_OPTIONS, Y as canPrompt, _ as showSentEmail, _t as renderInstall, a as revokeSendApproval, at as gatedChangeAtTerminal, bt as runCommand, c as downloadReceived, ct as installExitStatus, d as listReceived, et as commandPathOf, f as listScheduled, ft as openCore, g as showReceived, gt as renderApprovalWait, ht as refuseUnclaimedApproval, i as prepareSend, j as sendPolicyOf, jt as waitForApproval, k as policyWanted, l as getMetrics, lt as kindOf, m as listSuppressions, mt as pathOverridesFromCliOptions, n as executeSend, nt as escapeForDisplay, o as sendStatus, ot as handoffSentence, p as listSentEmails, pt as paint, q as approveChangeAtTerminal, r as finishSendApproval, rt as exemptFromUpdateNotice, s as cancelScheduledChange, st as handoffSentenceToFill, t as beginSendApproval, tt as describeFenceReport, u as listDomains, vt as renderPrune, w as listAccounts, x as runDoctor, xt as runUpdateCheckChild, yt as resolvePaths } from "./send-BbyDPqGS.mjs";
2
+ import { $ as colorEnabled, A as removeAccountChange, C as inspectKey, Ct as serverPruneChange, D as policyChange, Dt as truncateDisplay, E as policyApprovalRefusal, G as UPDATE_CHECK_CHILD_COMMAND, H as CommsError, It as RESEND_CALLER, J as approveRefusedHint, K as agentMarker, M as showAccount, Nt as wholeNumber, O as policyReport, Ot as updateNoticeAtTerminal, P as ResendContext, Pt as writeResult, Q as cliHandoffs, R as checkNewName, S as addAccountChange, St as serverInstallChange, T as modeOf, Tt as terminalUpdateHooks, U as EXIT_CODES, V as CHANNEL_SERVERS, Vt as VERSION, W as PATH_OPTIONS, Y as canPrompt, _ as showSentEmail, _t as renderInstall, a as revokeSendApproval, at as gatedChangeAtTerminal, bt as runCommand, c as downloadReceived, ct as installExitStatus, d as listReceived, et as commandPathOf, f as listScheduled, ft as openCore, g as showReceived, gt as renderApprovalWait, ht as refuseUnclaimedApproval, i as prepareSend, j as sendPolicyOf, jt as waitForApproval, k as policyWanted, l as getMetrics, lt as kindOf, m as listSuppressions, mt as pathOverridesFromCliOptions, n as executeSend, nt as escapeForDisplay, o as sendStatus, ot as handoffSentence, p as listSentEmails, pt as paint, q as approveChangeAtTerminal, r as finishSendApproval, rt as exemptFromUpdateNotice, s as cancelScheduledChange, st as handoffSentenceToFill, t as beginSendApproval, tt as describeFenceReport, u as listDomains, vt as renderPrune, w as listAccounts, x as runDoctor, xt as runUpdateCheckChild, yt as resolvePaths } from "./send-BC8FI-_F.mjs";
3
+ import childProcess from "node:child_process";
4
+ import fs from "node:fs";
3
5
  import path from "node:path";
4
6
  import { createInterface } from "node:readline/promises";
5
7
  import { stripVTControlCharacters } from "node:util";
6
- import fs from "node:fs";
7
- import childProcess from "node:child_process";
8
8
  import process$1 from "node:process";
9
9
  import { EventEmitter } from "node:events";
10
10
  import { Writable } from "node:stream";
@@ -3488,7 +3488,7 @@ Exit codes: 0 ok · 1 unexpected · 10 a send or a change was refused or needs a
3488
3488
  }));
3489
3489
  const mcp = program.command("mcp").description("run the MCP server on stdio, for a coding agent to connect to").option("--account <name>", "pin the server to one account; every tool then acts on it and no other").action(async (flags) => {
3490
3490
  ran = true;
3491
- const startResendStdioServer = deps.startMcp ?? (await import("./stdio-entry-DXuzeDqK.mjs")).startResendStdioServer;
3491
+ const startResendStdioServer = deps.startMcp ?? (await import("./stdio-entry-BvsR_B_w.mjs")).startResendStdioServer;
3492
3492
  const core = coreForInvocation();
3493
3493
  await startResendStdioServer({
3494
3494
  ...deps,
package/dist/index.d.mts CHANGED
@@ -2268,7 +2268,7 @@ declare const ZodReadonly: $constructor<ZodReadonly>;
2268
2268
  /** @deprecated Use z.ZodType (without generics) instead. */
2269
2269
  type ZodTypeAny<Output = unknown, Input = unknown, Internals extends $ZodTypeInternals<Output, Input> = $ZodTypeInternals<Output, Input>> = ZodType<Output, Input, Internals>;
2270
2270
  //#endregion
2271
- //#region ../core/dist/launcher-BzQ9fCW3.d.mts
2271
+ //#region ../core/dist/launcher-CtlslgkT.d.mts
2272
2272
  interface RegisteredServer {
2273
2273
  client: string;
2274
2274
  path: string;
@@ -2819,6 +2819,290 @@ interface CliHandoffs {
2819
2819
  */
2820
2820
  type RenameReason = "auto-read" | "type" | "no-extension";
2821
2821
  //#endregion
2822
+ //#region src/activity-settings.d.ts
2823
+ /**
2824
+ * The activity log's two settings (design 2026-10-25-activity §4.1): `activity.record`, `on` or `off`, and
2825
+ * `activity.retentionDays`, a whole number of days from 1 to 365. Absent, they read as on and 30.
2826
+ *
2827
+ * `config.json` keeps them as `activity: { record, retentionDays }`, a key the schemas do not name, so every release
2828
+ * sharing the file keeps it through its writes, as it keeps `agentLabel` and `behaviour`. It is read only through
2829
+ * `readActivitySettings`, which reads a value it does not understand as recording nothing — never as the default.
2830
+ * `off` and fewer days are the tightenings, which apply at once, and `on` and more days the loosenings, which a person
2831
+ * approves (`classifyChange`). So a hand edit or a later release's word can only make this release record less.
2832
+ *
2833
+ * A retention it cannot read is read as the longest, 365 days, with recording off: what it cannot read must never
2834
+ * delete what is held. Read as one day, a typo — or a later release's word — once deleted all but a day of the log.
2835
+ *
2836
+ * `config.ts` imports this module to judge a change, so it imports nothing at all.
2837
+ */
2838
+ declare const ACTIVITY_RECORD_SETTINGS: readonly ["on", "off"];
2839
+ type ActivityRecordSetting = (typeof ACTIVITY_RECORD_SETTINGS)[number];
2840
+ /** The settings as they apply, and what in the file could not be read as written (empty when all of it could). */
2841
+ interface ActivitySettings {
2842
+ readonly record: ActivityRecordSetting;
2843
+ readonly retentionDays: number;
2844
+ /** One sentence for each value read as something stricter than the file says — for `doctor` to show. */
2845
+ readonly problems: readonly string[];
2846
+ }
2847
+ //#endregion
2848
+ //#region src/activity.d.ts
2849
+ /**
2850
+ * The activity log (design 2026-10-25-activity, §4 with S1–S5): one line for every call an agent session makes that
2851
+ * reads or writes account data, tied to the session that made it — what it touched, never what it said.
2852
+ *
2853
+ * - **Where:** `<state>/activity/YYYY-MM-DD.jsonl` (the UTC day of the line), each file owner-only (600) in an
2854
+ * owner-only folder (700), each line appended whole with `appendPrivateLine`, as the audit log's are. Daily files,
2855
+ * so retention drops whole days (`prune`).
2856
+ * - **What a line holds:** `ActivityLine`, and nothing else. Every line is rebuilt field by field from the fields a
2857
+ * line has (`activityLineOf`), so a channel that hands over a whole message — body, text, HTML, attachment bytes —
2858
+ * still writes only its id, subject and sender: the type says so, and the copy makes it so. Subjects and names are
2859
+ * kept as received, cut to their bounds, and shown only inside the untrusted-content envelope.
2860
+ * - **Never in the way:** `append` never throws into its caller. A line that cannot be written is said once per
2861
+ * process on stderr, remembered for `doctor`, and the call it describes goes on (§4.6).
2862
+ * - **The audit log is unchanged.** It stays small, content-free and shareable; this one is private.
2863
+ */
2864
+ /** What the call did with account data: read it, wrote it, was told of it (an event delivery, S1), or approved it. */
2865
+ declare const ACTIVITY_KINDS: readonly ["read", "write", "told", "approval"];
2866
+ type ActivityKind = (typeof ACTIVITY_KINDS)[number];
2867
+ /** How it ended: done, refused by a policy, an approval or a rule, or failed. */
2868
+ declare const ACTIVITY_OUTCOMES: readonly ["ok", "refused", "failed"];
2869
+ type ActivityOutcome = (typeof ACTIVITY_OUTCOMES)[number];
2870
+ /** Which kind of process recorded it: an MCP server, a CLI call, or the event service's own work. */
2871
+ declare const ACTIVITY_SURFACES: readonly ["mcp", "cli", "daemon"];
2872
+ type ActivitySurface = (typeof ACTIVITY_SURFACES)[number];
2873
+ /** An MCP client's `clientInfo`, as the client reported it: what it said, never proof of what it is (§4.3). */
2874
+ interface ClientInfo {
2875
+ readonly name: string;
2876
+ readonly version?: string | undefined;
2877
+ }
2878
+ /** The account a call acted on: its immutable id, and its name at the time. */
2879
+ interface ActivityAccount {
2880
+ readonly id: string;
2881
+ readonly alias: string;
2882
+ }
2883
+ /** Who sent a message, as its sender wrote it. */
2884
+ interface ActivitySender {
2885
+ readonly name?: string | undefined;
2886
+ readonly address?: string | undefined;
2887
+ }
2888
+ /**
2889
+ * One thing a call touched: a message, a thread, a file. Its id, and for a message its subject and sender, for a
2890
+ * download its file name and size, for a chat message the conversation it is in. Never a body, a preview or bytes.
2891
+ */
2892
+ interface ActivityItem {
2893
+ readonly id: string;
2894
+ readonly subject?: string | undefined;
2895
+ readonly from?: ActivitySender | undefined;
2896
+ /** A file's name. */
2897
+ readonly name?: string | undefined;
2898
+ /** A file's size, in bytes. */
2899
+ readonly size?: number | undefined;
2900
+ /** Where it is: a Slack channel's name, say. */
2901
+ readonly conversation?: string | undefined;
2902
+ }
2903
+ /** A process as `ps` names it: its id, when it started (as `ps` prints it, an identity rather than a time), its name. */
2904
+ interface ActivityParent {
2905
+ readonly pid: number;
2906
+ readonly startedAt: string;
2907
+ readonly name: string;
2908
+ }
2909
+ /**
2910
+ * Which session made a call (S2). A session is an agent window: the processes one parent started in one folder.
2911
+ *
2912
+ * - `key` names the session: a hash of the parent's id, its start and the folder when `grouped`; otherwise a key of
2913
+ * this process's own, which no other process shares.
2914
+ * - `process` is a random id this process made when it started, and `pid` its process id.
2915
+ * - `folder` is the working folder, as a real path (shown with the home as `~` only at display time), or null when it
2916
+ * could not be read.
2917
+ * - `parent` is the parent that grouped it — for a CLI call that joined a window, that window's parent.
2918
+ * - `ancestors` (CLI calls only) names up to three processes above it, nearest first, so a person typing in a terminal
2919
+ * can be told from an agent's shell.
2920
+ */
2921
+ interface ActivitySession {
2922
+ readonly key: string;
2923
+ readonly process: string;
2924
+ readonly pid: number;
2925
+ readonly client?: ClientInfo | undefined;
2926
+ readonly folder: string | null;
2927
+ readonly parent?: ActivityParent | undefined;
2928
+ readonly ancestors?: readonly string[] | undefined;
2929
+ readonly grouped: boolean;
2930
+ readonly surface: ActivitySurface;
2931
+ }
2932
+ /** What a `told` line says of a delivery (S1): the rule that matched and the target it reached. No sender, no payload. */
2933
+ interface ActivityTold {
2934
+ readonly rule: string;
2935
+ readonly target: string;
2936
+ }
2937
+ /**
2938
+ * One call, as the log keeps it (§4.2, S1, S2, S4). Content never: what was touched, by id, subject and sender, and
2939
+ * how it ended.
2940
+ *
2941
+ * - `operation` is the capability id (`gmail.search`), `channel` the channel's word (`gmail`).
2942
+ * - `items` lists at most fifty things touched; `count` says how many there were in all.
2943
+ * - `counts` holds named counts where a channel records no identities (WhatsApp's `chats` and `messages`, S4).
2944
+ * - `query` is a search's words — an agent wrote them, not a sender.
2945
+ * - `recipients` and `approvalId` are a write's, as the audit records them.
2946
+ * - `told` is a delivery's (S1).
2947
+ */
2948
+ interface ActivityLine {
2949
+ readonly at: string;
2950
+ readonly channel: string;
2951
+ readonly account: ActivityAccount;
2952
+ readonly operation: string;
2953
+ readonly kind: ActivityKind;
2954
+ readonly outcome: ActivityOutcome;
2955
+ readonly reason?: string | undefined;
2956
+ readonly session: ActivitySession;
2957
+ readonly ms: number;
2958
+ readonly items?: readonly ActivityItem[] | undefined;
2959
+ readonly count?: number | undefined;
2960
+ readonly counts?: Readonly<Record<string, number>> | undefined;
2961
+ readonly query?: string | undefined;
2962
+ readonly recipients?: readonly string[] | undefined;
2963
+ readonly approvalId?: string | undefined;
2964
+ readonly told?: ActivityTold | undefined;
2965
+ /**
2966
+ * The line was cut to `MAX_ACTIVITY_LINE_BYTES`: items, then recipients, dropped from the end, and long words
2967
+ * shortened. `count` still says how many items there were.
2968
+ */
2969
+ readonly truncated?: true | undefined;
2970
+ }
2971
+ /** A line to append: `at` is now when left out. */
2972
+ type ActivityLineInput = Omit<ActivityLine, "at"> & {
2973
+ readonly at?: string | undefined;
2974
+ };
2975
+ /** How many lines of each kind, and of each outcome. */
2976
+ interface ActivityCounts {
2977
+ readonly kind: Readonly<Record<ActivityKind, number>>;
2978
+ readonly outcome: Readonly<Record<ActivityOutcome, number>>;
2979
+ }
2980
+ /**
2981
+ * One session as `sessions` lists it: where and by what it ran, when it was first and last seen, how many processes
2982
+ * recorded lines for it, and its counts by kind and outcome. Its folder, client and parent are those of its first
2983
+ * server process — or of its first line, when only CLI calls recorded any.
2984
+ */
2985
+ interface ActivitySessionSummary {
2986
+ readonly key: string;
2987
+ readonly grouped: boolean;
2988
+ readonly surfaces: readonly ActivitySurface[];
2989
+ readonly folder: string | null;
2990
+ readonly client: ClientInfo | null;
2991
+ readonly parent: ActivityParent | null;
2992
+ readonly firstSeen: string;
2993
+ readonly lastSeen: string;
2994
+ readonly processes: number;
2995
+ readonly channels: readonly string[];
2996
+ readonly accounts: readonly string[];
2997
+ readonly counts: ActivityCounts;
2998
+ }
2999
+ /** A line that could not be written: when, why, and which process — never anything the line held. */
3000
+ interface ActivityFailure {
3001
+ readonly at: string;
3002
+ readonly code: string;
3003
+ readonly message: string;
3004
+ readonly pid: number;
3005
+ }
3006
+ /** What `doctor` reads of the log: where it is, whether it is private and writable, and the last failure. */
3007
+ interface ActivityHealth {
3008
+ readonly directory: string;
3009
+ /** False when nothing was recorded yet. */
3010
+ readonly exists: boolean;
3011
+ /** False when something that is not a folder stands where it goes. */
3012
+ readonly isDirectory: boolean;
3013
+ /** Whether only its owner can read it; null where that cannot be told (Windows), or before it exists. */
3014
+ readonly private: boolean | null;
3015
+ /** Whether today's file can be written: the file when it exists, its folder otherwise. */
3016
+ readonly writable: boolean;
3017
+ /** The days held, oldest first. */
3018
+ readonly days: readonly string[];
3019
+ /** When a line was last written, from the newest file's time; null when there is none. */
3020
+ readonly lastWritten: string | null;
3021
+ /** The last failure any process recorded, or this one remembers. */
3022
+ readonly failure: ActivityFailure | null;
3023
+ }
3024
+ /** What `show` filters by. `account` is a name or an id; `since` an ISO time. */
3025
+ interface ActivityFilters {
3026
+ readonly kind?: ActivityKind | undefined;
3027
+ readonly channel?: string | undefined;
3028
+ readonly account?: string | undefined;
3029
+ readonly outcome?: ActivityOutcome | undefined;
3030
+ readonly since?: string | undefined;
3031
+ /** The most lines to return, newest first: 1000 when left out. */
3032
+ readonly limit?: number | undefined;
3033
+ }
3034
+ /** One session's lines, newest first, filtered; and what all of its lines in the time asked add up to. */
3035
+ interface ActivityShown {
3036
+ readonly lines: ActivityLine[];
3037
+ /** True when more lines matched than `limit`. */
3038
+ readonly more: boolean;
3039
+ /** The session over the time asked, before the other filters; null when it has no line there at all. */
3040
+ readonly summary: ActivitySessionSummary | null;
3041
+ }
3042
+ interface ActivityLogOptions {
3043
+ now?: (() => Date) | undefined;
3044
+ /**
3045
+ * The settings in force, read afresh for every line, so turning recording off applies at once in every process.
3046
+ * Left out, on and 30 days. A reader that throws — a configuration that cannot be read — is read as off.
3047
+ */
3048
+ settings?: (() => Promise<ActivitySettings>) | undefined;
3049
+ /** Where the once-a-process line about a failure goes: stderr when left out. */
3050
+ warn?: ((line: string) => void) | undefined;
3051
+ }
3052
+ declare class ActivityLog {
3053
+ #private;
3054
+ readonly directory: string;
3055
+ constructor(stateDir: string, options?: ActivityLogOptions);
3056
+ /** The last line this process could not write, or null. */
3057
+ get lastFailure(): ActivityFailure | null;
3058
+ /**
3059
+ * Appends one line, unless recording is off. True when it was written. Never throws: a line that cannot be written
3060
+ * is said once per process (`warn`, stderr by default), recorded beside the log for `doctor`, and returns false.
3061
+ *
3062
+ * The first call a process makes on each day — this, or any read — first prunes days older than the retention in
3063
+ * force, whether or not recording is on: the log's daily maintenance, best effort.
3064
+ */
3065
+ append(input: ActivityLineInput): Promise<boolean>;
3066
+ /** The days held, oldest first. */
3067
+ days(): Promise<string[]>;
3068
+ /**
3069
+ * Deletes every day whose last line is older than `retentionDays` days: a day goes once all of it is that old, so
3070
+ * every line is kept at least that long and at most a day longer. Whole days only; every other day is left whole.
3071
+ */
3072
+ prune(retentionDays: number): Promise<{
3073
+ deleted: string[];
3074
+ }>;
3075
+ /**
3076
+ * Every session with a line at or after `since` (every day the retention keeps, when left out), newest first. A day
3077
+ * past the retention is never read, whether or not it has been deleted yet.
3078
+ */
3079
+ sessions(options?: {
3080
+ since?: string | undefined;
3081
+ }): Promise<ActivitySessionSummary[]>;
3082
+ /**
3083
+ * One session's lines, newest first, that match every filter given; and its summary over the time asked. Only
3084
+ * lines whose session key is exactly `key` are ever read into the answer, and none of a day past the retention.
3085
+ */
3086
+ show(key: string, filters?: ActivityFilters): Promise<ActivityShown>;
3087
+ /**
3088
+ * The window a CLI call belongs to (S2): the session of a server process, today or yesterday, whose parent is one of
3089
+ * `ancestors` — the nearest first. Null when none is. Read from each day's parents file; a day with none — written
3090
+ * by an earlier build — is read whole, as before.
3091
+ */
3092
+ sessionOfAncestor(ancestors: readonly ActivityParent[]): Promise<{
3093
+ key: string;
3094
+ parent: ActivityParent;
3095
+ folder: string | null;
3096
+ } | null>;
3097
+ /** The last failure recorded by any process — the newer of the file beside the log and this process's own. */
3098
+ readFailure(): Promise<ActivityFailure | null>;
3099
+ /**
3100
+ * What `doctor` shows of the log. It creates nothing; like every read it first deletes the days past the retention,
3101
+ * once a day per process, so the days it lists past the retention are those that could not be deleted.
3102
+ */
3103
+ health(): Promise<ActivityHealth>;
3104
+ }
3105
+ //#endregion
2822
3106
  //#region src/ledger.d.ts
2823
3107
  interface Caps {
2824
3108
  perHour: number;
@@ -3129,6 +3413,11 @@ interface Core {
3129
3413
  plans: PlanStore;
3130
3414
  taint: TaintStore;
3131
3415
  audit: AuditLog;
3416
+ /**
3417
+ * The activity log (design 2026-10-25-activity): one line per call an agent session makes to account data, private,
3418
+ * by day, under the settings in `config.json`'s `activity`. Never throws into a caller (`ActivityLog.append`).
3419
+ */
3420
+ activity: ActivityLog;
3132
3421
  /** Opens the config directory's one secret backend (as recorded in config, or `kind` before the first write). */
3133
3422
  secrets(kind?: SecretStoreKind): Promise<SecretStore>;
3134
3423
  /**
@@ -4175,6 +4464,16 @@ interface ConfigBody {
4175
4464
  * keep every key they do not name, so older releases keep it too, and judged by `classifyChange`.
4176
4465
  */
4177
4466
  behaviour?: unknown;
4467
+ /**
4468
+ * The activity log's settings (design 2026-10-25-activity §4.1): `{ record: 'on' | 'off', retentionDays: 1..365 }`,
4469
+ * on and 30 when absent.
4470
+ *
4471
+ * `unknown` here, as `agentLabel` and `behaviour` are: it is read only through `readActivitySettings`, which reads a
4472
+ * value it does not understand as recording less — off, and the fewest days — so a hand edit or a later release's
4473
+ * word can only tighten. Kept through every write as the schemas keep every key they do not name, and judged by
4474
+ * `classifyChange`: recording again and keeping more days are loosenings, off and fewer days tightenings.
4475
+ */
4476
+ activity?: unknown;
4178
4477
  }
4179
4478
  interface ConfigV1 extends ConfigBody {
4180
4479
  version: 1;
@@ -12048,6 +12347,11 @@ declare class ResendContext {
12048
12347
  readonly now: () => Date;
12049
12348
  readonly platform: NodeJS.Platform;
12050
12349
  readonly surface: "cli" | "mcp";
12350
+ /**
12351
+ * What the MCP client said it is (`clientInfo`), for the activity log's session: set by the server once it exists,
12352
+ * read when a line is written, since a client says it only on connecting. Never set for the CLI.
12353
+ */
12354
+ clientInfo: (() => ClientInfo | undefined) | undefined;
12051
12355
  /**
12052
12356
  * What every result, refusal and hint names for a person to run: Resend's own CLI as this installation runs it, or
12053
12357
  * core's through its installed dependency (`own`, `core`), quoted for `platform` — or why there is none here.
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { Bt as VERSION, Ft as RESEND_CALLER, H as CommsError, It as REFUSED, Lt as RESEND_API_ORIGIN, N as resendRequest, P as ResendContext, Pt as PACKAGE_NAME, Rt as RESEND_DOWNLOAD_ORIGIN, b as readBody, dt as newBoundary, h as resendId, ut as neutralise, v as addressesOf, wt as stripInvisible, y as attachmentRisks, z as keyPermissionOf, zt as ROUTES } from "./send-BbyDPqGS.mjs";
2
- import { t as createResendMcpServer } from "./server-stiYlGRn.mjs";
1
+ import { Bt as ROUTES, Ft as PACKAGE_NAME, H as CommsError, It as RESEND_CALLER, Lt as REFUSED, N as resendRequest, P as ResendContext, Rt as RESEND_API_ORIGIN, Vt as VERSION, b as readBody, dt as newBoundary, h as resendId, ut as neutralise, v as addressesOf, wt as stripInvisible, y as attachmentRisks, z as keyPermissionOf, zt as RESEND_DOWNLOAD_ORIGIN } from "./send-BC8FI-_F.mjs";
2
+ import { t as createResendMcpServer } from "./server-7jk5cvX6.mjs";
3
3
  //#region src/operations/events.ts
4
4
  const BODY_LIMIT = 2e4;
5
5
  const STATUS = /* @__PURE__ */ new Set([