@garuda-agent/garuda 0.16.1 → 0.18.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/CHANGELOG.md +319 -0
- package/README.md +56 -1074
- package/SECURITY.md +9 -2
- package/dist/{acpCommand-OTAYW7BS.js → acpCommand-IUZPLPLI.js} +25 -23
- package/dist/{anthropic-NQDBCHJU.js → anthropic-NQIZLD64.js} +12 -6
- package/dist/{chunk-NP6RIC25.js → chunk-2FIV2VZP.js} +11 -7
- package/dist/{chunk-YQTGMCU6.js → chunk-3MRQJKUO.js} +29 -5
- package/dist/{chunk-HE2K657U.js → chunk-4BVCYCQT.js} +47 -16
- package/dist/{chunk-WMOLXTBU.js → chunk-4LFJFDCF.js} +2 -1
- package/dist/{chunk-44QN5SWZ.js → chunk-55CFEEIN.js} +22 -2
- package/dist/{chunk-USCUXCAU.js → chunk-5B5HDTUR.js} +3 -3
- package/dist/chunk-65NUEOI7.js +143 -0
- package/dist/{chunk-TUUEBHG2.js → chunk-6XHON3Q6.js} +2 -2
- package/dist/chunk-7KBOIPUT.js +157 -0
- package/dist/{chunk-B6FA4I7Q.js → chunk-7TH3NHCQ.js} +2 -2
- package/dist/{chunk-OUCV3FCT.js → chunk-AOGFYUKG.js} +3 -3
- package/dist/{chunk-GXZACJUI.js → chunk-B4SJY7KT.js} +322 -39
- package/dist/{chunk-3EQU2GUX.js → chunk-BHZ6G65V.js} +5 -1
- package/dist/chunk-C57GHLKP.js +9 -0
- package/dist/chunk-DOCDCQVM.js +484 -0
- package/dist/chunk-FOPBOB7W.js +332 -0
- package/dist/{chunk-TILFPYWO.js → chunk-NHWHG3SW.js} +1930 -992
- package/dist/{chunk-BQTUOO4G.js → chunk-OQ26W5L4.js} +81 -32
- package/dist/{chunk-HUIK3WXO.js → chunk-P6XWWIEK.js} +20 -3
- package/dist/chunk-Q4P3W657.js +6372 -0
- package/dist/{chunk-ZAE25JM2.js → chunk-QANRZW7W.js} +8 -1
- package/dist/chunk-UIRJOQQS.js +118 -0
- package/dist/chunk-UKIE4AAM.js +472 -0
- package/dist/{chunk-KKB5W47S.js → chunk-VTMD5IHD.js} +26 -2
- package/dist/cli/index.js +148 -57
- package/dist/config-WV2H64TF.js +23 -0
- package/dist/{create-VXIH2GUZ.js → create-W6BV75QX.js} +18 -12
- package/dist/{deadline-F5RJJ2QW.js → deadline-TP7ZGLT2.js} +4 -2
- package/dist/evalCommand-SKJQ6CW2.js +686 -0
- package/dist/evalTune-CZRCPSZ3.js +295 -0
- package/dist/{export-HN3CT7AV.js → export-SJ3DUP6W.js} +2 -2
- package/dist/{inkChat-WEDGQMCY.js → inkChat-WYYAFZXD.js} +20 -19
- package/dist/install-TKWN5AYH.js +19 -0
- package/dist/{job-3NYDMP2M.js → job-7JOI4YIQ.js} +6 -2
- package/dist/jobCommand-2ODQLHB3.js +33 -0
- package/dist/{launchd-SSX362VG.js → launchd-3A3ONEW5.js} +9 -8
- package/dist/{lspCommand-JRXKRSL7.js → lspCommand-ZZ6R4PA2.js} +7 -6
- package/dist/{manager-773PUDFE.js → manager-TCYTA5XU.js} +15 -14
- package/dist/{nightCommand-65MUEV32.js → nightCommand-WJU6VZA6.js} +26 -20
- package/dist/{openaiCompatible-CJWVJP5M.js → openaiCompatible-6TLDDW5U.js} +29 -15
- package/dist/{policy-EJPLEEXP.js → policy-ZJ7RMOFN.js} +10 -4
- package/dist/{remove-6GDSTAIO.js → remove-42WQNVPX.js} +8 -7
- package/dist/{run-ML6GSPN4.js → run-PTMRQCIU.js} +5 -5
- package/dist/{server-NGKVIQEV.js → server-VEYIJHEU.js} +2 -2
- package/dist/{setupCommand-VA7D5MZK.js → setupCommand-YMF6I3MD.js} +45 -13
- package/dist/text-LS35WSRL.js +17 -0
- package/dist/tune-YVI2KWQF.js +31 -0
- package/native/bin/garuda-reap +0 -0
- package/native/garuda-reap.c +113 -0
- package/package.json +39 -13
- package/dist/chunk-EIXUSVFX.js +0 -116
- package/dist/chunk-R7I2NBPX.js +0 -71
- package/dist/chunk-ULAJPMY7.js +0 -107
- package/dist/chunk-VBZCNMUD.js +0 -9
- package/dist/evalCommand-RGMZRYDR.js +0 -2812
- package/dist/install-EWDSPFFZ.js +0 -18
- package/dist/jobCommand-ACSGSBQ4.js +0 -32
- package/dist/text-J2GD647J.js +0 -11
package/dist/chunk-EIXUSVFX.js
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/session/redact.ts
|
|
4
|
-
var REDACTED = "[REDACTED]";
|
|
5
|
-
var PATTERNS = [
|
|
6
|
-
/-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z0-9 ]*PRIVATE KEY-----/g,
|
|
7
|
-
/sk-ant-[A-Za-z0-9_-]{16,}/g,
|
|
8
|
-
/\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}/g,
|
|
9
|
-
/\bAKIA[0-9A-Z]{16}\b/g,
|
|
10
|
-
/\bgh[pousr]_[A-Za-z0-9]{30,}\b/g,
|
|
11
|
-
/\bgithub_pat_[A-Za-z0-9_]{30,}\b/g,
|
|
12
|
-
/\bxox[abprs]-[A-Za-z0-9-]{10,}/g,
|
|
13
|
-
/\bAIza[0-9A-Za-z_-]{35}\b/g,
|
|
14
|
-
/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g
|
|
15
|
-
];
|
|
16
|
-
var ASSIGNMENT = /\b([A-Za-z0-9_]*(?:api[_-]?key|secret|token|password|passwd)[A-Za-z0-9_]*)(["']?\s*[:=]\s*["']?)([^\s"'`,;]{8,})/gi;
|
|
17
|
-
var OPAQUE_KEYS = /* @__PURE__ */ new Set(["encrypted_content", "encrypted_index", "signature"]);
|
|
18
|
-
function looksLikeCode(name, value, next) {
|
|
19
|
-
if (/^[\d_.]+$/.test(value)) return !/pass|secret/i.test(name);
|
|
20
|
-
if (value.includes("(") || next === "(") return true;
|
|
21
|
-
return /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+$/.test(value) && !/\d{4,}/.test(value);
|
|
22
|
-
}
|
|
23
|
-
var SECRET_ENV_NAME = /(KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIAL)/i;
|
|
24
|
-
var movedSecrets = /* @__PURE__ */ new Map();
|
|
25
|
-
function keepSecretForRedaction(name, value) {
|
|
26
|
-
movedSecrets.set(name, value);
|
|
27
|
-
}
|
|
28
|
-
var Redactor = class {
|
|
29
|
-
literals;
|
|
30
|
-
/**
|
|
31
|
-
* `env`: variables whose names look secret have their values removed wherever they appear.
|
|
32
|
-
* Default: this process's environment and the secrets moved out of it.
|
|
33
|
-
*/
|
|
34
|
-
constructor(env = { ...process.env, ...Object.fromEntries(movedSecrets) }) {
|
|
35
|
-
this.literals = Object.entries(env).filter(
|
|
36
|
-
([name, value]) => (SECRET_ENV_NAME.test(name) || value !== void 0 && movedSecrets.get(name) === value) && (value?.length ?? 0) >= 8
|
|
37
|
-
).map(([, value]) => value).sort((a, b) => b.length - a.length);
|
|
38
|
-
}
|
|
39
|
-
text(input) {
|
|
40
|
-
let out = input;
|
|
41
|
-
for (const literal of this.literals) out = out.split(literal).join(REDACTED);
|
|
42
|
-
for (const pattern of PATTERNS) out = out.replace(pattern, REDACTED);
|
|
43
|
-
return out.replace(
|
|
44
|
-
ASSIGNMENT,
|
|
45
|
-
(all, name, sep, value, at) => looksLikeCode(name, value, out[at + all.length]) ? all : `${name}${sep}${REDACTED}`
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
/** A copy of `value` with every string redacted. */
|
|
49
|
-
value(value) {
|
|
50
|
-
return this.walk(value);
|
|
51
|
-
}
|
|
52
|
-
walk(value) {
|
|
53
|
-
if (typeof value === "string") return this.text(value);
|
|
54
|
-
if (Array.isArray(value)) return value.map((item) => this.walk(item));
|
|
55
|
-
if (value !== null && typeof value === "object") {
|
|
56
|
-
const redactedThinking = value.type === "redacted_thinking";
|
|
57
|
-
return Object.fromEntries(
|
|
58
|
-
Object.entries(value).map(([k, v]) => [
|
|
59
|
-
k,
|
|
60
|
-
(OPAQUE_KEYS.has(k) || redactedThinking && k === "data") && typeof v === "string" ? v : this.walk(v)
|
|
61
|
-
])
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
return value;
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// src/tools/atomicWrite.ts
|
|
69
|
-
import { randomBytes } from "crypto";
|
|
70
|
-
import { chmod, link, realpath, rename, stat, unlink, writeFile } from "fs/promises";
|
|
71
|
-
import { basename, dirname, join } from "path";
|
|
72
|
-
async function writeFileAtomic(path, content, { createOnly }) {
|
|
73
|
-
const target = createOnly ? path : await realpath(path);
|
|
74
|
-
const temp = join(
|
|
75
|
-
dirname(target),
|
|
76
|
-
`.${basename(target)}.garuda-${randomBytes(4).toString("hex")}.tmp`
|
|
77
|
-
);
|
|
78
|
-
const mode = createOnly ? void 0 : (await stat(target)).mode & 4095;
|
|
79
|
-
await writeFile(temp, content, { flag: "wx", ...mode === void 0 ? {} : { mode } });
|
|
80
|
-
try {
|
|
81
|
-
if (createOnly) {
|
|
82
|
-
try {
|
|
83
|
-
await link(temp, target);
|
|
84
|
-
} catch (error) {
|
|
85
|
-
const code = error.code;
|
|
86
|
-
if (code !== "EPERM" && code !== "ENOTSUP" && code !== "EXDEV") throw error;
|
|
87
|
-
if (await exists(target)) throw Object.assign(new Error("EEXIST"), { code: "EEXIST" });
|
|
88
|
-
await rename(temp, target);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
} else {
|
|
92
|
-
await chmod(temp, mode ?? 420);
|
|
93
|
-
await rename(temp, target);
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
} finally {
|
|
97
|
-
await unlink(temp).catch(() => {
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
async function exists(path) {
|
|
102
|
-
try {
|
|
103
|
-
await stat(path);
|
|
104
|
-
return true;
|
|
105
|
-
} catch {
|
|
106
|
-
return false;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export {
|
|
111
|
-
REDACTED,
|
|
112
|
-
keepSecretForRedaction,
|
|
113
|
-
Redactor,
|
|
114
|
-
writeFileAtomic
|
|
115
|
-
};
|
|
116
|
-
//# sourceMappingURL=chunk-EIXUSVFX.js.map
|
package/dist/chunk-R7I2NBPX.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
EFFORTS
|
|
4
|
-
} from "./chunk-3EQU2GUX.js";
|
|
5
|
-
|
|
6
|
-
// src/model/pricing.ts
|
|
7
|
-
var DEFAULT_CONTEXT_WINDOW = 2e5;
|
|
8
|
-
var M = 1e6;
|
|
9
|
-
var ALWAYS = { mode: "always", efforts: EFFORTS };
|
|
10
|
-
var OPTIONAL = { mode: "optional", efforts: EFFORTS };
|
|
11
|
-
var OPTIONAL_46 = {
|
|
12
|
-
mode: "optional",
|
|
13
|
-
efforts: EFFORTS.filter((e) => e !== "xhigh")
|
|
14
|
-
};
|
|
15
|
-
var KNOWN = [
|
|
16
|
-
["claude-fable-5-1", { price: p(10, 50, 0.25, 12.5), contextWindow: M, thinking: ALWAYS }],
|
|
17
|
-
["claude-fable-5", { price: p(10, 50, 1, 12.5), contextWindow: M, thinking: ALWAYS }],
|
|
18
|
-
["claude-opus-5-5", { price: p(4, 20, 0.2, 5), contextWindow: M, thinking: ALWAYS }],
|
|
19
|
-
["claude-opus-5", { price: p(5, 25, 0.5, 6.25), contextWindow: M, thinking: ALWAYS }],
|
|
20
|
-
["claude-opus-4-8", { price: p(5, 25, 0.5, 6.25), contextWindow: M, thinking: OPTIONAL }],
|
|
21
|
-
["claude-opus-4-7", { price: p(5, 25, 0.5, 6.25), contextWindow: M, thinking: OPTIONAL }],
|
|
22
|
-
["claude-opus-4-6", { price: p(5, 25, 0.5, 6.25), contextWindow: M, thinking: OPTIONAL_46 }],
|
|
23
|
-
["claude-opus-4-5", { price: p(5, 25, 0.5, 6.25), contextWindow: 2e5 }],
|
|
24
|
-
["claude-sonnet-5", { price: p(2, 10, 0.2, 2.5), contextWindow: M, thinking: ALWAYS }],
|
|
25
|
-
["claude-sonnet-4-6", { price: p(3, 15, 0.3, 3.75), contextWindow: M, thinking: OPTIONAL_46 }],
|
|
26
|
-
["claude-sonnet-4-5", { price: p(3, 15, 0.3, 3.75), contextWindow: 2e5 }],
|
|
27
|
-
["claude-haiku-4-5", { price: p(1, 5, 0.1, 1.25), contextWindow: 2e5 }]
|
|
28
|
-
];
|
|
29
|
-
function p(input, output, cacheRead, cacheWrite) {
|
|
30
|
-
return { input, output, cacheRead, cacheWrite };
|
|
31
|
-
}
|
|
32
|
-
function aliasModel(alias) {
|
|
33
|
-
if (!/^(haiku|sonnet|opus|fable)$/.test(alias)) return void 0;
|
|
34
|
-
return KNOWN.find(([prefix]) => prefix.startsWith(`claude-${alias}-`))?.[0];
|
|
35
|
-
}
|
|
36
|
-
function knownModels() {
|
|
37
|
-
return KNOWN.map(([id, info]) => ({ id, info }));
|
|
38
|
-
}
|
|
39
|
-
function lookupModel(modelId) {
|
|
40
|
-
let best;
|
|
41
|
-
for (const [prefix, info] of KNOWN) {
|
|
42
|
-
if (modelId.startsWith(prefix) && prefix.length > (best?.prefix.length ?? 0)) {
|
|
43
|
-
best = { prefix, info };
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return best?.info ?? { contextWindow: DEFAULT_CONTEXT_WINDOW };
|
|
47
|
-
}
|
|
48
|
-
var WEB_SEARCH_USD = 0.01;
|
|
49
|
-
function costOf(usage, price, factor = 1) {
|
|
50
|
-
return (usage.inputTokens * price.input + usage.outputTokens * price.output + usage.cacheReadTokens * price.cacheRead + usage.cacheWriteTokens * price.cacheWrite) / M * factor + (usage.webSearches ?? 0) * WEB_SEARCH_USD;
|
|
51
|
-
}
|
|
52
|
-
function responseCost(response, price) {
|
|
53
|
-
return costOf(response.usage, price, response.priceFactor ?? 1);
|
|
54
|
-
}
|
|
55
|
-
function totalTokens(usage) {
|
|
56
|
-
return usage.inputTokens + usage.outputTokens + usage.cacheReadTokens + usage.cacheWriteTokens;
|
|
57
|
-
}
|
|
58
|
-
function contextSize(usage) {
|
|
59
|
-
return totalTokens(usage);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export {
|
|
63
|
-
aliasModel,
|
|
64
|
-
knownModels,
|
|
65
|
-
lookupModel,
|
|
66
|
-
WEB_SEARCH_USD,
|
|
67
|
-
responseCost,
|
|
68
|
-
totalTokens,
|
|
69
|
-
contextSize
|
|
70
|
-
};
|
|
71
|
-
//# sourceMappingURL=chunk-R7I2NBPX.js.map
|
package/dist/chunk-ULAJPMY7.js
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
cleanLine
|
|
4
|
-
} from "./chunk-PZS3V6P3.js";
|
|
5
|
-
import {
|
|
6
|
-
formatRule
|
|
7
|
-
} from "./chunk-3NJNVZTK.js";
|
|
8
|
-
|
|
9
|
-
// src/permissions/projectSettings.ts
|
|
10
|
-
import { createHash } from "crypto";
|
|
11
|
-
function settingsRisk(settings) {
|
|
12
|
-
const risk = {
|
|
13
|
-
executorHost: settings.executor === "host",
|
|
14
|
-
allow: settings.allow.map(formatRule),
|
|
15
|
-
writePaths: [...settings.sandbox?.writePaths ?? []],
|
|
16
|
-
envAllow: [...settings.envAllow],
|
|
17
|
-
allowLocalhost: settings.web?.allowLocalhost === true
|
|
18
|
-
};
|
|
19
|
-
const formatterCommands = Object.entries(settings.formatters?.commands ?? {}).flatMap(
|
|
20
|
-
([name, f]) => f === false ? [] : [`${name}: ${f.command.join(" ")}`]
|
|
21
|
-
);
|
|
22
|
-
if (formatterCommands.length > 0) risk.formatterCommands = formatterCommands;
|
|
23
|
-
const none = !risk.executorHost && risk.allow.length === 0 && risk.writePaths.length === 0 && risk.envAllow.length === 0 && !risk.allowLocalhost && risk.formatterCommands === void 0;
|
|
24
|
-
return none ? void 0 : risk;
|
|
25
|
-
}
|
|
26
|
-
function settingsRiskHash(risk) {
|
|
27
|
-
return createHash("sha256").update(JSON.stringify(risk)).digest("hex");
|
|
28
|
-
}
|
|
29
|
-
function settingsRiskLines(risk) {
|
|
30
|
-
const lines = [];
|
|
31
|
-
if (risk.executorHost) lines.push('executor: "host" (commands run with no OS sandbox)');
|
|
32
|
-
if (risk.allow.length > 0) {
|
|
33
|
-
lines.push(`permissions.allow (no question for these): ${risk.allow.join(", ")}`);
|
|
34
|
-
}
|
|
35
|
-
if (risk.writePaths.length > 0) {
|
|
36
|
-
lines.push(`sandbox.writePaths (commands may write there): ${risk.writePaths.join(", ")}`);
|
|
37
|
-
}
|
|
38
|
-
if (risk.envAllow.length > 0) {
|
|
39
|
-
lines.push(`env.allow (commands see these variables): ${risk.envAllow.join(", ")}`);
|
|
40
|
-
}
|
|
41
|
-
if (risk.allowLocalhost) lines.push("web.allowLocalhost (web_fetch may reach this machine)");
|
|
42
|
-
if (risk.formatterCommands !== void 0) {
|
|
43
|
-
lines.push(
|
|
44
|
-
`formatters.commands (run after each edit): ${risk.formatterCommands.map(cleanLine).join("; ")}`
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
return lines;
|
|
48
|
-
}
|
|
49
|
-
function withoutRisk(settings) {
|
|
50
|
-
const { sandbox, web, formatters, ...rest } = settings;
|
|
51
|
-
const { writePaths: _writePaths, ...sandboxRest } = sandbox ?? {};
|
|
52
|
-
const keptCommands = Object.fromEntries(
|
|
53
|
-
Object.entries(formatters?.commands ?? {}).filter(([, f]) => f === false)
|
|
54
|
-
);
|
|
55
|
-
return {
|
|
56
|
-
...rest,
|
|
57
|
-
...formatters === void 0 ? {} : { formatters: { ...formatters, commands: keptCommands } },
|
|
58
|
-
executor: settings.executor === "host" ? "auto" : settings.executor,
|
|
59
|
-
allow: [],
|
|
60
|
-
envAllow: [],
|
|
61
|
-
...sandbox === void 0 ? {} : { sandbox: sandboxRest },
|
|
62
|
-
...web === void 0 ? {} : { web: { ...web, allowLocalhost: false } }
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
async function gateProjectSettings(options) {
|
|
66
|
-
const risk = settingsRisk(options.settings);
|
|
67
|
-
if (risk === void 0) return { settings: options.settings };
|
|
68
|
-
const hash = settingsRiskHash(risk);
|
|
69
|
-
const known = options.trust?.settingsHash(options.root);
|
|
70
|
-
if (known === hash) return { settings: options.settings };
|
|
71
|
-
const lines = settingsRiskLines(risk);
|
|
72
|
-
if (options.ask !== void 0) {
|
|
73
|
-
const choice = await options.ask({
|
|
74
|
-
tool: "settings",
|
|
75
|
-
target: { kind: "input", json: "" },
|
|
76
|
-
title: "Project settings that loosen safety",
|
|
77
|
-
preview: [
|
|
78
|
-
`This project's .garuda/settings.json ${known === void 0 ? "asks for" : "changed and now asks for"}:`,
|
|
79
|
-
...lines.map((line) => ` - ${line}`),
|
|
80
|
-
"A cloned repository can ship this file. Without your yes, Garuda uses safe defaults for these",
|
|
81
|
-
"parts; the rest of the file applies."
|
|
82
|
-
].join("\n"),
|
|
83
|
-
isolation: options.isolation ?? "os",
|
|
84
|
-
question: "Use these project settings?",
|
|
85
|
-
choices: ["once", "session", "deny"],
|
|
86
|
-
labels: {
|
|
87
|
-
once: "Yes, for this run",
|
|
88
|
-
session: "Yes, and remember (asks again when they change)",
|
|
89
|
-
deny: "No, use safe defaults"
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
if (choice === "session") await options.trust?.setSettingsHash(options.root, hash);
|
|
93
|
-
if (choice !== "deny") return { settings: options.settings };
|
|
94
|
-
}
|
|
95
|
-
return {
|
|
96
|
-
settings: withoutRisk(options.settings),
|
|
97
|
-
notice: [
|
|
98
|
-
`Project settings not applied (not approved): ${lines.join("; ")}.`,
|
|
99
|
-
"Start the chat in a terminal and answer yes to use them."
|
|
100
|
-
].join(" ")
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export {
|
|
105
|
-
gateProjectSettings
|
|
106
|
-
};
|
|
107
|
-
//# sourceMappingURL=chunk-ULAJPMY7.js.map
|