@agent-beam/beam 0.2.40 → 0.2.41

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.
@@ -0,0 +1,197 @@
1
+ import { basename } from "node:path";
2
+ import { shellActionCommands } from "./credential-egress.js";
3
+ import { PRIVATE_PATH, isTemplateEnvPath, touchesSecretContent, executedText } from "./secret-use.js";
4
+ const MAX_STEPS = 6;
5
+ const clip = (s, n = 140) => (s.length > n ? s.slice(0, n - 1) + "…" : s);
6
+ // Pipe tails and plumbing: they shape output but are not an action worth narrating.
7
+ const PLUMBING = new Set(["cut", "wc", "sort", "uniq", "tr", "awk", "xargs", "tee", "cd", "echo", "printf", "true", "false", "export", "set", "unset", "sleep", "clear", "pwd", "[", "[[", "test", "read", "exit", "wait", "alias", "time", "nohup"]);
8
+ /** Last two path segments, no quotes -- the form used inside data fields. */
9
+ export function shortPath(path, safe) {
10
+ const clean = path.replace(/^["']|["']$/g, "");
11
+ if (/[$`]/.test(clean))
12
+ return "a file chosen by the command";
13
+ const parts = clean.replace(/\/+$/, "").split("/").filter(Boolean);
14
+ return safe(parts.length > 2 ? parts.slice(-2).join("/") : parts.join("/") || clean);
15
+ }
16
+ /** Quoted friendly name for reading in a sentence. */
17
+ export const friendlyName = (path, safe) => nice(path, safe);
18
+ function nice(path, safe) {
19
+ const clean = path.replace(/^["']|["']$/g, "");
20
+ if (/[$`]/.test(clean))
21
+ return "a file chosen by the command";
22
+ if (/[*?]/.test(clean))
23
+ return `files matching “${safe(clean.split("/").pop() ?? clean)}”`;
24
+ const parts = clean.replace(/\/+$/, "").split("/").filter(Boolean);
25
+ const tail = parts.length > 2 ? parts.slice(-2).join("/") : parts.join("/") || clean;
26
+ return `“${safe(tail)}”`;
27
+ }
28
+ const list = (items, max = 3) => (items.length > max ? `${items.slice(0, max).join(", ")} and ${items.length - max} more` : items.join(", "));
29
+ const GIT = {
30
+ status: "checked which files changed in git", diff: "looked at code changes in git", log: "looked at the commit history",
31
+ add: "staged files in git", commit: "saved a git commit", push: "pushed code to the shared repository", pull: "pulled the latest code",
32
+ checkout: "switched git branches", branch: "looked at git branches", stash: "set changes aside in git", reset: "reset git state",
33
+ clean: "removed untracked files with git", "ls-files": "asked git which files it tracks", "check-ignore": "asked git whether a file is ignored",
34
+ rm: "removed files through git", mv: "moved files through git", merge: "merged branches", rebase: "rewrote branch history", fetch: "fetched updates",
35
+ };
36
+ function describe(cmd, args, safe) {
37
+ const files = args.filter(a => !a.startsWith("-") && !/^\d+(?:,\d+)?p?$/.test(a));
38
+ if (/^(?:cat|head|tail|less|more|nl|bat|xxd|strings|od|sed)$/.test(cmd)) {
39
+ // sed's first non-option argument is its script (1,40p), not a file.
40
+ const target = cmd === "sed" ? args.filter(a => !a.startsWith("-")).slice(1) : files;
41
+ if (!target.length)
42
+ return undefined; // reading a pipe, not a file
43
+ const range = cmd === "sed" ? args.join(" ").match(/-n\s+['"]?(\d+),(\d+)p/) : cmd === "head" || cmd === "tail" ? args.join(" ").match(/-n?\s*(\d+)\b/) : null;
44
+ const how = range ? (range[2] ? `lines ${range[1]}–${range[2]} of ` : `${cmd === "head" ? "the first" : "the last"} ${range[1]} lines of `) : "";
45
+ return `read ${how}${list(target.map(f => nice(f, safe)))}`;
46
+ }
47
+ if (/^(?:ls|ll|la|tree|stat|file)$/.test(cmd)) {
48
+ if (!files.length)
49
+ return "listed the files in the current folder";
50
+ return files.length === 1 && /[*?]/.test(files[0]) ? `listed ${nice(files[0], safe)}` : `listed the files in ${list(files.map(f => nice(f, safe)))}`;
51
+ }
52
+ if (cmd === "find")
53
+ return `searched for files${files[0] ? ` under ${nice(files[0], safe)}` : ""}`;
54
+ if (/^(?:grep|egrep|rg|ag|ack)$/.test(cmd)) {
55
+ const pattern = files[0], where = files.slice(1);
56
+ const what = pattern && !/[|\\^$]{2,}/.test(pattern) ? ` for “${clip(safe(pattern.replace(/^["']|["']$/g, "")), 28)}”` : "";
57
+ return where.length ? `searched ${list(where.map(f => nice(f, safe)))}${what}` : `filtered the output${what}`;
58
+ }
59
+ if (cmd === "git")
60
+ return GIT[args.find(a => !a.startsWith("-")) ?? ""] ?? "ran a git command";
61
+ if (/^(?:npm|pnpm|yarn|bun|bunx|npx)$/.test(cmd)) {
62
+ const sub = args.find(a => !a.startsWith("-"));
63
+ if (sub === "run" || (cmd === "bun" && sub === "run"))
64
+ return `ran the project's “${safe(args[args.indexOf("run") + 1] ?? "script")}” command`;
65
+ if (sub === "install" || sub === "i" || sub === "add")
66
+ return "installed packages";
67
+ if (cmd === "npx" || cmd === "bunx")
68
+ return `ran the tool “${safe(sub ?? "")}” on demand`;
69
+ return `ran ${cmd} ${safe(sub ?? "")}`.trim();
70
+ }
71
+ if (/^(?:python[\d.]*|node|deno|ruby|perl|php)$/.test(cmd))
72
+ return args.some(a => a === "-") ? "ran a short script typed into the command" : files[0] ? `ran the script ${nice(files[0], safe)}` : "ran a short script";
73
+ if (/^(?:curl|wget)$/.test(cmd)) {
74
+ const url = args.find(a => /^https?:\/\//i.test(a.replace(/^["']|["']$/g, "")));
75
+ const host = url ? url.replace(/^["']/, "").replace(/^https?:\/\//i, "").split(/[/?#"']/)[0] : undefined;
76
+ return `contacted ${host ? safe(host) : "a web address"}${args.some(a => /^-[a-zA-Z]*[oO]$|^--output/.test(a)) ? " and saved the response" : ""}`;
77
+ }
78
+ if (cmd === "rm")
79
+ return `deleted ${list(files.map(f => nice(f, safe))) || "files"}${args.some(a => /^-[a-z]*r/i.test(a)) ? " (including everything inside)" : ""}`;
80
+ if (cmd === "mkdir")
81
+ return `created the folder ${list(files.map(f => nice(f, safe)))}`;
82
+ if (cmd === "cp")
83
+ return `copied ${files.length > 1 ? nice(files[0], safe) : "files"}${files.length > 1 ? ` to ${nice(files[files.length - 1], safe)}` : ""}`;
84
+ if (cmd === "mv")
85
+ return `moved ${files.length > 1 ? nice(files[0], safe) : "files"}${files.length > 1 ? ` to ${nice(files[files.length - 1], safe)}` : ""}`;
86
+ if (cmd === "touch")
87
+ return `created the file ${list(files.map(f => nice(f, safe)))}`;
88
+ if (cmd === "chmod" || cmd === "chown")
89
+ return "changed who is allowed to use a file";
90
+ if (/^(?:pkill|kill|killall|lsof|ps|pgrep)$/.test(cmd))
91
+ return "stopped or looked at a running program";
92
+ if (/^(?:psql|mysql|sqlite3|mongosh|redis-cli)$/.test(cmd))
93
+ return "ran a database command";
94
+ if (/^(?:docker|podman|kubectl|helm|terraform|aws|gcloud|az|vercel|railway|fly|gh|heroku)$/.test(cmd))
95
+ return `used the ${cmd} command-line tool`;
96
+ if (/^(?:source|\.)$/.test(cmd))
97
+ return files[0] ? `loaded settings from ${nice(files[0], safe)}` : "loaded a settings file";
98
+ if (cmd === "env" || cmd === "printenv")
99
+ return args.some(a => !a.startsWith("-")) ? "looked up a named setting" : "listed all of the computer's hidden settings";
100
+ if (/^(?:sed|awk)$/.test(cmd))
101
+ return undefined;
102
+ return `ran “${safe(cmd)}”`;
103
+ }
104
+ /** Steps for a shell command, in order, with plumbing left out and repeats merged. */
105
+ export function narrateCommand(command, safe) {
106
+ const all = [];
107
+ let admin = false;
108
+ const heredocEditor = /<<-?\s*['"]?\w+['"]?/.test(command) && /\.write_text\(|\.write\(|writeFile(?:Sync)?\(|open\([^)]*['"][wa]b?['"]/.test(command);
109
+ for (const c of shellActionCommands(command)) {
110
+ const t = c.tokens;
111
+ let at = 0;
112
+ while (/^[A-Za-z_]\w*=/.test(t[at]?.value ?? ""))
113
+ at++;
114
+ if (t[at]?.value === "sudo") {
115
+ admin = true;
116
+ at++;
117
+ }
118
+ const cmd = basename(t[at]?.value ?? "").toLowerCase();
119
+ if (!cmd || PLUMBING.has(cmd))
120
+ continue;
121
+ // Redirections (`2>/dev/null`, `> out.log`) are plumbing, not things the command acted on.
122
+ const raw = t.slice(at + 1).map(x => x.value);
123
+ const args = [];
124
+ for (let i = 0; i < raw.length; i++) {
125
+ if (/^(?:\d*>>?|&>>?|<)$/.test(raw[i])) {
126
+ i++;
127
+ continue;
128
+ }
129
+ if (/^(?:\d*>>?|&>>?|<)\S/.test(raw[i]) || /^\d*>&\d*$/.test(raw[i]))
130
+ continue;
131
+ args.push(raw[i]);
132
+ }
133
+ const text = describe(cmd, args, safe);
134
+ if (!text)
135
+ continue;
136
+ if (all.includes(text))
137
+ continue;
138
+ all.push(text);
139
+ }
140
+ if (heredocEditor && !all.some(s => /script/.test(s)))
141
+ all.unshift("ran a short script that edits files");
142
+ const steps = all.length > MAX_STEPS ? [...all.slice(0, MAX_STEPS - 1), `and ${all.length - (MAX_STEPS - 1)} more steps`] : all;
143
+ return { steps: steps.map(s => clip(s)), admin };
144
+ }
145
+ const ACCESS_RULES = new Set(["credentials.environment", "credentials.access", "source.private_files"]);
146
+ /** Builds the event-specific explanation. Returns undefined when there is nothing useful to narrate. */
147
+ export function explainFinding(input) {
148
+ const { ruleId, severity, command, context, safe } = input;
149
+ if (!command.trim())
150
+ return undefined;
151
+ const narrated = narrateCommand(command, safe);
152
+ const steps = narrated.steps;
153
+ if (!steps.length)
154
+ return undefined;
155
+ const privateNames = new Set();
156
+ for (const a of context?.actions ?? []) {
157
+ const p = a.resolvedPath ?? a.target ?? "";
158
+ if (p && PRIVATE_PATH.test(p) && !isTemplateEnvPath(p))
159
+ privateNames.add(basename(p) || p);
160
+ }
161
+ for (const m of executedText(command).matchAll(/(?:^|[\s/"'=])(\.env(?:\.[\w-]+)?|\.npmrc|\.netrc|\.pgpass|id_(?:rsa|ed25519)|credentials\.json)(?![\w.])/g)) {
162
+ if (!isTemplateEnvPath(m[1]))
163
+ privateNames.add(m[1]);
164
+ }
165
+ const touched = [...privateNames].slice(0, 4).map(n => clip(safe(n), 60));
166
+ let opened;
167
+ let nuance;
168
+ if (ACCESS_RULES.has(ruleId)) {
169
+ const dump = context?.actions.some(a => a.operation === "environment-dump");
170
+ const lookup = context?.actions.some(a => a.operation === "environment-lookup");
171
+ if (touched.length) {
172
+ opened = context && touchesSecretContent(command, context) ? "contents" : "names-only";
173
+ nuance = opened === "contents"
174
+ ? `It opened ${list(touched)}, so its contents may have been shown to the agent.`
175
+ : `${list(touched)} was only listed or mentioned; nothing opened its contents, so no secret was exposed.`;
176
+ }
177
+ else if (ruleId === "credentials.environment") {
178
+ nuance = dump ? "It listed every hidden setting at once, which can include passwords and keys."
179
+ : lookup ? "It looked up a single named setting, not the whole set."
180
+ : "The detector saw the word “env”, but the command did not list the computer's settings.";
181
+ opened = dump || lookup ? "contents" : "none";
182
+ }
183
+ else {
184
+ opened = "none";
185
+ nuance = "The command only mentions a credential-related word; it did not open a secret file.";
186
+ }
187
+ }
188
+ let verdict = "check";
189
+ if (severity === "critical" || opened === "contents" || (!ACCESS_RULES.has(ruleId) && severity === "high" && narrated.admin))
190
+ verdict = "risky";
191
+ else if (ACCESS_RULES.has(ruleId) && (opened === "none" || opened === "names-only"))
192
+ verdict = "routine";
193
+ else if (severity === "low" || severity === "info")
194
+ verdict = "routine";
195
+ return { v: 1, steps, ...(opened ? { opened } : {}), ...(touched.length ? { touched } : {}), verdict, ...(nuance ? { nuance: clip(nuance, 220) } : {}) };
196
+ }
197
+ //# sourceMappingURL=plain-explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plain-explain.js","sourceRoot":"","sources":["../src/plain-explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Where a repository lives, for the dashboard's repository tag: GitHub, GitLab, Bitbucket, Azure
3
+ * DevOps, AWS CodeCommit, Hugging Face, self-hosted servers, and so on -- plus the container
4
+ * registries (AWS ECR, GHCR, Docker Hub, ...) a command pushes to or pulls from.
5
+ *
6
+ * Read from `.git/config` and the command text. No `git` process is spawned and nothing touches the
7
+ * network. Credentials in a URL (https://user:token@host/...) are always dropped, and only
8
+ * host + path (the same "owner/repo" you would read off the page) are reported.
9
+ */
10
+ export type RepoRemote = {
11
+ /** github | gitlab | bitbucket | azure-devops | aws-codecommit | codeberg | sourcehut | gitea | huggingface | other */
12
+ provider: string;
13
+ /** Host name only, no port or credentials. */
14
+ host: string;
15
+ /** owner/repo, group/subgroup/repo, org/project/repo (Azure DevOps) or the repository name (CodeCommit). */
16
+ path: string;
17
+ protocol: "https" | "http" | "ssh" | "git" | "codecommit";
18
+ /** A web link to the repository, only for hosts whose layout is known. Always https. */
19
+ url?: string;
20
+ /** AWS region, for CodeCommit. */
21
+ region?: string;
22
+ };
23
+ export type RegistryRef = {
24
+ /** aws-ecr | aws-ecr-public | ghcr | docker-hub | gcr | gcp-artifact-registry | azure-acr | quay | gitlab-registry */
25
+ provider: string;
26
+ host: string;
27
+ /** Repository path inside the registry (no tag, no digest). */
28
+ path: string;
29
+ tag?: string;
30
+ /** AWS account id (ECR) -- an identifier, not a secret. */
31
+ account?: string;
32
+ region?: string;
33
+ };
34
+ /** Parses any git remote URL form. Returns undefined for local paths and anything unrecognisable. */
35
+ export declare function parseRemoteUrl(input: string): RepoRemote | undefined;
36
+ /** The origin remote (or the first remote) from a git directory's config. */
37
+ export declare function readOriginRemote(gitDir: string): RepoRemote | undefined;
38
+ /** Container registries named in a command (docker push/pull/build, aws ecr, ...). At most 4, no duplicates. */
39
+ export declare function registriesIn(text: string): RegistryRef[];
@@ -0,0 +1,191 @@
1
+ import { closeSync, existsSync, openSync, readSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const SAFE_SEGMENT = /^[A-Za-z0-9._~@+-]+$/;
4
+ const cleanPath = (p) => p.replace(/^\/+/, "").replace(/\/+$/, "").replace(/\.git$/i, "");
5
+ const okPath = (p) => p.length > 0 && p.length <= 200 && p.split("/").every(s => SAFE_SEGMENT.test(s) && s !== "." && s !== "..");
6
+ function providerOf(host) {
7
+ const h = host.toLowerCase();
8
+ if (/(^|\.)github\./.test(h) || h === "github.com" || h.endsWith(".github.com"))
9
+ return "github";
10
+ if (/(^|\.)gitlab\./.test(h) || h.includes("gitlab"))
11
+ return "gitlab";
12
+ if (/(^|\.)bitbucket\./.test(h) || h.includes("bitbucket"))
13
+ return "bitbucket";
14
+ if (h === "dev.azure.com" || h === "ssh.dev.azure.com" || h.endsWith(".visualstudio.com"))
15
+ return "azure-devops";
16
+ if (/^git-codecommit(?:-fips)?\.[a-z0-9-]+\.amazonaws\.com(?:\.cn)?$/.test(h))
17
+ return "aws-codecommit";
18
+ if (h === "codeberg.org")
19
+ return "codeberg";
20
+ if (h === "git.sr.ht" || h === "sr.ht")
21
+ return "sourcehut";
22
+ if (h === "huggingface.co" || h.endsWith(".hf.co"))
23
+ return "huggingface";
24
+ if (h.includes("gitea") || h.includes("forgejo"))
25
+ return "gitea";
26
+ return "other";
27
+ }
28
+ function browse(provider, host, path, region) {
29
+ switch (provider) {
30
+ case "azure-devops": {
31
+ const [org, project, repo] = path.split("/");
32
+ return org && project && repo ? `https://dev.azure.com/${org}/${project}/_git/${repo}` : undefined;
33
+ }
34
+ case "aws-codecommit":
35
+ return region ? `https://${region}.console.aws.amazon.com/codesuite/codecommit/repositories/${path}/browse?region=${region}` : undefined;
36
+ case "sourcehut":
37
+ return `https://git.sr.ht/${path}`;
38
+ default:
39
+ return `https://${host}/${path}`;
40
+ }
41
+ }
42
+ /** Parses any git remote URL form. Returns undefined for local paths and anything unrecognisable. */
43
+ export function parseRemoteUrl(input) {
44
+ const raw = input.trim();
45
+ if (!raw || raw.length > 500)
46
+ return undefined;
47
+ // codecommit::us-east-1://my-repo or codecommit://profile@my-repo
48
+ const cc = /^codecommit(?:::([a-z0-9-]+))?:\/\/(?:[^@/]+@)?([A-Za-z0-9._-]+)\/?$/.exec(raw);
49
+ if (cc) {
50
+ const region = cc[1];
51
+ return { provider: "aws-codecommit", host: region ? `git-codecommit.${region}.amazonaws.com` : "git-codecommit.amazonaws.com", path: cc[2], protocol: "codecommit", ...(region ? { region } : {}), ...(region ? { url: browse("aws-codecommit", "", cc[2], region) } : {}) };
52
+ }
53
+ let host = "", path = "", protocol = "https";
54
+ const scheme = /^([a-z][a-z0-9+.-]*):\/\//i.exec(raw);
55
+ if (scheme) {
56
+ let u;
57
+ try {
58
+ u = new URL(raw);
59
+ }
60
+ catch {
61
+ return undefined;
62
+ }
63
+ const proto = u.protocol.replace(":", "").toLowerCase();
64
+ if (proto === "file")
65
+ return undefined;
66
+ protocol = proto === "http" ? "http" : proto === "https" ? "https" : proto === "git" ? "git" : "ssh";
67
+ host = u.hostname.toLowerCase(); // port, user and password are dropped here
68
+ path = decodeURIComponent(u.pathname);
69
+ }
70
+ else {
71
+ // scp-like: git@github.com:owner/repo.git (but not C:\path or ./relative)
72
+ const scp = /^(?:[^@/\s]+@)?([A-Za-z0-9.-]+):(?!\/\/)(.+)$/.exec(raw);
73
+ if (!scp || /^[A-Za-z]$/.test(scp[1]))
74
+ return undefined;
75
+ host = scp[1].toLowerCase();
76
+ path = scp[2];
77
+ protocol = "ssh";
78
+ }
79
+ if (!host || !/^[a-z0-9.-]+$/.test(host))
80
+ return undefined;
81
+ let provider = providerOf(host);
82
+ let region;
83
+ path = cleanPath(path);
84
+ if (provider === "azure-devops") {
85
+ // https://dev.azure.com/org/project/_git/repo | git@ssh.dev.azure.com:v3/org/project/repo
86
+ path = path.replace(/^v3\//, "").replace(/\/_git\//, "/");
87
+ const vs = /^([a-z0-9-]+)\.visualstudio\.com$/.exec(host);
88
+ if (vs)
89
+ path = `${vs[1]}/${path}`;
90
+ }
91
+ else if (provider === "aws-codecommit") {
92
+ region = /^git-codecommit(?:-fips)?\.([a-z0-9-]+)\./.exec(host)?.[1];
93
+ path = path.replace(/^v1\/repos\//, "");
94
+ }
95
+ else if (provider === "sourcehut") {
96
+ path = path.replace(/^~/, "~");
97
+ }
98
+ if (!okPath(path))
99
+ return undefined;
100
+ if (protocol === "http")
101
+ provider = providerOf(host);
102
+ return {
103
+ provider, host, path, protocol,
104
+ ...(region ? { region } : {}),
105
+ ...(protocol !== "http" ? { url: browse(provider, host, path, region) } : {}),
106
+ };
107
+ }
108
+ function readSmall(file, max = 65536) {
109
+ try {
110
+ if (!existsSync(file) || statSync(file).size > max)
111
+ return undefined;
112
+ const fd = openSync(file, "r");
113
+ try {
114
+ const buf = Buffer.alloc(max);
115
+ const n = readSync(fd, buf, 0, max, 0);
116
+ return buf.subarray(0, n).toString("utf8");
117
+ }
118
+ finally {
119
+ closeSync(fd);
120
+ }
121
+ }
122
+ catch {
123
+ return undefined;
124
+ }
125
+ }
126
+ /** The origin remote (or the first remote) from a git directory's config. */
127
+ export function readOriginRemote(gitDir) {
128
+ const config = readSmall(join(gitDir, "config"));
129
+ if (!config)
130
+ return undefined;
131
+ const remotes = [];
132
+ let current;
133
+ for (const line of config.split(/\r?\n/)) {
134
+ const section = /^\s*\[\s*remote\s+"([^"]+)"\s*\]\s*$/.exec(line);
135
+ if (section) {
136
+ current = { name: section[1] };
137
+ remotes.push(current);
138
+ continue;
139
+ }
140
+ if (/^\s*\[/.test(line)) {
141
+ current = undefined;
142
+ continue;
143
+ }
144
+ const url = current && !current.url ? /^\s*url\s*=\s*(.+?)\s*$/.exec(line) : null;
145
+ if (current && url)
146
+ current.url = url[1];
147
+ }
148
+ const pick = remotes.find(r => r.name === "origin" && r.url) ?? remotes.find(r => r.url);
149
+ return pick?.url ? parseRemoteUrl(pick.url) : undefined;
150
+ }
151
+ // ---- container registries ---------------------------------------------------------------------
152
+ const TAG = "(?::([A-Za-z0-9_][A-Za-z0-9_.-]{0,127}))?";
153
+ const REGISTRIES = [
154
+ { provider: "aws-ecr", re: new RegExp(`\\b(\\d{12})\\.dkr\\.ecr(?:-fips)?\\.([a-z0-9-]+)\\.amazonaws\\.com(?:\\.cn)?/([a-z0-9][a-z0-9._/-]*)${TAG}`, "i"),
155
+ build: m => ({ provider: "aws-ecr", host: `${m[1]}.dkr.ecr.${m[2]}.amazonaws.com`, path: m[3], account: m[1], region: m[2], ...(m[4] ? { tag: m[4] } : {}) }) },
156
+ { provider: "aws-ecr-public", re: new RegExp(`\\bpublic\\.ecr\\.aws/([a-z0-9][a-z0-9._-]*/[a-z0-9][a-z0-9._/-]*)${TAG}`, "i"),
157
+ build: m => ({ provider: "aws-ecr-public", host: "public.ecr.aws", path: m[1], ...(m[2] ? { tag: m[2] } : {}) }) },
158
+ { provider: "ghcr", re: new RegExp(`\\bghcr\\.io/([a-z0-9][a-z0-9._-]*/[a-z0-9][a-z0-9._/-]*)${TAG}`, "i"),
159
+ build: m => ({ provider: "ghcr", host: "ghcr.io", path: m[1], ...(m[2] ? { tag: m[2] } : {}) }) },
160
+ { provider: "gcp-artifact-registry", re: new RegExp(`\\b([a-z0-9-]+)-docker\\.pkg\\.dev/([a-z0-9][a-z0-9.:-]*/[a-z0-9._-]+/[a-z0-9][a-z0-9._/-]*)${TAG}`, "i"),
161
+ build: m => ({ provider: "gcp-artifact-registry", host: `${m[1]}-docker.pkg.dev`, path: m[2], region: m[1], ...(m[3] ? { tag: m[3] } : {}) }) },
162
+ { provider: "gcr", re: new RegExp(`\\b((?:[a-z]+\\.)?gcr\\.io)/([a-z0-9][a-z0-9.:-]*/[a-z0-9][a-z0-9._/-]*)${TAG}`, "i"),
163
+ build: m => ({ provider: "gcr", host: m[1].toLowerCase(), path: m[2], ...(m[3] ? { tag: m[3] } : {}) }) },
164
+ { provider: "azure-acr", re: new RegExp(`\\b([a-z0-9]{5,50})\\.azurecr\\.io/([a-z0-9][a-z0-9._/-]*)${TAG}`, "i"),
165
+ build: m => ({ provider: "azure-acr", host: `${m[1]}.azurecr.io`, path: m[2], ...(m[3] ? { tag: m[3] } : {}) }) },
166
+ { provider: "quay", re: new RegExp(`\\bquay\\.io/([a-z0-9][a-z0-9._-]*/[a-z0-9][a-z0-9._/-]*)${TAG}`, "i"),
167
+ build: m => ({ provider: "quay", host: "quay.io", path: m[1], ...(m[2] ? { tag: m[2] } : {}) }) },
168
+ { provider: "gitlab-registry", re: new RegExp(`\\bregistry\\.gitlab\\.com/([a-z0-9][a-z0-9._-]*/[a-z0-9][a-z0-9._/-]*)${TAG}`, "i"),
169
+ build: m => ({ provider: "gitlab-registry", host: "registry.gitlab.com", path: m[1], ...(m[2] ? { tag: m[2] } : {}) }) },
170
+ { provider: "docker-hub", re: new RegExp(`\\b(?:docker\\.io|index\\.docker\\.io|registry-1\\.docker\\.io)/([a-z0-9][a-z0-9._-]*/[a-z0-9][a-z0-9._/-]*)${TAG}`, "i"),
171
+ build: m => ({ provider: "docker-hub", host: "docker.io", path: m[1], ...(m[2] ? { tag: m[2] } : {}) }) },
172
+ ];
173
+ /** Container registries named in a command (docker push/pull/build, aws ecr, ...). At most 4, no duplicates. */
174
+ export function registriesIn(text) {
175
+ const out = [];
176
+ const seen = new Set();
177
+ for (const { re, build } of REGISTRIES) {
178
+ for (const m of text.matchAll(new RegExp(re.source, "gi"))) {
179
+ const ref = build(m);
180
+ const key = `${ref.provider}|${ref.host}|${ref.path}`;
181
+ if (seen.has(key) || !okPath(ref.path.replace(/:/g, "")))
182
+ continue;
183
+ seen.add(key);
184
+ out.push(ref);
185
+ if (out.length >= 4)
186
+ return out;
187
+ }
188
+ }
189
+ return out;
190
+ }
191
+ //# sourceMappingURL=repo-remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-remote.js","sourceRoot":"","sources":["../src/repo-remote.ts"],"names":[],"mappings":"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"}