@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
|
-
|
|
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.
|
|
247
|
-
|
|
248
|
-
|
|
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-
|
|
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-
|
|
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
|
-
"
|
|
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-
|
|
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
|
|
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;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@snowyroad/braid",
|
|
3
|
-
"version": "0.
|
|
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",
|
package/service-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@snowyroad/braid",
|
|
3
|
-
"version": "0.
|
|
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.
|
|
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.
|
|
1398
|
-
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.
|
|
1399
|
-
"integrity": "sha512-
|
|
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.
|
|
2148
|
-
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.7.
|
|
2149
|
-
"integrity": "sha512-
|
|
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.
|
|
2373
|
-
"resolved": "https://registry.npmjs.org/hono/-/hono-4.13.
|
|
2374
|
-
"integrity": "sha512-
|
|
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.
|
|
2749
|
-
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.
|
|
2750
|
-
"integrity": "sha512-
|
|
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.
|
|
2968
|
-
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.
|
|
2969
|
-
"integrity": "sha512-
|
|
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.
|
|
2987
|
+
"nanoid": "^3.3.19",
|
|
2988
2988
|
"picocolors": "^1.1.1",
|
|
2989
|
-
"source-map-js": "^1.2.
|
|
2989
|
+
"source-map-js": "^1.2.2"
|
|
2990
2990
|
},
|
|
2991
2991
|
"engines": {
|
|
2992
2992
|
"node": "^10 || ^12 || >=14"
|