agent-relay-runner 0.93.0 → 0.94.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-relay-runner",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.94.0",
|
|
4
4
|
"description": "Unified provider lifecycle runner for Agent Relay",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"directory": "runner"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"agent-relay-sdk": "0.2.
|
|
23
|
+
"agent-relay-sdk": "0.2.74"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/bun": "latest",
|
package/src/launch-assembly.ts
CHANGED
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
hostUserScopeMcpServers,
|
|
13
13
|
profileUsesClaudeHostProviderGlobals,
|
|
14
14
|
providerHomePathFor,
|
|
15
|
+
providerProvisioningHomePathFor,
|
|
15
16
|
} from "./profile-home";
|
|
16
17
|
import { claudeLaunchPromptGateSettings } from "./claude-prompt-gates";
|
|
17
18
|
import {
|
|
@@ -226,6 +227,7 @@ function assembleInstructions(config: RunnerSpawnConfig): AssembledInstructions
|
|
|
226
227
|
|
|
227
228
|
function assembleClaude(config: RunnerSpawnConfig, providerConfig: ProviderConfig, hostDefaultArgs: string[]): AssembledLaunch {
|
|
228
229
|
const configHome = providerHomePathFor("claude", config);
|
|
230
|
+
const assetHome = providerProvisioningHomePathFor("claude", config);
|
|
229
231
|
const vanilla = profileIsVanillaBase(config);
|
|
230
232
|
const projectConfigProjection = claudeProjectConfigProjectionOn(config);
|
|
231
233
|
const relayPlugin = profileAllowsRelayFeature(config, "plugins");
|
|
@@ -237,14 +239,14 @@ function assembleClaude(config: RunnerSpawnConfig, providerConfig: ProviderConfi
|
|
|
237
239
|
? resolveClaudeProjectSkills(configHome, config, new Set(skills.map((s) => s.name)))
|
|
238
240
|
: [];
|
|
239
241
|
const projectSettings = resolveProjectClaudeSettings(config);
|
|
240
|
-
const provisionedPlugins =
|
|
242
|
+
const provisionedPlugins = assetHome ? resolveClaudeProvisionedPlugins(assetHome, config) : [];
|
|
241
243
|
|
|
242
244
|
// Plugin dirs (--plugin-dir loads explicitly, independent of --setting-sources):
|
|
243
245
|
// relay-bundled plugin → only when relay.plugins (carries the relay monitor +
|
|
244
246
|
// turn-lifecycle hooks #556, not reproducible via settings.json).
|
|
245
247
|
// relay-provisioned plugins (#556) → materialized into the isolated home.
|
|
246
248
|
// host plugin dirs → ONLY host-base profiles; isolated/vanilla must not pull them back in.
|
|
247
|
-
const relayPluginDirs = relayPlugin ? [CLAUDE_RELAY_PLUGIN_DIR] : [];
|
|
249
|
+
const relayPluginDirs = !config.agentProfile && relayPlugin ? [CLAUDE_RELAY_PLUGIN_DIR] : [];
|
|
248
250
|
const provisionedPluginDirs = provisionedPlugins.map((p) => p.dir);
|
|
249
251
|
const hostPluginDirs = profileUsesClaudeHostProviderGlobals(config) ? providerConfig.pluginDirs : [];
|
|
250
252
|
const pluginDirs = [...new Set([...relayPluginDirs, ...provisionedPluginDirs, ...hostPluginDirs])];
|
|
@@ -350,12 +352,13 @@ function assembleClaude(config: RunnerSpawnConfig, providerConfig: ProviderConfi
|
|
|
350
352
|
|
|
351
353
|
function assembleCodex(config: RunnerSpawnConfig, _providerConfig: ProviderConfig): AssembledLaunch {
|
|
352
354
|
const configHome = providerHomePathFor("codex", config);
|
|
355
|
+
const assetHome = providerProvisioningHomePathFor("codex", config);
|
|
353
356
|
const vanilla = profileIsVanillaBase(config);
|
|
354
357
|
const relaySkills = profileAllowsRelayFeature(config, "skills");
|
|
355
358
|
const relayEndpoint = profileAllowsRelayFeature(config, "mcp");
|
|
356
359
|
|
|
357
|
-
const provisionedSkills =
|
|
358
|
-
const bundledSkillDirs = relaySkills ? bundledCodexSkillDirs() : [];
|
|
360
|
+
const provisionedSkills = assetHome ? resolveCodexProvisionedSkills(assetHome, config) : [];
|
|
361
|
+
const bundledSkillDirs = !config.agentProfile && relaySkills ? bundledCodexSkillDirs() : [];
|
|
359
362
|
const skillDirs = [...bundledSkillDirs, ...provisionedSkills.map((s) => s.dir)];
|
|
360
363
|
|
|
361
364
|
const provisionedMcp = profileProvisioning(config).mcpServers;
|
|
@@ -438,13 +441,16 @@ export function assembleLaunch(provider: SpawnProvider, config: RunnerSpawnConfi
|
|
|
438
441
|
*/
|
|
439
442
|
export function materializeLaunchAssembly(provider: SpawnProvider, config: RunnerSpawnConfig): void {
|
|
440
443
|
const configHome = providerHomePathFor(provider, config);
|
|
441
|
-
|
|
444
|
+
const assetHome = providerProvisioningHomePathFor(provider, config);
|
|
445
|
+
if (!configHome && !assetHome) return;
|
|
442
446
|
if (provider === "claude") {
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
+
if (configHome) {
|
|
448
|
+
const skills = resolveClaudeProvisionedSkills(configHome, config);
|
|
449
|
+
materializeResolvedAssets(skills);
|
|
450
|
+
materializeResolvedAssets(resolveClaudeProjectSkills(configHome, config, new Set(skills.map((s) => s.name))));
|
|
451
|
+
}
|
|
452
|
+
if (assetHome) materializeResolvedAssets(resolveClaudeProvisionedPlugins(assetHome, config));
|
|
447
453
|
return;
|
|
448
454
|
}
|
|
449
|
-
materializeResolvedAssets(resolveCodexProvisionedSkills(
|
|
455
|
+
if (assetHome) materializeResolvedAssets(resolveCodexProvisionedSkills(assetHome, config));
|
|
450
456
|
}
|
package/src/profile-home.ts
CHANGED
|
@@ -40,6 +40,15 @@ export function providerHomePathFor(provider: "claude" | "codex", config: Runner
|
|
|
40
40
|
return providerHomePath(provider, config);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
// Provisioned file-backed assets need a relay-owned materialization root even for
|
|
44
|
+
// host-base profiles, where the provider's real config home stays in use. This path is
|
|
45
|
+
// only passed explicitly through launch args such as Codex skills.config or Claude
|
|
46
|
+
// --plugin-dir; it does not imply CODEX_HOME/CLAUDE_CONFIG_DIR isolation.
|
|
47
|
+
export function providerProvisioningHomePathFor(provider: "claude" | "codex", config: RunnerSpawnConfig): string | undefined {
|
|
48
|
+
if (!config.agentProfile) return undefined;
|
|
49
|
+
return providerHomePathFor(provider, config) ?? join(providerHomePath(provider, config), "provisioning");
|
|
50
|
+
}
|
|
51
|
+
|
|
43
52
|
// First-run bootstrap (provider layer)
|
|
44
53
|
// -------------------------------------
|
|
45
54
|
// Isolated profile homes are keyed by instanceId, so every spawn gets a brand
|
|
@@ -33,6 +33,7 @@ export function agentProfileProjectionReport(input: AgentProfileProjectionInput)
|
|
|
33
33
|
add(provisioningSkillsEntry(assembled));
|
|
34
34
|
add(provisioningPluginsEntry(assembled));
|
|
35
35
|
add(provisioningMcpEntry(assembled));
|
|
36
|
+
for (const entry of provisioningSkippedEntries(assembled)) add(entry);
|
|
36
37
|
add(projectMcpEntry(assembled));
|
|
37
38
|
add(projectSkillsEntry(assembled));
|
|
38
39
|
add(projectSettingsEntry(assembled));
|
|
@@ -147,6 +148,14 @@ function provisioningMcpEntry(a: AssembledLaunch): AgentProfileProjectionEntry {
|
|
|
147
148
|
: `Relay-provisioned MCP servers emitted as -c mcp_servers.* overrides (${names.join(", ")}).`);
|
|
148
149
|
}
|
|
149
150
|
|
|
151
|
+
function provisioningSkippedEntries(a: AssembledLaunch): AgentProfileProjectionEntry[] {
|
|
152
|
+
return (a.profile?.provisioning?.skipped ?? []).map((item) => partial(
|
|
153
|
+
`provisioning.${item.kind}.${item.ref}`,
|
|
154
|
+
item.reason,
|
|
155
|
+
item.detail,
|
|
156
|
+
));
|
|
157
|
+
}
|
|
158
|
+
|
|
150
159
|
// #667 — project `.mcp.json` projection provenance. `not-applicable` when the profile/spawn
|
|
151
160
|
// didn't opt in (the default); `applied` lists the spawn-cwd servers relay injected through
|
|
152
161
|
// the controlled --mcp-config / -c path (sourced from the project, not ambient host MCP).
|
package/src/provisioning.ts
CHANGED
|
@@ -21,7 +21,7 @@ const EMPTY: ResolvedProvisioning = { skills: [], plugins: [], mcpServers: {} };
|
|
|
21
21
|
export function profileProvisioning(config: Pick<RunnerSpawnConfig, "agentProfile">): ResolvedProvisioning {
|
|
22
22
|
const p = config.agentProfile?.provisioning;
|
|
23
23
|
if (!p) return EMPTY;
|
|
24
|
-
return { skills: p.skills ?? [], plugins: p.plugins ?? [], mcpServers: p.mcpServers ?? {} };
|
|
24
|
+
return { skills: p.skills ?? [], plugins: p.plugins ?? [], mcpServers: p.mcpServers ?? {}, ...(p.skipped?.length ? { skipped: p.skipped } : {}) };
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
// The `mcpServers` keys a Claude `.mcp.json` entry may carry; coerced into the
|