@kynver-app/runtime 0.1.122 → 0.1.128
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/dist/chat/chat-claim-loop.d.ts +11 -0
- package/dist/chat/command-allowlist.d.ts +8 -0
- package/dist/chat/command-executor.d.ts +13 -0
- package/dist/cli.js +54 -17773
- package/dist/cron/cron-cli-bin.d.ts +7 -0
- package/dist/cron/cron-readiness.d.ts +35 -0
- package/dist/disk-gate.d.ts +7 -0
- package/dist/index.js +71 -19272
- package/dist/mesh-liveness/mesh-cron-lease-store.d.ts +9 -0
- package/dist/server/cleanup.js +16 -4054
- package/dist/server/default-repo.js +1 -458
- package/dist/server/harness-notice.js +15 -287
- package/dist/server/heavy-verification.js +1 -223
- package/dist/server/landing.js +1 -44
- package/dist/server/memory-cost-enforce.js +2 -480
- package/dist/server/memory-cost.js +2 -184
- package/dist/server/monitor.js +8 -1805
- package/dist/server/orchestration.js +1 -444
- package/dist/server/pr-evidence.js +1 -163
- package/dist/server/repo-search.js +1 -224
- package/dist/server/worker-policy.js +1 -432
- package/dist/worker-persona-catalog.js +1 -138
- package/package.json +3 -2
- package/dist/cli.js.map +0 -7
- package/dist/index.js.map +0 -7
- package/dist/server/cleanup.js.map +0 -7
- package/dist/server/default-repo.js.map +0 -7
- package/dist/server/harness-notice.js.map +0 -7
- package/dist/server/heavy-verification.js.map +0 -7
- package/dist/server/landing.js.map +0 -7
- package/dist/server/memory-cost-enforce.js.map +0 -7
- package/dist/server/memory-cost.js.map +0 -7
- package/dist/server/monitor.js.map +0 -7
- package/dist/server/orchestration.js.map +0 -7
- package/dist/server/pr-evidence.js.map +0 -7
- package/dist/server/repo-search.js.map +0 -7
- package/dist/server/worker-policy.js.map +0 -7
- package/dist/worker-persona-catalog.js.map +0 -7
|
@@ -1,224 +1 @@
|
|
|
1
|
-
|
|
2
|
-
var RG_BINARIES = /* @__PURE__ */ new Set(["rg", "ripgrep", "grep"]);
|
|
3
|
-
var RG_OPTS_WITH_VALUE = /* @__PURE__ */ new Set([
|
|
4
|
-
"-e",
|
|
5
|
-
"--regexp",
|
|
6
|
-
"-f",
|
|
7
|
-
"--file",
|
|
8
|
-
"-m",
|
|
9
|
-
"--max-count",
|
|
10
|
-
"-A",
|
|
11
|
-
"--after-context",
|
|
12
|
-
"-B",
|
|
13
|
-
"--before-context",
|
|
14
|
-
"-C",
|
|
15
|
-
"--context",
|
|
16
|
-
"-g",
|
|
17
|
-
"--glob",
|
|
18
|
-
"--iglob"
|
|
19
|
-
]);
|
|
20
|
-
function binaryName(token) {
|
|
21
|
-
if (!token) return null;
|
|
22
|
-
const base = token.split("/").pop() ?? token;
|
|
23
|
-
return base.replace(/\.exe$/i, "").toLowerCase();
|
|
24
|
-
}
|
|
25
|
-
function splitShellWords(input) {
|
|
26
|
-
if (!input) return [];
|
|
27
|
-
const words = [];
|
|
28
|
-
let current = "";
|
|
29
|
-
let quote;
|
|
30
|
-
let escaped = false;
|
|
31
|
-
for (const char of input) {
|
|
32
|
-
if (escaped) {
|
|
33
|
-
current += char;
|
|
34
|
-
escaped = false;
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
if (char === "\\") {
|
|
38
|
-
escaped = true;
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
if (quote) {
|
|
42
|
-
if (char === quote) quote = void 0;
|
|
43
|
-
else current += char;
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
if (char === '"' || char === "'") {
|
|
47
|
-
quote = char;
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
if (/\s/.test(char)) {
|
|
51
|
-
if (current) {
|
|
52
|
-
words.push(current);
|
|
53
|
-
current = "";
|
|
54
|
-
}
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
current += char;
|
|
58
|
-
}
|
|
59
|
-
if (current) words.push(current);
|
|
60
|
-
return words;
|
|
61
|
-
}
|
|
62
|
-
function isRgArgv(argv) {
|
|
63
|
-
const bin = binaryName(argv[0]);
|
|
64
|
-
return Boolean(bin && RG_BINARIES.has(bin));
|
|
65
|
-
}
|
|
66
|
-
function isSingleFileSearchTarget(target) {
|
|
67
|
-
if (!target || target.includes("/") || target.includes("*")) return false;
|
|
68
|
-
return /\.(?:json|md|mjs|cjs|js|ts|tsx|yaml|yml)$/iu.test(target);
|
|
69
|
-
}
|
|
70
|
-
function isRgExcludeScopeTarget(target) {
|
|
71
|
-
if (!target) return false;
|
|
72
|
-
const t = target.trim();
|
|
73
|
-
return t.startsWith("!") && !t.includes("/") && !t.endsWith("/**");
|
|
74
|
-
}
|
|
75
|
-
function fixRgGlobToken(token) {
|
|
76
|
-
if (!token.startsWith("--glob=")) return token;
|
|
77
|
-
const value = token.slice("--glob=".length);
|
|
78
|
-
if (value.startsWith("!") && !value.includes("/") && !value.endsWith("/**")) {
|
|
79
|
-
return `--glob=${value}/**`;
|
|
80
|
-
}
|
|
81
|
-
return token;
|
|
82
|
-
}
|
|
83
|
-
function collectRgPositional(argv) {
|
|
84
|
-
const positional = [];
|
|
85
|
-
for (let i = 1; i < argv.length; i += 1) {
|
|
86
|
-
const token = argv[i];
|
|
87
|
-
if (!token) continue;
|
|
88
|
-
if (token === "--") {
|
|
89
|
-
positional.push(...argv.slice(i + 1));
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
if (token.startsWith("-")) {
|
|
93
|
-
if (token.includes("=")) continue;
|
|
94
|
-
if (RG_OPTS_WITH_VALUE.has(token)) i += 1;
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
positional.push(token);
|
|
98
|
-
}
|
|
99
|
-
return positional;
|
|
100
|
-
}
|
|
101
|
-
function normalizeRgArgv(argv) {
|
|
102
|
-
let changed = false;
|
|
103
|
-
const out = argv.map((token) => {
|
|
104
|
-
const fixed = fixRgGlobToken(token);
|
|
105
|
-
if (fixed !== token) changed = true;
|
|
106
|
-
return fixed;
|
|
107
|
-
});
|
|
108
|
-
const positional = collectRgPositional(out);
|
|
109
|
-
if (positional.length === 2) {
|
|
110
|
-
const [pattern, target] = positional;
|
|
111
|
-
if (isSingleFileSearchTarget(target)) {
|
|
112
|
-
return { argv: [out[0] ?? "rg", "-g", target, pattern, "."], changed: true };
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return { argv: out, changed };
|
|
116
|
-
}
|
|
117
|
-
function normalizeRepoSearchCommand(command) {
|
|
118
|
-
const trimmed = command.trim();
|
|
119
|
-
if (!trimmed) return { command: trimmed, changed: false };
|
|
120
|
-
const joiner = trimmed.includes("&&") ? " && " : trimmed.includes("||") ? " || " : "; ";
|
|
121
|
-
const stages = trimmed.split(/\s*(?:&&|\|\||;)\s*/u);
|
|
122
|
-
let changed = false;
|
|
123
|
-
const normalizedStages = stages.map((stage) => {
|
|
124
|
-
const argv = splitShellWords(stage.trim());
|
|
125
|
-
if (!argv.length || !isRgArgv(argv)) return stage;
|
|
126
|
-
const normalized = normalizeRgArgv(argv);
|
|
127
|
-
if (normalized.changed) {
|
|
128
|
-
changed = true;
|
|
129
|
-
return normalized.argv.join(" ");
|
|
130
|
-
}
|
|
131
|
-
return stage;
|
|
132
|
-
});
|
|
133
|
-
if (!changed) return { command: trimmed, changed: false };
|
|
134
|
-
return { command: normalizedStages.join(joiner), changed: true };
|
|
135
|
-
}
|
|
136
|
-
function extractSearchMeta(meta) {
|
|
137
|
-
if (!meta) return {};
|
|
138
|
-
const pipelineMatch = meta.match(/search\s+"(.+)"\s+in\s+([^()]+?)(?:\s*\(|$)/iu);
|
|
139
|
-
if (pipelineMatch) {
|
|
140
|
-
return { pattern: pipelineMatch[1], target: pipelineMatch[2]?.trim() };
|
|
141
|
-
}
|
|
142
|
-
const match = meta.match(/^search\s+"(.+)"\s+in\s+(.+)$/iu);
|
|
143
|
-
if (!match) return {};
|
|
144
|
-
return { pattern: match[1], target: match[2]?.trim() };
|
|
145
|
-
}
|
|
146
|
-
function classifyRepoSearchMeta(meta) {
|
|
147
|
-
const { pattern, target } = extractSearchMeta(meta);
|
|
148
|
-
if (!pattern) return { kind: "not_repo_search" };
|
|
149
|
-
if (isRgExcludeScopeTarget(target)) {
|
|
150
|
-
return { kind: "rg_exclude_syntax", pattern, target };
|
|
151
|
-
}
|
|
152
|
-
if (isSingleFileSearchTarget(target)) {
|
|
153
|
-
return { kind: "bad_scope", pattern, target };
|
|
154
|
-
}
|
|
155
|
-
return { kind: "not_repo_search", pattern, target };
|
|
156
|
-
}
|
|
157
|
-
function metaToNormalizedRgCommand(meta) {
|
|
158
|
-
const { pattern, target } = extractSearchMeta(meta);
|
|
159
|
-
if (!pattern) return null;
|
|
160
|
-
if (isRgExcludeScopeTarget(target)) {
|
|
161
|
-
const glob = `${target.trim()}/**`;
|
|
162
|
-
return {
|
|
163
|
-
command: `rg "${pattern}" -g '${glob}' .`,
|
|
164
|
-
changed: true
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
if (target && isSingleFileSearchTarget(target)) {
|
|
168
|
-
return {
|
|
169
|
-
command: `rg -g ${target} "${pattern}" .`,
|
|
170
|
-
changed: true
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
function formatRepoSearchGuidance(ctx) {
|
|
176
|
-
if (ctx.kind === "bad_scope" && ctx.pattern?.includes("agent-os-land-pr") && ctx.target === "package.json") {
|
|
177
|
-
return "Search package.json with a glob from the repo root: `rg -g package.json agent-os-land-pr .` \u2014 or run `node scripts/agent-os-land-pr.mjs <pr-url>` directly.";
|
|
178
|
-
}
|
|
179
|
-
if (ctx.kind === "bad_scope" && ctx.pattern && ctx.target) {
|
|
180
|
-
return `Use \`rg -g '${ctx.target}' ${ctx.pattern} .\` from the repo root instead of treating ${ctx.target} as a folder.`;
|
|
181
|
-
}
|
|
182
|
-
if (ctx.kind === "rg_exclude_syntax" && ctx.pattern) {
|
|
183
|
-
const glob = ctx.target ? `${ctx.target.trim()}/**` : "!node_modules/**";
|
|
184
|
-
return `Repo search scope \`${ctx.target ?? "!node_modules"}\` is not a valid ripgrep path. Use \`rg "${ctx.pattern}" -g '${glob}' .\` from the repo root (exclude globs need a \`/**\` suffix).`;
|
|
185
|
-
}
|
|
186
|
-
if (ctx.kind === "no_matches" && ctx.pattern) {
|
|
187
|
-
return `No matches for "${ctx.pattern}". Try a broader pattern, drop overly short tokens, or search from the repo root with \`rg "${ctx.pattern}" .\`.`;
|
|
188
|
-
}
|
|
189
|
-
return null;
|
|
190
|
-
}
|
|
191
|
-
function extractSearchMetaFromToolLine(line) {
|
|
192
|
-
const match = line.match(/search\s+"(.+)"\s+in\s+([^()]+?)(?:\s*\(agent\)|\s*failed|$)/iu);
|
|
193
|
-
if (!match) return null;
|
|
194
|
-
return `search "${match[1]}" in ${match[2]?.trim()}`;
|
|
195
|
-
}
|
|
196
|
-
function diagnoseRepoSearchFailure(input) {
|
|
197
|
-
const meta = input.meta?.trim() || (input.command ? extractSearchMetaFromToolLine(input.command) : null) || null;
|
|
198
|
-
if (meta) {
|
|
199
|
-
const ctx = classifyRepoSearchMeta(meta);
|
|
200
|
-
const guidance = formatRepoSearchGuidance(ctx);
|
|
201
|
-
if (guidance) return guidance;
|
|
202
|
-
const normalized = metaToNormalizedRgCommand(meta);
|
|
203
|
-
if (normalized?.changed) {
|
|
204
|
-
return `Repo search used an invalid scope. Retry with: \`${normalized.command}\`.`;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
if (input.command && /\b(rg|ripgrep)\b/i.test(input.command)) {
|
|
208
|
-
const normalized = normalizeRepoSearchCommand(input.command);
|
|
209
|
-
if (normalized.changed) {
|
|
210
|
-
return `Ripgrep scope may be invalid. Retry with: \`${normalized.command}\`.`;
|
|
211
|
-
}
|
|
212
|
-
if (input.exitCode === 1) {
|
|
213
|
-
return "Ripgrep returned no matches (exit 1). Try a broader pattern or search from the repo root.";
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return null;
|
|
217
|
-
}
|
|
218
|
-
export {
|
|
219
|
-
classifyRepoSearchMeta,
|
|
220
|
-
diagnoseRepoSearchFailure,
|
|
221
|
-
extractSearchMetaFromToolLine,
|
|
222
|
-
formatRepoSearchGuidance
|
|
223
|
-
};
|
|
224
|
-
//# sourceMappingURL=repo-search.js.map
|
|
1
|
+
var m=new Set(["rg","ripgrep","grep"]),h=new Set(["-e","--regexp","-f","--file","-m","--max-count","-A","--after-context","-B","--before-context","-C","--context","-g","--glob","--iglob"]);function b(e){return e?(e.split("/").pop()??e).replace(/\.exe$/i,"").toLowerCase():null}function R(e){if(!e)return[];let n=[],r="",t,i=!1;for(let o of e){if(i){r+=o,i=!1;continue}if(o==="\\"){i=!0;continue}if(t){o===t?t=void 0:r+=o;continue}if(o==='"'||o==="'"){t=o;continue}if(/\s/.test(o)){r&&(n.push(r),r="");continue}r+=o}return r&&n.push(r),n}function S(e){let n=b(e[0]);return!!(n&&m.has(n))}function c(e){return!e||e.includes("/")||e.includes("*")?!1:/\.(?:json|md|mjs|cjs|js|ts|tsx|yaml|yml)$/iu.test(e)}function l(e){if(!e)return!1;let n=e.trim();return n.startsWith("!")&&!n.includes("/")&&!n.endsWith("/**")}function _(e){if(!e.startsWith("--glob="))return e;let n=e.slice(7);return n.startsWith("!")&&!n.includes("/")&&!n.endsWith("/**")?`--glob=${n}/**`:e}function $(e){let n=[];for(let r=1;r<e.length;r+=1){let t=e[r];if(t){if(t==="--"){n.push(...e.slice(r+1));break}if(t.startsWith("-")){if(t.includes("="))continue;h.has(t)&&(r+=1);continue}n.push(t)}}return n}function x(e){let n=!1,r=e.map(i=>{let o=_(i);return o!==i&&(n=!0),o}),t=$(r);if(t.length===2){let[i,o]=t;if(c(o))return{argv:[r[0]??"rg","-g",o,i,"."],changed:!0}}return{argv:r,changed:n}}function y(e){let n=e.trim();if(!n)return{command:n,changed:!1};let r=n.includes("&&")?" && ":n.includes("||")?" || ":"; ",t=n.split(/\s*(?:&&|\|\||;)\s*/u),i=!1,o=t.map(a=>{let s=R(a.trim());if(!s.length||!S(s))return a;let u=x(s);return u.changed?(i=!0,u.argv.join(" ")):a});return i?{command:o.join(r),changed:!0}:{command:n,changed:!1}}function g(e){if(!e)return{};let n=e.match(/search\s+"(.+)"\s+in\s+([^()]+?)(?:\s*\(|$)/iu);if(n)return{pattern:n[1],target:n[2]?.trim()};let r=e.match(/^search\s+"(.+)"\s+in\s+(.+)$/iu);return r?{pattern:r[1],target:r[2]?.trim()}:{}}function d(e){let{pattern:n,target:r}=g(e);return n?l(r)?{kind:"rg_exclude_syntax",pattern:n,target:r}:c(r)?{kind:"bad_scope",pattern:n,target:r}:{kind:"not_repo_search",pattern:n,target:r}:{kind:"not_repo_search"}}function j(e){let{pattern:n,target:r}=g(e);if(!n)return null;if(l(r)){let t=`${r.trim()}/**`;return{command:`rg "${n}" -g '${t}' .`,changed:!0}}return r&&c(r)?{command:`rg -g ${r} "${n}" .`,changed:!0}:null}function f(e){if(e.kind==="bad_scope"&&e.pattern?.includes("agent-os-land-pr")&&e.target==="package.json")return"Search package.json with a glob from the repo root: `rg -g package.json agent-os-land-pr .` \u2014 or run `node scripts/agent-os-land-pr.mjs <pr-url>` directly.";if(e.kind==="bad_scope"&&e.pattern&&e.target)return`Use \`rg -g '${e.target}' ${e.pattern} .\` from the repo root instead of treating ${e.target} as a folder.`;if(e.kind==="rg_exclude_syntax"&&e.pattern){let n=e.target?`${e.target.trim()}/**`:"!node_modules/**";return`Repo search scope \`${e.target??"!node_modules"}\` is not a valid ripgrep path. Use \`rg "${e.pattern}" -g '${n}' .\` from the repo root (exclude globs need a \`/**\` suffix).`}return e.kind==="no_matches"&&e.pattern?`No matches for "${e.pattern}". Try a broader pattern, drop overly short tokens, or search from the repo root with \`rg "${e.pattern}" .\`.`:null}function p(e){let n=e.match(/search\s+"(.+)"\s+in\s+([^()]+?)(?:\s*\(agent\)|\s*failed|$)/iu);return n?`search "${n[1]}" in ${n[2]?.trim()}`:null}function k(e){let n=e.meta?.trim()||(e.command?p(e.command):null)||null;if(n){let r=d(n),t=f(r);if(t)return t;let i=j(n);if(i?.changed)return`Repo search used an invalid scope. Retry with: \`${i.command}\`.`}if(e.command&&/\b(rg|ripgrep)\b/i.test(e.command)){let r=y(e.command);if(r.changed)return`Ripgrep scope may be invalid. Retry with: \`${r.command}\`.`;if(e.exitCode===1)return"Ripgrep returned no matches (exit 1). Try a broader pattern or search from the repo root."}return null}export{d as classifyRepoSearchMeta,k as diagnoseRepoSearchFailure,p as extractSearchMetaFromToolLine,f as formatRepoSearchGuidance};
|
|
@@ -1,432 +1 @@
|
|
|
1
|
-
var
|
|
2
|
-
var __esm = (fn, res) => function __init() {
|
|
3
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
// src/worker-env.ts
|
|
7
|
-
function isForbiddenWorkerEnvKey(key) {
|
|
8
|
-
if (FORBIDDEN_KEY_SET.has(key)) return true;
|
|
9
|
-
return FORBIDDEN_SUFFIXES.some((suffix) => key.endsWith(suffix));
|
|
10
|
-
}
|
|
11
|
-
function listForbiddenWorkerEnvKeys(env) {
|
|
12
|
-
return Object.keys(env).filter(isForbiddenWorkerEnvKey).sort();
|
|
13
|
-
}
|
|
14
|
-
function scrubWorkerEnv(env) {
|
|
15
|
-
const next = { ...env };
|
|
16
|
-
for (const key of Object.keys(next)) {
|
|
17
|
-
if (isForbiddenWorkerEnvKey(key)) delete next[key];
|
|
18
|
-
}
|
|
19
|
-
return next;
|
|
20
|
-
}
|
|
21
|
-
function auditWorkerEnv(env) {
|
|
22
|
-
const forbiddenPresent = listForbiddenWorkerEnvKeys(env);
|
|
23
|
-
return { forbiddenPresent, safe: forbiddenPresent.length === 0 };
|
|
24
|
-
}
|
|
25
|
-
var FORBIDDEN_WORKER_ENV_KEYS, FORBIDDEN_KEY_SET, FORBIDDEN_SUFFIXES;
|
|
26
|
-
var init_worker_env = __esm({
|
|
27
|
-
"src/worker-env.ts"() {
|
|
28
|
-
"use strict";
|
|
29
|
-
FORBIDDEN_WORKER_ENV_KEYS = [
|
|
30
|
-
"ANTHROPIC_API_KEY",
|
|
31
|
-
"ANALYST_API_KEY",
|
|
32
|
-
"RECRUITER_API_KEY",
|
|
33
|
-
"AUTH_SECRET",
|
|
34
|
-
"NEXTAUTH_SECRET",
|
|
35
|
-
"DATABASE_URL",
|
|
36
|
-
"PRODUCTION_DATABASE_URL",
|
|
37
|
-
"KYNVER_PRODUCTION_DATABASE_URL",
|
|
38
|
-
"REDIS_URL",
|
|
39
|
-
"GOOGLE_CLIENT_SECRET",
|
|
40
|
-
"GITHUB_CLIENT_SECRET",
|
|
41
|
-
"KYNVER_API_KEY",
|
|
42
|
-
"KYNVER_SERVICE_SECRET",
|
|
43
|
-
"KYNVER_RUNTIME_SECRET",
|
|
44
|
-
"KYNVER_CRON_SECRET",
|
|
45
|
-
"OPENCLAW_CRON_SECRET",
|
|
46
|
-
"QSTASH_TOKEN",
|
|
47
|
-
"QSTASH_CURRENT_SIGNING_KEY",
|
|
48
|
-
"QSTASH_NEXT_SIGNING_KEY",
|
|
49
|
-
"TOOL_SECRETS_KEK",
|
|
50
|
-
"TOOL_EXECUTOR_DISPATCH_SECRET",
|
|
51
|
-
"CLOUDFLARE_API_TOKEN",
|
|
52
|
-
"STRIPE_SECRET_KEY",
|
|
53
|
-
"STRIPE_WEBHOOK_SECRET",
|
|
54
|
-
"STRIPE_IDENTITY_WEBHOOK_SECRET",
|
|
55
|
-
"VOYAGE_API_KEY",
|
|
56
|
-
"PERPLEXITY_API_KEY",
|
|
57
|
-
"FRED_API_KEY",
|
|
58
|
-
"FMP_API_KEY",
|
|
59
|
-
"CURSOR_API_KEY"
|
|
60
|
-
];
|
|
61
|
-
FORBIDDEN_KEY_SET = new Set(FORBIDDEN_WORKER_ENV_KEYS);
|
|
62
|
-
FORBIDDEN_SUFFIXES = ["_SECRET", "_API_KEY"];
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// src/util.ts
|
|
67
|
-
var init_util = __esm({
|
|
68
|
-
"src/util.ts"() {
|
|
69
|
-
"use strict";
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
// src/git.ts
|
|
74
|
-
var init_git = __esm({
|
|
75
|
-
"src/git.ts"() {
|
|
76
|
-
"use strict";
|
|
77
|
-
init_util();
|
|
78
|
-
init_worker_env();
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// src/path-values.ts
|
|
83
|
-
var init_path_values = __esm({
|
|
84
|
-
"src/path-values.ts"() {
|
|
85
|
-
"use strict";
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// src/default-repo-discovery.ts
|
|
90
|
-
var init_default_repo_discovery = __esm({
|
|
91
|
-
"src/default-repo-discovery.ts"() {
|
|
92
|
-
"use strict";
|
|
93
|
-
init_git();
|
|
94
|
-
init_path_values();
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// src/box-identity.ts
|
|
99
|
-
var init_box_identity = __esm({
|
|
100
|
-
"src/box-identity.ts"() {
|
|
101
|
-
"use strict";
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
// src/bounded-build/meminfo.ts
|
|
106
|
-
var init_meminfo = __esm({
|
|
107
|
-
"src/bounded-build/meminfo.ts"() {
|
|
108
|
-
"use strict";
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
// src/wsl-host.ts
|
|
113
|
-
var DEFAULT_WSL_HOST_WARN_FREE_BYTES, DEFAULT_WSL_HOST_CRITICAL_FREE_BYTES;
|
|
114
|
-
var init_wsl_host = __esm({
|
|
115
|
-
"src/wsl-host.ts"() {
|
|
116
|
-
"use strict";
|
|
117
|
-
DEFAULT_WSL_HOST_WARN_FREE_BYTES = 25 * 1024 * 1024 * 1024;
|
|
118
|
-
DEFAULT_WSL_HOST_CRITICAL_FREE_BYTES = 12 * 1024 * 1024 * 1024;
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
// src/disk-gate.ts
|
|
123
|
-
var DEFAULT_WARN_FREE_BYTES, DEFAULT_CRITICAL_FREE_BYTES;
|
|
124
|
-
var init_disk_gate = __esm({
|
|
125
|
-
"src/disk-gate.ts"() {
|
|
126
|
-
"use strict";
|
|
127
|
-
init_wsl_host();
|
|
128
|
-
DEFAULT_WARN_FREE_BYTES = 30 * 1024 * 1024 * 1024;
|
|
129
|
-
DEFAULT_CRITICAL_FREE_BYTES = 15 * 1024 * 1024 * 1024;
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
// src/paths.ts
|
|
134
|
-
import { homedir } from "node:os";
|
|
135
|
-
import path from "node:path";
|
|
136
|
-
var LEGACY_ROOT;
|
|
137
|
-
var init_paths = __esm({
|
|
138
|
-
"src/paths.ts"() {
|
|
139
|
-
"use strict";
|
|
140
|
-
init_config();
|
|
141
|
-
init_path_values();
|
|
142
|
-
init_util();
|
|
143
|
-
LEGACY_ROOT = path.join(homedir(), ".openclaw", "harness");
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
// src/run-store.ts
|
|
148
|
-
var init_run_store = __esm({
|
|
149
|
-
"src/run-store.ts"() {
|
|
150
|
-
"use strict";
|
|
151
|
-
init_paths();
|
|
152
|
-
init_util();
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
// src/run-worker-index.ts
|
|
157
|
-
var init_run_worker_index = __esm({
|
|
158
|
-
"src/run-worker-index.ts"() {
|
|
159
|
-
"use strict";
|
|
160
|
-
init_run_store();
|
|
161
|
-
init_util();
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
// src/heartbeat-final-result.ts
|
|
166
|
-
var init_heartbeat_final_result = __esm({
|
|
167
|
-
"src/heartbeat-final-result.ts"() {
|
|
168
|
-
"use strict";
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
// src/heartbeat.ts
|
|
173
|
-
var init_heartbeat = __esm({
|
|
174
|
-
"src/heartbeat.ts"() {
|
|
175
|
-
"use strict";
|
|
176
|
-
init_heartbeat_final_result();
|
|
177
|
-
init_util();
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
// src/repo-search.ts
|
|
182
|
-
var init_repo_search = __esm({
|
|
183
|
-
"src/repo-search.ts"() {
|
|
184
|
-
"use strict";
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
// src/shell-command-outcome.ts
|
|
189
|
-
var init_shell_command_outcome = __esm({
|
|
190
|
-
"src/shell-command-outcome.ts"() {
|
|
191
|
-
"use strict";
|
|
192
|
-
init_repo_search();
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
// src/stream.ts
|
|
197
|
-
var init_stream = __esm({
|
|
198
|
-
"src/stream.ts"() {
|
|
199
|
-
"use strict";
|
|
200
|
-
init_shell_command_outcome();
|
|
201
|
-
init_util();
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
// src/exit-classify.ts
|
|
206
|
-
var init_exit_classify = __esm({
|
|
207
|
-
"src/exit-classify.ts"() {
|
|
208
|
-
"use strict";
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
// src/exited-salvage.ts
|
|
213
|
-
var init_exited_salvage = __esm({
|
|
214
|
-
"src/exited-salvage.ts"() {
|
|
215
|
-
"use strict";
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
// src/landing-gate.ts
|
|
220
|
-
var init_landing_gate = __esm({
|
|
221
|
-
"src/landing-gate.ts"() {
|
|
222
|
-
"use strict";
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
// src/worker-final-result-embed.ts
|
|
227
|
-
var init_worker_final_result_embed = __esm({
|
|
228
|
-
"src/worker-final-result-embed.ts"() {
|
|
229
|
-
"use strict";
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
// src/landing-contract-gate.ts
|
|
234
|
-
var init_landing_contract_gate = __esm({
|
|
235
|
-
"src/landing-contract-gate.ts"() {
|
|
236
|
-
"use strict";
|
|
237
|
-
init_worker_final_result_embed();
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
// src/status.ts
|
|
242
|
-
var init_status = __esm({
|
|
243
|
-
"src/status.ts"() {
|
|
244
|
-
"use strict";
|
|
245
|
-
init_heartbeat();
|
|
246
|
-
init_stream();
|
|
247
|
-
init_exit_classify();
|
|
248
|
-
init_exited_salvage();
|
|
249
|
-
init_git();
|
|
250
|
-
init_landing_gate();
|
|
251
|
-
init_landing_contract_gate();
|
|
252
|
-
init_worker_final_result_embed();
|
|
253
|
-
init_util();
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
// src/harness-worker-active.ts
|
|
258
|
-
var init_harness_worker_active = __esm({
|
|
259
|
-
"src/harness-worker-active.ts"() {
|
|
260
|
-
"use strict";
|
|
261
|
-
init_status();
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
// src/resource-gate.ts
|
|
266
|
-
var DEFAULT_PER_WORKER_MEM_BYTES, DEFAULT_MEM_RESERVE_BYTES;
|
|
267
|
-
var init_resource_gate = __esm({
|
|
268
|
-
"src/resource-gate.ts"() {
|
|
269
|
-
"use strict";
|
|
270
|
-
init_meminfo();
|
|
271
|
-
init_config();
|
|
272
|
-
init_box_identity();
|
|
273
|
-
init_worker_cap_source();
|
|
274
|
-
init_disk_gate();
|
|
275
|
-
init_run_store();
|
|
276
|
-
init_run_worker_index();
|
|
277
|
-
init_harness_worker_active();
|
|
278
|
-
init_util();
|
|
279
|
-
DEFAULT_PER_WORKER_MEM_BYTES = 500 * 1024 * 1024;
|
|
280
|
-
DEFAULT_MEM_RESERVE_BYTES = 4 * 1024 * 1024 * 1024;
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
// src/worker-cap-source.ts
|
|
285
|
-
var init_worker_cap_source = __esm({
|
|
286
|
-
"src/worker-cap-source.ts"() {
|
|
287
|
-
"use strict";
|
|
288
|
-
init_resource_gate();
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
// src/config.ts
|
|
293
|
-
import { homedir as homedir2, totalmem } from "node:os";
|
|
294
|
-
import path2 from "node:path";
|
|
295
|
-
var CONFIG_DIR, CONFIG_FILE, CREDENTIALS_FILE, SETUP_PER_WORKER_MEM_BYTES, SETUP_MEM_RESERVE_BYTES;
|
|
296
|
-
var init_config = __esm({
|
|
297
|
-
"src/config.ts"() {
|
|
298
|
-
"use strict";
|
|
299
|
-
init_default_repo_discovery();
|
|
300
|
-
init_path_values();
|
|
301
|
-
init_util();
|
|
302
|
-
init_box_identity();
|
|
303
|
-
init_worker_cap_source();
|
|
304
|
-
init_disk_gate();
|
|
305
|
-
CONFIG_DIR = path2.join(homedir2(), ".kynver");
|
|
306
|
-
CONFIG_FILE = path2.join(CONFIG_DIR, "config.json");
|
|
307
|
-
CREDENTIALS_FILE = path2.join(CONFIG_DIR, "credentials");
|
|
308
|
-
SETUP_PER_WORKER_MEM_BYTES = 500 * 1024 * 1024;
|
|
309
|
-
SETUP_MEM_RESERVE_BYTES = 4 * 1024 * 1024 * 1024;
|
|
310
|
-
}
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
// src/server/worker-policy.ts
|
|
314
|
-
init_worker_env();
|
|
315
|
-
|
|
316
|
-
// src/model-routing.ts
|
|
317
|
-
init_config();
|
|
318
|
-
|
|
319
|
-
// src/providers/claude.ts
|
|
320
|
-
init_worker_env();
|
|
321
|
-
init_util();
|
|
322
|
-
|
|
323
|
-
// src/providers/codex.ts
|
|
324
|
-
init_worker_env();
|
|
325
|
-
init_util();
|
|
326
|
-
|
|
327
|
-
// src/providers/hermes-codex.ts
|
|
328
|
-
init_worker_env();
|
|
329
|
-
init_util();
|
|
330
|
-
var HERMES_OPENAI_CODEX_DEFAULT_MODEL = process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim() || "gpt-5.4";
|
|
331
|
-
|
|
332
|
-
// src/providers/codex.ts
|
|
333
|
-
function resolveCodexDefaultModel() {
|
|
334
|
-
return process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim() || "gpt-5.4";
|
|
335
|
-
}
|
|
336
|
-
var CODEX_DEFAULT_MODEL = resolveCodexDefaultModel();
|
|
337
|
-
|
|
338
|
-
// src/model-routing.ts
|
|
339
|
-
var CURSOR_DEFAULT_MODEL = "composer-2.5";
|
|
340
|
-
|
|
341
|
-
// src/worker-provider-policy.ts
|
|
342
|
-
var DEFAULT_WORKER_PROVIDER = "cursor";
|
|
343
|
-
var CLAUDE_FAMILY = /* @__PURE__ */ new Set(["claude", "opus", "anthropic"]);
|
|
344
|
-
var TASK_OVERRIDE_MARKERS = [
|
|
345
|
-
/\[worker-provider:\s*claude\]/i,
|
|
346
|
-
/\[use-claude-worker\]/i,
|
|
347
|
-
/\[operator-worker-provider:\s*claude\]/i
|
|
348
|
-
];
|
|
349
|
-
function taskString(task, key) {
|
|
350
|
-
const v = task[key];
|
|
351
|
-
return typeof v === "string" ? v.trim() : "";
|
|
352
|
-
}
|
|
353
|
-
function isClaudeFamilyProvider(provider) {
|
|
354
|
-
if (!provider?.trim()) return false;
|
|
355
|
-
const normalized = provider.trim().toLowerCase();
|
|
356
|
-
if (CLAUDE_FAMILY.has(normalized)) return true;
|
|
357
|
-
return normalized.includes("claude") || normalized.includes("opus");
|
|
358
|
-
}
|
|
359
|
-
function taskAllowsClaudeWorker(task) {
|
|
360
|
-
if (!task) return false;
|
|
361
|
-
const override = task.workerProviderOverride;
|
|
362
|
-
if (typeof override === "string" && isClaudeFamilyProvider(override)) return true;
|
|
363
|
-
const ref = taskString(task, "executorRef").toLowerCase();
|
|
364
|
-
if (ref === "provider:claude" || ref.startsWith("provider:claude:")) return true;
|
|
365
|
-
if (ref.includes("claude-worker-override") || ref.includes("operator-claude")) return true;
|
|
366
|
-
const description = taskString(task, "description");
|
|
367
|
-
if (TASK_OVERRIDE_MARKERS.some((re) => re.test(description))) return true;
|
|
368
|
-
const title = taskString(task, "title");
|
|
369
|
-
if (/\[use-claude-worker\]/i.test(title)) return true;
|
|
370
|
-
return false;
|
|
371
|
-
}
|
|
372
|
-
function coerceCursorModel(model, ruleSuffix) {
|
|
373
|
-
const coerced = {
|
|
374
|
-
provider: DEFAULT_WORKER_PROVIDER,
|
|
375
|
-
model: CURSOR_DEFAULT_MODEL,
|
|
376
|
-
rule: `policy:cursor_default${ruleSuffix}`,
|
|
377
|
-
requestedModel: model
|
|
378
|
-
};
|
|
379
|
-
return coerced;
|
|
380
|
-
}
|
|
381
|
-
function enforceCursorWorkerProvider(input) {
|
|
382
|
-
const { routing, task } = input;
|
|
383
|
-
const explicit = input.explicitProvider?.trim().toLowerCase();
|
|
384
|
-
if (input.explicitProviderIsOperatorOverride && isClaudeFamilyProvider(explicit)) {
|
|
385
|
-
return {
|
|
386
|
-
...routing,
|
|
387
|
-
provider: "claude",
|
|
388
|
-
rule: routing.rule.startsWith("explicit:") ? routing.rule : "explicit:operator_provider"
|
|
389
|
-
};
|
|
390
|
-
}
|
|
391
|
-
if (taskAllowsClaudeWorker(task)) {
|
|
392
|
-
return routing;
|
|
393
|
-
}
|
|
394
|
-
if (routing.rule === "explicit:cli" && isClaudeFamilyProvider(routing.provider)) {
|
|
395
|
-
return routing;
|
|
396
|
-
}
|
|
397
|
-
if (!isClaudeFamilyProvider(routing.provider)) {
|
|
398
|
-
return routing;
|
|
399
|
-
}
|
|
400
|
-
const suffix = routing.rule && routing.rule !== "default:global" ? `:${routing.rule.replace(/:/g, "_")}` : "";
|
|
401
|
-
return coerceCursorModel(routing.model, suffix);
|
|
402
|
-
}
|
|
403
|
-
function resolveConfiguredWorkerProvider(configured, fallback = DEFAULT_WORKER_PROVIDER) {
|
|
404
|
-
const trimmed = configured?.trim();
|
|
405
|
-
if (!trimmed) return fallback;
|
|
406
|
-
if (isClaudeFamilyProvider(trimmed)) return DEFAULT_WORKER_PROVIDER;
|
|
407
|
-
if (trimmed === "codex") return "codex";
|
|
408
|
-
return trimmed;
|
|
409
|
-
}
|
|
410
|
-
function preferCursorExecutor(executors) {
|
|
411
|
-
const unique = [...new Set(executors.map((e) => e.trim().toLowerCase()).filter(Boolean))];
|
|
412
|
-
if (unique.includes(DEFAULT_WORKER_PROVIDER)) {
|
|
413
|
-
return [...new Set(unique.map((e) => isClaudeFamilyProvider(e) ? DEFAULT_WORKER_PROVIDER : e))];
|
|
414
|
-
}
|
|
415
|
-
if (unique.every((e) => isClaudeFamilyProvider(e))) {
|
|
416
|
-
return [DEFAULT_WORKER_PROVIDER];
|
|
417
|
-
}
|
|
418
|
-
return unique;
|
|
419
|
-
}
|
|
420
|
-
export {
|
|
421
|
-
DEFAULT_WORKER_PROVIDER,
|
|
422
|
-
auditWorkerEnv,
|
|
423
|
-
enforceCursorWorkerProvider,
|
|
424
|
-
isClaudeFamilyProvider,
|
|
425
|
-
isForbiddenWorkerEnvKey,
|
|
426
|
-
listForbiddenWorkerEnvKeys,
|
|
427
|
-
preferCursorExecutor,
|
|
428
|
-
resolveConfiguredWorkerProvider,
|
|
429
|
-
scrubWorkerEnv,
|
|
430
|
-
taskAllowsClaudeWorker
|
|
431
|
-
};
|
|
432
|
-
//# sourceMappingURL=worker-policy.js.map
|
|
1
|
+
var t=(r,e)=>()=>(r&&(e=r(r=0)),e);function h(r){return ee.has(r)?!0:re.some(e=>r.endsWith(e))}function O(r){return Object.keys(r).filter(h).sort()}function c(r){let e={...r};for(let n of Object.keys(e))h(n)&&delete e[n];return e}function te(r){let e=O(r);return{forbiddenPresent:e,safe:e.length===0}}var Z,ee,re,a=t(()=>{"use strict";Z=["ANTHROPIC_API_KEY","ANALYST_API_KEY","RECRUITER_API_KEY","AUTH_SECRET","NEXTAUTH_SECRET","DATABASE_URL","PRODUCTION_DATABASE_URL","KYNVER_PRODUCTION_DATABASE_URL","REDIS_URL","GOOGLE_CLIENT_SECRET","GITHUB_CLIENT_SECRET","KYNVER_API_KEY","KYNVER_SERVICE_SECRET","KYNVER_RUNTIME_SECRET","KYNVER_CRON_SECRET","OPENCLAW_CRON_SECRET","QSTASH_TOKEN","QSTASH_CURRENT_SIGNING_KEY","QSTASH_NEXT_SIGNING_KEY","TOOL_SECRETS_KEK","TOOL_EXECUTOR_DISPATCH_SECRET","CLOUDFLARE_API_TOKEN","STRIPE_SECRET_KEY","STRIPE_WEBHOOK_SECRET","STRIPE_IDENTITY_WEBHOOK_SECRET","VOYAGE_API_KEY","PERPLEXITY_API_KEY","FRED_API_KEY","FMP_API_KEY","CURSOR_API_KEY"],ee=new Set(Z),re=["_SECRET","_API_KEY"]});var o=t(()=>{"use strict"});var b=t(()=>{"use strict";o();a()});var u=t(()=>{"use strict"});var P=t(()=>{"use strict";b();u()});var k=t(()=>{"use strict"});var w=t(()=>{"use strict"});var De,Le,I=t(()=>{"use strict";De=25*1024*1024*1024,Le=12*1024*1024*1024});var Ye,Ge,R=t(()=>{"use strict";I();Ye=30*1024*1024*1024,Ge=15*1024*1024*1024});import{homedir as oe}from"node:os";import ie from"node:path";var Ze,B=t(()=>{"use strict";d();u();o();Ze=ie.join(oe(),".openclaw","harness")});var x=t(()=>{"use strict";B();o()});var T=t(()=>{"use strict";x();o()});var W=t(()=>{"use strict"});var M=t(()=>{"use strict";W();o()});var K=t(()=>{"use strict"});var U=t(()=>{"use strict";K()});var F=t(()=>{"use strict";U();o()});var D=t(()=>{"use strict"});var L=t(()=>{"use strict"});var $=t(()=>{"use strict"});var _=t(()=>{"use strict"});var H=t(()=>{"use strict";_()});var j=t(()=>{"use strict";M();F();D();L();b();$();H();_();o()});var Y=t(()=>{"use strict";j()});var de,me,G=t(()=>{"use strict";w();d();k();S();R();x();T();Y();o();de=500*1024*1024,me=4*1024*1024*1024});var S=t(()=>{"use strict";G()});import{homedir as fe,totalmem as Ft}from"node:os";import C from"node:path";var V,Vt,zt,Jt,qt,d=t(()=>{"use strict";P();u();o();k();S();R();V=C.join(fe(),".kynver"),Vt=C.join(V,"config.json"),zt=C.join(V,"credentials"),Jt=500*1024*1024,qt=4*1024*1024*1024});a();d();a();o();a();o();a();o();var Yn=process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim()||"gpt-5.4";function be(){return process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim()||"gpt-5.4"}var ke=be();var q="composer-2.5";var s="cursor",Re=new Set(["claude","opus","anthropic"]),ve=[/\[worker-provider:\s*claude\]/i,/\[use-claude-worker\]/i,/\[operator-worker-provider:\s*claude\]/i];function A(r,e){let n=r[e];return typeof n=="string"?n.trim():""}function i(r){if(!r?.trim())return!1;let e=r.trim().toLowerCase();return Re.has(e)?!0:e.includes("claude")||e.includes("opus")}function E(r){if(!r)return!1;let e=r.workerProviderOverride;if(typeof e=="string"&&i(e))return!0;let n=A(r,"executorRef").toLowerCase();if(n==="provider:claude"||n.startsWith("provider:claude:")||n.includes("claude-worker-override")||n.includes("operator-claude"))return!0;let p=A(r,"description");if(ve.some(Q=>Q.test(p)))return!0;let g=A(r,"title");return!!/\[use-claude-worker\]/i.test(g)}function xe(r,e){return{provider:s,model:q,rule:`policy:cursor_default${e}`,requestedModel:r}}function X(r){let{routing:e,task:n}=r,p=r.explicitProvider?.trim().toLowerCase();if(r.explicitProviderIsOperatorOverride&&i(p))return{...e,provider:"claude",rule:e.rule.startsWith("explicit:")?e.rule:"explicit:operator_provider"};if(E(n)||e.rule==="explicit:cli"&&i(e.provider)||!i(e.provider))return e;let g=e.rule&&e.rule!=="default:global"?`:${e.rule.replace(/:/g,"_")}`:"";return xe(e.model,g)}function _e(r,e=s){let n=r?.trim();return n?i(n)?s:n==="codex"?"codex":n:e}function Se(r){let e=[...new Set(r.map(n=>n.trim().toLowerCase()).filter(Boolean))];return e.includes(s)?[...new Set(e.map(n=>i(n)?s:n))]:e.every(n=>i(n))?[s]:e}export{s as DEFAULT_WORKER_PROVIDER,te as auditWorkerEnv,X as enforceCursorWorkerProvider,i as isClaudeFamilyProvider,h as isForbiddenWorkerEnvKey,O as listForbiddenWorkerEnvKeys,Se as preferCursorExecutor,_e as resolveConfiguredWorkerProvider,c as scrubWorkerEnv,E as taskAllowsClaudeWorker};
|