flavor-code 1.4.2 → 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.
Files changed (74) hide show
  1. package/README.md +28 -1
  2. package/README.zh-CN.md +28 -1
  3. package/dist/{app-4CUS3GEJ.js → app-G35YBHPR.js} +593 -536
  4. package/dist/apply-WOW3QU5I.js +51 -0
  5. package/dist/broker-cli-X5H46FZV.js +15 -0
  6. package/dist/check-CSKTV4O2.js +16 -0
  7. package/dist/chunk-3563SW4X.js +10513 -0
  8. package/dist/chunk-3UX2CGDW.js +1955 -0
  9. package/dist/chunk-4TMLXZVZ.js +75 -0
  10. package/dist/chunk-6F66UXBI.js +48 -0
  11. package/dist/{chunk-KMBDK4SN.js → chunk-6URQ7FIF.js} +24 -88
  12. package/dist/chunk-6X62CGMA.js +193 -0
  13. package/dist/chunk-7Y64WNBB.js +8930 -0
  14. package/dist/chunk-AA4QNKTF.js +501 -0
  15. package/dist/chunk-BDX777JR.js +11 -0
  16. package/dist/chunk-CVP5OUHD.js +103 -0
  17. package/dist/chunk-EWD7FWTH.js +14547 -0
  18. package/dist/chunk-FAJ6YDZK.js +630 -0
  19. package/dist/{chunk-N5MXHJKD.js → chunk-GTFP2R5I.js} +1 -1
  20. package/dist/{chunk-7YFHRORG.js → chunk-HGTCIHWA.js} +383 -172
  21. package/dist/chunk-IDJAHEG6.js +43501 -0
  22. package/dist/chunk-IQEEFDEE.js +389 -0
  23. package/dist/chunk-IU3UBETC.js +30 -0
  24. package/dist/chunk-K7UGGWJV.js +1003 -0
  25. package/dist/chunk-KRWWCVXA.js +74 -0
  26. package/dist/chunk-OKHV7CTB.js +482 -0
  27. package/dist/chunk-PULWAH6E.js +474 -0
  28. package/dist/chunk-PZ5NKRVA.js +85 -0
  29. package/dist/chunk-RBAZLFKB.js +1022 -0
  30. package/dist/chunk-RV3EXUXM.js +30 -0
  31. package/dist/chunk-SJUIIHIA.js +2130 -0
  32. package/dist/{chunk-W2TIY6JY.js → chunk-T6RE76D2.js} +1993 -493
  33. package/dist/chunk-TIEOVQW6.js +61 -0
  34. package/dist/chunk-WLZUAVVU.js +15 -0
  35. package/dist/chunk-X442CJJH.js +114 -0
  36. package/dist/{chunk-RAYH6K2H.js → chunk-Y7EH4NVO.js} +1 -1
  37. package/dist/{chunk-S32JRDZK.js → chunk-ZKKVSR37.js} +6 -1
  38. package/dist/{claude-ink-VQU3C5UL.js → claude-ink-BE56DB6N.js} +9 -4
  39. package/dist/cli-3MF6EL2H.js +163 -0
  40. package/dist/cli-main.js +3805 -473
  41. package/dist/cli.js +50 -4
  42. package/dist/config/load.d.ts +8 -0
  43. package/dist/config/schema.d.ts +11 -0
  44. package/dist/context/manager.d.ts +2 -0
  45. package/dist/desktop/main.js +4299 -1150
  46. package/dist/desktop/preload.cjs +30 -0
  47. package/dist/desktop-renderer/assets/index-BWklSoOO.css +1 -0
  48. package/dist/desktop-renderer/assets/index-DCqIrF1S.js +153 -0
  49. package/dist/desktop-renderer/assets/{interactive-terminal-ouQQ3brz.js → interactive-terminal-B6GbpzIn.js} +1 -1
  50. package/dist/desktop-renderer/index.html +2 -2
  51. package/dist/doctor-OHCGK52S.js +20 -0
  52. package/dist/load-QK6CMLDF.js +25 -0
  53. package/dist/log-ATFIPRNU.js +19 -0
  54. package/dist/manager-5SI4MPES.js +191 -0
  55. package/dist/models/anthropic.d.ts +3 -0
  56. package/dist/node-LOIXT44J.js +879 -0
  57. package/dist/plugin-worker-entry.js +1 -1
  58. package/dist/production-6DIZ6YLQ.js +46 -0
  59. package/dist/production.d.ts +28 -1
  60. package/dist/project-3QXE22TG.js +11 -0
  61. package/dist/react-M6JGXSJZ.js +7 -0
  62. package/dist/recorder-FAGJJH3N.js +11 -0
  63. package/dist/sdk/index.js +30 -8
  64. package/dist/server-2KLKPHPL.js +11 -0
  65. package/dist/session/store.d.ts +1 -0
  66. package/dist/store-ZIHN6363.js +18 -0
  67. package/dist/usage-summary-G5FBOJLK.js +13 -0
  68. package/dist/write-stream-CGD57URC.js +77 -0
  69. package/package.json +1 -1
  70. package/dist/chunk-B23V72YR.js +0 -170
  71. package/dist/chunk-QKND3FX7.js +0 -26103
  72. package/dist/desktop-renderer/assets/index-Bk6FYhyh.css +0 -1
  73. package/dist/desktop-renderer/assets/index-CPXrzFgv.js +0 -154
  74. 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 = createRequire(import.meta.url);
2
+ import { createRequire as createFlavorRequire } from "node:module"; const require = createFlavorRequire(import.meta.url);
3
3
  import {
4
- message,
5
- redactErrorText,
6
- redactSecrets
7
- } from "./chunk-QKND3FX7.js";
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
- import { z } from "zod";
14
- var base = { id: z.string().min(1).max(128).optional() };
15
- var RpcCommandSchema = z.discriminatedUnion("type", [
16
- z.object({ ...base, type: z.literal("prompt"), message: z.string().trim().min(1).max(1e6) }).strict(),
17
- z.object({ ...base, type: z.literal("steer"), message: z.string().trim().min(1).max(1e6) }).strict(),
18
- z.object({ ...base, type: z.literal("follow_up"), message: z.string().trim().min(1).max(1e6) }).strict(),
19
- z.object({ ...base, type: z.literal("abort") }).strict(),
20
- z.object({ ...base, type: z.literal("get_state") }).strict(),
21
- z.object({ ...base, type: z.literal("get_queue") }).strict(),
22
- z.object({ ...base, type: z.literal("clear_queue") }).strict(),
23
- z.object({ ...base, type: z.literal("approval_decision"), approvalId: z.string().min(1).max(128), decision: z.enum(["once", "always", "deny"]) }).strict(),
24
- z.object({ ...base, type: z.literal("write_commit"), writeId: z.string().uuid() }).strict(),
25
- z.object({ ...base, type: z.literal("checkpoint"), label: z.string().trim().min(1).max(256).optional() }).strict(),
26
- z.object({ ...base, type: z.literal("get_tree") }).strict(),
27
- z.object({ ...base, type: z.literal("rewind"), nodeId: z.string().min(1).max(256) }).strict(),
28
- z.object({ ...base, type: z.literal("unrevert") }).strict(),
29
- z.object({ ...base, type: z.literal("fork"), nodeId: z.string().min(1).max(256) }).strict(),
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
+ };