codedeck 0.1.9 → 0.3.0
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 +97 -1
- package/dist/cli/cli-name.js +20 -0
- package/dist/cli/cli-name.js.map +1 -0
- package/dist/cli/commands/claims.js +170 -0
- package/dist/cli/commands/claims.js.map +1 -0
- package/dist/cli/commands/doctor.js +22 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/models.js +3 -3
- package/dist/cli/commands/models.js.map +1 -1
- package/dist/cli/commands/open.js +331 -0
- package/dist/cli/commands/open.js.map +1 -0
- package/dist/cli/commands/ps.js +260 -23
- package/dist/cli/commands/ps.js.map +1 -1
- package/dist/cli/commands/rename.js +29 -0
- package/dist/cli/commands/rename.js.map +1 -0
- package/dist/cli/commands/run.js +68 -30
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/setup.js +508 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/usage.js +37 -0
- package/dist/cli/commands/usage.js.map +1 -0
- package/dist/cli/commands/wait.js +3 -2
- package/dist/cli/commands/wait.js.map +1 -1
- package/dist/cli/index.js +37 -21
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/picker-state.js +168 -0
- package/dist/cli/picker-state.js.map +1 -0
- package/dist/cli/picker.js +157 -0
- package/dist/cli/picker.js.map +1 -0
- package/dist/cli/ui.js +233 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/config/config.js +47 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/orchestrator-mode.js +72 -0
- package/dist/config/orchestrator-mode.js.map +1 -0
- package/dist/config/paths.js +8 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/core/models.js +23 -4
- package/dist/core/models.js.map +1 -1
- package/dist/core/pricing.js +65 -0
- package/dist/core/pricing.js.map +1 -0
- package/dist/core/roles.js +83 -0
- package/dist/core/roles.js.map +1 -0
- package/dist/core/run-usage.js +46 -0
- package/dist/core/run-usage.js.map +1 -0
- package/dist/core/session.js +5 -0
- package/dist/core/session.js.map +1 -1
- package/dist/daemon/daemon.js +90 -3
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/ipc.js +10 -3
- package/dist/daemon/ipc.js.map +1 -1
- package/dist/drivers/opencode/driver.js +1 -114
- package/dist/drivers/opencode/driver.js.map +1 -1
- package/dist/drivers/opencode/parser.js +86 -0
- package/dist/drivers/opencode/parser.js.map +1 -0
- package/dist/drivers/session-runtime.js +1 -0
- package/dist/drivers/session-runtime.js.map +1 -1
- package/dist/git/worktree.js +1 -1
- package/dist/git/worktree.js.map +1 -1
- package/dist/open/contract.js +104 -0
- package/dist/open/contract.js.map +1 -0
- package/dist/open/injection.js +59 -0
- package/dist/open/injection.js.map +1 -0
- package/dist/open/launchers/claude.js +212 -0
- package/dist/open/launchers/claude.js.map +1 -0
- package/dist/open/launchers/opencode.js +178 -0
- package/dist/open/launchers/opencode.js.map +1 -0
- package/dist/open/orchestrator-prose.js +12 -0
- package/dist/open/orchestrator-prose.js.map +1 -0
- package/dist/open/pty.js +281 -0
- package/dist/open/pty.js.map +1 -0
- package/dist/open/runtime.js +597 -0
- package/dist/open/runtime.js.map +1 -0
- package/dist/plugin/.claude-plugin/plugin.json +11 -0
- package/dist/plugin/agents/auditor.md +36 -0
- package/dist/plugin/agents/general.md +35 -0
- package/dist/plugin/agents/orchestrator-edit.md +69 -0
- package/dist/plugin/agents/orchestrator-read.md +69 -0
- package/dist/plugin/agents/orchestrator.md +91 -0
- package/dist/plugin/agents/reviewer.md +36 -0
- package/dist/plugin/commands/autonomous.md +58 -0
- package/dist/plugin/hooks/hooks.json +24 -0
- package/dist/plugin/hooks/session-id.sh +23 -0
- package/dist/plugin/hooks/session-name-lib.mjs +40 -0
- package/dist/plugin/hooks/session-name-worker.mjs +124 -0
- package/dist/plugin/hooks/session-name.mjs +66 -0
- package/dist/plugin/hooks/session-name.sh +7 -0
- package/dist/plugin/pty-shim.mjs +114 -0
- package/dist/plugin/statusline.sh +260 -0
- package/dist/plugin/themes/codedeck-rage.json +74 -0
- package/dist/plugin/themes/codedeck-ultra.json +76 -0
- package/dist/plugin/ultra.md +9 -0
- package/dist/store/claims.js +152 -0
- package/dist/store/claims.js.map +1 -0
- package/dist/store/database.js +14 -0
- package/dist/store/database.js.map +1 -1
- package/dist/store/sessions.js +17 -3
- package/dist/store/sessions.js.map +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
import { getCachedOrDiscoverModels, } from "../../core/models.js";
|
|
2
|
+
import { itemKey } from "../picker-state.js";
|
|
3
|
+
import { runScreens } from "../picker.js";
|
|
4
|
+
import { colors, readDimensions } from "../ui.js";
|
|
5
|
+
import { getCliName } from "../cli-name.js";
|
|
6
|
+
import { getRegistry } from "../../drivers/registry.js";
|
|
7
|
+
import { ROLES } from "../../core/roles.js";
|
|
8
|
+
import { BALANCED_PRESET, DISPATCHER_PRESET, EXPLORER_PRESET, ORCHESTRATOR_PRESETS, isOrchestratorMode, loadConfig, orchestratorModeLabel, resolveOrchestratorMode, saveConfig, } from "../../config/config.js";
|
|
9
|
+
const ORCHESTRATOR_SCREEN_ROLE = "orchestrator-mode";
|
|
10
|
+
const ORCHESTRATOR_PICKER_GROUP = "orchestrator";
|
|
11
|
+
const PARALLELISM_NONE = "none";
|
|
12
|
+
const SANDBOX_SCREEN_ROLE = "sandbox";
|
|
13
|
+
const SANDBOX_PICKER_GROUP = "sandbox";
|
|
14
|
+
const SANDBOX_OFF = "workspace-write";
|
|
15
|
+
const SANDBOX_ON = "danger-full-access";
|
|
16
|
+
const ORCHESTRATOR_PARALLELISM_NOTE_LINES = [
|
|
17
|
+
"parallelism is advisory. Version 1 puts the requested cap in the",
|
|
18
|
+
"orchestrator prompt for review verification and does not enforce the",
|
|
19
|
+
"cap in code.",
|
|
20
|
+
];
|
|
21
|
+
export const ORCHESTRATOR_PARALLELISM_NOTE = ORCHESTRATOR_PARALLELISM_NOTE_LINES.join(" ");
|
|
22
|
+
const ORCHESTRATOR_PARAMETERS = [
|
|
23
|
+
"investigate",
|
|
24
|
+
"selfWork",
|
|
25
|
+
"tools",
|
|
26
|
+
"parallelism",
|
|
27
|
+
];
|
|
28
|
+
function copyOrchestratorMode(mode) {
|
|
29
|
+
return {
|
|
30
|
+
investigate: mode.investigate,
|
|
31
|
+
selfWork: mode.selfWork,
|
|
32
|
+
tools: mode.tools,
|
|
33
|
+
...(mode.parallelism === undefined ? {} : { parallelism: mode.parallelism }),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function selectionId(selection) {
|
|
37
|
+
return typeof selection === "string" ? selection : selection.id;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Turns a preset or a complete custom answer into the config block. The
|
|
41
|
+
* returned object contains parameters only, so labels and preset names cannot
|
|
42
|
+
* leak into the saved JSON.
|
|
43
|
+
*/
|
|
44
|
+
export function orchestratorConfigFromSelection(selection, parameters) {
|
|
45
|
+
const id = selectionId(selection);
|
|
46
|
+
if (Object.hasOwn(ORCHESTRATOR_PRESETS, id)) {
|
|
47
|
+
return copyOrchestratorMode(ORCHESTRATOR_PRESETS[id]);
|
|
48
|
+
}
|
|
49
|
+
if (id !== "custom" || parameters === undefined)
|
|
50
|
+
return undefined;
|
|
51
|
+
const mode = {
|
|
52
|
+
investigate: parameters.investigate,
|
|
53
|
+
selfWork: parameters.selfWork,
|
|
54
|
+
tools: parameters.tools,
|
|
55
|
+
...(parameters.parallelism === undefined ? {} : { parallelism: parameters.parallelism }),
|
|
56
|
+
};
|
|
57
|
+
return isOrchestratorMode(mode) ? mode : undefined;
|
|
58
|
+
}
|
|
59
|
+
export function orchestratorDisplayLabel(config) {
|
|
60
|
+
return orchestratorModeLabel(resolveOrchestratorMode(config));
|
|
61
|
+
}
|
|
62
|
+
function modeValue(mode, parameter) {
|
|
63
|
+
if (parameter === "parallelism")
|
|
64
|
+
return mode.parallelism === undefined ? PARALLELISM_NONE : String(mode.parallelism);
|
|
65
|
+
return mode[parameter];
|
|
66
|
+
}
|
|
67
|
+
function parameterItems(parameter, mode) {
|
|
68
|
+
const choices = parameter === "investigate"
|
|
69
|
+
? ["none", "read", "free"]
|
|
70
|
+
: parameter === "selfWork"
|
|
71
|
+
? ["none", "trivial", "small"]
|
|
72
|
+
: parameter === "tools"
|
|
73
|
+
? ["dispatch", "read", "edit"]
|
|
74
|
+
: [PARALLELISM_NONE, "1", "2", "3", "4", "5", "6", "8", "12"];
|
|
75
|
+
const current = modeValue(mode, parameter);
|
|
76
|
+
const ordered = [current, ...choices.filter((choice) => choice !== current)];
|
|
77
|
+
return ordered.map((choice) => ({
|
|
78
|
+
id: choice,
|
|
79
|
+
label: parameter === "parallelism" && choice === PARALLELISM_NONE ? "sem limite" : choice,
|
|
80
|
+
group: ORCHESTRATOR_PICKER_GROUP,
|
|
81
|
+
harness: ORCHESTRATOR_PICKER_GROUP,
|
|
82
|
+
...(choice === current ? { note: "atual" } : {}),
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
export function buildOrchestratorScreen(config = {}, index = 0, total = 1) {
|
|
86
|
+
const mode = resolveOrchestratorMode(config);
|
|
87
|
+
const presets = [
|
|
88
|
+
["dispatcher", DISPATCHER_PRESET],
|
|
89
|
+
["balanced", BALANCED_PRESET],
|
|
90
|
+
["explorer", EXPLORER_PRESET],
|
|
91
|
+
];
|
|
92
|
+
const presetItems = presets.map(([name, preset]) => ({
|
|
93
|
+
id: name,
|
|
94
|
+
label: name,
|
|
95
|
+
group: ORCHESTRATOR_PICKER_GROUP,
|
|
96
|
+
harness: ORCHESTRATOR_PICKER_GROUP,
|
|
97
|
+
note: `${preset.investigate} / ${preset.selfWork} / ${preset.tools}`,
|
|
98
|
+
}));
|
|
99
|
+
return {
|
|
100
|
+
role: ORCHESTRATOR_SCREEN_ROLE,
|
|
101
|
+
title: `orchestrator (${orchestratorModeLabel(mode)})`,
|
|
102
|
+
counter: `agente ${index + 1} de ${total}`,
|
|
103
|
+
description: ORCHESTRATOR_PARALLELISM_NOTE_LINES,
|
|
104
|
+
items: [
|
|
105
|
+
...presetItems,
|
|
106
|
+
{
|
|
107
|
+
id: "custom",
|
|
108
|
+
label: "custom",
|
|
109
|
+
group: ORCHESTRATOR_PICKER_GROUP,
|
|
110
|
+
harness: ORCHESTRATOR_PICKER_GROUP,
|
|
111
|
+
note: "ajustar os quatro parametros",
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
pinned: false,
|
|
115
|
+
known: new Set([
|
|
116
|
+
...presetItems.map((item) => itemKey(item.harness, item.id)),
|
|
117
|
+
itemKey(ORCHESTRATOR_PICKER_GROUP, "custom"),
|
|
118
|
+
]),
|
|
119
|
+
harnesses: new Set([ORCHESTRATOR_PICKER_GROUP]),
|
|
120
|
+
next: (result) => result.kind === "picked" && result.id === "custom"
|
|
121
|
+
? [buildOrchestratorParameterScreen(ORCHESTRATOR_PARAMETERS[0], mode, 0)]
|
|
122
|
+
: [],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export function buildSandboxScreen(config = {}, index = 0, total = 1) {
|
|
126
|
+
const selected = config.defaultSandbox === SANDBOX_ON ? SANDBOX_ON : SANDBOX_OFF;
|
|
127
|
+
const values = selected === SANDBOX_ON ? [SANDBOX_ON, SANDBOX_OFF] : [SANDBOX_OFF, SANDBOX_ON];
|
|
128
|
+
const items = values.map((value) => ({
|
|
129
|
+
id: value,
|
|
130
|
+
label: value === SANDBOX_ON ? "ON" : "OFF",
|
|
131
|
+
group: SANDBOX_PICKER_GROUP,
|
|
132
|
+
harness: SANDBOX_PICKER_GROUP,
|
|
133
|
+
...(value === selected ? { note: "atual" } : {}),
|
|
134
|
+
}));
|
|
135
|
+
return {
|
|
136
|
+
role: SANDBOX_SCREEN_ROLE,
|
|
137
|
+
title: "Danger full access",
|
|
138
|
+
counter: `configuração ${index + 1} de ${total}`,
|
|
139
|
+
description: ["Danger full access applies to new Codex sessions."],
|
|
140
|
+
items,
|
|
141
|
+
pinned: true,
|
|
142
|
+
known: new Set(items.map((item) => itemKey(item.harness, item.id))),
|
|
143
|
+
harnesses: new Set([SANDBOX_PICKER_GROUP]),
|
|
144
|
+
next: () => [],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function modeAfterParameter(mode, result) {
|
|
148
|
+
const parameters = collectOrchestratorParameters([result], mode);
|
|
149
|
+
return orchestratorConfigFromSelection("custom", parameters) ?? mode;
|
|
150
|
+
}
|
|
151
|
+
function buildOrchestratorParameterScreen(parameter, mode, index, error) {
|
|
152
|
+
const items = parameterItems(parameter, mode);
|
|
153
|
+
const description = parameter === "parallelism"
|
|
154
|
+
? [...ORCHESTRATOR_PARALLELISM_NOTE_LINES, "Type orchestrator:N for another positive cap."]
|
|
155
|
+
: ORCHESTRATOR_PARALLELISM_NOTE_LINES;
|
|
156
|
+
return {
|
|
157
|
+
role: `${ORCHESTRATOR_SCREEN_ROLE}.${parameter}`,
|
|
158
|
+
title: `orchestrator (${orchestratorModeLabel(mode)}) · ${parameter}`,
|
|
159
|
+
counter: `parametro ${index + 1} de ${ORCHESTRATOR_PARAMETERS.length}`,
|
|
160
|
+
...(error === undefined ? {} : { error }),
|
|
161
|
+
description,
|
|
162
|
+
items,
|
|
163
|
+
pinned: false,
|
|
164
|
+
known: new Set(items.map((item) => itemKey(item.harness, item.id))),
|
|
165
|
+
harnesses: new Set([ORCHESTRATOR_PICKER_GROUP]),
|
|
166
|
+
next: (result) => {
|
|
167
|
+
if (parameter === "parallelism" &&
|
|
168
|
+
result.kind === "picked" &&
|
|
169
|
+
result.id !== PARALLELISM_NONE &&
|
|
170
|
+
numericParallelism(result.id) === undefined) {
|
|
171
|
+
return [
|
|
172
|
+
buildOrchestratorParameterScreen(parameter, mode, index, "parallelism must be a positive finite number"),
|
|
173
|
+
];
|
|
174
|
+
}
|
|
175
|
+
if (index + 1 >= ORCHESTRATOR_PARAMETERS.length)
|
|
176
|
+
return [];
|
|
177
|
+
const nextIndex = index + 1;
|
|
178
|
+
return [
|
|
179
|
+
buildOrchestratorParameterScreen(ORCHESTRATOR_PARAMETERS[nextIndex], modeAfterParameter(mode, result), nextIndex),
|
|
180
|
+
];
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function numericParallelism(value) {
|
|
185
|
+
const parsed = Number(value);
|
|
186
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
|
|
187
|
+
}
|
|
188
|
+
/** Keeps skipped parameter screens at the mode shown when customization began. */
|
|
189
|
+
export function collectOrchestratorParameters(results, existing) {
|
|
190
|
+
const parameters = {
|
|
191
|
+
investigate: existing.investigate,
|
|
192
|
+
selfWork: existing.selfWork,
|
|
193
|
+
tools: existing.tools,
|
|
194
|
+
...(existing.parallelism === undefined ? {} : { parallelism: existing.parallelism }),
|
|
195
|
+
};
|
|
196
|
+
for (const result of results) {
|
|
197
|
+
if (result.kind !== "picked")
|
|
198
|
+
continue;
|
|
199
|
+
const parameter = result.role.startsWith(`${ORCHESTRATOR_SCREEN_ROLE}.`)
|
|
200
|
+
? result.role.slice(`${ORCHESTRATOR_SCREEN_ROLE}.`.length)
|
|
201
|
+
: "";
|
|
202
|
+
if (parameter === "investigate" && ["none", "read", "free"].includes(result.id)) {
|
|
203
|
+
parameters.investigate = result.id;
|
|
204
|
+
}
|
|
205
|
+
else if (parameter === "selfWork" && ["none", "trivial", "small"].includes(result.id)) {
|
|
206
|
+
parameters.selfWork = result.id;
|
|
207
|
+
}
|
|
208
|
+
else if (parameter === "tools" && ["dispatch", "read", "edit"].includes(result.id)) {
|
|
209
|
+
parameters.tools = result.id;
|
|
210
|
+
}
|
|
211
|
+
else if (parameter === "parallelism") {
|
|
212
|
+
if (result.id === PARALLELISM_NONE)
|
|
213
|
+
delete parameters.parallelism;
|
|
214
|
+
else {
|
|
215
|
+
const parsed = numericParallelism(result.id);
|
|
216
|
+
if (parsed !== undefined)
|
|
217
|
+
parameters.parallelism = parsed;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return parameters;
|
|
222
|
+
}
|
|
223
|
+
export function collectOrchestratorSelection(selection, parameters, existing = {}) {
|
|
224
|
+
if (selection?.kind !== "picked")
|
|
225
|
+
return undefined;
|
|
226
|
+
if (selection.id !== "custom")
|
|
227
|
+
return orchestratorConfigFromSelection(selection);
|
|
228
|
+
const current = resolveOrchestratorMode(existing);
|
|
229
|
+
return orchestratorConfigFromSelection("custom", collectOrchestratorParameters(parameters, current));
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Both streams have to be a terminal, not just stdout. A piped stdin leaves
|
|
233
|
+
* `question` waiting on input that can never arrive, and `tail -f /dev/null |
|
|
234
|
+
* codedeck open` keeps stdout a TTY while stdin is exactly that pipe.
|
|
235
|
+
*/
|
|
236
|
+
export function isInteractiveTerminal() {
|
|
237
|
+
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* The open command uses this decision before creating a readline interface.
|
|
241
|
+
* Keeping the terminal state as an argument makes the first-run policy pure.
|
|
242
|
+
*/
|
|
243
|
+
export function needsModelSetup(config, isTTY = isInteractiveTerminal()) {
|
|
244
|
+
if (!isTTY)
|
|
245
|
+
return false;
|
|
246
|
+
// `agents` is what setup writes now. A config carrying only the older
|
|
247
|
+
// per-harness `models` has never answered the per-role question, so it still
|
|
248
|
+
// counts as unset.
|
|
249
|
+
return config == null || config.agents == null;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* The catalog of every installed harness, flattened into one list.
|
|
253
|
+
*
|
|
254
|
+
* The group is the bare agent id rather than a prettier label because it is
|
|
255
|
+
* also what free text has to type as a prefix ("codex:gpt-5.7"). A header
|
|
256
|
+
* reading "Codex" over rows you reach by typing "codex" would hide that.
|
|
257
|
+
*/
|
|
258
|
+
/** One normalization for every id, so the catalog and the pin agree on a key. */
|
|
259
|
+
function modelId(raw) {
|
|
260
|
+
return typeof raw === "string" ? raw.trim() : "";
|
|
261
|
+
}
|
|
262
|
+
function catalogItems(installed) {
|
|
263
|
+
const known = new Set();
|
|
264
|
+
const items = [];
|
|
265
|
+
for (const harness of installed) {
|
|
266
|
+
for (const provider of harness.providers) {
|
|
267
|
+
for (const model of provider.models) {
|
|
268
|
+
// A driver reporting a blank id used to become a selectable blank row
|
|
269
|
+
// that Enter would save as the model. The line wizard guarded this and
|
|
270
|
+
// the port dropped the guard.
|
|
271
|
+
const id = modelId(model.id);
|
|
272
|
+
if (!id)
|
|
273
|
+
continue;
|
|
274
|
+
// Keyed by both halves: two harnesses listing the same id are two real
|
|
275
|
+
// choices, and only a repeat within one harness is a duplicate.
|
|
276
|
+
const key = itemKey(harness.agent, id);
|
|
277
|
+
if (known.has(key))
|
|
278
|
+
continue;
|
|
279
|
+
known.add(key);
|
|
280
|
+
// The name is carried for the filter, not for the row: most of the
|
|
281
|
+
// catalog spells a version readably there ("Claude Opus 5") and only in
|
|
282
|
+
// the id the way it is typed.
|
|
283
|
+
const name = typeof model.name === "string" ? model.name.trim() : "";
|
|
284
|
+
items.push({
|
|
285
|
+
id,
|
|
286
|
+
label: id,
|
|
287
|
+
group: harness.agent,
|
|
288
|
+
harness: harness.agent,
|
|
289
|
+
...(name && name !== id ? { name } : {}),
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return { items, known };
|
|
295
|
+
}
|
|
296
|
+
function pinnedFor(installed, known, configured, fallbackHarness) {
|
|
297
|
+
if (configured) {
|
|
298
|
+
const inCatalog = known.has(itemKey(configured.harness, configured.model));
|
|
299
|
+
// A saved id the catalog no longer lists still gets shown. Hiding it is how
|
|
300
|
+
// the wizard used to answer `open`'s own "that model is gone, run setup":
|
|
301
|
+
// the user arrived here and could not see which model it meant. Marking it
|
|
302
|
+
// synthetic makes keeping it cost the same second Enter as typing it.
|
|
303
|
+
return {
|
|
304
|
+
id: configured.model,
|
|
305
|
+
label: configured.model,
|
|
306
|
+
group: configured.harness,
|
|
307
|
+
harness: configured.harness,
|
|
308
|
+
note: inCatalog ? `atual · ${configured.harness}` : `atual · ${configured.harness}, fora do catalogo`,
|
|
309
|
+
...(inCatalog ? {} : { synthetic: true }),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
// Nothing saved for this role, so the suggestion comes from the harness that
|
|
313
|
+
// runs everything else by default, and only if that harness names a default.
|
|
314
|
+
const harness = installed.find((candidate) => candidate.agent === fallbackHarness);
|
|
315
|
+
if (!harness)
|
|
316
|
+
return undefined;
|
|
317
|
+
for (const provider of harness.providers) {
|
|
318
|
+
// Trimmed the same way the catalog trims, or the lookup misses its own row
|
|
319
|
+
// and a harness that pads its ids ends up pinning nothing.
|
|
320
|
+
const real = provider.models
|
|
321
|
+
.map((model) => ({ id: modelId(model.id), isDefault: model.isDefault }))
|
|
322
|
+
.find((model) => model.isDefault && known.has(itemKey(harness.agent, model.id)));
|
|
323
|
+
if (real) {
|
|
324
|
+
return {
|
|
325
|
+
id: real.id,
|
|
326
|
+
label: real.id,
|
|
327
|
+
group: harness.agent,
|
|
328
|
+
harness: harness.agent,
|
|
329
|
+
note: `padrao · ${harness.agent}`,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// With no config and no isDefault, the first row is just catalog order.
|
|
334
|
+
// Hoisting that and calling it the default would stamp a coin flip as a
|
|
335
|
+
// recommendation.
|
|
336
|
+
}
|
|
337
|
+
export function buildRoleScreen(role, installed, index, total, configured, fallbackHarness = "claude") {
|
|
338
|
+
const { items: catalog, known } = catalogItems(installed);
|
|
339
|
+
const pinned = pinnedFor(installed, known, configured, fallbackHarness);
|
|
340
|
+
const pinnedKey = pinned ? itemKey(pinned.harness, pinned.id) : undefined;
|
|
341
|
+
const items = pinned
|
|
342
|
+
? [pinned, ...catalog.filter((item) => itemKey(item.harness, item.id) !== pinnedKey)]
|
|
343
|
+
: catalog;
|
|
344
|
+
// One screen now spans every harness, so a harness that answered with an
|
|
345
|
+
// error no longer owns the error line by itself. Naming each one keeps a
|
|
346
|
+
// missing catalog readable as "codex is why codex has no rows".
|
|
347
|
+
const errors = installed
|
|
348
|
+
.filter((harness) => harness.error)
|
|
349
|
+
.map((harness) => `${harness.agent}: ${harness.error}`);
|
|
350
|
+
return {
|
|
351
|
+
role,
|
|
352
|
+
title: role,
|
|
353
|
+
counter: `agente ${index + 1} de ${total}`,
|
|
354
|
+
...(errors.length > 0 ? { error: errors.join(" · ") } : {}),
|
|
355
|
+
items,
|
|
356
|
+
pinned: pinned !== undefined,
|
|
357
|
+
known,
|
|
358
|
+
harnesses: new Set(installed.map((harness) => harness.agent)),
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
export function buildScreens(roles, harnesses, configured, fallbackHarness = "claude") {
|
|
362
|
+
const seen = new Set();
|
|
363
|
+
// A merged disk cache can hand back the same agent twice.
|
|
364
|
+
const installed = harnesses.filter((harness) => {
|
|
365
|
+
if (!harness.available || seen.has(harness.agent))
|
|
366
|
+
return false;
|
|
367
|
+
seen.add(harness.agent);
|
|
368
|
+
return true;
|
|
369
|
+
});
|
|
370
|
+
if (installed.length === 0)
|
|
371
|
+
return [];
|
|
372
|
+
return roles.map((role, index) => buildRoleScreen(role, installed, index, roles.length, configured[role], fallbackHarness));
|
|
373
|
+
}
|
|
374
|
+
export function collectSelections(results, existing, shown) {
|
|
375
|
+
// Starts from what was already saved: skipping has to leave it intact, and a
|
|
376
|
+
// brand new map would wipe a choice made on an earlier run.
|
|
377
|
+
const agents = { ...(existing ?? {}) };
|
|
378
|
+
for (const result of results) {
|
|
379
|
+
if (result.kind !== "picked")
|
|
380
|
+
continue;
|
|
381
|
+
agents[result.role] = { harness: result.harness, model: result.id };
|
|
382
|
+
}
|
|
383
|
+
const aborted = results.some((result) => result.kind === "aborted");
|
|
384
|
+
return { agents, write: shown > 0 && !aborted };
|
|
385
|
+
}
|
|
386
|
+
/** Below this no list survives once the chrome is placed. */
|
|
387
|
+
const MIN_ROWS = 8;
|
|
388
|
+
function watchResize(listener) {
|
|
389
|
+
process.stdout.on("resize", listener);
|
|
390
|
+
return () => {
|
|
391
|
+
process.stdout.off("resize", listener);
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
export async function runModelSetupWizard(options = {}) {
|
|
395
|
+
const config = options.config ?? loadConfig();
|
|
396
|
+
if (!(options.isTTY ?? isInteractiveTerminal()))
|
|
397
|
+
return config;
|
|
398
|
+
const output = options.output ?? process.stdout;
|
|
399
|
+
const input = options.input ?? process.stdin;
|
|
400
|
+
const registry = options.registry ?? getRegistry();
|
|
401
|
+
// Order matters: announce, discover with raw mode still off, and only then
|
|
402
|
+
// measure and draw. Discovery blocks for seconds, and doing it with the
|
|
403
|
+
// terminal already taken over looks like a freeze.
|
|
404
|
+
output.write("\n discovering models...\n");
|
|
405
|
+
let harnesses;
|
|
406
|
+
try {
|
|
407
|
+
const discover = options.discoverModels ??
|
|
408
|
+
((selected, refresh) => getCachedOrDiscoverModels(selected, { refresh }));
|
|
409
|
+
harnesses = await discover(registry, options.refresh ?? false);
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
// A catalog that cannot be reached is not an answer from the user. It falls
|
|
413
|
+
// into the guard below, which saves nothing and lets the next run ask.
|
|
414
|
+
console.error(`Warning: Could not discover models: ${error instanceof Error ? error.message : String(error)}`);
|
|
415
|
+
harnesses = [];
|
|
416
|
+
}
|
|
417
|
+
const roleScreens = buildScreens(ROLES, harnesses, config.agents ?? {}, config.defaultAgent ?? "claude");
|
|
418
|
+
// Writing `agents` is what marks first-run setup as done. Doing that after
|
|
419
|
+
// showing nothing would spend the single prompt the user ever gets.
|
|
420
|
+
if (roleScreens.length === 0) {
|
|
421
|
+
console.error("Warning: No installed harness reported any model; skipping model setup.");
|
|
422
|
+
return config;
|
|
423
|
+
}
|
|
424
|
+
const dim = options.dimensions ?? readDimensions(output);
|
|
425
|
+
if (dim.rows < MIN_ROWS) {
|
|
426
|
+
console.error(`Warning: Terminal is ${dim.rows} rows, model setup needs ${MIN_ROWS}. Nothing was saved.`);
|
|
427
|
+
return config;
|
|
428
|
+
}
|
|
429
|
+
const paint = colors(Boolean(output.isTTY) && !process.env.NO_COLOR);
|
|
430
|
+
const screens = [
|
|
431
|
+
...roleScreens,
|
|
432
|
+
buildOrchestratorScreen(config, roleScreens.length, roleScreens.length + 1),
|
|
433
|
+
];
|
|
434
|
+
const results = await runScreens([...screens, buildSandboxScreen(config, screens.length, screens.length + 1)], { input, output, onResize: watchResize }, paint);
|
|
435
|
+
if (results.some((result) => result.kind === "aborted")) {
|
|
436
|
+
console.error("Warning: Model setup was interrupted; nothing was saved.");
|
|
437
|
+
return config;
|
|
438
|
+
}
|
|
439
|
+
const answeredResults = results.filter((result) => result.kind !== "aborted");
|
|
440
|
+
const agentResults = answeredResults.filter((result) => roleScreens.some((screen) => screen.role === result.role));
|
|
441
|
+
const { agents, write } = collectSelections(agentResults, config.agents, roleScreens.length);
|
|
442
|
+
if (!write) {
|
|
443
|
+
console.error("Warning: Model setup was interrupted; nothing was saved.");
|
|
444
|
+
return config;
|
|
445
|
+
}
|
|
446
|
+
const orchestratorSelection = answeredResults.find((result) => result.role === ORCHESTRATOR_SCREEN_ROLE);
|
|
447
|
+
if (orchestratorSelection === undefined) {
|
|
448
|
+
console.error("Warning: Orchestrator setup was interrupted; nothing was saved.");
|
|
449
|
+
return config;
|
|
450
|
+
}
|
|
451
|
+
let orchestrator;
|
|
452
|
+
if (orchestratorSelection.kind === "picked" && orchestratorSelection.id === "custom") {
|
|
453
|
+
const parameterResults = answeredResults.filter((result) => result.role.startsWith(`${ORCHESTRATOR_SCREEN_ROLE}.`));
|
|
454
|
+
orchestrator = collectOrchestratorSelection(orchestratorSelection, parameterResults, config);
|
|
455
|
+
if (orchestrator === undefined) {
|
|
456
|
+
console.error("Warning: Orchestrator setup was invalid; nothing was saved.");
|
|
457
|
+
return config;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
else if (orchestratorSelection.kind === "picked") {
|
|
461
|
+
orchestrator = collectOrchestratorSelection(orchestratorSelection, [], config);
|
|
462
|
+
if (orchestrator === undefined) {
|
|
463
|
+
console.error("Warning: Orchestrator setup was invalid; nothing was saved.");
|
|
464
|
+
return config;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
const updatedConfig = { ...config, agents };
|
|
468
|
+
if (orchestrator !== undefined)
|
|
469
|
+
updatedConfig.orchestrator = orchestrator;
|
|
470
|
+
const sandboxSelection = answeredResults.find((result) => result.role === SANDBOX_SCREEN_ROLE);
|
|
471
|
+
if (sandboxSelection?.kind === "picked") {
|
|
472
|
+
if (sandboxSelection.id === SANDBOX_OFF || sandboxSelection.id === SANDBOX_ON) {
|
|
473
|
+
updatedConfig.defaultSandbox = sandboxSelection.id;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
try {
|
|
477
|
+
(options.save ?? saveConfig)(updatedConfig);
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
console.error(`Warning: Could not save config: ${error instanceof Error ? error.message : String(error)}`);
|
|
481
|
+
}
|
|
482
|
+
const summary = roleScreens
|
|
483
|
+
.map((screen) => {
|
|
484
|
+
const binding = agents[screen.role];
|
|
485
|
+
return `${screen.role} ${binding ? `${binding.harness}:${binding.model}` : "unset"}`;
|
|
486
|
+
})
|
|
487
|
+
.join(" · ");
|
|
488
|
+
const modeSummary = orchestrator === undefined ? "" : ` · orchestrator ${orchestratorModeLabel(orchestrator)}`;
|
|
489
|
+
output.write(`\n saved: ${summary}${modeSummary}\n\n`);
|
|
490
|
+
return updatedConfig;
|
|
491
|
+
}
|
|
492
|
+
export function registerSetupCommand(program) {
|
|
493
|
+
program
|
|
494
|
+
.command("setup")
|
|
495
|
+
.description("Choose the harness and model each agent should run on")
|
|
496
|
+
.option("--refresh", "ignore the cached catalog and rediscover")
|
|
497
|
+
.action(async (opts) => {
|
|
498
|
+
// The message lives here rather than in the wizard, because `open` calls
|
|
499
|
+
// the same function and has to stay quiet when it cannot prompt.
|
|
500
|
+
if (!isInteractiveTerminal()) {
|
|
501
|
+
console.error(`${getCliName()} setup needs a terminal on both stdin and stdout.`);
|
|
502
|
+
process.exitCode = 1;
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
await runModelSetupWizard({ refresh: opts.refresh });
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { IpcClient } from "../../daemon/ipc.js";
|
|
2
|
+
export function formatUsageSummary(summary) {
|
|
3
|
+
const cost = `$${summary.costUsd.toFixed(2)}${summary.costComplete ? "" : "?"}`;
|
|
4
|
+
return `Run ${summary.runId}: ${summary.sessionCount} sessions, ${summary.inputTokens} input / ${summary.outputTokens} output / ${summary.cachedTokens} cached tokens, cost ${cost}`;
|
|
5
|
+
}
|
|
6
|
+
export function registerUsageCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("usage")
|
|
9
|
+
.description("Show aggregated usage for a run")
|
|
10
|
+
.argument("<run-id>", "run id")
|
|
11
|
+
.option("--json", "output the aggregated usage as JSON")
|
|
12
|
+
.action(async (runId, opts) => {
|
|
13
|
+
const client = new IpcClient();
|
|
14
|
+
try {
|
|
15
|
+
await client.ensureDaemonStarted();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error(`Failed to start daemon: ${error instanceof Error ? error.message : String(error)}`);
|
|
19
|
+
process.exitCode = 3;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
let summary;
|
|
23
|
+
try {
|
|
24
|
+
summary = await client.request("usage.get", { runId });
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
28
|
+
process.exitCode = 3;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (opts.json)
|
|
32
|
+
console.log(JSON.stringify(summary));
|
|
33
|
+
else
|
|
34
|
+
console.log(formatUsageSummary(summary));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/cli/commands/usage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOhD,MAAM,UAAU,kBAAkB,CAAC,OAAwB;IACzD,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAChF,OAAO,OAAO,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,YAAY,cAAc,OAAO,CAAC,WAAW,YAAY,OAAO,CAAC,YAAY,aAAa,OAAO,CAAC,YAAY,wBAAwB,IAAI,EAAE,CAAC;AACvL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;SAC9B,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAyB,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,OAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAkB,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;;YAC/C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { IpcClient } from "../../daemon/ipc.js";
|
|
2
|
+
import { getCliInvocation } from "../cli-name.js";
|
|
2
3
|
import { exitCodeForOutcome } from "../../core/errors.js";
|
|
3
4
|
import { waitForSession } from "../wait.js";
|
|
4
5
|
export function formatWaitResult(session) {
|
|
@@ -18,8 +19,8 @@ export function registerWaitCommand(program) {
|
|
|
18
19
|
.option("--json", "output the final session as JSON")
|
|
19
20
|
.addHelpText("after", `
|
|
20
21
|
Examples:
|
|
21
|
-
$
|
|
22
|
-
$
|
|
22
|
+
$ ${getCliInvocation()} wait a83f
|
|
23
|
+
$ ${getCliInvocation()} wait a83f --json
|
|
23
24
|
`)
|
|
24
25
|
.action(async (id, opts) => {
|
|
25
26
|
const client = new IpcClient();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAA0B,MAAM,YAAY,CAAC;AAMpE,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QACrG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO,aAAa,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,aAAa,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8CAA8C,CAAC;SAC3D,QAAQ,CAAC,MAAM,EAAE,wCAAwC,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,kCAAkC,CAAC;SACpD,WAAW,CAAC,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"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"}
|