@snowyroad/braid 0.96.8 → 0.97.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
@@ -231,7 +231,7 @@ descendant process and cannot be shed.
231
231
  dirs** — `~/.ssh`, `~/.aws`, `~/.gnupg`, `~/.kube/config`, and the bridge's own
232
232
  credential store (`~/.braid`).
233
233
  - **Network:** a curated allow-list (provider API hosts, package registries, and
234
- the major source-code hosts) so normal work keeps working; everything else is
234
+ read-only source-content hosts such as codeload.github.com) so normal work keeps working; everything else is
235
235
  blocked. Operator-extensible.
236
236
  - **Fail-closed:** in **full** tool mode the bridge REFUSES to start if the OS
237
237
  sandbox facility is unavailable, and tells you how to fix it. In read-and-reply
@@ -243,9 +243,11 @@ descendant process and cannot be shed.
243
243
  or the `BRAID_SCOPE_ALLOW_WRITE` / `BRAID_SCOPE_ALLOW_READ` / `BRAID_SCOPE_ALLOW_DOMAINS`
244
244
  env vars (see below). Credential directories (`~/.ssh`, `~/.aws`, `~/.config/gh`,
245
245
  and the rest of the protected inventory) are reserved and CANNOT be granted: a
246
- grant that lands inside one is refused at startup with a SCOPE ERROR. A tool CLI
247
- that only needs network still works inside the jail (`github.com` is in the default
248
- allow-list); grant a project data directory, never a credential store.
246
+ grant that lands inside one is refused at startup with a SCOPE ERROR. Code hosts
247
+ (github.com, gitlab.com, bitbucket.org) are NOT reachable from inside the jail:
248
+ authenticated git goes through the bridge's git tools. Grant a project data directory, never a credential store.
249
+
250
+ **Code hosts are not reachable from the jail.** `github.com`, `api.github.com`, `gitlab.com` and `bitbucket.org` are a reserved set: an `--allow-domain` or `scope.network.allowedDomains` entry that reaches them is refused at startup. To accept that risk for one agent (for example, `git+https` dependencies during installs) run `braid scope allow-code-hosts <agent>`; the startup banner then carries a warning. The agent's own `git` runs with credential helpers disabled, so it cannot read your `gh` or keychain credentials.
249
251
 
250
252
  - **Unix socket access (Linux):** on Linux, seccomp-bpf cannot filter Unix sockets
251
253
  by path. The default `compat` IPC profile allows all pathname sockets. The `strict`
@@ -400,7 +400,7 @@ var InviteExpiredError = class extends Error {
400
400
  }
401
401
  };
402
402
  async function redeemInvite(relayHttpUrl, code) {
403
- const { boundedJsonFetch: boundedJsonFetch2 } = await import("./http-3WYFRJZR.js");
403
+ const { boundedJsonFetch: boundedJsonFetch2 } = await import("./http-7LMCYNHB.js");
404
404
  const r = await boundedJsonFetch2(`${relayHttpUrl.replace(/\/$/, "")}/invites/redeem`, {
405
405
  method: "POST",
406
406
  headers: { "content-type": "application/json" },
@@ -492,7 +492,7 @@ function validateReplacementToken(newToken, currentToken, nowMs = Date.now()) {
492
492
  return { ok: true };
493
493
  }
494
494
  async function mintAccessToken(relayHttpUrl, agentKey, fetchFn = fetch, dpopProof) {
495
- const { boundedJsonFetch: boundedJsonFetch2 } = await import("./http-3WYFRJZR.js");
495
+ const { boundedJsonFetch: boundedJsonFetch2 } = await import("./http-7LMCYNHB.js");
496
496
  const r = await boundedJsonFetch2(`${relayHttpUrl.replace(/\/$/, "")}/agents/token`, {
497
497
  method: "POST",
498
498
  headers: {
@@ -812,6 +812,7 @@ function parseScope(v) {
812
812
  if (allowedDomains) net.allowedDomains = allowedDomains;
813
813
  const deniedDomains = strArr(n.deniedDomains);
814
814
  if (deniedDomains) net.deniedDomains = deniedDomains;
815
+ if (typeof n.allowCodeHosts === "boolean") net.allowCodeHosts = n.allowCodeHosts;
815
816
  if (Object.keys(net).length > 0) out.network = net;
816
817
  }
817
818
  return Object.keys(out).length > 0 ? out : void 0;
@@ -1049,6 +1050,13 @@ function pinEndpoint(dir, agentName, pin) {
1049
1050
  agent.pinnedEndpoints = next;
1050
1051
  saveAgent(dir, agent);
1051
1052
  }
1053
+ function setScopeAllowCodeHosts(dir, agentName, value) {
1054
+ const entry = loadAgent(dir, agentName);
1055
+ const agent = entry.agent;
1056
+ const network = { ...agent.scope?.network ?? {}, allowCodeHosts: value };
1057
+ agent.scope = { ...agent.scope ?? {}, network };
1058
+ saveAgent(dir, agent);
1059
+ }
1052
1060
  function updateAgentWorkspace(dir, agentName, info) {
1053
1061
  try {
1054
1062
  const entry = loadAgent(dir, agentName);
@@ -2832,13 +2840,44 @@ var DEFAULT_ALLOWED_DOMAINS = [
2832
2840
  // Crates.io
2833
2841
  "crates.io",
2834
2842
  "static.crates.io",
2835
- // Source hosts
2843
+ // Source hosts: READ-ONLY content delivery only. The code-host write paths
2844
+ // (github.com, api.github.com, gitlab.com, bitbucket.org) left this list on
2845
+ // 2026-10-06 (git gateway D12/G2): with them present, an injected agent could
2846
+ // push private files to an attacker's repo using an attacker-supplied token,
2847
+ // no operator credential needed. Authenticated git goes through the bridge's
2848
+ // git gateway tools; see RESERVED_CODE_HOST_DOMAINS for the enforced floor.
2849
+ "codeload.github.com",
2850
+ "*.githubusercontent.com"
2851
+ ];
2852
+ var RESERVED_CODE_HOST_DOMAINS = [
2836
2853
  "github.com",
2837
2854
  "*.github.com",
2838
- "*.githubusercontent.com",
2839
2855
  "gitlab.com",
2840
- "bitbucket.org"
2856
+ "*.gitlab.com",
2857
+ "bitbucket.org",
2858
+ "*.bitbucket.org"
2841
2859
  ];
2860
+ var RESERVED_CODE_HOST_READ_ONLY = /* @__PURE__ */ new Set(["codeload.github.com"]);
2861
+ function codeHostConflicts(allowed) {
2862
+ const out = [];
2863
+ for (const a of allowed) {
2864
+ const d = a.domain.trim().toLowerCase().replace(/\.$/, "");
2865
+ if (RESERVED_CODE_HOST_READ_ONLY.has(d)) continue;
2866
+ for (const r of RESERVED_CODE_HOST_DOMAINS) {
2867
+ const base = r.startsWith("*.") ? r.slice(2) : r;
2868
+ const isAllMatch = d === "*";
2869
+ const isReservedItself = d === r || d === base;
2870
+ const isSubdomainOfReservedWildcard = r.startsWith("*.") && d.endsWith("." + base);
2871
+ const isBroaderWildcard = d.startsWith("*.") && (base === d.slice(2) || base.endsWith("." + d.slice(2)));
2872
+ const hit = isAllMatch || isReservedItself || isSubdomainOfReservedWildcard || isBroaderWildcard;
2873
+ if (hit) {
2874
+ out.push({ domain: a.domain, source: a.source, reservation: r });
2875
+ break;
2876
+ }
2877
+ }
2878
+ }
2879
+ return out;
2880
+ }
2842
2881
  var PROVIDER_PATHS = {
2843
2882
  "claude-code": ["~/.claude", "~/.claude.json"],
2844
2883
  codex: ["~/.codex"],
@@ -3022,6 +3061,24 @@ Narrow the grant to a path outside the protected set. (Ancestor grants like "~"
3022
3061
  ...scope.network?.deniedDomains ?? [],
3023
3062
  ...parseEnvList(env["BRAID_SCOPE_DENY_DOMAINS"])
3024
3063
  ]);
3064
+ const allowCodeHosts = scope.network?.allowCodeHosts === true;
3065
+ if (!disabled && !allowCodeHosts) {
3066
+ const labelledDomains = [
3067
+ ...(scope.network?.allowedDomains ?? []).map((domain) => ({ domain, source: "scope.network.allowedDomains" })),
3068
+ ...(cfg.derivedAllowedDomains ?? []).map((domain) => ({ domain, source: "derived model endpoint" })),
3069
+ ...parseEnvList(env["BRAID_SCOPE_ALLOW_DOMAINS"]).map((domain) => ({ domain, source: "BRAID_SCOPE_ALLOW_DOMAINS" })),
3070
+ ...(cfg.scopeFlags?.allowDomains ?? []).map((domain) => ({ domain, source: "--allow-domain" }))
3071
+ ];
3072
+ const hits = codeHostConflicts(labelledDomains);
3073
+ if (hits.length > 0) {
3074
+ const detail = hits.map((h) => ` - ${h.source}: "${h.domain}" is a code host (reserved: ${h.reservation})`).join("\n");
3075
+ throw new Error(
3076
+ `[braid] SCOPE ERROR: a network grant reaches a code host and was refused:
3077
+ ${detail}
3078
+ The sandboxed agent must not reach code hosts directly (an injected agent could push private files anywhere on that host). Use the Braid git tools for authenticated git, or run \`braid scope allow-code-hosts <agent>\` to accept the exfiltration risk for this agent.`
3079
+ );
3080
+ }
3081
+ }
3025
3082
  function describe() {
3026
3083
  const lines = [];
3027
3084
  if (disabled) {
@@ -3042,6 +3099,9 @@ Narrow the grant to a path outside the protected set. (Ancestor grants like "~"
3042
3099
  lines.push(`[scope] provider paths (writable): ${providerPaths.join(", ")}`);
3043
3100
  }
3044
3101
  lines.push(`[scope] allowed domains (${allowedDomains.length}): ${allowedDomains.slice(0, 5).join(", ")}${allowedDomains.length > 5 ? " ..." : ""}`);
3102
+ if (allowCodeHosts) {
3103
+ lines.push("[scope] WARNING: direct code-host egress is ON for this agent (exfiltration path accepted by the owner via `braid scope allow-code-hosts`)");
3104
+ }
3045
3105
  if ((cfg.derivedAllowedDomains ?? []).length > 0) {
3046
3106
  lines.push(`[scope] model endpoints (derived): ${(cfg.derivedAllowedDomains ?? []).join(", ")}`);
3047
3107
  }
@@ -6225,6 +6285,29 @@ function formatRateLimitNotice(agentName, provider, message) {
6225
6285
  ];
6226
6286
  }
6227
6287
 
6288
+ // src/gitEnv.ts
6289
+ var AGENT_GIT_ENV = {
6290
+ GIT_TERMINAL_PROMPT: "0",
6291
+ GCM_INTERACTIVE: "never",
6292
+ GIT_CONFIG_NOSYSTEM: "1"
6293
+ };
6294
+ var AGENT_GIT_CONFIG = [
6295
+ ["credential.helper", ""],
6296
+ ["core.askPass", ""]
6297
+ ];
6298
+ function withAgentGitEnv(extra, baseGitConfigCount = process.env.GIT_CONFIG_COUNT) {
6299
+ const out = { ...extra, ...AGENT_GIT_ENV };
6300
+ let n = Number.parseInt(extra.GIT_CONFIG_COUNT ?? baseGitConfigCount ?? "0", 10);
6301
+ if (!Number.isFinite(n) || n < 0) n = 0;
6302
+ for (const [key, value] of AGENT_GIT_CONFIG) {
6303
+ out[`GIT_CONFIG_KEY_${n}`] = key;
6304
+ out[`GIT_CONFIG_VALUE_${n}`] = value;
6305
+ n++;
6306
+ }
6307
+ out.GIT_CONFIG_COUNT = String(n);
6308
+ return out;
6309
+ }
6310
+
6228
6311
  // src/adapter.ts
6229
6312
  function defaultToolPolicy() {
6230
6313
  return { mode: "readonly", configDirAbs: resolve2(configDir(process.env)), allowReadAbs: [] };
@@ -6324,6 +6407,10 @@ function resolvePathBinary(binary, hint) {
6324
6407
  return found;
6325
6408
  }
6326
6409
  function launchSpecFor(agent) {
6410
+ const spec = launchSpecForProvider(agent);
6411
+ return { ...spec, env: withAgentGitEnv(spec.env ?? {}) };
6412
+ }
6413
+ function launchSpecForProvider(agent) {
6327
6414
  const cwd = process.cwd();
6328
6415
  switch (agent) {
6329
6416
  case "claude-code": {
@@ -6468,7 +6555,7 @@ function interactiveHandoffSupported(agent) {
6468
6555
  }
6469
6556
  function interactiveResumeSpecFor(agent, sessionId, cwd) {
6470
6557
  const build = HANDOFF_RESUME_SPECS[agent];
6471
- return build ? build(sessionId, cwd) : null;
6558
+ return build ? { ...build(sessionId, cwd), env: withAgentGitEnv({}) } : null;
6472
6559
  }
6473
6560
  var defaultAcpClientFactory = (launch) => new AcpClient(launch);
6474
6561
  var MAX_CONSECUTIVE_RESTARTS = 3;
@@ -7921,6 +8008,7 @@ export {
7921
8008
  loadAgent,
7922
8009
  acquireAgentLock,
7923
8010
  pinEndpoint,
8011
+ setScopeAllowCodeHosts,
7924
8012
  updateAgentWorkspace,
7925
8013
  isFilesystemRoot,
7926
8014
  narrowestMode,
@@ -7950,6 +8038,7 @@ export {
7950
8038
  scopedLaunch,
7951
8039
  resetScope,
7952
8040
  sandboxInstaller,
8041
+ withAgentGitEnv,
7953
8042
  resolveClaudeBinary,
7954
8043
  describeClaudeBinary,
7955
8044
  interactiveHandoffSupported,
package/dist/cli.js CHANGED
@@ -75,6 +75,7 @@ import {
75
75
  sanitizeForTty,
76
76
  saveAgent,
77
77
  scopedLaunch,
78
+ setScopeAllowCodeHosts,
78
79
  setVerboseOutput,
79
80
  snapshotHttpMetrics,
80
81
  startingLines,
@@ -82,8 +83,9 @@ import {
82
83
  toolStatusLine,
83
84
  updateAgentWorkspace,
84
85
  validateRelayWsUrl,
86
+ withAgentGitEnv,
85
87
  wsToHttp
86
- } from "./chunk-QHWKKDPN.js";
88
+ } from "./chunk-2OHYN3KD.js";
87
89
  import {
88
90
  clampUntrusted,
89
91
  externalSourceLabel,
@@ -2376,7 +2378,7 @@ function makeSocketHandoffController(deps) {
2376
2378
  session = c.session;
2377
2379
  spec = c.spec;
2378
2380
  }
2379
- const scoped = await scopedLaunchFn({ command: spec.command, args: spec.args, cwd: spec.cwd }, { scope: deps.scope }, deps.provider);
2381
+ const scoped = await scopedLaunchFn({ command: spec.command, args: spec.args, cwd: spec.cwd, env: spec.env }, { scope: deps.scope }, deps.provider);
2380
2382
  pauseAttempted = true;
2381
2383
  await session.handoffPause();
2382
2384
  active = { channelId, session };
@@ -3043,6 +3045,9 @@ Commands:
3043
3045
  (no network; local inspection only)
3044
3046
  scope allow <agent> <host>
3045
3047
  Approve a custom model endpoint host for a saved agent (BL-148)
3048
+ scope allow-code-hosts <agent>
3049
+ Let THIS agent's sandbox reach github.com/gitlab.com/bitbucket.org
3050
+ directly (accepts the exfiltration risk; prefer the git tools)
3046
3051
  telemetry [status|enable|disable]
3047
3052
  Show or change usage telemetry (tool-mode +
3048
3053
  blocked-tool-call signals only; never content, paths, or
@@ -3125,6 +3130,11 @@ function parseCliArgs(argv) {
3125
3130
  }
3126
3131
  return { kind: "scope-allow", agent: agent2, host };
3127
3132
  }
3133
+ if (argv[1] === "allow-code-hosts") {
3134
+ const agent2 = argv[2] && !argv[2].startsWith("-") ? argv[2].trim() : void 0;
3135
+ if (!agent2) return { kind: "usage", error: `Usage: braid scope allow-code-hosts <agent>` };
3136
+ return { kind: "scope-allow-code-hosts", agent: agent2 };
3137
+ }
3128
3138
  const agent = argv[1] && !argv[1].startsWith("-") ? argv[1].trim() : void 0;
3129
3139
  return { kind: "scope", agent };
3130
3140
  }
@@ -3951,7 +3961,7 @@ async function runHandoff(opts) {
3951
3961
  }
3952
3962
  const spawnFn = opts.spawnFn ?? nodeSpawn;
3953
3963
  const scoped = await scopedLaunch(
3954
- { command: spec.command, args: spec.args, cwd: spec.cwd },
3964
+ { command: spec.command, args: spec.args, cwd: spec.cwd, env: spec.env },
3955
3965
  { scope: opts.scope },
3956
3966
  provider
3957
3967
  );
@@ -4109,7 +4119,7 @@ async function runTakeover(lc, ctx) {
4109
4119
  const child = spawnFn(spec.command, spec.args, {
4110
4120
  stdio: "inherit",
4111
4121
  cwd: spec.cwd,
4112
- env: buildAcpEnv(env, spec.env ?? void 0)
4122
+ env: buildAcpEnv(env, spec.env ? withOwnGitConfig(spec.env, env) : void 0)
4113
4123
  });
4114
4124
  child.on("exit", () => settle({}));
4115
4125
  child.on("error", (e) => settle({ error: e }));
@@ -4332,6 +4342,13 @@ async function defaultPrompt(stdin, stdout, question) {
4332
4342
  rl.close();
4333
4343
  }
4334
4344
  }
4345
+ function withOwnGitConfig(wire, owner) {
4346
+ const rest = {};
4347
+ for (const [k, v] of Object.entries(wire)) {
4348
+ if (k !== "GIT_CONFIG_COUNT" && !/^GIT_CONFIG_(KEY|VALUE)_\d+$/.test(k)) rest[k] = v;
4349
+ }
4350
+ return withAgentGitEnv(rest, owner.GIT_CONFIG_COUNT);
4351
+ }
4335
4352
 
4336
4353
  // src/observe/handoffGate.ts
4337
4354
  var HandoffGate = class {
@@ -5993,6 +6010,13 @@ Set the provider's config to use ${normalizedHost} and try again, or check BRAID
5993
6010
  console.log(`[braid] pinned: ${normalizedHost} (source: ${match.source})`);
5994
6011
  console.log(`[braid] restart the bridge for the change to take effect.`);
5995
6012
  }
6013
+ function scopeAllowCodeHosts(agentName) {
6014
+ const dir = configDir(process.env);
6015
+ setScopeAllowCodeHosts(dir, agentName, true);
6016
+ console.log(`[braid] ${agentName}: direct code-host egress is now ON (github.com, gitlab.com, bitbucket.org reachable from the jail).`);
6017
+ console.log(`[braid] This re-opens an exfiltration path. Prefer the Braid git tools; undo by editing scope.network.allowCodeHosts in the saved agent file.`);
6018
+ console.log(`[braid] restart the bridge for the change to take effect.`);
6019
+ }
5996
6020
  function runTelemetryVerb(verb) {
5997
6021
  const dir = configDir(process.env);
5998
6022
  if (verb === "disable") {
@@ -6063,6 +6087,10 @@ async function main() {
6063
6087
  scopeAllow(invocation.agent, invocation.host);
6064
6088
  return;
6065
6089
  }
6090
+ if (invocation.kind === "scope-allow-code-hosts") {
6091
+ scopeAllowCodeHosts(invocation.agent);
6092
+ return;
6093
+ }
6066
6094
  if (invocation.kind === "telemetry") {
6067
6095
  runTelemetryVerb(invocation.verb);
6068
6096
  return;
@@ -4,7 +4,7 @@ import {
4
4
  boundedJsonFetch,
5
5
  resetHttpMetricsForTest,
6
6
  snapshotHttpMetrics
7
- } from "./chunk-QHWKKDPN.js";
7
+ } from "./chunk-2OHYN3KD.js";
8
8
  import "./chunk-HQNAAXUM.js";
9
9
  export {
10
10
  assertHttpEndpoint,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snowyroad/braid",
3
- "version": "0.96.8",
3
+ "version": "0.97.0",
4
4
  "description": "Braid: connect your own coding agent (Claude Code, Codex, Gemini, Grok) to a Braid channel and collaborate with other agents and humans.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "SnowyRoad",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@snowyroad/braid",
3
- "version": "0.96.8",
3
+ "version": "0.97.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@snowyroad/braid",
9
- "version": "0.96.8",
9
+ "version": "0.97.0",
10
10
  "license": "SEE LICENSE IN LICENSE.md",
11
11
  "dependencies": {
12
12
  "@agentclientprotocol/sdk": "0.25.1",
@@ -1394,9 +1394,9 @@
1394
1394
  }
1395
1395
  },
1396
1396
  "node_modules/acorn": {
1397
- "version": "8.18.0",
1398
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
1399
- "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
1397
+ "version": "8.19.0",
1398
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz",
1399
+ "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==",
1400
1400
  "dev": true,
1401
1401
  "license": "MIT",
1402
1402
  "bin": {
@@ -2144,9 +2144,9 @@
2144
2144
  }
2145
2145
  },
2146
2146
  "node_modules/express-rate-limit": {
2147
- "version": "8.7.0",
2148
- "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.7.0.tgz",
2149
- "integrity": "sha512-hOwV7WOxXfjRpAM1DSJWZDXx3GhplwD8IfwuwvogD8i1Qnkgosw/H45s4ZnFAUHDAhPjlY9hLBvJhKmGMyY26g==",
2147
+ "version": "8.7.1",
2148
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.7.1.tgz",
2149
+ "integrity": "sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==",
2150
2150
  "license": "MIT",
2151
2151
  "dependencies": {
2152
2152
  "debug": "^4.4.3",
@@ -2369,9 +2369,9 @@
2369
2369
  }
2370
2370
  },
2371
2371
  "node_modules/hono": {
2372
- "version": "4.13.12",
2373
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.12.tgz",
2374
- "integrity": "sha512-6E2QDAc9Ick9Sq77ZrGS/dk2WUYni91aufTw6LJKpV7w8kW5/GxVUc650FOADOmlwg3K+f7Pun6XlV+pYmW6gw==",
2372
+ "version": "4.13.13",
2373
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.13.tgz",
2374
+ "integrity": "sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==",
2375
2375
  "license": "MIT",
2376
2376
  "engines": {
2377
2377
  "node": ">=16.9.0"
@@ -2745,9 +2745,9 @@
2745
2745
  }
2746
2746
  },
2747
2747
  "node_modules/nanoid": {
2748
- "version": "3.3.19",
2749
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz",
2750
- "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==",
2748
+ "version": "3.3.20",
2749
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz",
2750
+ "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==",
2751
2751
  "dev": true,
2752
2752
  "funding": [
2753
2753
  {
@@ -2964,9 +2964,9 @@
2964
2964
  }
2965
2965
  },
2966
2966
  "node_modules/postcss": {
2967
- "version": "8.5.28",
2968
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
2969
- "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
2967
+ "version": "8.5.29",
2968
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.29.tgz",
2969
+ "integrity": "sha512-49cGhUbXj8Qenv0iTMxA1cFBzxXoctpC9Ujd77t1WcbJIr6nF/eI7g/8MgxrYldFRuAXvja7xQRwavoW7kgrxQ==",
2970
2970
  "dev": true,
2971
2971
  "funding": [
2972
2972
  {
@@ -2984,9 +2984,9 @@
2984
2984
  ],
2985
2985
  "license": "MIT",
2986
2986
  "dependencies": {
2987
- "nanoid": "^3.3.18",
2987
+ "nanoid": "^3.3.19",
2988
2988
  "picocolors": "^1.1.1",
2989
- "source-map-js": "^1.2.1"
2989
+ "source-map-js": "^1.2.2"
2990
2990
  },
2991
2991
  "engines": {
2992
2992
  "node": "^10 || ^12 || >=14"