flavor-code 1.4.1 → 1.4.3-beta.2
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 +32 -2
- package/README.zh-CN.md +32 -2
- package/dist/{app-4YRKE7VI.js → app-G35YBHPR.js} +873 -641
- package/dist/apply-WOW3QU5I.js +51 -0
- package/dist/broker-cli-X5H46FZV.js +15 -0
- package/dist/check-CSKTV4O2.js +16 -0
- package/dist/chunk-3563SW4X.js +10513 -0
- package/dist/chunk-3UX2CGDW.js +1955 -0
- package/dist/chunk-4TMLXZVZ.js +75 -0
- package/dist/chunk-6F66UXBI.js +48 -0
- package/dist/{chunk-FAORPP4F.js → chunk-6URQ7FIF.js} +24 -88
- package/dist/chunk-6X62CGMA.js +193 -0
- package/dist/chunk-7Y64WNBB.js +8930 -0
- package/dist/chunk-AA4QNKTF.js +501 -0
- package/dist/chunk-BDX777JR.js +11 -0
- package/dist/chunk-CVP5OUHD.js +103 -0
- package/dist/chunk-EWD7FWTH.js +14547 -0
- package/dist/chunk-FAJ6YDZK.js +630 -0
- package/dist/{chunk-N5MXHJKD.js → chunk-GTFP2R5I.js} +1 -1
- package/dist/{chunk-7YFHRORG.js → chunk-HGTCIHWA.js} +383 -172
- package/dist/chunk-IDJAHEG6.js +43501 -0
- package/dist/chunk-IQEEFDEE.js +389 -0
- package/dist/chunk-IU3UBETC.js +30 -0
- package/dist/chunk-K7UGGWJV.js +1003 -0
- package/dist/chunk-KRWWCVXA.js +74 -0
- package/dist/chunk-OKHV7CTB.js +482 -0
- package/dist/chunk-PULWAH6E.js +474 -0
- package/dist/chunk-PZ5NKRVA.js +85 -0
- package/dist/chunk-RBAZLFKB.js +1022 -0
- package/dist/chunk-RV3EXUXM.js +30 -0
- package/dist/chunk-SJUIIHIA.js +2130 -0
- package/dist/{chunk-VMQWXQEC.js → chunk-T6RE76D2.js} +2003 -493
- package/dist/chunk-TIEOVQW6.js +61 -0
- package/dist/chunk-WLZUAVVU.js +15 -0
- package/dist/chunk-X442CJJH.js +114 -0
- package/dist/{chunk-RAYH6K2H.js → chunk-Y7EH4NVO.js} +1 -1
- package/dist/{chunk-S32JRDZK.js → chunk-ZKKVSR37.js} +6 -1
- package/dist/{claude-ink-JZXNSAQS.js → claude-ink-BE56DB6N.js} +9 -4
- package/dist/cli-3MF6EL2H.js +163 -0
- package/dist/cli-main.js +3805 -473
- package/dist/cli.js +50 -4
- package/dist/config/load.d.ts +8 -0
- package/dist/config/schema.d.ts +11 -0
- package/dist/context/manager.d.ts +2 -0
- package/dist/desktop/main.js +4303 -1171
- package/dist/desktop/preload.cjs +30 -0
- package/dist/desktop-renderer/assets/index-BWklSoOO.css +1 -0
- package/dist/desktop-renderer/assets/index-DCqIrF1S.js +153 -0
- package/dist/desktop-renderer/assets/{interactive-terminal-1agnYY5L.js → interactive-terminal-B6GbpzIn.js} +1 -1
- package/dist/desktop-renderer/index.html +2 -2
- package/dist/doctor-OHCGK52S.js +20 -0
- package/dist/load-QK6CMLDF.js +25 -0
- package/dist/log-ATFIPRNU.js +19 -0
- package/dist/manager-5SI4MPES.js +191 -0
- package/dist/models/anthropic.d.ts +3 -0
- package/dist/node-LOIXT44J.js +879 -0
- package/dist/plugin-worker-entry.js +1 -1
- package/dist/production-6DIZ6YLQ.js +46 -0
- package/dist/production.d.ts +28 -1
- package/dist/project-3QXE22TG.js +11 -0
- package/dist/react-M6JGXSJZ.js +7 -0
- package/dist/recorder-FAGJJH3N.js +11 -0
- package/dist/sdk/index.js +30 -8
- package/dist/server-2KLKPHPL.js +11 -0
- package/dist/session/store.d.ts +1 -0
- package/dist/store-ZIHN6363.js +18 -0
- package/dist/ui/commands.d.ts +1 -5
- package/dist/usage-summary-G5FBOJLK.js +13 -0
- package/dist/utils/execFileNoThrow.d.ts +1 -0
- package/dist/write-stream-CGD57URC.js +77 -0
- package/package.json +1 -1
- package/dist/chunk-O2PC44GY.js +0 -26120
- package/dist/chunk-ZJCAQXA7.js +0 -169
- package/dist/desktop-renderer/assets/index-BM9ugkh9.js +0 -154
- package/dist/desktop-renderer/assets/index-Bk6FYhyh.css +0 -1
- package/dist/load-UPOG3XQR.js +0 -19
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as createFlavorRequire } from "node:module"; const require = createFlavorRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
redactErrorText,
|
|
5
|
+
redactSecrets
|
|
6
|
+
} from "./chunk-WLZUAVVU.js";
|
|
7
|
+
import {
|
|
8
|
+
external_exports
|
|
9
|
+
} from "./chunk-EWD7FWTH.js";
|
|
10
|
+
|
|
11
|
+
// src/trace/recorder.ts
|
|
12
|
+
import { mkdir, open } from "fs/promises";
|
|
13
|
+
import { dirname, resolve } from "path";
|
|
14
|
+
|
|
15
|
+
// src/trace/schema.ts
|
|
16
|
+
var TraceKindSchema = external_exports.enum(["command", "response", "output", "queue", "history", "verification"]);
|
|
17
|
+
var TraceRecordSchema = external_exports.object({
|
|
18
|
+
version: external_exports.literal(1),
|
|
19
|
+
sequence: external_exports.number().int().positive(),
|
|
20
|
+
timestamp: external_exports.string().datetime(),
|
|
21
|
+
sessionId: external_exports.string().min(1),
|
|
22
|
+
kind: TraceKindSchema,
|
|
23
|
+
payload: external_exports.unknown()
|
|
24
|
+
}).strict();
|
|
25
|
+
|
|
26
|
+
// src/trace/recorder.ts
|
|
27
|
+
var TraceRecorder = class {
|
|
28
|
+
path;
|
|
29
|
+
#sessionId;
|
|
30
|
+
#secrets;
|
|
31
|
+
#now;
|
|
32
|
+
#sequence = 0;
|
|
33
|
+
#handle;
|
|
34
|
+
#tail = Promise.resolve();
|
|
35
|
+
constructor(options) {
|
|
36
|
+
this.path = resolve(options.path);
|
|
37
|
+
this.#sessionId = options.sessionId;
|
|
38
|
+
this.#secrets = options.secrets ?? [];
|
|
39
|
+
this.#now = options.now ?? (() => /* @__PURE__ */ new Date());
|
|
40
|
+
}
|
|
41
|
+
record(kind, payload) {
|
|
42
|
+
const sequence = ++this.#sequence;
|
|
43
|
+
this.#tail = this.#tail.then(async () => {
|
|
44
|
+
const handle = await this.#file();
|
|
45
|
+
const serialized = redactErrorText(redactSecrets(JSON.stringify(payload) ?? "null", this.#secrets));
|
|
46
|
+
const record = TraceRecordSchema.parse({
|
|
47
|
+
version: 1,
|
|
48
|
+
sequence,
|
|
49
|
+
timestamp: this.#now().toISOString(),
|
|
50
|
+
sessionId: this.#sessionId,
|
|
51
|
+
kind,
|
|
52
|
+
payload: JSON.parse(serialized)
|
|
53
|
+
});
|
|
54
|
+
await handle.appendFile(`${JSON.stringify(record)}
|
|
55
|
+
`, "utf8");
|
|
56
|
+
});
|
|
57
|
+
return this.#tail;
|
|
58
|
+
}
|
|
59
|
+
async close() {
|
|
60
|
+
await this.#tail;
|
|
61
|
+
await this.#handle?.close();
|
|
62
|
+
this.#handle = void 0;
|
|
63
|
+
}
|
|
64
|
+
async #file() {
|
|
65
|
+
if (this.#handle !== void 0) return this.#handle;
|
|
66
|
+
await mkdir(dirname(this.path), { recursive: true });
|
|
67
|
+
this.#handle = await open(this.path, "a", 384);
|
|
68
|
+
return this.#handle;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export {
|
|
73
|
+
TraceRecordSchema,
|
|
74
|
+
TraceRecorder
|
|
75
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as createFlavorRequire } from "node:module"; const require = createFlavorRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
gt,
|
|
5
|
+
isValidVersion
|
|
6
|
+
} from "./chunk-3UX2CGDW.js";
|
|
7
|
+
|
|
8
|
+
// src/update/check.ts
|
|
9
|
+
var NPM_PACKAGE_NAME = "flavor-code";
|
|
10
|
+
var REGISTRY_LATEST_URL = `https://registry.npmjs.org/${NPM_PACKAGE_NAME}/latest`;
|
|
11
|
+
var DEFAULT_TIMEOUT_MS = 3e3;
|
|
12
|
+
function findNewerVersion(current, latest) {
|
|
13
|
+
if (!isValidVersion(current) || !isValidVersion(latest)) return void 0;
|
|
14
|
+
return gt(latest, current) ? latest : void 0;
|
|
15
|
+
}
|
|
16
|
+
async function fetchLatestVersion(options = {}) {
|
|
17
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
18
|
+
const fetchImpl = options.fetchImpl ?? ((url, init) => fetch(url, init));
|
|
19
|
+
let timer;
|
|
20
|
+
const timeout = new Promise((resolve) => {
|
|
21
|
+
timer = setTimeout(() => resolve(void 0), timeoutMs);
|
|
22
|
+
timer.unref?.();
|
|
23
|
+
});
|
|
24
|
+
try {
|
|
25
|
+
const response = await Promise.race([
|
|
26
|
+
fetchImpl(REGISTRY_LATEST_URL, { signal: AbortSignal.timeout(timeoutMs) }),
|
|
27
|
+
timeout
|
|
28
|
+
]);
|
|
29
|
+
if (response === void 0 || !response.ok) return void 0;
|
|
30
|
+
const body = await Promise.race([response.json(), timeout]);
|
|
31
|
+
return typeof body?.version === "string" ? body.version : void 0;
|
|
32
|
+
} catch {
|
|
33
|
+
return void 0;
|
|
34
|
+
} finally {
|
|
35
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function checkForUpdate(current, options = {}) {
|
|
39
|
+
const latest = await fetchLatestVersion(options);
|
|
40
|
+
return latest === void 0 ? void 0 : findNewerVersion(current, latest);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export {
|
|
44
|
+
NPM_PACKAGE_NAME,
|
|
45
|
+
findNewerVersion,
|
|
46
|
+
fetchLatestVersion,
|
|
47
|
+
checkForUpdate
|
|
48
|
+
};
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { createRequire } from "node:module"; const require =
|
|
2
|
+
import { createRequire as createFlavorRequire } from "node:module"; const require = createFlavorRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
|
-
message
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
message
|
|
5
|
+
} from "./chunk-BDX777JR.js";
|
|
6
|
+
import {
|
|
7
|
+
external_exports
|
|
8
|
+
} from "./chunk-EWD7FWTH.js";
|
|
8
9
|
|
|
9
10
|
// src/rpc/server.ts
|
|
10
11
|
import { createInterface } from "readline";
|
|
11
12
|
|
|
12
13
|
// src/rpc/schema.ts
|
|
13
|
-
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
z.object({ ...base, type: z.literal("shutdown") }).strict()
|
|
14
|
+
var base = { id: external_exports.string().min(1).max(128).optional() };
|
|
15
|
+
var RpcCommandSchema = external_exports.discriminatedUnion("type", [
|
|
16
|
+
external_exports.object({ ...base, type: external_exports.literal("prompt"), message: external_exports.string().trim().min(1).max(1e6) }).strict(),
|
|
17
|
+
external_exports.object({ ...base, type: external_exports.literal("steer"), message: external_exports.string().trim().min(1).max(1e6) }).strict(),
|
|
18
|
+
external_exports.object({ ...base, type: external_exports.literal("follow_up"), message: external_exports.string().trim().min(1).max(1e6) }).strict(),
|
|
19
|
+
external_exports.object({ ...base, type: external_exports.literal("abort") }).strict(),
|
|
20
|
+
external_exports.object({ ...base, type: external_exports.literal("get_state") }).strict(),
|
|
21
|
+
external_exports.object({ ...base, type: external_exports.literal("get_queue") }).strict(),
|
|
22
|
+
external_exports.object({ ...base, type: external_exports.literal("clear_queue") }).strict(),
|
|
23
|
+
external_exports.object({ ...base, type: external_exports.literal("approval_decision"), approvalId: external_exports.string().min(1).max(128), decision: external_exports.enum(["once", "always", "deny"]) }).strict(),
|
|
24
|
+
external_exports.object({ ...base, type: external_exports.literal("write_commit"), writeId: external_exports.string().uuid() }).strict(),
|
|
25
|
+
external_exports.object({ ...base, type: external_exports.literal("checkpoint"), label: external_exports.string().trim().min(1).max(256).optional() }).strict(),
|
|
26
|
+
external_exports.object({ ...base, type: external_exports.literal("get_tree") }).strict(),
|
|
27
|
+
external_exports.object({ ...base, type: external_exports.literal("rewind"), nodeId: external_exports.string().min(1).max(256) }).strict(),
|
|
28
|
+
external_exports.object({ ...base, type: external_exports.literal("unrevert") }).strict(),
|
|
29
|
+
external_exports.object({ ...base, type: external_exports.literal("fork"), nodeId: external_exports.string().min(1).max(256) }).strict(),
|
|
30
|
+
external_exports.object({ ...base, type: external_exports.literal("shutdown") }).strict()
|
|
31
31
|
]);
|
|
32
32
|
|
|
33
33
|
// src/rpc/server.ts
|
|
@@ -182,70 +182,6 @@ function required(service, name) {
|
|
|
182
182
|
return service;
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
-
// src/trace/recorder.ts
|
|
186
|
-
import { mkdir, open } from "fs/promises";
|
|
187
|
-
import { dirname, resolve } from "path";
|
|
188
|
-
|
|
189
|
-
// src/trace/schema.ts
|
|
190
|
-
import { z as z2 } from "zod";
|
|
191
|
-
var TraceKindSchema = z2.enum(["command", "response", "output", "queue", "history", "verification"]);
|
|
192
|
-
var TraceRecordSchema = z2.object({
|
|
193
|
-
version: z2.literal(1),
|
|
194
|
-
sequence: z2.number().int().positive(),
|
|
195
|
-
timestamp: z2.string().datetime(),
|
|
196
|
-
sessionId: z2.string().min(1),
|
|
197
|
-
kind: TraceKindSchema,
|
|
198
|
-
payload: z2.unknown()
|
|
199
|
-
}).strict();
|
|
200
|
-
|
|
201
|
-
// src/trace/recorder.ts
|
|
202
|
-
var TraceRecorder = class {
|
|
203
|
-
path;
|
|
204
|
-
#sessionId;
|
|
205
|
-
#secrets;
|
|
206
|
-
#now;
|
|
207
|
-
#sequence = 0;
|
|
208
|
-
#handle;
|
|
209
|
-
#tail = Promise.resolve();
|
|
210
|
-
constructor(options) {
|
|
211
|
-
this.path = resolve(options.path);
|
|
212
|
-
this.#sessionId = options.sessionId;
|
|
213
|
-
this.#secrets = options.secrets ?? [];
|
|
214
|
-
this.#now = options.now ?? (() => /* @__PURE__ */ new Date());
|
|
215
|
-
}
|
|
216
|
-
record(kind, payload) {
|
|
217
|
-
const sequence = ++this.#sequence;
|
|
218
|
-
this.#tail = this.#tail.then(async () => {
|
|
219
|
-
const handle = await this.#file();
|
|
220
|
-
const serialized = redactErrorText(redactSecrets(JSON.stringify(payload) ?? "null", this.#secrets));
|
|
221
|
-
const record = TraceRecordSchema.parse({
|
|
222
|
-
version: 1,
|
|
223
|
-
sequence,
|
|
224
|
-
timestamp: this.#now().toISOString(),
|
|
225
|
-
sessionId: this.#sessionId,
|
|
226
|
-
kind,
|
|
227
|
-
payload: JSON.parse(serialized)
|
|
228
|
-
});
|
|
229
|
-
await handle.appendFile(`${JSON.stringify(record)}
|
|
230
|
-
`, "utf8");
|
|
231
|
-
});
|
|
232
|
-
return this.#tail;
|
|
233
|
-
}
|
|
234
|
-
async close() {
|
|
235
|
-
await this.#tail;
|
|
236
|
-
await this.#handle?.close();
|
|
237
|
-
this.#handle = void 0;
|
|
238
|
-
}
|
|
239
|
-
async #file() {
|
|
240
|
-
if (this.#handle !== void 0) return this.#handle;
|
|
241
|
-
await mkdir(dirname(this.path), { recursive: true });
|
|
242
|
-
this.#handle = await open(this.path, "a", 384);
|
|
243
|
-
return this.#handle;
|
|
244
|
-
}
|
|
245
|
-
};
|
|
246
|
-
|
|
247
185
|
export {
|
|
248
|
-
FlavorRpcServer
|
|
249
|
-
TraceRecordSchema,
|
|
250
|
-
TraceRecorder
|
|
186
|
+
FlavorRpcServer
|
|
251
187
|
};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as createFlavorRequire } from "node:module"; const require = createFlavorRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
external_exports
|
|
5
|
+
} from "./chunk-EWD7FWTH.js";
|
|
6
|
+
|
|
7
|
+
// src/config/schema.ts
|
|
8
|
+
var PERMISSION_MODES = [
|
|
9
|
+
"default",
|
|
10
|
+
"acceptEdits",
|
|
11
|
+
"plan",
|
|
12
|
+
"bypassPermissions",
|
|
13
|
+
"auto",
|
|
14
|
+
"bubble"
|
|
15
|
+
];
|
|
16
|
+
function normalizePermissionMode(value) {
|
|
17
|
+
if (value === "safe" || value === "workspace") return "default";
|
|
18
|
+
if (value === "full") return "bypassPermissions";
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
var PermissionModeSchema = external_exports.preprocess(
|
|
22
|
+
normalizePermissionMode,
|
|
23
|
+
external_exports.enum(PERMISSION_MODES).default("default")
|
|
24
|
+
);
|
|
25
|
+
var ProviderConfigSchema = external_exports.object({
|
|
26
|
+
type: external_exports.string(),
|
|
27
|
+
baseURL: external_exports.string().url().optional(),
|
|
28
|
+
apiKey: external_exports.string().optional(),
|
|
29
|
+
defaultModel: external_exports.string().min(1).optional(),
|
|
30
|
+
cheapModel: external_exports.string().min(1).optional(),
|
|
31
|
+
models: external_exports.array(external_exports.string().min(1)).max(100).optional(),
|
|
32
|
+
maxOutputTokens: external_exports.number().int().positive().optional(),
|
|
33
|
+
// Extended-thinking budget in output tokens for the Anthropic protocol.
|
|
34
|
+
// Defaults to DEFAULT_THINKING_BUDGET; set to 0 to disable the request
|
|
35
|
+
// parameter. Provider thinking deltas are forwarded whenever they arrive.
|
|
36
|
+
thinkingBudget: external_exports.number().int().min(0).optional(),
|
|
37
|
+
// Anthropic explicit prompt-cache lifetime. Omitted keeps the broadly
|
|
38
|
+
// compatible provider default (5 minutes); 1h trades higher writes for
|
|
39
|
+
// better reuse across longer pauses.
|
|
40
|
+
cacheTtl: external_exports.enum(["5m", "1h"]).optional(),
|
|
41
|
+
// Reasoning effort requested from the OpenAI Responses protocol (sent as
|
|
42
|
+
// reasoning.effort). The adapter defaults an omitted value to high.
|
|
43
|
+
thinkingEffort: external_exports.enum(["minimal", "low", "medium", "high", "xhigh", "ultra"]).optional(),
|
|
44
|
+
// Send the Claude Code client fingerprint (User-Agent/x-app) with Anthropic requests,
|
|
45
|
+
// for gateways that restrict the Anthropic protocol to Claude clients.
|
|
46
|
+
claudeClient: external_exports.boolean().optional(),
|
|
47
|
+
// OAuth PKCE fields
|
|
48
|
+
apiType: external_exports.enum(["openai", "anthropic"]).optional(),
|
|
49
|
+
authorizationUrl: external_exports.string().url().optional(),
|
|
50
|
+
tokenUrl: external_exports.string().url().optional(),
|
|
51
|
+
clientId: external_exports.string().min(1).optional(),
|
|
52
|
+
scope: external_exports.string().optional()
|
|
53
|
+
});
|
|
54
|
+
var McpServerCommonShape = {
|
|
55
|
+
disabled: external_exports.boolean().default(false),
|
|
56
|
+
timeoutMs: external_exports.number().int().min(100).max(30 * 6e4).default(6e4)
|
|
57
|
+
};
|
|
58
|
+
var McpStdioServerConfigSchema = external_exports.object({
|
|
59
|
+
command: external_exports.string().min(1),
|
|
60
|
+
args: external_exports.array(external_exports.string()).default([]),
|
|
61
|
+
env: external_exports.record(external_exports.string(), external_exports.string()).default({}),
|
|
62
|
+
cwd: external_exports.string().min(1).optional(),
|
|
63
|
+
...McpServerCommonShape
|
|
64
|
+
}).strict();
|
|
65
|
+
var McpHttpServerConfigSchema = external_exports.object({
|
|
66
|
+
url: external_exports.string().url().refine((value) => {
|
|
67
|
+
const protocol = new URL(value).protocol;
|
|
68
|
+
return protocol === "http:" || protocol === "https:";
|
|
69
|
+
}, "MCP HTTP URLs must use http or https"),
|
|
70
|
+
headers: external_exports.record(external_exports.string(), external_exports.string()).default({}),
|
|
71
|
+
...McpServerCommonShape
|
|
72
|
+
}).strict();
|
|
73
|
+
var McpServerConfigSchema = external_exports.union([
|
|
74
|
+
McpStdioServerConfigSchema,
|
|
75
|
+
McpHttpServerConfigSchema
|
|
76
|
+
]);
|
|
77
|
+
var McpServerNameSchema = external_exports.string().min(1).max(32).regex(/^[A-Za-z0-9_-]+$/, "MCP server names may contain only letters, digits, underscores, and hyphens");
|
|
78
|
+
var SkillNameSchema = external_exports.string().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, "Skill names must use lowercase letters, digits, and single hyphens");
|
|
79
|
+
var FlavorConfigSchema = external_exports.object({
|
|
80
|
+
sleep: external_exports.boolean().default(false),
|
|
81
|
+
providers: external_exports.record(external_exports.string(), ProviderConfigSchema).default({}),
|
|
82
|
+
mcpServers: external_exports.record(McpServerNameSchema, McpServerConfigSchema).default({}),
|
|
83
|
+
skills: external_exports.object({
|
|
84
|
+
disabled: external_exports.array(SkillNameSchema).max(1e3).default([])
|
|
85
|
+
}).prefault({}),
|
|
86
|
+
agents: external_exports.object({
|
|
87
|
+
main: external_exports.object({ model: external_exports.string() }).optional(),
|
|
88
|
+
subagent: external_exports.object({ model: external_exports.string() }).optional()
|
|
89
|
+
}).optional(),
|
|
90
|
+
maxSubagents: external_exports.number().int().min(1).max(16).default(3),
|
|
91
|
+
maxSessions: external_exports.number().int().min(1).max(1e3).default(50),
|
|
92
|
+
memory: external_exports.object({
|
|
93
|
+
enabled: external_exports.boolean().default(true),
|
|
94
|
+
autoExtract: external_exports.boolean().default(true),
|
|
95
|
+
autoExtractMinChars: external_exports.number().int().min(200).max(1e5).default(200),
|
|
96
|
+
scoreThreshold: external_exports.number().int().min(0).max(12).default(9),
|
|
97
|
+
autoStoreThreshold: external_exports.number().int().min(0).max(12).default(11),
|
|
98
|
+
ignoreStreakLimit: external_exports.number().int().min(2).max(100).default(5),
|
|
99
|
+
reviewAutoDismissSeconds: external_exports.number().int().min(0).max(300).default(5),
|
|
100
|
+
// One candidate per task is a deliberate memory-quality boundary, not a tunable range.
|
|
101
|
+
maxCandidatesPerTask: external_exports.literal(1).default(1),
|
|
102
|
+
retrievalTopK: external_exports.number().int().min(1).max(20).default(5),
|
|
103
|
+
maxEntries: external_exports.number().int().min(1).max(1e4).default(200),
|
|
104
|
+
maxEntryChars: external_exports.number().int().min(32).max(2e4).default(1e3),
|
|
105
|
+
maxPromptChars: external_exports.number().int().min(256).max(2e5).default(12e3)
|
|
106
|
+
}).prefault({}),
|
|
107
|
+
permissionMode: PermissionModeSchema,
|
|
108
|
+
execution: external_exports.object({
|
|
109
|
+
mode: external_exports.enum(["local", "docker"]).default("local"),
|
|
110
|
+
image: external_exports.string().trim().min(1).default("node:24-bookworm-slim"),
|
|
111
|
+
network: external_exports.boolean().default(false),
|
|
112
|
+
memory: external_exports.string().regex(/^[1-9][0-9]*(?:[kKmMgG])?$/).default("2g"),
|
|
113
|
+
cpus: external_exports.number().positive().max(64).default(2)
|
|
114
|
+
}).prefault({}),
|
|
115
|
+
language: external_exports.string().regex(/^[a-z]{2}(-[A-Z]{2})?$/, "language must be a BCP47 tag like zh-CN or en-US").optional(),
|
|
116
|
+
hallucination: external_exports.object({
|
|
117
|
+
showWarnings: external_exports.boolean().default(false),
|
|
118
|
+
evaluationTimeoutMs: external_exports.number().int().min(100).max(3e4).default(2e3)
|
|
119
|
+
}).prefault({}),
|
|
120
|
+
maxIterations: external_exports.object({
|
|
121
|
+
main: external_exports.number().int().min(10).max(500).default(300),
|
|
122
|
+
subagent: external_exports.number().int().min(10).max(200).default(100),
|
|
123
|
+
softLimitFactor: external_exports.number().min(0.5).max(1).default(0.8),
|
|
124
|
+
extendBy: external_exports.number().int().min(5).max(100).default(50)
|
|
125
|
+
}).prefault({}),
|
|
126
|
+
loop: external_exports.object({
|
|
127
|
+
maxCycles: external_exports.number().int().positive().max(1e4).default(100),
|
|
128
|
+
maxTokens: external_exports.number().int().positive().max(Number.MAX_SAFE_INTEGER).default(5e5),
|
|
129
|
+
isolation: external_exports.literal("auto").default("auto")
|
|
130
|
+
}).prefault({}),
|
|
131
|
+
goal: external_exports.object({
|
|
132
|
+
maxRounds: external_exports.number().int().positive().max(1e4).default(100),
|
|
133
|
+
maxStallStreak: external_exports.number().int().positive().max(100).default(3)
|
|
134
|
+
}).prefault({}),
|
|
135
|
+
context: external_exports.object({
|
|
136
|
+
windowTokens: external_exports.number().int().positive().default(2e5),
|
|
137
|
+
reservedOutputTokens: external_exports.number().int().nonnegative().default(2e4),
|
|
138
|
+
autoCompactBufferTokens: external_exports.number().int().nonnegative().default(27e3),
|
|
139
|
+
warningBufferTokens: external_exports.number().int().nonnegative().default(2e4),
|
|
140
|
+
blockingBufferTokens: external_exports.number().int().nonnegative().default(3e3),
|
|
141
|
+
microcompactKeepRecentToolResults: external_exports.number().int().nonnegative().default(5),
|
|
142
|
+
recentTokens: external_exports.number().int().nonnegative().default(1e4),
|
|
143
|
+
recentTextMessages: external_exports.number().int().nonnegative().default(5),
|
|
144
|
+
maxRecentTokens: external_exports.number().int().nonnegative().default(4e4),
|
|
145
|
+
/** @deprecated Character threshold retained for configuration compatibility. */
|
|
146
|
+
compactAtChars: external_exports.number().int().positive().optional(),
|
|
147
|
+
toolOutputChars: external_exports.number().int().positive().default(3e4)
|
|
148
|
+
}).superRefine((context, issue) => {
|
|
149
|
+
if (context.reservedOutputTokens >= context.windowTokens) issue.addIssue({
|
|
150
|
+
code: "custom",
|
|
151
|
+
path: ["reservedOutputTokens"],
|
|
152
|
+
message: "reservedOutputTokens must be below windowTokens"
|
|
153
|
+
});
|
|
154
|
+
if (context.maxRecentTokens < context.recentTokens) issue.addIssue({
|
|
155
|
+
code: "custom",
|
|
156
|
+
path: ["maxRecentTokens"],
|
|
157
|
+
message: "maxRecentTokens must be at least recentTokens"
|
|
158
|
+
});
|
|
159
|
+
}).prefault({}),
|
|
160
|
+
incidents: external_exports.object({
|
|
161
|
+
enabled: external_exports.boolean().default(false),
|
|
162
|
+
webhookUrl: external_exports.string().url().optional()
|
|
163
|
+
}).prefault({}),
|
|
164
|
+
evolve: external_exports.object({
|
|
165
|
+
promptTop: external_exports.number().int().min(1).max(10).default(3),
|
|
166
|
+
minRepeats: external_exports.number().int().min(2).max(100).default(2),
|
|
167
|
+
testCommand: external_exports.string().trim().min(1).default("npm test"),
|
|
168
|
+
testTimeoutMs: external_exports.number().int().min(1e3).max(6e5).default(12e4)
|
|
169
|
+
}).prefault({})
|
|
170
|
+
});
|
|
171
|
+
var CONFIG_TOP_LEVEL_KEYS = Object.keys(FlavorConfigSchema.shape);
|
|
172
|
+
function configPathSegments(key) {
|
|
173
|
+
const segments = key.split(".");
|
|
174
|
+
if (segments.length === 0 || segments.some((segment) => segment.length === 0)) {
|
|
175
|
+
throw new Error(`Invalid configuration key: "${key}". Use dot notation like "maxSessions" or "context.windowTokens".`);
|
|
176
|
+
}
|
|
177
|
+
if (!CONFIG_TOP_LEVEL_KEYS.includes(segments[0])) {
|
|
178
|
+
throw new Error(`Unknown configuration key: "${segments[0]}". Known keys: ${CONFIG_TOP_LEVEL_KEYS.join(", ")}.`);
|
|
179
|
+
}
|
|
180
|
+
return segments;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export {
|
|
184
|
+
PERMISSION_MODES,
|
|
185
|
+
normalizePermissionMode,
|
|
186
|
+
PermissionModeSchema,
|
|
187
|
+
ProviderConfigSchema,
|
|
188
|
+
McpServerConfigSchema,
|
|
189
|
+
McpServerNameSchema,
|
|
190
|
+
SkillNameSchema,
|
|
191
|
+
FlavorConfigSchema,
|
|
192
|
+
configPathSegments
|
|
193
|
+
};
|