agent-relay-runner 0.93.1 → 0.94.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay-runner",
3
- "version": "0.93.1",
3
+ "version": "0.94.1",
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.73"
23
+ "agent-relay-sdk": "0.2.74"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/bun": "latest",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agent-relay-runner",
3
3
  "description": "Thin Agent Relay runner bridge for Claude Code",
4
- "version": "0.93.1",
4
+ "version": "0.94.1",
5
5
  "agentRelayContracts": {
6
6
  "providerPluginProtocol": 1
7
7
  }
@@ -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 = configHome ? resolveClaudeProvisionedPlugins(configHome, config) : [];
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 = configHome ? resolveCodexProvisionedSkills(configHome, config) : [];
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
- if (!configHome) return;
444
+ const assetHome = providerProvisioningHomePathFor(provider, config);
445
+ if (!configHome && !assetHome) return;
442
446
  if (provider === "claude") {
443
- const skills = resolveClaudeProvisionedSkills(configHome, config);
444
- materializeResolvedAssets(skills);
445
- materializeResolvedAssets(resolveClaudeProjectSkills(configHome, config, new Set(skills.map((s) => s.name))));
446
- materializeResolvedAssets(resolveClaudeProvisionedPlugins(configHome, config));
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(configHome, config));
455
+ if (assetHome) materializeResolvedAssets(resolveCodexProvisionedSkills(assetHome, config));
450
456
  }
@@ -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).
@@ -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