@atomicmail/agent-skill
Advanced tools
| /** 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; | ||
| } |
@@ -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 +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) { |
+1
-0
@@ -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"} |
+1
-0
@@ -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"; |
+9
-1
@@ -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}`); |
+1
-1
| { | ||
| "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": [ |
+20
-0
@@ -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. |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
307059
2.16%157
1.95%5480
1.99%201
11.05%35
2.94%