@ghyper9023/pi-dev-workflow 0.4.1 → 0.4.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/.pi-dev-output/pi-grill/answers/answer-mpfe77f1-20260521-1913.md +58 -0
- package/.pi-dev-output/pi-grill/answers/answer-mpfh37wu-20260521-2034.md +13 -0
- package/.pi-dev-output/pi-grill/answers/answer-mpfi5q4c-20260521-2104.md +13 -0
- package/.pi-dev-output/pi-grill/answers/answer-mpfizccb-20260521-2127.md +13 -0
- package/.pi-dev-output/pi-grill/answers/answer-mpfjk78k-20260521-2143.md +13 -0
- package/.pi-dev-output/pi-grill/questions/questions-mpfdz1tz-20260521-1907.json +94 -0
- package/.pi-dev-output/pi-plans/20260521-113000-fix-loopcount-timeout.md +215 -0
- package/.pi-dev-output/pi-plans/20260521-1730-grill-input-wrap-back-fix.md +240 -0
- package/.pi-dev-output/pi-plans/20260521-230000-fix-timeout-display-loopcount-gitdiff.md +253 -0
- package/.pi-dev-output/pi-plans/20260521-230500-esc-double-press-confirm-workflow.md +137 -0
- package/.pi-dev-output/pi-plans/20260521-235000-fix-gitdiff-loopcount.md +258 -0
- package/.pi-dev-output/pi-review/html/20260521-2305-review-workflow-index.html +196 -0
- package/.pi-dev-output/pi-review/md/review-20260520-100000.md +91 -0
- package/.pi-dev-output/pi-review/md/review-20260521-140000.md +191 -0
- package/.pi-dev-output/pi-review/md/review-20260521-190000.md +189 -0
- package/.pi-dev-output/pi-review/md/review-20260521-204500.md +241 -0
- package/.pi-dev-output/pi-review/md/review-20260521-214500.md +270 -0
- package/.pi-dev-output/pi-review/md/review-20260521-215158.md +214 -0
- package/.pi-dev-output/pi-review/md/review-20260521-234500.md +201 -0
- package/.pi-dev-output/pi-review/md/review-20260521-235500.md +422 -0
- package/.pi-dev-output/pi-review/md/review-20260522-000000.md +212 -0
- package/.pi-dev-output/pi-review/md/review-20260522-003000.md +377 -0
- package/.pi-dev-output/pi-review/md/review-20260522-003500.md +296 -0
- package/.pi-dev-output/pi-workflow/checkpoint-20260521-113000-fix-loopcount-timeout.json +402 -0
- package/.pi-dev-output/pi-workflow/checkpoint-20260521-1730-grill-input-wrap-back-fix.json +447 -0
- package/.pi-dev-output/pi-workflow/checkpoint-20260521-230000-fix-timeout-display-loopcount-gitdiff.json +708 -0
- package/.pi-dev-output/pi-workflow/checkpoint-20260521-230500-esc-double-press-confirm-workflow.json +365 -0
- package/.pi-dev-output/pi-workflow/checkpoint-20260521-235000-fix-gitdiff-loopcount.json +395 -0
- package/.pi-dev-output/pi-workflow/checkpoint-archive-mpfhyxc5.json +30 -0
- package/.pi-dev-output/pi-workflow/checkpoint-archive-mpfi2unc.json +49 -0
- package/.pi-dev-output/pi-workflow/checkpoint-archive-mpfi382e.json +59 -0
- package/.pi-dev-output/pi-workflow/checkpoint-archive-mpfi5r22.json +76 -0
- package/extensions/dev-prompts.ts +16 -8
- package/extensions/grill-me-agent.ts +23 -7
- package/extensions/ui-helpers.ts +59 -7
- package/extensions/workflow-engine.ts +80 -32
- package/package.json +1 -1
- package/tests/test-loopcount-timeout-fix.mjs +336 -0
- package/themes/oh-my-pi-titanium.json +90 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* test-loopcount-timeout-fix.mjs
|
|
3
|
+
*
|
|
4
|
+
* 测试 loopCount UI 同步、reviewer 独立超时、默认超时值修改
|
|
5
|
+
*
|
|
6
|
+
* 测试范围:
|
|
7
|
+
* 1. loopCount 在每次循环后通过 updateWidgetStep 同步到 widget
|
|
8
|
+
* 2. reviewer 使用 reviewTimeoutMs(独立超时)
|
|
9
|
+
* 3. 默认超时值 worker=30min (1_800_000), trimmer=20min (1_200_000), reviewer=15min (900_000)
|
|
10
|
+
* 4. loop-group 行不显示 timeoutMs(通过静态分析 updateWidgetStep 参数)
|
|
11
|
+
* 5. sub-step 在 runAgentWithProgress 中写入 detail(超时信息)
|
|
12
|
+
* 6. 回归:非 loop-group 步骤仍正常显示超时
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import * as fs from "node:fs";
|
|
16
|
+
import * as path from "node:path";
|
|
17
|
+
import { fileURLToPath } from "node:url";
|
|
18
|
+
|
|
19
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
const EXT_DIR = path.resolve(__dirname, "..", "extensions");
|
|
21
|
+
|
|
22
|
+
// ── Test helpers ──
|
|
23
|
+
|
|
24
|
+
let passed = 0;
|
|
25
|
+
let failed = 0;
|
|
26
|
+
const results = [];
|
|
27
|
+
|
|
28
|
+
function assert(label, condition, detail = "") {
|
|
29
|
+
if (condition) {
|
|
30
|
+
passed++;
|
|
31
|
+
results.push({ label, ok: true });
|
|
32
|
+
} else {
|
|
33
|
+
failed++;
|
|
34
|
+
results.push({ label, ok: false, detail });
|
|
35
|
+
console.error(` ❌ ${label}${detail ? " — " + detail : ""}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function assertIncludes(label, text, pattern, detail = "") {
|
|
40
|
+
assert(label, text.includes(pattern), detail);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function assertNotIncludes(label, text, pattern, detail = "") {
|
|
44
|
+
assert(label, !text.includes(pattern), detail);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ── Read source files ──
|
|
48
|
+
|
|
49
|
+
const weContent = fs.readFileSync(path.join(EXT_DIR, "workflow-engine.ts"), "utf8");
|
|
50
|
+
const dpContent = fs.readFileSync(path.join(EXT_DIR, "dev-prompts.ts"), "utf8");
|
|
51
|
+
const uhContent = fs.readFileSync(path.join(EXT_DIR, "ui-helpers.ts"), "utf8");
|
|
52
|
+
|
|
53
|
+
// ═══════════════════════════════════════════════════════════════
|
|
54
|
+
// Test 1: loopCount UI sync
|
|
55
|
+
// 验证 executeLoopGroup 中 loopCount++ 后调用 updateWidgetStep
|
|
56
|
+
// ═══════════════════════════════════════════════════════════════
|
|
57
|
+
|
|
58
|
+
console.log("\n📋 Test 1: loopCount UI 同步");
|
|
59
|
+
|
|
60
|
+
assertIncludes(
|
|
61
|
+
"1.1 executeLoopGroup 中有 loopCount++ 后立即更新 UI",
|
|
62
|
+
weContent,
|
|
63
|
+
"// 立即更新 UI 显示当前循环次数",
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
assertIncludes(
|
|
67
|
+
"1.2 updateWidgetStep 调用中传入 loopCount",
|
|
68
|
+
weContent,
|
|
69
|
+
"loopCount,",
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
assertIncludes(
|
|
73
|
+
"1.3 updateWidgetStep 调用中包含 loopCount 参数名",
|
|
74
|
+
weContent,
|
|
75
|
+
"loopCount,", // 在 extra 对象中
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
assertIncludes(
|
|
79
|
+
"1.4 updateWidgetStep 调用中包含 maxLoops",
|
|
80
|
+
weContent,
|
|
81
|
+
"maxLoops: step.maxLoops",
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
// ═══════════════════════════════════════════════════════════════
|
|
85
|
+
// Test 2: Reviewer 独立超时
|
|
86
|
+
// 验证 reviewer 使用 reviewTimeoutMs 而非 step.timeoutMs
|
|
87
|
+
// ═══════════════════════════════════════════════════════════════
|
|
88
|
+
|
|
89
|
+
console.log("\n📋 Test 2: Reviewer 独立超时");
|
|
90
|
+
|
|
91
|
+
assertIncludes(
|
|
92
|
+
"2.1 executeLoopGroup 中定义了 reviewTimeoutMs 变量",
|
|
93
|
+
weContent,
|
|
94
|
+
"const reviewTimeoutMs = step.reviewTimeoutMs ?? step.timeoutMs;",
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
assertIncludes(
|
|
98
|
+
"2.2 reviewer 的 runAgentWithProgress 使用 reviewTimeoutMs",
|
|
99
|
+
weContent,
|
|
100
|
+
"step.reviewAgentName!, reviewTimeoutMs);",
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
assert(
|
|
104
|
+
"2.3 reviewer 调用不再使用 step.timeoutMs",
|
|
105
|
+
!weContent.includes("step.reviewAgentName!, step.timeoutMs)"),
|
|
106
|
+
"reviewer 的 runAgentWithProgress 不应该使用 step.timeoutMs",
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
assertIncludes(
|
|
110
|
+
"2.4 Worker 仍使用 step.timeoutMs(未受 reviewer 变更影响)",
|
|
111
|
+
weContent,
|
|
112
|
+
"step.loopAgentName!, step.timeoutMs)",
|
|
113
|
+
"注意:worker 的 runAgentWithProgress 仍使用 step.timeoutMs",
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
// ═══════════════════════════════════════════════════════════════
|
|
117
|
+
// Test 3: 默认超时值验证(读取 dev-prompts.ts)
|
|
118
|
+
// ═══════════════════════════════════════════════════════════════
|
|
119
|
+
|
|
120
|
+
console.log("\n📋 Test 3: 默认超时值验证");
|
|
121
|
+
|
|
122
|
+
// Helper: extract all loop-group config blocks
|
|
123
|
+
function extractLoopGroups(source) {
|
|
124
|
+
const lines = source.split("\n");
|
|
125
|
+
const groups = [];
|
|
126
|
+
let currentBlock = null;
|
|
127
|
+
let braceDepth = 0;
|
|
128
|
+
|
|
129
|
+
for (const line of lines) {
|
|
130
|
+
if (line.includes("type: \"loop-group\"")) {
|
|
131
|
+
currentBlock = { start: lines.indexOf(line), lines: [line], loopAgent: "", reviewAgent: "", timeoutMs: 0, reviewTimeoutMs: 0 };
|
|
132
|
+
braceDepth = 0;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (currentBlock) {
|
|
136
|
+
currentBlock.lines.push(line);
|
|
137
|
+
if (line.includes("loopAgentName:")) {
|
|
138
|
+
const m = line.match(/loopAgentName:\s*"(\w+)"/);
|
|
139
|
+
if (m) currentBlock.loopAgent = m[1];
|
|
140
|
+
}
|
|
141
|
+
if (line.includes("reviewAgentName:")) {
|
|
142
|
+
const m = line.match(/reviewAgentName:\s*"(\w+)"/);
|
|
143
|
+
if (m) currentBlock.reviewAgent = m[1];
|
|
144
|
+
}
|
|
145
|
+
if (line.includes("timeoutMs:")) {
|
|
146
|
+
const m = line.match(/timeoutMs:\s*(\d[\d_]*)/);
|
|
147
|
+
if (m) currentBlock.timeoutMs = parseInt(m[1].replace(/_/g, ""), 10);
|
|
148
|
+
}
|
|
149
|
+
if (line.includes("reviewTimeoutMs:")) {
|
|
150
|
+
const m = line.match(/reviewTimeoutMs:\s*(\d[\d_]*)/);
|
|
151
|
+
if (m) currentBlock.reviewTimeoutMs = parseInt(m[1].replace(/_/g, ""), 10);
|
|
152
|
+
}
|
|
153
|
+
if (line.includes("},") || line.includes("} ;") || line.includes("};")) {
|
|
154
|
+
braceDepth++;
|
|
155
|
+
if (braceDepth >= 1) {
|
|
156
|
+
groups.push(currentBlock);
|
|
157
|
+
currentBlock = null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return groups;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const loopGroups = extractLoopGroups(dpContent);
|
|
166
|
+
|
|
167
|
+
assert("3.0 找到至少 6 个 loop-group 配置", loopGroups.length >= 6, `找到 ${loopGroups.length} 个`);
|
|
168
|
+
|
|
169
|
+
// worker 相关:timeoutMs 应为 1_800_000 (30min)
|
|
170
|
+
const workerGroups = loopGroups.filter(g => g.loopAgent === "worker");
|
|
171
|
+
for (const g of workerGroups) {
|
|
172
|
+
assert(
|
|
173
|
+
`3.1 Worker loop-group 超时=30min: ${g.loopAgent} → ${g.timeoutMs}`,
|
|
174
|
+
g.timeoutMs === 1_800_000,
|
|
175
|
+
`期望 1_800_000,实际 ${g.timeoutMs}`,
|
|
176
|
+
);
|
|
177
|
+
assert(
|
|
178
|
+
`3.2 Worker loop-group reviewTimeoutMs=15min: ${g.loopAgent} → ${g.reviewTimeoutMs}`,
|
|
179
|
+
g.reviewTimeoutMs === 900_000,
|
|
180
|
+
`期望 900_000,实际 ${g.reviewTimeoutMs}`,
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// trimmer 相关:timeoutMs 应为 1_200_000 (20min)
|
|
185
|
+
const trimmerGroups = loopGroups.filter(g => g.loopAgent === "trimmer");
|
|
186
|
+
for (const g of trimmerGroups) {
|
|
187
|
+
assert(
|
|
188
|
+
`3.3 Trimmer loop-group 超时=20min: ${g.loopAgent} → ${g.timeoutMs}`,
|
|
189
|
+
g.timeoutMs === 1_200_000,
|
|
190
|
+
`期望 1_200_000,实际 ${g.timeoutMs}`,
|
|
191
|
+
);
|
|
192
|
+
assert(
|
|
193
|
+
`3.4 Trimmer loop-group reviewTimeoutMs=15min: ${g.loopAgent} → ${g.reviewTimeoutMs}`,
|
|
194
|
+
g.reviewTimeoutMs === 900_000,
|
|
195
|
+
`期望 900_000,实际 ${g.reviewTimeoutMs}`,
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// 所有 loop-group 都应有 reviewTimeoutMs
|
|
200
|
+
for (const g of loopGroups) {
|
|
201
|
+
assert(
|
|
202
|
+
`3.5 ${g.loopAgent} loop-group 有 reviewTimeoutMs`,
|
|
203
|
+
g.reviewTimeoutMs > 0,
|
|
204
|
+
`缺少 reviewTimeoutMs`,
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// ═══════════════════════════════════════════════════════════════
|
|
209
|
+
// Test 4: loop-group 行不显示 timeout
|
|
210
|
+
// 验证 updateWidgetStep 对 loop-group 步骤不传 timeoutMs
|
|
211
|
+
// ═══════════════════════════════════════════════════════════════
|
|
212
|
+
|
|
213
|
+
console.log("\n📋 Test 4: loop-group 行不显示 timeout");
|
|
214
|
+
|
|
215
|
+
assertIncludes(
|
|
216
|
+
"4.1 loop-group running 状态不传 timeoutMs",
|
|
217
|
+
weContent,
|
|
218
|
+
'step.type === "loop-group" ? undefined : step.timeoutMs',
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
// ═══════════════════════════════════════════════════════════════
|
|
222
|
+
// Test 5: sub-step 显示 timeout
|
|
223
|
+
// 验证 runAgentWithProgress 在 sub-step 的 detail 中写入超时
|
|
224
|
+
// ═══════════════════════════════════════════════════════════════
|
|
225
|
+
|
|
226
|
+
console.log("\n📋 Test 5: sub-step 显示 timeout");
|
|
227
|
+
|
|
228
|
+
assertIncludes(
|
|
229
|
+
"5.1 runAgentWithProgress 在新建 sub-step 时写入 detail",
|
|
230
|
+
weContent,
|
|
231
|
+
"detail: `超时时间${formatTimeout(timeoutMs)}`",
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
assertIncludes(
|
|
235
|
+
"5.2 runAgentWithProgress 在复用 sub-step 时更新 detail",
|
|
236
|
+
weContent,
|
|
237
|
+
"existing.detail = `超时时间${formatTimeout(timeoutMs)}`;",
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
// ═══════════════════════════════════════════════════════════════
|
|
241
|
+
// Test 6: formatTimeout 已导出
|
|
242
|
+
// ═══════════════════════════════════════════════════════════════
|
|
243
|
+
|
|
244
|
+
console.log("\n📋 Test 6: formatTimeout 导出");
|
|
245
|
+
|
|
246
|
+
assertIncludes(
|
|
247
|
+
"6.1 formatTimeout 从 ui-helpers.ts 导出",
|
|
248
|
+
uhContent,
|
|
249
|
+
"export function formatTimeout",
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
assertIncludes(
|
|
253
|
+
"6.2 formatTimeout 被 workflow-engine.ts 导入",
|
|
254
|
+
weContent,
|
|
255
|
+
"formatTimeout,",
|
|
256
|
+
);
|
|
257
|
+
|
|
258
|
+
// ═══════════════════════════════════════════════════════════════
|
|
259
|
+
// Test 7: WorkflowStepDef 接口有 reviewTimeoutMs 字段
|
|
260
|
+
// ═══════════════════════════════════════════════════════════════
|
|
261
|
+
|
|
262
|
+
console.log("\n📋 Test 7: WorkflowStepDef 接口");
|
|
263
|
+
|
|
264
|
+
assertIncludes(
|
|
265
|
+
"7.1 WorkflowStepDef 有 reviewTimeoutMs 字段定义",
|
|
266
|
+
weContent,
|
|
267
|
+
"reviewTimeoutMs?: number;",
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
// ═══════════════════════════════════════════════════════════════
|
|
271
|
+
// Test 8: 回归测试 — 非 loop-group 功能不受影响
|
|
272
|
+
// ═══════════════════════════════════════════════════════════════
|
|
273
|
+
|
|
274
|
+
console.log("\n📋 Test 8: 回归测试");
|
|
275
|
+
|
|
276
|
+
assertIncludes(
|
|
277
|
+
"8.1 非 loop-group 步骤运行状态仍传 timeoutMs",
|
|
278
|
+
weContent,
|
|
279
|
+
"timeoutMs: step.type === \"loop-group\" ? undefined : step.timeoutMs,", // 对于非 loop-group 仍传
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
assertIncludes(
|
|
283
|
+
"8.2 非 loop-group 步骤 done 状态仍传 timeoutMs",
|
|
284
|
+
weContent,
|
|
285
|
+
"timeoutMs: step.type === \"loop-group\" ? undefined : step.timeoutMs,", // done 状态同样逻辑
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
// 验证 executeSingleStep 未受影响 — 它仍然传递超时给 runAgentWithProgress
|
|
289
|
+
if (weContent.includes("executeSingleStep")) {
|
|
290
|
+
assert(
|
|
291
|
+
"8.3 executeSingleStep 中仍传递 timeoutMs",
|
|
292
|
+
true,
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// ═══════════════════════════════════════════════════════════════
|
|
297
|
+
// Test 9: sub-step 重置 — 每次循环重置 sub-step 状态
|
|
298
|
+
// ═══════════════════════════════════════════════════════════════
|
|
299
|
+
|
|
300
|
+
console.log("\n📋 Test 9: sub-step 状态重置");
|
|
301
|
+
|
|
302
|
+
assertIncludes(
|
|
303
|
+
"9.1 每次循环开始时重置 sub-step 状态",
|
|
304
|
+
weContent,
|
|
305
|
+
"// 每次循环开始时重置 sub-step 状态",
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
assert(
|
|
309
|
+
"9.2 loopAgent sub-step 在循环开始被重置为 pending",
|
|
310
|
+
weContent.includes('setWidgetSubStepStatus(stepIndex, step.loopAgentName!, "pending")'),
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
assert(
|
|
314
|
+
"9.3 reviewAgent sub-step 在循环开始被重置为 pending",
|
|
315
|
+
weContent.includes('setWidgetSubStepStatus(stepIndex, step.reviewAgentName!, "pending")'),
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
// ═══════════════════════════════════════════════════════════════
|
|
319
|
+
// Summary
|
|
320
|
+
// ═══════════════════════════════════════════════════════════════
|
|
321
|
+
|
|
322
|
+
console.log("\n" + "═".repeat(60));
|
|
323
|
+
console.log(`结果: ${passed} 通过, ${failed} 失败, 共 ${passed + failed} 个测试`);
|
|
324
|
+
console.log("═".repeat(60));
|
|
325
|
+
|
|
326
|
+
if (failed > 0) {
|
|
327
|
+
console.error("\n⚠️ 部分测试未通过:");
|
|
328
|
+
for (const r of results) {
|
|
329
|
+
if (!r.ok) {
|
|
330
|
+
console.error(` ❌ ${r.label}${r.detail ? " — " + r.detail : ""}`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
process.exit(1);
|
|
334
|
+
} else {
|
|
335
|
+
console.log("\n✅ 全部通过");
|
|
336
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/can1357/oh-my-pi/main/packages/coding-agent/theme-schema.json",
|
|
3
|
+
"name": "titanium",
|
|
4
|
+
"vars": {
|
|
5
|
+
"brushedTitanium": "#151820",
|
|
6
|
+
"darkTitanium": "#0f1216",
|
|
7
|
+
"electricBlue": "#00b4ff",
|
|
8
|
+
"deepBlue": "#0082b3",
|
|
9
|
+
"titaniumGold": "#d4c090",
|
|
10
|
+
"brightAluminum": "#e8ecf4",
|
|
11
|
+
"dimAluminum": "#9ca3b0",
|
|
12
|
+
"warningAmber": "#ffb347",
|
|
13
|
+
"readoutGreen": "#00ff88",
|
|
14
|
+
"alertRed": "#ff4757",
|
|
15
|
+
"subtleGray": "#2a3038"
|
|
16
|
+
},
|
|
17
|
+
"colors": {
|
|
18
|
+
"accent": "electricBlue",
|
|
19
|
+
"border": "subtleGray",
|
|
20
|
+
"borderAccent": "electricBlue",
|
|
21
|
+
"borderMuted": "#1f252d",
|
|
22
|
+
"success": "readoutGreen",
|
|
23
|
+
"error": "alertRed",
|
|
24
|
+
"warning": "warningAmber",
|
|
25
|
+
"muted": "dimAluminum",
|
|
26
|
+
"dim": "#6b7280",
|
|
27
|
+
"text": "",
|
|
28
|
+
"thinkingText": "dimAluminum",
|
|
29
|
+
"selectedBg": "deepBlue",
|
|
30
|
+
"userMessageBg": "darkTitanium",
|
|
31
|
+
"userMessageText": "",
|
|
32
|
+
"customMessageBg": "subtleGray",
|
|
33
|
+
"customMessageText": "",
|
|
34
|
+
"customMessageLabel": "titaniumGold",
|
|
35
|
+
"toolPendingBg": "darkTitanium",
|
|
36
|
+
"toolSuccessBg": "darkTitanium",
|
|
37
|
+
"toolErrorBg": "#1a0f10",
|
|
38
|
+
"toolTitle": "",
|
|
39
|
+
"toolOutput": "dimAluminum",
|
|
40
|
+
"mdHeading": "electricBlue",
|
|
41
|
+
"mdLink": "electricBlue",
|
|
42
|
+
"mdLinkUrl": "deepBlue",
|
|
43
|
+
"mdCode": "readoutGreen",
|
|
44
|
+
"mdCodeBlock": "dimAluminum",
|
|
45
|
+
"mdCodeBlockBorder": "subtleGray",
|
|
46
|
+
"mdQuote": "dimAluminum",
|
|
47
|
+
"mdQuoteBorder": "subtleGray",
|
|
48
|
+
"mdHr": "subtleGray",
|
|
49
|
+
"mdListBullet": "electricBlue",
|
|
50
|
+
"toolDiffAdded": "readoutGreen",
|
|
51
|
+
"toolDiffRemoved": "alertRed",
|
|
52
|
+
"toolDiffContext": "dimAluminum",
|
|
53
|
+
"syntaxComment": "#6b7280",
|
|
54
|
+
"syntaxKeyword": "electricBlue",
|
|
55
|
+
"syntaxFunction": "readoutGreen",
|
|
56
|
+
"syntaxVariable": "brightAluminum",
|
|
57
|
+
"syntaxString": "titaniumGold",
|
|
58
|
+
"syntaxNumber": "warningAmber",
|
|
59
|
+
"syntaxType": "electricBlue",
|
|
60
|
+
"syntaxOperator": "electricBlue",
|
|
61
|
+
"syntaxPunctuation": "dimAluminum",
|
|
62
|
+
"thinkingOff": "#4a5058",
|
|
63
|
+
"thinkingMinimal": "#5a6068",
|
|
64
|
+
"thinkingLow": "#6a7078",
|
|
65
|
+
"thinkingMedium": "dimAluminum",
|
|
66
|
+
"thinkingHigh": "electricBlue",
|
|
67
|
+
"thinkingXhigh": "titaniumGold",
|
|
68
|
+
"bashMode": "readoutGreen",
|
|
69
|
+
"statusLineBg": "darkTitanium",
|
|
70
|
+
"statusLineSep": "subtleGray",
|
|
71
|
+
"statusLineModel": "electricBlue",
|
|
72
|
+
"statusLinePath": "brightAluminum",
|
|
73
|
+
"statusLineGitClean": "readoutGreen",
|
|
74
|
+
"statusLineGitDirty": "warningAmber",
|
|
75
|
+
"statusLineContext": "dimAluminum",
|
|
76
|
+
"statusLineSpend": "titaniumGold",
|
|
77
|
+
"statusLineStaged": "readoutGreen",
|
|
78
|
+
"statusLineDirty": "warningAmber",
|
|
79
|
+
"statusLineUntracked": "dimAluminum",
|
|
80
|
+
"statusLineOutput": "deepBlue",
|
|
81
|
+
"statusLineCost": "titaniumGold",
|
|
82
|
+
"statusLineSubagents": "electricBlue",
|
|
83
|
+
"pythonMode": "#f0c040"
|
|
84
|
+
},
|
|
85
|
+
"export": {
|
|
86
|
+
"pageBg": "brushedTitanium",
|
|
87
|
+
"cardBg": "darkTitanium",
|
|
88
|
+
"infoBg": "subtleGray"
|
|
89
|
+
}
|
|
90
|
+
}
|