claude-tempo 0.20.1 → 0.21.1
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/dist/activities/outbox.d.ts +6 -0
- package/dist/activities/outbox.js +3 -2
- package/dist/cli/commands.js +8 -4
- package/dist/cli/config-command.js +3 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +5 -0
- package/dist/spawn.d.ts +14 -3
- package/dist/spawn.js +27 -6
- package/dist/tools/encore.js +1 -0
- package/dist/tools/load-lineup.js +1 -0
- package/dist/tools/recruit.js +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/workflows/session.js +3 -0
- package/package.json +1 -1
- package/workflow-bundle.js +4 -1
|
@@ -31,6 +31,8 @@ export interface StartRecruitedSessionInput {
|
|
|
31
31
|
agentDefinition?: string;
|
|
32
32
|
agentDefinitionDescription?: string;
|
|
33
33
|
allowedTools?: string[];
|
|
34
|
+
/** Custom claude binary path (from config.claudeBin). */
|
|
35
|
+
claudeBin?: string;
|
|
34
36
|
}
|
|
35
37
|
export interface SpawnProcessInput {
|
|
36
38
|
targetName: string;
|
|
@@ -50,6 +52,8 @@ export interface SpawnProcessInput {
|
|
|
50
52
|
claudeSessionId?: string;
|
|
51
53
|
/** Tool restrictions from the agent definition frontmatter. */
|
|
52
54
|
allowedTools?: string[];
|
|
55
|
+
/** Custom claude binary path (from config.claudeBin). */
|
|
56
|
+
claudeBin?: string;
|
|
53
57
|
}
|
|
54
58
|
export interface PerformEncoreInput {
|
|
55
59
|
ensemble: string;
|
|
@@ -70,6 +74,8 @@ export interface EncoreResult {
|
|
|
70
74
|
claudeSessionId?: string;
|
|
71
75
|
temporalAddress: string;
|
|
72
76
|
temporalNamespace: string;
|
|
77
|
+
/** Custom claude binary path (from config.claudeBin). */
|
|
78
|
+
claudeBin?: string;
|
|
73
79
|
}
|
|
74
80
|
export interface OutboxActivityResult {
|
|
75
81
|
success: boolean;
|
|
@@ -157,7 +157,7 @@ function createOutboxActivities(client, config) {
|
|
|
157
157
|
}
|
|
158
158
|
},
|
|
159
159
|
async spawnProcess(input) {
|
|
160
|
-
const { targetName, workDir, isConductor, agent, systemPrompt, ensemble, temporalAddress, temporalNamespace, agentDefinition, agentDefinitionPath, nativeResolvable, resume, claudeSessionId, allowedTools } = input;
|
|
160
|
+
const { targetName, workDir, isConductor, agent, systemPrompt, ensemble, temporalAddress, temporalNamespace, agentDefinition, agentDefinitionPath, nativeResolvable, resume, claudeSessionId, allowedTools, claudeBin } = input;
|
|
161
161
|
// Read secrets from the worker's config closure — never from workflow state
|
|
162
162
|
const { temporalApiKey, temporalTlsCertPath, temporalTlsKeyPath } = config;
|
|
163
163
|
try {
|
|
@@ -222,7 +222,7 @@ function createOutboxActivities(client, config) {
|
|
|
222
222
|
envVars[config_2.ENV.TEMPORAL_TLS_CERT_PATH] = temporalTlsCertPath;
|
|
223
223
|
if (temporalTlsKeyPath)
|
|
224
224
|
envVars[config_2.ENV.TEMPORAL_TLS_KEY_PATH] = temporalTlsKeyPath;
|
|
225
|
-
const { pid } = (0, spawn_1.spawnInTerminal)(spawnArgs, workDir, envVars);
|
|
225
|
+
const { pid } = (0, spawn_1.spawnInTerminal)(spawnArgs, workDir, envVars, { claudeBin });
|
|
226
226
|
log(`Spawned claude process (pid ${pid}) in ${workDir} as "${targetName}" (resume=${!!resume})`);
|
|
227
227
|
}
|
|
228
228
|
return { success: true };
|
|
@@ -299,6 +299,7 @@ function createOutboxActivities(client, config) {
|
|
|
299
299
|
claudeSessionId: metadata.claudeSessionId || undefined,
|
|
300
300
|
temporalAddress: config.temporalAddress,
|
|
301
301
|
temporalNamespace: config.temporalNamespace,
|
|
302
|
+
claudeBin: config.claudeBin,
|
|
302
303
|
};
|
|
303
304
|
}
|
|
304
305
|
catch (err) {
|
package/dist/cli/commands.js
CHANGED
|
@@ -178,6 +178,8 @@ async function start(opts) {
|
|
|
178
178
|
temporalEnvVars[config_1.ENV.TEMPORAL_TLS_CERT_PATH] = config.temporalTlsCertPath;
|
|
179
179
|
if (config.temporalTlsKeyPath)
|
|
180
180
|
temporalEnvVars[config_1.ENV.TEMPORAL_TLS_KEY_PATH] = config.temporalTlsKeyPath;
|
|
181
|
+
if (config.claudeBin)
|
|
182
|
+
temporalEnvVars[config_1.ENV.CLAUDE_BIN] = config.claudeBin;
|
|
181
183
|
if (opts.agent === 'copilot') {
|
|
182
184
|
const { pid } = (0, spawn_1.spawnCopilotBridge)({
|
|
183
185
|
name: opts.name || `copilot-${Date.now()}`,
|
|
@@ -212,7 +214,7 @@ async function start(opts) {
|
|
|
212
214
|
[config_1.ENV.CONDUCTOR]: opts.conductor ? 'true' : '',
|
|
213
215
|
[config_1.ENV.PLAYER_NAME]: sessionName || '',
|
|
214
216
|
};
|
|
215
|
-
const { pid } = (0, spawn_1.spawnInTerminal)(claudeArgs, workDir, envVars);
|
|
217
|
+
const { pid } = (0, spawn_1.spawnInTerminal)(claudeArgs, workDir, envVars, { claudeBin: config.claudeBin });
|
|
216
218
|
out.success(`Launched ${role} session${sessionName ? ` "${sessionName}"` : ''} (pid ${pid ?? 'unknown'})`);
|
|
217
219
|
}
|
|
218
220
|
out.log(` Ensemble: ${opts.ensemble}`);
|
|
@@ -841,7 +843,7 @@ async function up(opts) {
|
|
|
841
843
|
if (resolvedConductorType || conductorTypeName) {
|
|
842
844
|
conductorEnvVars[config_1.ENV.PLAYER_TYPE] = resolvedConductorType?.name || conductorTypeName || '';
|
|
843
845
|
}
|
|
844
|
-
({ pid } = (0, spawn_1.spawnInTerminal)(claudeArgs, process.cwd(), conductorEnvVars));
|
|
846
|
+
({ pid } = (0, spawn_1.spawnInTerminal)(claudeArgs, process.cwd(), conductorEnvVars, { claudeBin: config.claudeBin }));
|
|
845
847
|
}
|
|
846
848
|
out.success(`Conductor launched (pid ${pid ?? 'unknown'})`);
|
|
847
849
|
// Step 6: If lineup provided, recruit players and create schedules
|
|
@@ -946,7 +948,7 @@ async function up(opts) {
|
|
|
946
948
|
if (resolvedPlayerType) {
|
|
947
949
|
playerEnvVars[config_1.ENV.PLAYER_TYPE] = resolvedPlayerType.name;
|
|
948
950
|
}
|
|
949
|
-
(0, spawn_1.spawnInTerminal)(claudeArgs, playerWorkDir, playerEnvVars);
|
|
951
|
+
(0, spawn_1.spawnInTerminal)(claudeArgs, playerWorkDir, playerEnvVars, { claudeBin: config.claudeBin });
|
|
950
952
|
}
|
|
951
953
|
out.log(` ${out.green('ok')} ${out.bold(player.name)} in ${playerWorkDir}`);
|
|
952
954
|
}
|
|
@@ -1765,7 +1767,9 @@ async function encore(opts) {
|
|
|
1765
1767
|
envVars[config_1.ENV.TEMPORAL_TLS_CERT_PATH] = config.temporalTlsCertPath;
|
|
1766
1768
|
if (config.temporalTlsKeyPath)
|
|
1767
1769
|
envVars[config_1.ENV.TEMPORAL_TLS_KEY_PATH] = config.temporalTlsKeyPath;
|
|
1768
|
-
|
|
1770
|
+
if (config.claudeBin)
|
|
1771
|
+
envVars[config_1.ENV.CLAUDE_BIN] = config.claudeBin;
|
|
1772
|
+
const { pid } = (0, spawn_1.spawnInTerminal)(spawnArgs, targetMeta.workDir, envVars, { claudeBin: config.claudeBin });
|
|
1769
1773
|
out.success(`Encore! "${opts.name}" revived (pid ${pid})`);
|
|
1770
1774
|
await connection.close();
|
|
1771
1775
|
}
|
|
@@ -173,6 +173,8 @@ function configSet(key, value) {
|
|
|
173
173
|
'temporal-tls-key-path': 'temporalTlsKeyPath',
|
|
174
174
|
defaultAgent: 'defaultAgent',
|
|
175
175
|
'default-agent': 'defaultAgent',
|
|
176
|
+
claudeBin: 'claudeBin',
|
|
177
|
+
'claude-bin': 'claudeBin',
|
|
176
178
|
};
|
|
177
179
|
const configKey = keyMap[key];
|
|
178
180
|
if (!configKey) {
|
|
@@ -200,6 +202,7 @@ function configShow() {
|
|
|
200
202
|
{ key: 'temporalTlsCertPath', configKey: 'temporalTlsCertPath' },
|
|
201
203
|
{ key: 'temporalTlsKeyPath', configKey: 'temporalTlsKeyPath' },
|
|
202
204
|
{ key: 'defaultAgent', configKey: 'defaultAgent' },
|
|
205
|
+
{ key: 'claudeBin', configKey: 'claudeBin' },
|
|
203
206
|
];
|
|
204
207
|
out.log(` Config file: ${out.dim(config_1.CONFIG_FILE_PATH)}`);
|
|
205
208
|
console.log();
|
package/dist/config.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export declare const ENV: {
|
|
|
15
15
|
readonly TEMPORAL_TLS_KEY_PATH: "TEMPORAL_TLS_KEY_PATH";
|
|
16
16
|
readonly DEFAULT_AGENT: "CLAUDE_TEMPO_DEFAULT_AGENT";
|
|
17
17
|
readonly PLAYER_TYPE: "CLAUDE_TEMPO_PLAYER_TYPE";
|
|
18
|
+
readonly CLAUDE_BIN: "CLAUDE_TEMPO_CLAUDE_BIN";
|
|
18
19
|
};
|
|
19
20
|
export interface Config {
|
|
20
21
|
temporalAddress: string;
|
|
@@ -23,6 +24,7 @@ export interface Config {
|
|
|
23
24
|
temporalTlsCertPath?: string;
|
|
24
25
|
temporalTlsKeyPath?: string;
|
|
25
26
|
defaultAgent: AgentType;
|
|
27
|
+
claudeBin?: string;
|
|
26
28
|
taskQueue: string;
|
|
27
29
|
ensemble: string;
|
|
28
30
|
}
|
|
@@ -34,6 +36,7 @@ export interface PersistedConfig {
|
|
|
34
36
|
temporalTlsCertPath?: string;
|
|
35
37
|
temporalTlsKeyPath?: string;
|
|
36
38
|
defaultAgent?: AgentType;
|
|
39
|
+
claudeBin?: string;
|
|
37
40
|
}
|
|
38
41
|
export declare const CLAUDE_TEMPO_HOME: string;
|
|
39
42
|
export declare const CONFIG_FILE_PATH: string;
|
package/dist/config.js
CHANGED
|
@@ -36,6 +36,7 @@ exports.ENV = {
|
|
|
36
36
|
TEMPORAL_TLS_KEY_PATH: 'TEMPORAL_TLS_KEY_PATH',
|
|
37
37
|
DEFAULT_AGENT: 'CLAUDE_TEMPO_DEFAULT_AGENT',
|
|
38
38
|
PLAYER_TYPE: 'CLAUDE_TEMPO_PLAYER_TYPE',
|
|
39
|
+
CLAUDE_BIN: 'CLAUDE_TEMPO_CLAUDE_BIN',
|
|
39
40
|
};
|
|
40
41
|
exports.CLAUDE_TEMPO_HOME = (0, path_1.join)((0, os_1.homedir)(), '.claude-tempo');
|
|
41
42
|
exports.CONFIG_FILE_PATH = (0, path_1.join)(exports.CLAUDE_TEMPO_HOME, 'config.json');
|
|
@@ -192,6 +193,7 @@ function getConfig(overrides = {}) {
|
|
|
192
193
|
defaultAgent: validAgent(overrides.defaultAgent
|
|
193
194
|
|| process.env[exports.ENV.DEFAULT_AGENT]
|
|
194
195
|
|| configFile.defaultAgent),
|
|
196
|
+
claudeBin: process.env[exports.ENV.CLAUDE_BIN] || configFile.claudeBin || undefined,
|
|
195
197
|
taskQueue: process.env[exports.ENV.TASK_QUEUE] ?? 'claude-tempo',
|
|
196
198
|
ensemble: process.env[exports.ENV.ENSEMBLE] ?? 'default',
|
|
197
199
|
};
|
|
@@ -227,6 +229,7 @@ function getConfigWithSources(overrides = {}) {
|
|
|
227
229
|
const tlsCert = resolveWithSource('temporalTlsCertPath', overrides.temporalTlsCertPath, exports.ENV.TEMPORAL_TLS_CERT_PATH, configFile.temporalTlsCertPath, temporalCli.temporalTlsCertPath);
|
|
228
230
|
const tlsKey = resolveWithSource('temporalTlsKeyPath', overrides.temporalTlsKeyPath, exports.ENV.TEMPORAL_TLS_KEY_PATH, configFile.temporalTlsKeyPath, temporalCli.temporalTlsKeyPath);
|
|
229
231
|
const defaultAgent = resolveWithSource('defaultAgent', overrides.defaultAgent, exports.ENV.DEFAULT_AGENT, configFile.defaultAgent, undefined, 'claude');
|
|
232
|
+
const claudeBin = resolveWithSource('claudeBin', undefined, exports.ENV.CLAUDE_BIN, configFile.claudeBin, undefined);
|
|
230
233
|
return {
|
|
231
234
|
config: {
|
|
232
235
|
temporalAddress: address.value,
|
|
@@ -235,6 +238,7 @@ function getConfigWithSources(overrides = {}) {
|
|
|
235
238
|
temporalTlsCertPath: tlsCert.value,
|
|
236
239
|
temporalTlsKeyPath: tlsKey.value,
|
|
237
240
|
defaultAgent: validAgent(defaultAgent.value),
|
|
241
|
+
claudeBin: claudeBin.value,
|
|
238
242
|
taskQueue: process.env[exports.ENV.TASK_QUEUE] ?? 'claude-tempo',
|
|
239
243
|
ensemble: process.env[exports.ENV.ENSEMBLE] ?? 'default',
|
|
240
244
|
},
|
|
@@ -245,6 +249,7 @@ function getConfigWithSources(overrides = {}) {
|
|
|
245
249
|
temporalTlsCertPath: tlsCert.source,
|
|
246
250
|
temporalTlsKeyPath: tlsKey.source,
|
|
247
251
|
defaultAgent: defaultAgent.source,
|
|
252
|
+
claudeBin: claudeBin.source,
|
|
248
253
|
},
|
|
249
254
|
};
|
|
250
255
|
}
|
package/dist/spawn.d.ts
CHANGED
|
@@ -10,8 +10,17 @@ export declare function resolveIconPath(): string;
|
|
|
10
10
|
export declare function ensureWindowsTerminalProfile(): boolean;
|
|
11
11
|
/** POSIX shell-safe single-quoting (works in bash, zsh, and fish) */
|
|
12
12
|
export declare function shellQuote(s: string): string;
|
|
13
|
-
/**
|
|
14
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Resolve the path to the `claude` binary.
|
|
15
|
+
*
|
|
16
|
+
* Resolution order:
|
|
17
|
+
* 1. `configBin` parameter (from Config.claudeBin — env var or config file)
|
|
18
|
+
* 2. `CLAUDE_TEMPO_CLAUDE_BIN` env var (checked directly for spawned processes that
|
|
19
|
+
* may not have full config resolution, e.g., activities)
|
|
20
|
+
* 3. `which claude` / `where claude` lookup
|
|
21
|
+
* 4. Bare `claude` fallback
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveClaudePath(configBin?: string): string;
|
|
15
24
|
/**
|
|
16
25
|
* Detect the macOS terminal the user is actually running in.
|
|
17
26
|
*
|
|
@@ -38,7 +47,9 @@ export declare function buildClaudeCommand(claudeBin: string, claudeArgs: string
|
|
|
38
47
|
* - Windows: shell:true with env vars
|
|
39
48
|
* - Linux: terminal emulator with -e flag
|
|
40
49
|
*/
|
|
41
|
-
export declare function spawnInTerminal(claudeArgs: string[], workDir: string, envVars: Record<string, string
|
|
50
|
+
export declare function spawnInTerminal(claudeArgs: string[], workDir: string, envVars: Record<string, string>, options?: {
|
|
51
|
+
claudeBin?: string;
|
|
52
|
+
}): {
|
|
42
53
|
pid: number | undefined;
|
|
43
54
|
};
|
|
44
55
|
export interface CopilotBridgeOpts {
|
package/dist/spawn.js
CHANGED
|
@@ -130,8 +130,25 @@ function ensureWindowsTerminalProfile() {
|
|
|
130
130
|
function shellQuote(s) {
|
|
131
131
|
return `'${s.replace(/'/g, "'\\''")}'`;
|
|
132
132
|
}
|
|
133
|
-
/**
|
|
134
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Resolve the path to the `claude` binary.
|
|
135
|
+
*
|
|
136
|
+
* Resolution order:
|
|
137
|
+
* 1. `configBin` parameter (from Config.claudeBin — env var or config file)
|
|
138
|
+
* 2. `CLAUDE_TEMPO_CLAUDE_BIN` env var (checked directly for spawned processes that
|
|
139
|
+
* may not have full config resolution, e.g., activities)
|
|
140
|
+
* 3. `which claude` / `where claude` lookup
|
|
141
|
+
* 4. Bare `claude` fallback
|
|
142
|
+
*/
|
|
143
|
+
function resolveClaudePath(configBin) {
|
|
144
|
+
// Priority 1: explicit config value
|
|
145
|
+
if (configBin)
|
|
146
|
+
return configBin;
|
|
147
|
+
// Priority 2: env var (may be set by parent process)
|
|
148
|
+
const envBin = process.env.CLAUDE_TEMPO_CLAUDE_BIN;
|
|
149
|
+
if (envBin)
|
|
150
|
+
return envBin;
|
|
151
|
+
// Priority 3: which/where lookup
|
|
135
152
|
const cmd = process.platform === 'win32' ? 'where' : 'which';
|
|
136
153
|
try {
|
|
137
154
|
return (0, child_process_1.execFileSync)(cmd, ['claude'], { encoding: 'utf8' }).trim().split('\n')[0];
|
|
@@ -205,8 +222,10 @@ function buildClaudeCommand(claudeBin, claudeArgs, envVars) {
|
|
|
205
222
|
const envInline = Object.entries(envVars)
|
|
206
223
|
.map(([k, v]) => `${k}=${shellQuote(v)}`)
|
|
207
224
|
.join(' ');
|
|
225
|
+
// Quote the binary path if it contains spaces (e.g., "C:\Program Files\...")
|
|
226
|
+
const quotedBin = claudeBin.includes(' ') ? shellQuote(claudeBin) : claudeBin;
|
|
208
227
|
const args = claudeArgs.map(a => shellQuote(a)).join(' ');
|
|
209
|
-
return envInline ? `${envInline} ${
|
|
228
|
+
return envInline ? `${envInline} ${quotedBin} ${args}` : `${quotedBin} ${args}`;
|
|
210
229
|
}
|
|
211
230
|
/**
|
|
212
231
|
* Spawn a Claude Code session in a visible terminal window.
|
|
@@ -218,8 +237,8 @@ function buildClaudeCommand(claudeBin, claudeArgs, envVars) {
|
|
|
218
237
|
* - Windows: shell:true with env vars
|
|
219
238
|
* - Linux: terminal emulator with -e flag
|
|
220
239
|
*/
|
|
221
|
-
function spawnInTerminal(claudeArgs, workDir, envVars) {
|
|
222
|
-
const claudeBin = resolveClaudePath();
|
|
240
|
+
function spawnInTerminal(claudeArgs, workDir, envVars, options) {
|
|
241
|
+
const claudeBin = resolveClaudePath(options?.claudeBin);
|
|
223
242
|
const claudeInvocation = buildClaudeCommand(claudeBin, claudeArgs, envVars);
|
|
224
243
|
if (process.platform === 'darwin') {
|
|
225
244
|
const detected = detectMacTerminal();
|
|
@@ -308,7 +327,9 @@ function spawnInTerminal(claudeArgs, workDir, envVars) {
|
|
|
308
327
|
const setCmds = Object.entries(envVars)
|
|
309
328
|
.map(([k, v]) => `set "${k}=${cmdEscape(v)}"`)
|
|
310
329
|
.join(' && ');
|
|
311
|
-
|
|
330
|
+
// Quote the binary path if it contains spaces (e.g., "C:\Program Files\...")
|
|
331
|
+
const quotedWinBin = claudeBin.includes(' ') ? `"${cmdEscape(claudeBin)}"` : cmdEscape(claudeBin);
|
|
332
|
+
const claudeCmd = `${quotedWinBin} ${claudeArgs.map(a => `"${cmdEscape(a)}"`).join(' ')}`;
|
|
312
333
|
const innerCmd = setCmds
|
|
313
334
|
? `${setCmds} && ${claudeCmd}`
|
|
314
335
|
: claudeCmd;
|
package/dist/tools/encore.js
CHANGED
|
@@ -44,6 +44,7 @@ function registerEncoreTool(server, client, config, getPlayerId, handle) {
|
|
|
44
44
|
targetPlayerId: playerId,
|
|
45
45
|
targetHostname: host,
|
|
46
46
|
contextMessageCount: contextMessages,
|
|
47
|
+
claudeBin: config.claudeBin,
|
|
47
48
|
};
|
|
48
49
|
const entryId = await handle.executeUpdate(signals_1.submitOutboxUpdate, { args: [entry] });
|
|
49
50
|
return (0, helpers_1.ok)(`Encore request submitted for **${playerId}**. The session will be revived with context restored. (outbox: ${entryId})`);
|
|
@@ -156,6 +156,7 @@ function registerLoadLineupTool(server, client, config, getPlayerId, ownAgentTyp
|
|
|
156
156
|
agentDefinitionDescription: resolvedType?.description,
|
|
157
157
|
nativeResolvable: resolvedType?.nativeResolvable,
|
|
158
158
|
allowedTools: player.allowedTools,
|
|
159
|
+
claudeBin: config.claudeBin,
|
|
159
160
|
};
|
|
160
161
|
await handle.executeUpdate(signals_1.submitOutboxUpdate, { args: [entry] });
|
|
161
162
|
recruited.push(playerName);
|
package/dist/tools/recruit.js
CHANGED
|
@@ -118,6 +118,7 @@ function registerRecruitTool(server, client, config, getPlayerId, handle, ownAge
|
|
|
118
118
|
agentDefinitionDescription,
|
|
119
119
|
nativeResolvable,
|
|
120
120
|
allowedTools,
|
|
121
|
+
claudeBin: config.claudeBin,
|
|
121
122
|
};
|
|
122
123
|
const entryId = await handle.executeUpdate(signals_1.submitOutboxUpdate, { args: [entry] });
|
|
123
124
|
return (0, helpers_1.ok)(`Recruit request submitted for **${name}** in ${workDir}. The session will be spawned shortly. (outbox: ${entryId})`);
|
package/dist/types.d.ts
CHANGED
|
@@ -127,6 +127,8 @@ export interface RecruitOutboxEntry extends OutboxEntryBase {
|
|
|
127
127
|
nativeResolvable?: boolean;
|
|
128
128
|
/** Tool restrictions from the agent definition frontmatter. */
|
|
129
129
|
allowedTools?: string[];
|
|
130
|
+
/** Custom claude binary path (from config.claudeBin). */
|
|
131
|
+
claudeBin?: string;
|
|
130
132
|
}
|
|
131
133
|
export interface ReportOutboxEntry extends OutboxEntryBase {
|
|
132
134
|
type: 'report';
|
|
@@ -142,6 +144,8 @@ export interface EncoreOutboxEntry extends OutboxEntryBase {
|
|
|
142
144
|
targetPlayerId: string;
|
|
143
145
|
targetHostname?: string;
|
|
144
146
|
contextMessageCount?: number;
|
|
147
|
+
/** Custom claude binary path (from config.claudeBin). */
|
|
148
|
+
claudeBin?: string;
|
|
145
149
|
}
|
|
146
150
|
export type OutboxEntry = CueOutboxEntry | RecruitOutboxEntry | ReportOutboxEntry | StopOutboxEntry | EncoreOutboxEntry;
|
|
147
151
|
/** Distributive Omit that works correctly on union types. */
|
|
@@ -452,6 +452,7 @@ async function claudeSessionWorkflow(input) {
|
|
|
452
452
|
agentDefinition: entry.agentDefinition,
|
|
453
453
|
agentDefinitionDescription: entry.agentDefinitionDescription,
|
|
454
454
|
allowedTools: entry.allowedTools,
|
|
455
|
+
claudeBin: entry.claudeBin,
|
|
455
456
|
});
|
|
456
457
|
const targetHost = entry.targetHostname || input.metadata.hostname;
|
|
457
458
|
const spawnFn = getSpawnProxy(targetHost);
|
|
@@ -469,6 +470,7 @@ async function claudeSessionWorkflow(input) {
|
|
|
469
470
|
nativeResolvable: entry.nativeResolvable,
|
|
470
471
|
claudeSessionId: recruitResult.claudeSessionId,
|
|
471
472
|
allowedTools: entry.allowedTools,
|
|
473
|
+
claudeBin: entry.claudeBin,
|
|
472
474
|
});
|
|
473
475
|
break;
|
|
474
476
|
}
|
|
@@ -496,6 +498,7 @@ async function claudeSessionWorkflow(input) {
|
|
|
496
498
|
allowedTools: encoreResult.allowedTools,
|
|
497
499
|
claudeSessionId: encoreResult.claudeSessionId,
|
|
498
500
|
resume: true,
|
|
501
|
+
claudeBin: entry.claudeBin || encoreResult.claudeBin,
|
|
499
502
|
});
|
|
500
503
|
}
|
|
501
504
|
catch (spawnErr) {
|