🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@atomicmail/agent-skill

Package Overview
Dependencies
Maintainers
3
Versions
38
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@atomicmail/agent-skill - npm Package Compare versions

Comparing version
0.3.24
to
0.3.25
+23
esm/lib/agent/auth/agent-utm.d.ts
/** The five UTM fields forwarded to the backend on username signup. */
export interface UtmParams {
utm_source?: string;
utm_medium?: string;
utm_campaign?: string;
utm_term?: string;
utm_content?: string;
}
/** Known UTM keys, in wire order. Everything else in the string is ignored. */
export declare const UTM_KEYS: readonly ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
/** Backend caps each value at 64 chars; we truncate client-side to match. */
export declare const UTM_MAX_VALUE_LENGTH = 64;
/**
* Parse a URL-query-style UTM string (e.g.
* `utm_source=blog&utm_medium=cpc&utm_campaign=launch`) into the five known
* `utm_*` fields. Unknown keys are ignored, each value is truncated to 64
* chars, and empty values are dropped. Never throws — any parse problem (or an
* empty/garbage input) yields an empty object.
*/
export declare function parseUtm(raw: string | undefined | null): UtmParams;
/** True when the parsed UTM object carries at least one field. */
export declare function hasUtm(utm: UtmParams | undefined | null): utm is UtmParams;
//# sourceMappingURL=agent-utm.d.ts.map
{"version":3,"file":"agent-utm.d.ts","sourceRoot":"","sources":["../../../../src/lib/agent/auth/agent-utm.ts"],"names":[],"mappings":"AAQA,uEAAuE;AACvE,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,kFAMX,CAAC;AAEX,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAgBlE;AAED,kEAAkE;AAClE,wBAAgB,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,GAAG,IAAI,SAAS,CAE1E"}
// UTM install-attribution parsing (shared by the CLI + MCP register paths).
//
// A landing page bakes a URL-query-style UTM string into the copy-paste install
// snippet (CLI `--utm` flag / `ATOMICMAIL_UTM` env). On username signup the
// parsed fields ride along in the auth-service session-exchange body and the
// backend forwards them to PostHog. Parsing never throws: any problem yields an
// empty object so registration never fails over UTM.
/** Known UTM keys, in wire order. Everything else in the string is ignored. */
export const UTM_KEYS = [
"utm_source",
"utm_medium",
"utm_campaign",
"utm_term",
"utm_content",
];
/** Backend caps each value at 64 chars; we truncate client-side to match. */
export const UTM_MAX_VALUE_LENGTH = 64;
/**
* Parse a URL-query-style UTM string (e.g.
* `utm_source=blog&utm_medium=cpc&utm_campaign=launch`) into the five known
* `utm_*` fields. Unknown keys are ignored, each value is truncated to 64
* chars, and empty values are dropped. Never throws — any parse problem (or an
* empty/garbage input) yields an empty object.
*/
export function parseUtm(raw) {
if (!raw)
return {};
try {
const params = new URLSearchParams(raw);
const out = {};
for (const key of UTM_KEYS) {
const value = params.get(key);
if (value === null)
continue;
const truncated = value.slice(0, UTM_MAX_VALUE_LENGTH);
if (truncated.length === 0)
continue;
out[key] = truncated;
}
return out;
}
catch {
return {};
}
}
/** True when the parsed UTM object carries at least one field. */
export function hasUtm(utm) {
return !!utm && Object.keys(utm).length > 0;
}
+8
-0

@@ -0,1 +1,2 @@

import type { UtmParams } from "./agent-utm.js";
export declare function fetchChallenge(authUrl: string): Promise<{

@@ -16,2 +17,7 @@ challengeJWT: string;

username?: string;
utm_source?: string;
utm_medium?: string;
utm_campaign?: string;
utm_term?: string;
utm_content?: string;
}): Promise<SessionResponse>;

@@ -24,2 +30,4 @@ export declare function fetchCapability(authUrl: string, sessionJWT: string): Promise<string>;

username?: string;
/** Parsed UTM install-attribution; forwarded on the username signup path. */
utm?: UtmParams;
onPowProgress?: (nonce: bigint) => void;

@@ -26,0 +34,0 @@ }

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"agent-auth-http.d.ts","sourceRoot":"","sources":["../../../../src/lib/agent/auth/agent-auth-http.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CA8BD;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IACJ,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,eAAe,CAAC,CA8B1B;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,eAAe,CAAC,CAgB1B"}
{"version":3,"file":"agent-auth-http.d.ts","sourceRoot":"","sources":["../../../../src/lib/agent/auth/agent-auth-http.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CA8BD;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IACJ,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,eAAe,CAAC,CAgC1B;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,eAAe,CAAC,CAkB1B"}

@@ -74,2 +74,4 @@ // auth-service HTTP: challenge → session → capability.

username: input.username,
// Only present utm_* fields are spread in, so absent ones stay off the body.
...(input.utm ?? {}),
});

@@ -76,0 +78,0 @@ }

import { type SkillFiles } from "./agent-credentials-store.js";
import { type UtmParams } from "../auth/agent-utm.js";
export type ConfigSource = "credentials-file" | "env" | "mixed" | "defaults";

@@ -12,2 +13,7 @@ export interface ResolvedAgentConfig {

source: ConfigSource;
/**
* Parsed UTM install-attribution from `ATOMICMAIL_UTM` (stdio-only MCP has no
* flag, so env is its only carrier). Empty object when unset/garbage.
*/
utm: UtmParams;
}

@@ -14,0 +20,0 @@ /**

@@ -1,1 +0,1 @@

{"version":3,"file":"agent-resolve-config.d.ts","sourceRoot":"","sources":["../../../../src/lib/agent/session/agent-resolve-config.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,UAAU,EAEhB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,KAAK,GACL,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAW7C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CACxD,mBAAmB,CACpB,CAuCA"}
{"version":3,"file":"agent-resolve-config.d.ts","sourceRoot":"","sources":["../../../../src/lib/agent/session/agent-resolve-config.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,UAAU,EAEhB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,KAAK,GACL,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,GAAG,EAAE,SAAS,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAW7C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CACxD,mBAAmB,CACpB,CAyCA"}

@@ -7,2 +7,3 @@ // Resolve MCP / process credential dir + URLs from env + credentials.json.

import { defaultFilesFromOutDir, tryReadCredentials, } from "./agent-credentials-store.js";
import { parseUtm } from "../auth/agent-utm.js";
/**

@@ -53,2 +54,3 @@ * Default credential directory:

const inboxId = fileCreds?.inboxId;
const utm = parseUtm(env.ATOMICMAIL_UTM);
const usingFile = fileCreds !== undefined;

@@ -72,3 +74,4 @@ const usingEnv = !!(envAuthUrl || envApiUrl || envSalt || envApiKey);

source,
utm,
};
}
import { type CredentialStore, type SkillFiles } from "./agent-credentials-store.js";
import type { JmapBlobUploadLimits } from "../jmap/agent-jmap-blob-limits.js";
import type { UtmParams } from "../auth/agent-utm.js";
export interface AgentSessionConfig {

@@ -26,2 +27,7 @@ authUrl: string;

forced?: boolean;
/**
* Parsed UTM install-attribution, forwarded to the backend on first-time
* signup only (ignored on idempotent replay). Absent/empty is a no-op.
*/
utm?: UtmParams;
}

@@ -28,0 +34,0 @@ /** Local-part of an inbox email, or the whole string if no @. */

@@ -1,1 +0,1 @@

{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../../../src/lib/agent/session/agent-session.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../../../src/lib/agent/session/agent-session.ts"],"names":[],"mappings":"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"}

@@ -207,2 +207,3 @@ // Stateful PoW + capability JWT + optional cached JMAP session (accountId).

username,
utm: options.utm,
});

@@ -209,0 +210,0 @@ if (!result.apiKey) {

@@ -13,2 +13,3 @@ export * from "./network/auth-client.js";

export * from "./agent/auth/agent-auth-http.js";
export * from "./agent/auth/agent-utm.js";
export * from "./agent/jmap/agent-jmap.js";

@@ -15,0 +16,0 @@ export * from "./agent/jmap/agent-jmap-verify.js";

@@ -1,1 +0,1 @@

{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/lib/mod.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mCAAmC,CAAC;AAClD,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAEhC,cAAc,4CAA4C,CAAC;AAC3D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAE3C,cAAc,8CAA8C,CAAC;AAC7D,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC"}
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/lib/mod.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mCAAmC,CAAC;AAClD,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAEhC,cAAc,4CAA4C,CAAC;AAC3D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAE3C,cAAc,8CAA8C,CAAC;AAC7D,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC"}

@@ -13,2 +13,3 @@ export * from "./network/auth-client.js";

export * from "./agent/auth/agent-auth-http.js";
export * from "./agent/auth/agent-utm.js";
export * from "./agent/jmap/agent-jmap.js";

@@ -15,0 +16,0 @@ export * from "./agent/jmap/agent-jmap-verify.js";

@@ -6,3 +6,3 @@ #!/usr/bin/env node

import { parseArgs } from "node:util";
import { AgentSession, DEFAULT_API_URL, DEFAULT_AUTH_URL, DEFAULT_JMAP_USING, DEFAULT_POW_SCRYPT_SALT_HEX, defaultFilesFromOutDir, expandCredentialDirInput, getHelp, parseUserVarsJson, persistLoginWithApiKey, readCredentials, readOpsFile, runJmapRequest, sharedError, } from "../lib/mod.js";
import { AgentSession, DEFAULT_API_URL, DEFAULT_AUTH_URL, DEFAULT_JMAP_USING, DEFAULT_POW_SCRYPT_SALT_HEX, defaultFilesFromOutDir, expandCredentialDirInput, getHelp, parseUserVarsJson, parseUtm, persistLoginWithApiKey, readCredentials, readOpsFile, runJmapRequest, sharedError, } from "../lib/mod.js";
const USAGE = `Atomic Mail — AgentSkill

@@ -20,2 +20,3 @@

atomicmail register --username alice
atomicmail register --username alice --utm "utm_source=blog&utm_campaign=launch"
atomicmail register --api-key UUID

@@ -53,2 +54,3 @@ atomicmail jmap_request --ops-file list_inbox.json

"credentials-dir": { type: "string" },
utm: { type: "string" },
forced: { type: "boolean" },

@@ -77,2 +79,4 @@ quiet: { type: "boolean" },

--credentials-dir DIR Credential directory (default: ~/.atomicmail)
--utm STRING Install-attribution, URL-query style (only with --username) [env: ATOMICMAIL_UTM]
e.g. "utm_source=blog&utm_medium=cpc&utm_campaign=launch"
--forced Allow replacing existing credentials with a new account

@@ -99,2 +103,5 @@ --quiet Less stderr output

const credentialDir = expandCredentialDirInput(dir);
// UTM install-attribution: --utm flag takes precedence over ATOMICMAIL_UTM.
// Parsing never throws, so a malformed value simply sends no utm fields.
const utm = parseUtm(parsed.values.utm ?? env.ATOMICMAIL_UTM);
const username = parsed.values.username;

@@ -121,2 +128,3 @@ const apiKey = parsed.values["api-key"];

forced: parsed.values.forced === true,
utm,
});

@@ -123,0 +131,0 @@ log(`Wrote credentials under ${credentialDir}`);

{
"name": "@atomicmail/agent-skill",
"version": "0.3.24",
"version": "0.3.25",
"description": "Atomic Mail AgentSkill — register, jmap_request, and help CLI for AI agents.",

@@ -5,0 +5,0 @@ "keywords": [

@@ -181,1 +181,21 @@ ---

- PoW salt: `--scrypt-salt` or `ATOMIC_MAIL_SCRYPT_SALT`
- Install attribution: `--utm` or `ATOMICMAIL_UTM` (see below)
## Install attribution (UTM)
Optionally tag a `register` with where the install came from. Pass a
URL-query-style string of `utm_*` fields on the `register` command:
```bash
npx --package=@atomicmail/agent-skill atomicmail register \
--username "myagent" \
--utm "utm_source=blog&utm_medium=cpc&utm_campaign=launch"
```
- Recognized keys: `utm_source`, `utm_medium`, `utm_campaign`, `utm_term`,
`utm_content`. Anything else in the string is ignored; each value is capped at
64 characters.
- The `--utm` flag takes precedence over the `ATOMICMAIL_UTM` environment
variable when both are set.
- Attribution applies to new-account signup only (`--username`), not `--api-key`
login. It never blocks registration — a malformed value simply sends nothing.