infinity-harness 2.8.9 → 2.8.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/extensions/infinity-harness/index.js +3614 -0
- package/dist/extensions/infinity-harness/index.js.map +1 -0
- package/dist/src/approval.js +154 -0
- package/dist/src/approval.js.map +1 -0
- package/dist/src/core/brief.js +309 -0
- package/dist/src/core/brief.js.map +1 -0
- package/dist/src/core/config.js +539 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/exec.js +106 -0
- package/dist/src/core/exec.js.map +1 -0
- package/dist/src/core/featureList.js +365 -0
- package/dist/src/core/featureList.js.map +1 -0
- package/dist/src/core/fsx.js +123 -0
- package/dist/src/core/fsx.js.map +1 -0
- package/dist/src/core/gates.js +490 -0
- package/dist/src/core/gates.js.map +1 -0
- package/dist/src/core/init.js +480 -0
- package/dist/src/core/init.js.map +1 -0
- package/dist/src/core/lock.js +183 -0
- package/dist/src/core/lock.js.map +1 -0
- package/dist/src/core/modelRouter.js +185 -0
- package/dist/src/core/modelRouter.js.map +1 -0
- package/dist/src/core/paths.js +129 -0
- package/dist/src/core/paths.js.map +1 -0
- package/dist/src/core/phases.js +254 -0
- package/dist/src/core/phases.js.map +1 -0
- package/dist/src/core/plan.js +15 -0
- package/dist/src/core/plan.js.map +1 -0
- package/dist/src/core/runState.js +126 -0
- package/dist/src/core/runState.js.map +1 -0
- package/dist/src/core/settings.js +877 -0
- package/dist/src/core/settings.js.map +1 -0
- package/dist/src/core/skills.js +319 -0
- package/dist/src/core/skills.js.map +1 -0
- package/dist/src/core/skillsAudit.js +194 -0
- package/dist/src/core/skillsAudit.js.map +1 -0
- package/dist/src/core/types.js +77 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/daemon/budget.js +85 -0
- package/dist/src/daemon/budget.js.map +1 -0
- package/dist/src/daemon/guard.js +122 -0
- package/dist/src/daemon/guard.js.map +1 -0
- package/dist/src/daemon/index.js +461 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/isolation.js +84 -0
- package/dist/src/daemon/isolation.js.map +1 -0
- package/dist/src/daemon/preflight.js +131 -0
- package/dist/src/daemon/preflight.js.map +1 -0
- package/dist/src/daemon/server.js +174 -0
- package/dist/src/daemon/server.js.map +1 -0
- package/dist/src/daemon/supervisorState.js +42 -0
- package/dist/src/daemon/supervisorState.js.map +1 -0
- package/dist/src/daemon/worker.js +239 -0
- package/dist/src/daemon/worker.js.map +1 -0
- package/dist/src/daemon/worktree.js +102 -0
- package/dist/src/daemon/worktree.js.map +1 -0
- package/dist/src/escalate.js +312 -0
- package/dist/src/escalate.js.map +1 -0
- package/dist/src/exec/piWorker.js +630 -0
- package/dist/src/exec/piWorker.js.map +1 -0
- package/dist/src/goal.js +317 -0
- package/dist/src/goal.js.map +1 -0
- package/dist/src/goalLoop.js +374 -0
- package/dist/src/goalLoop.js.map +1 -0
- package/dist/src/goalSpec.js +397 -0
- package/dist/src/goalSpec.js.map +1 -0
- package/dist/src/goalState.js +255 -0
- package/dist/src/goalState.js.map +1 -0
- package/dist/src/handoff.js +205 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/intake.js +203 -0
- package/dist/src/intake.js.map +1 -0
- package/dist/src/loop.js +592 -0
- package/dist/src/loop.js.map +1 -0
- package/dist/src/modelRouter.js +216 -0
- package/dist/src/modelRouter.js.map +1 -0
- package/dist/src/remote.js +246 -0
- package/dist/src/remote.js.map +1 -0
- package/dist/src/replan.js +262 -0
- package/dist/src/replan.js.map +1 -0
- package/dist/src/review.js +54 -0
- package/dist/src/review.js.map +1 -0
- package/dist/src/rework.js +241 -0
- package/dist/src/rework.js.map +1 -0
- package/dist/src/runState.js +4 -0
- package/dist/src/runState.js.map +1 -0
- package/dist/src/scheduler.js +270 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/supervisor.js +787 -0
- package/dist/src/supervisor.js.map +1 -0
- package/dist/src/taskList.js +430 -0
- package/dist/src/taskList.js.map +1 -0
- package/dist/src/ui/config.js +268 -0
- package/dist/src/ui/config.js.map +1 -0
- package/dist/src/ui/dashboard.js +1288 -0
- package/dist/src/ui/dashboard.js.map +1 -0
- package/dist/src/ui/display.js +229 -0
- package/dist/src/ui/display.js.map +1 -0
- package/dist/src/ui/planTree.js +219 -0
- package/dist/src/ui/planTree.js.map +1 -0
- package/dist/src/ui/theme.js +298 -0
- package/dist/src/ui/theme.js.map +1 -0
- package/dist/src/ui/viewState.js +65 -0
- package/dist/src/ui/viewState.js.map +1 -0
- package/dist/src/ui/widget.js +721 -0
- package/dist/src/ui/widget.js.map +1 -0
- package/dist/src/ui/wizard.js +540 -0
- package/dist/src/ui/wizard.js.map +1 -0
- package/dist/src/unstuck.js +210 -0
- package/dist/src/unstuck.js.map +1 -0
- package/dist/src/worker.js +267 -0
- package/dist/src/worker.js.map +1 -0
- package/dist/src/workflow.js +250 -0
- package/dist/src/workflow.js.map +1 -0
- package/dist/tests/approval.test.js +144 -0
- package/dist/tests/approval.test.js.map +1 -0
- package/dist/tests/brief.test.js +271 -0
- package/dist/tests/brief.test.js.map +1 -0
- package/dist/tests/config.test.js +320 -0
- package/dist/tests/config.test.js.map +1 -0
- package/dist/tests/dashboard.test.js +277 -0
- package/dist/tests/dashboard.test.js.map +1 -0
- package/dist/tests/display.test.js +229 -0
- package/dist/tests/display.test.js.map +1 -0
- package/dist/tests/escalate.test.js +272 -0
- package/dist/tests/escalate.test.js.map +1 -0
- package/dist/tests/featureList.test.js +429 -0
- package/dist/tests/featureList.test.js.map +1 -0
- package/dist/tests/gates.test.js +333 -0
- package/dist/tests/gates.test.js.map +1 -0
- package/dist/tests/goal.test.js +229 -0
- package/dist/tests/goal.test.js.map +1 -0
- package/dist/tests/goalLoop.test.js +170 -0
- package/dist/tests/goalLoop.test.js.map +1 -0
- package/dist/tests/goalSpec.test.js +146 -0
- package/dist/tests/goalSpec.test.js.map +1 -0
- package/dist/tests/goalState.test.js +202 -0
- package/dist/tests/goalState.test.js.map +1 -0
- package/dist/tests/handoff.test.js +127 -0
- package/dist/tests/handoff.test.js.map +1 -0
- package/dist/tests/init.test.js +264 -0
- package/dist/tests/init.test.js.map +1 -0
- package/dist/tests/intake.test.js +288 -0
- package/dist/tests/intake.test.js.map +1 -0
- package/dist/tests/loop.test.js +453 -0
- package/dist/tests/loop.test.js.map +1 -0
- package/dist/tests/modelRouter.test.js +131 -0
- package/dist/tests/modelRouter.test.js.map +1 -0
- package/dist/tests/phases.test.js +244 -0
- package/dist/tests/phases.test.js.map +1 -0
- package/dist/tests/planTree.test.js +190 -0
- package/dist/tests/planTree.test.js.map +1 -0
- package/dist/tests/remote.test.js +380 -0
- package/dist/tests/remote.test.js.map +1 -0
- package/dist/tests/replan.test.js +113 -0
- package/dist/tests/replan.test.js.map +1 -0
- package/dist/tests/review.test.js +77 -0
- package/dist/tests/review.test.js.map +1 -0
- package/dist/tests/rework.test.js +109 -0
- package/dist/tests/rework.test.js.map +1 -0
- package/dist/tests/routing-live.test.js +121 -0
- package/dist/tests/routing-live.test.js.map +1 -0
- package/dist/tests/runState.test.js +73 -0
- package/dist/tests/runState.test.js.map +1 -0
- package/dist/tests/settings.test.js +311 -0
- package/dist/tests/settings.test.js.map +1 -0
- package/dist/tests/skills.test.js +387 -0
- package/dist/tests/skills.test.js.map +1 -0
- package/dist/tests/supervisor.test.js +437 -0
- package/dist/tests/supervisor.test.js.map +1 -0
- package/dist/tests/surface.test.js +203 -0
- package/dist/tests/surface.test.js.map +1 -0
- package/dist/tests/taskList.test.js +376 -0
- package/dist/tests/taskList.test.js.map +1 -0
- package/dist/tests/theme.test.js +149 -0
- package/dist/tests/theme.test.js.map +1 -0
- package/dist/tests/unstuck.test.js +268 -0
- package/dist/tests/unstuck.test.js.map +1 -0
- package/dist/tests/widget.test.js +424 -0
- package/dist/tests/widget.test.js.map +1 -0
- package/dist/tests/worker.test.js +306 -0
- package/dist/tests/worker.test.js.map +1 -0
- package/dist/tests/workflow.test.js +187 -0
- package/dist/tests/workflow.test.js.map +1 -0
- package/extensions/infinity-harness/index.ts +39 -12
- package/package.json +5 -2
- package/src/core/modelRouter.ts +23 -1
- package/src/daemon/index.ts +3 -3
- package/src/daemon/worker.ts +28 -5
- package/src/ui/config.ts +25 -1
- package/src/ui/wizard.ts +10 -5
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* infinity-harness — the settings TUI.
|
|
3
|
+
*
|
|
4
|
+
* Every option is reachable and editable from inside pi. Editing the JSON by
|
|
5
|
+
* hand still works and always will, but nobody should *have* to: a harness you
|
|
6
|
+
* can only configure by opening a file in another window is a harness people
|
|
7
|
+
* configure once, wrongly, and never touch again.
|
|
8
|
+
*
|
|
9
|
+
* The menu is generated from `core/settings.ts`, so adding an option there
|
|
10
|
+
* makes it appear here automatically.
|
|
11
|
+
*
|
|
12
|
+
* This module never imports pi. It talks to a `Prompter`, which the extension
|
|
13
|
+
* satisfies with `ctx.ui` and a test satisfies with a scripted fake — which is
|
|
14
|
+
* why the whole flow is testable without a terminal.
|
|
15
|
+
*/
|
|
16
|
+
import { summarizeWorkflow } from "../workflow.js";
|
|
17
|
+
import { normalizeDisplay, summarizeDisplay } from "./display.js";
|
|
18
|
+
import { SETTINGS, coerce, formatValue, readAll, readSetting, writeSetting, } from "../core/settings.js";
|
|
19
|
+
const BACK = "← back";
|
|
20
|
+
const DONE = "✓ done";
|
|
21
|
+
const INHERIT = "(use pi's current model)";
|
|
22
|
+
const CUSTOM = "type a model id…";
|
|
23
|
+
/**
|
|
24
|
+
* Run the settings menu until the user leaves.
|
|
25
|
+
*
|
|
26
|
+
* Returns the paths that were changed, so the caller can report what happened
|
|
27
|
+
* and refresh anything that reads config.
|
|
28
|
+
*/
|
|
29
|
+
export async function runConfigMenu(options) {
|
|
30
|
+
const { targetDir, prompt } = options;
|
|
31
|
+
const changed = [];
|
|
32
|
+
for (;;) {
|
|
33
|
+
const io = readAll(targetDir);
|
|
34
|
+
const labels = SETTINGS.map((g) => `${g.label} · ${summarize(g, io)}`);
|
|
35
|
+
const choice = await prompt.select("infinity-harness settings", [...labels, DONE]);
|
|
36
|
+
if (choice === undefined || choice === DONE)
|
|
37
|
+
break;
|
|
38
|
+
const group = SETTINGS[labels.indexOf(choice)];
|
|
39
|
+
if (!group)
|
|
40
|
+
break;
|
|
41
|
+
const edited = await runGroup(group, options, changed);
|
|
42
|
+
if (options.once && edited)
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
return changed;
|
|
46
|
+
}
|
|
47
|
+
/** One line per group so the top menu says something at a glance. */
|
|
48
|
+
function summarize(group, io) {
|
|
49
|
+
switch (group.id) {
|
|
50
|
+
case "models": {
|
|
51
|
+
const enabled = io.router.enabled;
|
|
52
|
+
if (!enabled)
|
|
53
|
+
return "routing off";
|
|
54
|
+
const tiers = ["easy", "moderate", "difficult"]
|
|
55
|
+
.map((t) => io.router.byDifficulty?.[t])
|
|
56
|
+
.filter((v) => Boolean(v && v.trim()));
|
|
57
|
+
return tiers.length ? `${tiers.length}/3 tiers set` : "routing on, no tiers set";
|
|
58
|
+
}
|
|
59
|
+
case "pipeline":
|
|
60
|
+
return (io.config.phases?.enabled ?? []).join(" → ") || "(none)";
|
|
61
|
+
case "workflow":
|
|
62
|
+
return summarizeWorkflow(io.config);
|
|
63
|
+
case "display":
|
|
64
|
+
return summarizeDisplay(normalizeDisplay(io.config.display));
|
|
65
|
+
case "commands": {
|
|
66
|
+
const set = Object.entries(io.config.commands ?? {}).filter(([, v]) => Boolean(v));
|
|
67
|
+
return set.length ? set.map(([k]) => k).join(", ") : "none set";
|
|
68
|
+
}
|
|
69
|
+
case "gates":
|
|
70
|
+
return io.config.gates?.enabled === false ? "DISABLED" : "on";
|
|
71
|
+
case "loop":
|
|
72
|
+
return `${io.config.loop?.maxIterations ?? "?"} turns · ${formatValue({ type: { kind: "number", unit: "ms" } }, io.config.loop?.maxWallClockMs)}`;
|
|
73
|
+
case "retries":
|
|
74
|
+
return `${io.config.maxRetries ?? "?"} per task`;
|
|
75
|
+
default:
|
|
76
|
+
return "";
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function runGroup(group, options, changed) {
|
|
80
|
+
const { targetDir, prompt } = options;
|
|
81
|
+
let edited = false;
|
|
82
|
+
for (;;) {
|
|
83
|
+
const io = readAll(targetDir);
|
|
84
|
+
const rows = group.settings.map((s) => `${s.label}: ${formatValue(s, readSetting(io, s))}`);
|
|
85
|
+
const choice = await prompt.select(`${group.label} — ${group.help}`, [...rows, BACK]);
|
|
86
|
+
if (choice === undefined || choice === BACK)
|
|
87
|
+
return edited;
|
|
88
|
+
const setting = group.settings[rows.indexOf(choice)];
|
|
89
|
+
if (!setting)
|
|
90
|
+
return edited;
|
|
91
|
+
const applied = await editSetting(setting, options);
|
|
92
|
+
if (applied) {
|
|
93
|
+
changed.push(setting.path);
|
|
94
|
+
edited = true;
|
|
95
|
+
if (options.once)
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Prompt for one setting and persist it. Returns whether anything changed. */
|
|
101
|
+
async function editSetting(setting, options) {
|
|
102
|
+
const { targetDir, prompt } = options;
|
|
103
|
+
const io = readAll(targetDir);
|
|
104
|
+
const current = readSetting(io, setting);
|
|
105
|
+
let raw;
|
|
106
|
+
switch (setting.type.kind) {
|
|
107
|
+
case "boolean": {
|
|
108
|
+
const picked = await prompt.select(`${setting.label} — ${setting.help}`, ["on", "off", BACK]);
|
|
109
|
+
if (picked === undefined || picked === BACK)
|
|
110
|
+
return false;
|
|
111
|
+
raw = picked;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
case "choice": {
|
|
115
|
+
const picked = await prompt.select(`${setting.label} — ${setting.help}`, [
|
|
116
|
+
...setting.type.choices,
|
|
117
|
+
BACK,
|
|
118
|
+
]);
|
|
119
|
+
if (picked === undefined || picked === BACK)
|
|
120
|
+
return false;
|
|
121
|
+
raw = picked;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
case "thinking": {
|
|
125
|
+
// capability-aware: if setting is tiers.X.thinkingLevel etc, filter to what the model actually supports
|
|
126
|
+
let choices = ["(inherit)", "off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
127
|
+
try {
|
|
128
|
+
const m = setting.path.match(/^tiers.([A-Z]).(provider|id|thinkingLevel)/);
|
|
129
|
+
// For tiers.A/B/C/D/X thinkingLevel, look up that tier's model and its supported levels
|
|
130
|
+
const tierMatch = setting.path.match(/^tiers.([A-Z]).thinkingLevel/);
|
|
131
|
+
if (tierMatch) {
|
|
132
|
+
const tier = tierMatch[1];
|
|
133
|
+
const all = readAll(targetDir);
|
|
134
|
+
const tierSpec = all.config.tiers?.[tier];
|
|
135
|
+
if (tierSpec?.provider && tierSpec?.id) {
|
|
136
|
+
const ref = tierSpec.provider + "/" + tierSpec.id;
|
|
137
|
+
const models = await options.models();
|
|
138
|
+
const found = models.find(x => x.ref === ref);
|
|
139
|
+
if (found?.supportedThinkingLevels?.length) {
|
|
140
|
+
choices = ["(inherit)", ...found.supportedThinkingLevels.filter(l => l !== "off")];
|
|
141
|
+
// ensure off is last fallback if model supports only off
|
|
142
|
+
if (!found.supportedThinkingLevels.includes("off"))
|
|
143
|
+
choices = ["(inherit)", ...found.supportedThinkingLevels];
|
|
144
|
+
else if (choices.indexOf("off") === -1)
|
|
145
|
+
choices.splice(1, 0, "off");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch { }
|
|
151
|
+
const picked = await prompt.select(`${setting.label} — ${setting.help}`, [...choices, BACK]);
|
|
152
|
+
if (picked === undefined || picked === BACK)
|
|
153
|
+
return false;
|
|
154
|
+
raw = picked;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
case "model": {
|
|
158
|
+
raw = await pickModel(setting, options, typeof current === "string" ? current : "");
|
|
159
|
+
if (raw === undefined)
|
|
160
|
+
return false;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
case "multi": {
|
|
164
|
+
// Toggling one at a time beats asking someone to retype a whole list.
|
|
165
|
+
const selected = new Set(Array.isArray(current) ? current : []);
|
|
166
|
+
for (;;) {
|
|
167
|
+
const rows = setting.type.choices.map((c) => `${selected.has(c) ? "[x]" : "[ ]"} ${c}`);
|
|
168
|
+
const picked = await prompt.select(`${setting.label} — ${setting.help}`, [...rows, DONE, BACK]);
|
|
169
|
+
if (picked === undefined || picked === BACK)
|
|
170
|
+
return false;
|
|
171
|
+
if (picked === DONE)
|
|
172
|
+
break;
|
|
173
|
+
const idx = rows.indexOf(picked);
|
|
174
|
+
const key = setting.type.choices[idx];
|
|
175
|
+
if (key === undefined)
|
|
176
|
+
return false;
|
|
177
|
+
if (selected.has(key))
|
|
178
|
+
selected.delete(key);
|
|
179
|
+
else
|
|
180
|
+
selected.add(key);
|
|
181
|
+
}
|
|
182
|
+
raw = [...selected].join(",");
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
default: {
|
|
186
|
+
const shown = formatValue(setting, current);
|
|
187
|
+
const answer = await prompt.input(`${setting.label} — ${setting.help} [now: ${shown}]`, setting.type.kind === "text" ? setting.type.placeholder : undefined);
|
|
188
|
+
if (answer === undefined)
|
|
189
|
+
return false;
|
|
190
|
+
raw = answer;
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const result = coerce(setting, raw);
|
|
195
|
+
if (!result.ok) {
|
|
196
|
+
prompt.notify(`${setting.label}: ${result.error}`, "warning");
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
if (JSON.stringify(result.value) === JSON.stringify(current))
|
|
200
|
+
return false;
|
|
201
|
+
try {
|
|
202
|
+
writeSetting(targetDir, setting, result.value);
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
prompt.notify(`could not save ${setting.label}: ${e instanceof Error ? e.message : String(e)}`, "error");
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
prompt.notify(`${setting.label} → ${formatValue(setting, result.value)}`, "info");
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Offer the models pi actually has, rather than asking someone to remember an
|
|
213
|
+
* id. Inheriting pi's current model is the first option because it is the
|
|
214
|
+
* right answer for most tiers most of the time.
|
|
215
|
+
*/
|
|
216
|
+
async function pickModel(setting, options, current) {
|
|
217
|
+
const { prompt } = options;
|
|
218
|
+
let models = [];
|
|
219
|
+
try {
|
|
220
|
+
models = await options.models();
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
models = [];
|
|
224
|
+
}
|
|
225
|
+
if (models.length === 0) {
|
|
226
|
+
prompt.notify("pi reports no configured models — falling back to typing an id. Check `pi models` / your provider auth.", "warning");
|
|
227
|
+
const typed = await prompt.input(`${setting.label} — ${setting.help}`, current || "provider/model-id");
|
|
228
|
+
return typed;
|
|
229
|
+
}
|
|
230
|
+
const rows = models.map((m) => (m.ref === current ? `${m.label} ← current` : m.label));
|
|
231
|
+
const picked = await prompt.select(`${setting.label} — ${setting.help}`, [
|
|
232
|
+
INHERIT,
|
|
233
|
+
...rows,
|
|
234
|
+
CUSTOM,
|
|
235
|
+
BACK,
|
|
236
|
+
]);
|
|
237
|
+
if (picked === undefined || picked === BACK)
|
|
238
|
+
return undefined;
|
|
239
|
+
if (picked === INHERIT)
|
|
240
|
+
return "";
|
|
241
|
+
if (picked === CUSTOM) {
|
|
242
|
+
const typed = await prompt.input(`${setting.label} — model id`, current || "provider/model-id");
|
|
243
|
+
return typed;
|
|
244
|
+
}
|
|
245
|
+
const model = models[rows.indexOf(picked)];
|
|
246
|
+
return model?.ref;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* A plain-text report of the whole configuration.
|
|
250
|
+
*
|
|
251
|
+
* Used by `/infinity:config show` and worth having on its own: it is the
|
|
252
|
+
* fastest way to answer "what is this run actually going to do?".
|
|
253
|
+
*/
|
|
254
|
+
export function renderSettings(targetDir) {
|
|
255
|
+
const io = readAll(targetDir);
|
|
256
|
+
const lines = ["infinity-harness settings", ""];
|
|
257
|
+
for (const group of SETTINGS) {
|
|
258
|
+
lines.push(`${group.label}`);
|
|
259
|
+
for (const s of group.settings) {
|
|
260
|
+
const value = formatValue(s, readSetting(io, s));
|
|
261
|
+
lines.push(` ${s.label.padEnd(28)} ${value}`);
|
|
262
|
+
}
|
|
263
|
+
lines.push("");
|
|
264
|
+
}
|
|
265
|
+
lines.push("Stored in harness/config.json and harness/model-router.json — both safe to edit by hand.");
|
|
266
|
+
return lines.join("\n");
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/ui/config.ts"],"names":[],"mappings":"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"}
|