codedeck 0.2.0 → 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 +45 -16
- 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 +148 -315
- package/dist/cli/commands/open.js.map +1 -1
- 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 +48 -17
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/setup.js +388 -62
- package/dist/cli/commands/setup.js.map +1 -1
- 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 +33 -21
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/picker-state.js +75 -8
- package/dist/cli/picker-state.js.map +1 -1
- package/dist/cli/picker.js +13 -3
- package/dist/cli/picker.js.map +1 -1
- package/dist/cli/ui.js +20 -4
- package/dist/cli/ui.js.map +1 -1
- package/dist/config/config.js +39 -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/pricing.js +65 -0
- package/dist/core/pricing.js.map +1 -0
- package/dist/core/roles.js +14 -3
- package/dist/core/roles.js.map +1 -1
- 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/agents/auditor.md +7 -1
- package/dist/plugin/agents/general.md +12 -1
- package/dist/plugin/agents/orchestrator-edit.md +69 -0
- package/dist/plugin/agents/orchestrator-read.md +69 -0
- package/dist/plugin/agents/orchestrator.md +76 -17
- package/dist/plugin/agents/reviewer.md +3 -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 +214 -22
- package/dist/plugin/themes/codedeck-rage.json +74 -0
- package/dist/plugin/themes/codedeck-ultra.json +52 -44
- 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 +3 -2
- package/dist/plugin/settings.json +0 -7
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { DISPATCHER_PRESET } from "../../config/orchestrator-mode.js";
|
|
5
|
+
import { detectBinary } from "../../drivers/helpers.js";
|
|
6
|
+
import { getRegistry } from "../../drivers/registry.js";
|
|
7
|
+
import { getCachedOrDiscoverModels } from "../../core/models.js";
|
|
8
|
+
import { catalogWarning, judgeModelIn, readUltra } from "../contract.js";
|
|
9
|
+
import { composeOrchestratorProse } from "../orchestrator-prose.js";
|
|
10
|
+
import { errorDetails, sanitizeEnv, shellQuote, spinnerTips, SPINNER_VERBS, } from "../runtime.js";
|
|
11
|
+
export const DEFAULT_MODEL = "claude-opus-4-8";
|
|
12
|
+
export const DEFAULT_EFFORT = "xhigh";
|
|
13
|
+
const PLUGIN_NAME = "codedeck";
|
|
14
|
+
const THEME_REF = `custom:${PLUGIN_NAME}:codedeck-ultra`;
|
|
15
|
+
/**
|
|
16
|
+
* There is no startup text slot worth using, and the two that exist were tried.
|
|
17
|
+
*
|
|
18
|
+
* `companyAnnouncements` renders our string, but Claude Code puts its own dim
|
|
19
|
+
* "Message from <organization>:" above it whenever the account belongs to one,
|
|
20
|
+
* with no way to suppress that from settings. On an account with an org it
|
|
21
|
+
* therefore reads as a message from the employer, which is false.
|
|
22
|
+
*
|
|
23
|
+
* A SessionStart hook can print, but every hook message renders as
|
|
24
|
+
* "<hook> says: <text>", so it cannot draw a clean line either.
|
|
25
|
+
*
|
|
26
|
+
* Nothing is lost by leaving both alone. Claude Code's own opening header
|
|
27
|
+
* already names the model, the effort and the agent, and the footer already
|
|
28
|
+
* says whether permissions are bypassed.
|
|
29
|
+
*/
|
|
30
|
+
export const CLAUDE_NOT_FOUND = "Claude Code was not found on PATH. Install Claude Code and ensure `claude` is available.";
|
|
31
|
+
const execFileAsync = promisify(execFile);
|
|
32
|
+
/**
|
|
33
|
+
* The settings are built here, at launch, rather than shipped as a file, and
|
|
34
|
+
* the reason is the status line.
|
|
35
|
+
*
|
|
36
|
+
* `${CLAUDE_PLUGIN_ROOT}` is expanded only for hooks declared in a plugin's
|
|
37
|
+
* hooks/hooks.json. It is never expanded for statusLine.command: the runner
|
|
38
|
+
* calls its executor with nine arguments where the plugin root sits in the
|
|
39
|
+
* fourteenth, so the check reads undefined and throws "This variable is only
|
|
40
|
+
* available in hooks defined in a plugin's hooks/hooks.json file". The runner
|
|
41
|
+
* swallows that, so the shipped settings.json produced no status line and no
|
|
42
|
+
* error, in any version. `open` knows the real directory, so it writes the
|
|
43
|
+
* resolved path instead of a placeholder nothing will substitute.
|
|
44
|
+
*
|
|
45
|
+
* Building it here also means one definition rather than two: the file that
|
|
46
|
+
* shipped alongside this code was never exercised by a launch, which is exactly
|
|
47
|
+
* how a broken command sat in it unnoticed.
|
|
48
|
+
*/
|
|
49
|
+
export function buildSettings(pluginDir, flags) {
|
|
50
|
+
const statusLine = {
|
|
51
|
+
type: "command",
|
|
52
|
+
command: `bash ${shellQuote(path.join(pluginDir, "statusline.sh"))}`,
|
|
53
|
+
refreshInterval: 2,
|
|
54
|
+
};
|
|
55
|
+
// --no-theme means "do not restyle my session", so it drops the whole look,
|
|
56
|
+
// renderer included, and not just the palette. The status line is the one
|
|
57
|
+
// thing it keeps, because that is what the flag has always promised.
|
|
58
|
+
if (flags.theme === false)
|
|
59
|
+
return { statusLine };
|
|
60
|
+
return {
|
|
61
|
+
theme: THEME_REF,
|
|
62
|
+
tui: "fullscreen",
|
|
63
|
+
spinnerVerbs: { mode: "replace", verbs: SPINNER_VERBS },
|
|
64
|
+
spinnerTipsOverride: { excludeDefault: true, label: "ULTRA", tips: spinnerTips() },
|
|
65
|
+
statusLine,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The session name is what Claude shows on the ruler above the input, in
|
|
70
|
+
* `/resume` and in the window title, so it carries the project folder along
|
|
71
|
+
* with the role. With three terminals open on the same role, the role alone
|
|
72
|
+
* leaves them indistinguishable. The role stays last because the status line
|
|
73
|
+
* reads it off the tail of this same string.
|
|
74
|
+
*/
|
|
75
|
+
export function sessionName(role, cwd) {
|
|
76
|
+
const project = cwd?.split("/").filter(Boolean).at(-1)?.replace(/[\t\r\n]/g, " ").trim();
|
|
77
|
+
if (!project)
|
|
78
|
+
return `CodeDeck · ${role}`;
|
|
79
|
+
return `CodeDeck · ${project} · ${role}`;
|
|
80
|
+
}
|
|
81
|
+
export function buildOpenArgs(role, flags, pluginDir, passthrough, cwd, mode = DISPATCHER_PRESET) {
|
|
82
|
+
const orchestratorProse = role === "orchestrator" ? composeOrchestratorProse(mode) : "";
|
|
83
|
+
const agent = role !== "orchestrator"
|
|
84
|
+
? `${PLUGIN_NAME}:${role}`
|
|
85
|
+
: `${PLUGIN_NAME}:orchestrator${mode.tools === "dispatch" ? "" : `-${mode.tools}`}`;
|
|
86
|
+
const args = [
|
|
87
|
+
"--model",
|
|
88
|
+
flags.model ?? DEFAULT_MODEL,
|
|
89
|
+
"--effort",
|
|
90
|
+
flags.effort ?? DEFAULT_EFFORT,
|
|
91
|
+
// Remote Control is interactive-only. It requires a subscribed Claude
|
|
92
|
+
// account and a prior workspace-trust dialog.
|
|
93
|
+
...(flags.remoteControl !== false ? ["--remote-control"] : []),
|
|
94
|
+
...(flags.bypass !== false ? ["--dangerously-skip-permissions"] : []),
|
|
95
|
+
"--plugin-dir",
|
|
96
|
+
pluginDir,
|
|
97
|
+
...appendSystemPromptArgs(pluginDir, orchestratorProse),
|
|
98
|
+
"--settings",
|
|
99
|
+
JSON.stringify(buildSettings(pluginDir, flags)),
|
|
100
|
+
// `--agent` layers on top of Claude's own system prompt rather than
|
|
101
|
+
// replacing it, and an agent file with no `tools:` key inherits the whole
|
|
102
|
+
// toolset. So `general` carries its contract the same way the others do,
|
|
103
|
+
// with nothing taken away.
|
|
104
|
+
"--agent",
|
|
105
|
+
agent,
|
|
106
|
+
"-n",
|
|
107
|
+
sessionName(role, cwd),
|
|
108
|
+
...(flags.resume ? ["--resume", flags.resume] : []),
|
|
109
|
+
...(flags.worktree ? ["-w"] : []),
|
|
110
|
+
...passthrough,
|
|
111
|
+
];
|
|
112
|
+
return args;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Ultra ships as a file, but Claude Code refuses --append-system-prompt-file
|
|
116
|
+
* together with --append-system-prompt, and an orchestrator preset needs its
|
|
117
|
+
* dynamic prose appended too. With prose the two are merged and handed over
|
|
118
|
+
* inline as the single source Claude allows; without it the file keeps the
|
|
119
|
+
* original, cheaper contract.
|
|
120
|
+
*/
|
|
121
|
+
function appendSystemPromptArgs(pluginDir, prose) {
|
|
122
|
+
if (!prose)
|
|
123
|
+
return ["--append-system-prompt-file", path.join(pluginDir, "ultra.md")];
|
|
124
|
+
return ["--append-system-prompt", `${readUltra(pluginDir).trimEnd()}\n\n${prose}`];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* The claude half of the split: find this harness's catalog, judge it with
|
|
128
|
+
* the shared pure verdict. Kept while the suite pins this shape.
|
|
129
|
+
*/
|
|
130
|
+
export function judgeModel(model, catalogs, fromConfig) {
|
|
131
|
+
return judgeModelIn(catalogs?.find((item) => item.agent === "claude"), model, fromConfig, "Claude");
|
|
132
|
+
}
|
|
133
|
+
export async function preflightModel(model, fromConfig) {
|
|
134
|
+
let catalogs;
|
|
135
|
+
try {
|
|
136
|
+
catalogs = await getCachedOrDiscoverModels(getRegistry(), { agent: "claude" });
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
// A catalog that cannot be reached is not evidence against the model, so
|
|
140
|
+
// this warns and lets the launch decide.
|
|
141
|
+
const details = errorDetails(error);
|
|
142
|
+
console.warn(catalogWarning("Claude", model, `unavailable (${details.text})`));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const verdict = judgeModel(model, catalogs, fromConfig);
|
|
146
|
+
if (verdict.kind === "ok")
|
|
147
|
+
return;
|
|
148
|
+
if (verdict.kind === "unknown-catalog") {
|
|
149
|
+
console.warn(verdict.warning);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
throw new Error(verdict.error);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Returns the resolved path rather than a boolean so everything downstream
|
|
156
|
+
* launches the exact binary that was checked, instead of asking PATH again and
|
|
157
|
+
* hoping it answers the same way.
|
|
158
|
+
*/
|
|
159
|
+
export async function resolveBinary() {
|
|
160
|
+
// detectBinary reports failure in its result and never rejects, so there is
|
|
161
|
+
// nothing here to catch.
|
|
162
|
+
const installation = await detectBinary("claude");
|
|
163
|
+
if (!installation.installed || !installation.path) {
|
|
164
|
+
throw new Error(CLAUDE_NOT_FOUND);
|
|
165
|
+
}
|
|
166
|
+
return installation.path;
|
|
167
|
+
}
|
|
168
|
+
export async function assertSupport(claudeBin, cwd) {
|
|
169
|
+
try {
|
|
170
|
+
await execFileAsync(claudeBin, ["--append-system-prompt-file"], {
|
|
171
|
+
cwd,
|
|
172
|
+
env: sanitizeEnv(process.env),
|
|
173
|
+
timeout: 5000,
|
|
174
|
+
maxBuffer: 1024 * 1024,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
const details = errorDetails(error);
|
|
179
|
+
if (details.code === "ENOENT") {
|
|
180
|
+
throw new Error(CLAUDE_NOT_FOUND);
|
|
181
|
+
}
|
|
182
|
+
if (/unknown option|unknown argument|unrecognized option|invalid option/i.test(details.text)) {
|
|
183
|
+
throw new Error("This Claude Code version does not support --append-system-prompt-file. Upgrade Claude Code and retry.");
|
|
184
|
+
}
|
|
185
|
+
// A supported Commander option reports a missing argument for this probe.
|
|
186
|
+
// Other probe failures are left to the real launch, which can provide the
|
|
187
|
+
// harness-specific diagnostic without blocking a valid installation.
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* The catalog knows which models exist, not which ones this account may use, so
|
|
192
|
+
* an entitlement problem can only be read off the launch itself. Claude Code
|
|
193
|
+
* reports it as a tagged error rather than a distinct exit code.
|
|
194
|
+
*/
|
|
195
|
+
export function entitlementError(model, output) {
|
|
196
|
+
const tag = /\[claude-code:unrecognized_model\]\s*(\{.*\})?/i.exec(output);
|
|
197
|
+
if (!tag)
|
|
198
|
+
return undefined;
|
|
199
|
+
// The passthrough can carry its own --model, which wins over the one CodeDeck
|
|
200
|
+
// resolved, so the name in the payload is the one that was actually rejected.
|
|
201
|
+
let rejected = model;
|
|
202
|
+
if (tag[1]) {
|
|
203
|
+
try {
|
|
204
|
+
const payload = JSON.parse(tag[1]);
|
|
205
|
+
if (typeof payload.model === "string" && payload.model)
|
|
206
|
+
rejected = payload.model;
|
|
207
|
+
}
|
|
208
|
+
catch { }
|
|
209
|
+
}
|
|
210
|
+
return `Claude Code rejected model "${rejected}" because this account is not entitled to it. Check the Claude plan or model access for the account.`;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/open/launchers/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { detectBinary } from "../../drivers/helpers.js";
|
|
5
|
+
import { getRegistry } from "../../drivers/registry.js";
|
|
6
|
+
import { getCachedOrDiscoverModels } from "../../core/models.js";
|
|
7
|
+
import { catalogWarning, judgeModelIn, resolveRoleContract, } from "../contract.js";
|
|
8
|
+
import { DISPATCHER_PRESET } from "../../config/orchestrator-mode.js";
|
|
9
|
+
import { composeOrchestratorProse } from "../orchestrator-prose.js";
|
|
10
|
+
/**
|
|
11
|
+
* Claude `tools:` becomes opencode `permission:`. Every key below was
|
|
12
|
+
* resolved live through `opencode debug agent`: `edit: deny` turns off edit
|
|
13
|
+
* and write, `read: deny` turns off read with bash intact, `task: deny`
|
|
14
|
+
* turns off dispatch, and `"*": "allow"` turns everything on. No role leans
|
|
15
|
+
* on user defaults, so `general` stays unrestricted and the restricted three
|
|
16
|
+
* stay restricted whatever the user configured globally.
|
|
17
|
+
*/
|
|
18
|
+
export function rolePermission(role, mode = DISPATCHER_PRESET) {
|
|
19
|
+
switch (role) {
|
|
20
|
+
case "general":
|
|
21
|
+
return { "*": "allow" };
|
|
22
|
+
case "orchestrator":
|
|
23
|
+
switch (mode.tools) {
|
|
24
|
+
case "dispatch":
|
|
25
|
+
return { read: "deny", edit: "deny", write: "deny", task: "deny", bash: "allow" };
|
|
26
|
+
case "read":
|
|
27
|
+
return { read: "allow", edit: "deny", write: "deny", task: "deny", bash: "allow" };
|
|
28
|
+
case "edit":
|
|
29
|
+
return { read: "allow", edit: "allow", write: "allow", task: "deny", bash: "allow" };
|
|
30
|
+
}
|
|
31
|
+
case "reviewer":
|
|
32
|
+
return { edit: "deny", write: "deny", task: "deny", bash: "allow" };
|
|
33
|
+
case "auditor":
|
|
34
|
+
return { edit: "deny", write: "deny", task: "allow", bash: "allow" };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function agentName(role) {
|
|
38
|
+
return `codedeck-${role}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The whole opencode contract as one `OPENCODE_CONFIG_CONTENT` value: global
|
|
42
|
+
* instructions from ultra plus the role agent carrying its prompt and
|
|
43
|
+
* permission map. Pure and file-free: nothing lands in `~/.config/opencode`
|
|
44
|
+
* or tmp, so there is nothing to clean up and concurrent opens share nothing.
|
|
45
|
+
*/
|
|
46
|
+
export function buildInlineConfig(pluginDir, role, mode = DISPATCHER_PRESET) {
|
|
47
|
+
const { agentBody, ultra } = resolveRoleContract(pluginDir, role);
|
|
48
|
+
const orchestratorProse = role === "orchestrator" ? composeOrchestratorProse(mode) : "";
|
|
49
|
+
return JSON.stringify({
|
|
50
|
+
instructions: [ultra],
|
|
51
|
+
agent: {
|
|
52
|
+
[agentName(role)]: {
|
|
53
|
+
mode: "primary",
|
|
54
|
+
description: `CodeDeck ${role}`,
|
|
55
|
+
prompt: orchestratorProse ? `${agentBody}\n\n${orchestratorProse}` : agentBody,
|
|
56
|
+
permission: rolePermission(role, mode),
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const MODEL_SHAPE = /^[^/\s]+\/[^/\s]+$/;
|
|
62
|
+
export function buildArgs(role, flags, passthrough) {
|
|
63
|
+
if (!MODEL_SHAPE.test(flags.model)) {
|
|
64
|
+
throw new Error(`Model "${flags.model}" must be provider/model for opencode (e.g. anthropic/claude-sonnet-4-6).`);
|
|
65
|
+
}
|
|
66
|
+
return [
|
|
67
|
+
"--agent",
|
|
68
|
+
agentName(role),
|
|
69
|
+
"--model",
|
|
70
|
+
flags.model,
|
|
71
|
+
// --auto mirrors the claude bypass default; --no-bypass drops it. Effort
|
|
72
|
+
// has no opencode equivalent in this scope and stays unmapped.
|
|
73
|
+
...(flags.bypass !== false ? ["--auto"] : []),
|
|
74
|
+
...(flags.resume ? ["--session", flags.resume] : []),
|
|
75
|
+
...passthrough,
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
export const OPENCODE_NOT_FOUND = "Opencode was not found on PATH. Install opencode and ensure `opencode` is available.";
|
|
79
|
+
/**
|
|
80
|
+
* The opencode half of the CodeDeck look. The name answers to the theme file
|
|
81
|
+
* basename: `codedeck-rage.json` selected as `codedeck-rage`, the same rule
|
|
82
|
+
* the Claude side pins for its own slug.
|
|
83
|
+
*/
|
|
84
|
+
export const OPENCODE_THEME_NAME = "codedeck-rage";
|
|
85
|
+
const OPENCODE_THEME_FILE = `${OPENCODE_THEME_NAME}.json`;
|
|
86
|
+
/**
|
|
87
|
+
* Where opencode discovers custom theme files. Project directories come
|
|
88
|
+
* first at runtime, but a launch must not write into the user's checkout,
|
|
89
|
+
* so the managed copy lives here, next to the user's own themes.
|
|
90
|
+
*/
|
|
91
|
+
export function userThemesDir(home = os.homedir(), xdgConfigHome = process.env.XDG_CONFIG_HOME) {
|
|
92
|
+
const configHome = xdgConfigHome && xdgConfigHome.length > 0
|
|
93
|
+
? xdgConfigHome
|
|
94
|
+
: path.join(home, ".config");
|
|
95
|
+
return path.join(configHome, "opencode", "themes");
|
|
96
|
+
}
|
|
97
|
+
/** The per-session TUI selection, as an ephemeral config dir understands it. */
|
|
98
|
+
export function buildTuiConfig() {
|
|
99
|
+
return JSON.stringify({
|
|
100
|
+
$schema: "https://opencode.ai/tui.json",
|
|
101
|
+
theme: OPENCODE_THEME_NAME,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Installs the managed theme file when it is missing or stale. Returns
|
|
106
|
+
* whether the theme can be selected: a read-only home or a broken plugin
|
|
107
|
+
* directory falls back to the user's own theme instead of failing the launch.
|
|
108
|
+
*/
|
|
109
|
+
export function ensureOpencodeTheme(pluginDir, themesDir = userThemesDir()) {
|
|
110
|
+
try {
|
|
111
|
+
const wanted = fs.readFileSync(path.join(pluginDir, "themes", OPENCODE_THEME_FILE), "utf8");
|
|
112
|
+
const target = path.join(themesDir, OPENCODE_THEME_FILE);
|
|
113
|
+
let current;
|
|
114
|
+
try {
|
|
115
|
+
current = fs.readFileSync(target, "utf8");
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
current = undefined;
|
|
119
|
+
}
|
|
120
|
+
if (current !== wanted) {
|
|
121
|
+
fs.mkdirSync(themesDir, { recursive: true });
|
|
122
|
+
fs.writeFileSync(target, wanted);
|
|
123
|
+
}
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* A config dir holding only the TUI selection. The main contract still
|
|
132
|
+
* travels through OPENCODE_CONFIG_CONTENT, which merges with every config
|
|
133
|
+
* dir, so this stays a one-file directory with nothing to drift.
|
|
134
|
+
*/
|
|
135
|
+
export function createEphemeralTuiDir() {
|
|
136
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "codedeck-opencode-"));
|
|
137
|
+
fs.writeFileSync(path.join(dir, "tui.json"), buildTuiConfig());
|
|
138
|
+
return dir;
|
|
139
|
+
}
|
|
140
|
+
export function removeEphemeralTuiDir(dir) {
|
|
141
|
+
try {
|
|
142
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
143
|
+
}
|
|
144
|
+
catch { }
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Returns the resolved path rather than a boolean so everything downstream
|
|
148
|
+
* launches the exact binary that was checked.
|
|
149
|
+
*/
|
|
150
|
+
export async function resolveBinary() {
|
|
151
|
+
const installation = await detectBinary("opencode");
|
|
152
|
+
if (!installation.installed || !installation.path) {
|
|
153
|
+
throw new Error(OPENCODE_NOT_FOUND);
|
|
154
|
+
}
|
|
155
|
+
return installation.path;
|
|
156
|
+
}
|
|
157
|
+
export async function preflight(model, fromConfig) {
|
|
158
|
+
let catalogs;
|
|
159
|
+
try {
|
|
160
|
+
catalogs = await getCachedOrDiscoverModels(getRegistry(), { agent: "opencode" });
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
// A catalog that cannot be reached is not evidence against the model, so
|
|
164
|
+
// this warns and lets the launch decide.
|
|
165
|
+
const text = error instanceof Error ? error.message : String(error);
|
|
166
|
+
console.warn(catalogWarning("opencode", model, `unavailable (${text})`));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const verdict = judgeModelIn(catalogs?.find((item) => item.agent === "opencode"), model, fromConfig, "opencode");
|
|
170
|
+
if (verdict.kind === "ok")
|
|
171
|
+
return;
|
|
172
|
+
if (verdict.kind === "unknown-catalog") {
|
|
173
|
+
console.warn(verdict.warning);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
throw new Error(verdict.error);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/open/launchers/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function composeOrchestratorProse(mode) {
|
|
2
|
+
const lines = [];
|
|
3
|
+
if (mode.investigate !== "none" || mode.selfWork !== "none") {
|
|
4
|
+
lines.push(`Investigation allowance: ${mode.investigate}.`);
|
|
5
|
+
lines.push(`Self-work allowance: ${mode.selfWork}.`);
|
|
6
|
+
}
|
|
7
|
+
if (mode.parallelism !== undefined) {
|
|
8
|
+
lines.push(`Run at most ${mode.parallelism} workers concurrently.`);
|
|
9
|
+
}
|
|
10
|
+
return lines.join("\n");
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=orchestrator-prose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-prose.js","sourceRoot":"","sources":["../../src/open/orchestrator-prose.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CAAC,IAAsB;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,wBAAwB,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|