@ai-outfitter/outfitter 1.1.2 → 1.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.
Files changed (38) hide show
  1. package/dist/agents/PiSessionDirectory.d.ts +16 -0
  2. package/dist/agents/PiSessionDirectory.js +41 -0
  3. package/dist/agents/PiSessionDirectory.js.map +1 -0
  4. package/dist/cli/commands/DumpCommand.js +1 -1
  5. package/dist/cli/commands/DumpCommand.js.map +1 -1
  6. package/dist/cli/commands/RunAgentCommand.js +11 -3
  7. package/dist/cli/commands/RunAgentCommand.js.map +1 -1
  8. package/dist/cli/commands/ValidateCommand.js +1 -1
  9. package/dist/cli/commands/ValidateCommand.js.map +1 -1
  10. package/dist/composer/Composer.d.ts +7 -5
  11. package/dist/composer/Composer.js +280 -64
  12. package/dist/composer/Composer.js.map +1 -1
  13. package/dist/composer/Composition.d.ts +34 -3
  14. package/dist/composer/PromptSource.d.ts +44 -0
  15. package/dist/composer/PromptSource.js +113 -0
  16. package/dist/composer/PromptSource.js.map +1 -0
  17. package/dist/dump/Dump.d.ts +1 -1
  18. package/dist/dump/Dump.js +111 -20
  19. package/dist/dump/Dump.js.map +1 -1
  20. package/dist/projection/Materialize.d.ts +1 -5
  21. package/dist/projection/Materialize.js +57 -13
  22. package/dist/projection/Materialize.js.map +1 -1
  23. package/dist/projection/ProjectHarness.js +19 -4
  24. package/dist/projection/ProjectHarness.js.map +1 -1
  25. package/dist/projection/Projection.d.ts +2 -0
  26. package/dist/resolver/AgentDefinition.d.ts +9 -0
  27. package/dist/resolver/AgentDefinition.js +17 -0
  28. package/dist/resolver/AgentDefinition.js.map +1 -1
  29. package/dist/resolver/ResolverValidation.d.ts +1 -1
  30. package/dist/resolver/ResolverValidation.js +25 -15
  31. package/dist/resolver/ResolverValidation.js.map +1 -1
  32. package/dist/schemas/agent.schema.json +32 -0
  33. package/docs/documentation/agents.md +81 -26
  34. package/docs/documentation/migration.md +18 -9
  35. package/docs/documentation/profiles.md +24 -7
  36. package/docs/documentation/state.md +28 -1
  37. package/package.json +1 -1
  38. package/src/schemas/agent.schema.json +32 -0
@@ -0,0 +1,16 @@
1
+ /**
2
+ * pi's session-storage environment override. pi resolves the session directory as
3
+ * `--session-dir` → `PI_CODING_AGENT_SESSION_DIR` → `sessionDir` in settings.json, so a
4
+ * pass-through `-- --session-dir <dir>` still wins over the default Outfitter sets here.
5
+ */
6
+ export declare const PI_SESSION_DIRECTORY_ENV = "PI_CODING_AGENT_SESSION_DIR";
7
+ /** pi's durable session folder for one project: `~/.pi/agent/sessions/--<encoded project>--`. */
8
+ export declare const resolvePiUserSessionDirectory: (homeDirectory: string, projectDirectory: string) => string;
9
+ /**
10
+ * Session directory for a pi launch, or `undefined` when the launch should keep whatever
11
+ * `PI_CODING_AGENT_SESSION_DIR` it inherits — an explicitly configured store, such as a resident
12
+ * agent's workspace/PVC path, stays in control. `env`, `homeDirectory`, and `projectDirectory` are
13
+ * injected so the resolution stays unit-testable; `projectDirectory` is the directory pi runs in
14
+ * (`process.cwd()`), which is what makes the result pi's own folder for the project.
15
+ */
16
+ export declare const resolvePiSessionDirectory: (env: Readonly<Record<string, string | undefined>>, homeDirectory: string, projectDirectory: string) => string | undefined;
@@ -0,0 +1,41 @@
1
+ // Keeps pi session transcripts durable across runs. Outfitter launches pi with PI_CODING_AGENT_DIR
2
+ // pointed at a per-run projection root that is deleted once the child exits, and pi stores sessions
3
+ // under `<agent dir>/sessions/<encoded cwd>` by default (pi-coding-agent core/session-manager.js:
4
+ // getDefaultSessionDirPath()). Left alone every transcript dies with the projection, so
5
+ // `pi --continue`/`--resume` can never find the previous conversation (#223).
6
+ //
7
+ // Outfitter therefore points pi at the same per-project folder under pi's durable agent directory
8
+ // that a standalone pi already writes to, so history is shared between `outfitter run` and a bare
9
+ // `pi` in the same project, and `--continue` keeps pi's fast path instead of scanning every
10
+ // project's transcripts.
11
+ import { join, resolve } from 'node:path';
12
+ import { resolvePiUserAgentDirectory } from './PiCredentialPersistence.js';
13
+ /**
14
+ * pi's session-storage environment override. pi resolves the session directory as
15
+ * `--session-dir` → `PI_CODING_AGENT_SESSION_DIR` → `sessionDir` in settings.json, so a
16
+ * pass-through `-- --session-dir <dir>` still wins over the default Outfitter sets here.
17
+ */
18
+ export const PI_SESSION_DIRECTORY_ENV = 'PI_CODING_AGENT_SESSION_DIR';
19
+ // pi's own encoding of a project directory into a single session folder name: absolute path,
20
+ // leading separator dropped, remaining separators and drive colons flattened to '-', wrapped in
21
+ // '--'. Mirrored here so Outfitter runs share pi's native per-project folder rather than starting a
22
+ // parallel layout.
23
+ const encodeProjectDirectory = (projectDirectory) => `--${resolve(projectDirectory)
24
+ .replace(/^[/\\]/u, '')
25
+ .replace(/[/\\:]/gu, '-')}--`;
26
+ /** pi's durable session folder for one project: `~/.pi/agent/sessions/--<encoded project>--`. */
27
+ export const resolvePiUserSessionDirectory = (homeDirectory, projectDirectory) => join(resolvePiUserAgentDirectory(homeDirectory), 'sessions', encodeProjectDirectory(projectDirectory));
28
+ /**
29
+ * Session directory for a pi launch, or `undefined` when the launch should keep whatever
30
+ * `PI_CODING_AGENT_SESSION_DIR` it inherits — an explicitly configured store, such as a resident
31
+ * agent's workspace/PVC path, stays in control. `env`, `homeDirectory`, and `projectDirectory` are
32
+ * injected so the resolution stays unit-testable; `projectDirectory` is the directory pi runs in
33
+ * (`process.cwd()`), which is what makes the result pi's own folder for the project.
34
+ */
35
+ export const resolvePiSessionDirectory = (env, homeDirectory, projectDirectory) => {
36
+ const inherited = env[PI_SESSION_DIRECTORY_ENV];
37
+ if (inherited !== undefined && inherited.trim() !== '')
38
+ return undefined;
39
+ return resolvePiUserSessionDirectory(homeDirectory, projectDirectory);
40
+ };
41
+ //# sourceMappingURL=PiSessionDirectory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PiSessionDirectory.js","sourceRoot":"","sources":["../../src/agents/PiSessionDirectory.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,oGAAoG;AACpG,kGAAkG;AAClG,wFAAwF;AACxF,8EAA8E;AAC9E,EAAE;AACF,kGAAkG;AAClG,kGAAkG;AAClG,4FAA4F;AAC5F,yBAAyB;AACzB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAE3E;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,6BAA6B,CAAC;AAEtE,6FAA6F;AAC7F,gGAAgG;AAChG,oGAAoG;AACpG,mBAAmB;AACnB,MAAM,sBAAsB,GAAG,CAAC,gBAAwB,EAAU,EAAE,CAClE,KAAK,OAAO,CAAC,gBAAgB,CAAC;KAC3B,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;KACtB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;AAElC,iGAAiG;AACjG,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,aAAqB,EAAE,gBAAwB,EAAU,EAAE,CACvG,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAEzG;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,GAAiD,EACjD,aAAqB,EACrB,gBAAwB,EACJ,EAAE;IACtB,MAAM,SAAS,GAAG,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAChD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAEzE,OAAO,6BAA6B,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AACxE,CAAC,CAAC"}
@@ -19,7 +19,7 @@ export const executeDumpCommand = (input) => {
19
19
  }
20
20
  const syncWarnings = warnings.map((warning) => `warning: ${warning}`);
21
21
  const agentSlug = resolveAgentSlug(settings, input.agent);
22
- const result = dumpAgent(set, agentSlug, input.out);
22
+ const result = dumpAgent(set, agentSlug, input.out, input.projectDirectory);
23
23
  const ok = result.errors.length === 0;
24
24
  const messages = ok
25
25
  ? [
@@ -1 +1 @@
1
- {"version":3,"file":"DumpCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/DumpCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DumpCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/DumpCommand.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { join } from 'node:path';
5
5
  import { Option } from 'commander';
6
6
  import { launchThroughSpawn, spawnLauncher } from '../../agents/AgentLaunch.js';
7
7
  import { persistPiCredentials, resolvePiUserAgentDirectory, seedPiCredentials, } from '../../agents/PiCredentialPersistence.js';
8
+ import { resolvePiSessionDirectory } from '../../agents/PiSessionDirectory.js';
8
9
  import { compose } from '../../composer/Composer.js';
9
10
  import { ensurePiExtensions } from '../../extensions/PiExtensionCache.js';
10
11
  import { resolveOutfitterCacheDir } from '../../paths/OutfitterCache.js';
@@ -51,6 +52,10 @@ const launchWithCredentialPersistence = async (input, harness, rootDirectory, la
51
52
  persistPiCredentials(rootDirectory, piUserAgentDirectory);
52
53
  return exitCode;
53
54
  };
55
+ // pi writes sessions inside PI_CODING_AGENT_DIR — the projection root Outfitter deletes after the
56
+ // run — so resolve pi's durable per-project store instead and let `--continue` outlive the run. An
57
+ // inherited PI_CODING_AGENT_SESSION_DIR keeps precedence (undefined), as do non-pi harnesses.
58
+ const resolveSessionDirectory = (input, harness) => harness === 'pi' ? resolvePiSessionDirectory(process.env, input.homeDirectory, input.projectDirectory) : undefined;
54
59
  // Installs/caches the pi extensions for the composed agent (pi only) so they load at launch.
55
60
  const resolvePiExtensions = async (input, harness, extensionSpecs) => {
56
61
  if (harness !== 'pi')
@@ -61,6 +66,7 @@ const resolvePiExtensions = async (input, harness, extensionSpecs) => {
61
66
  spawn: input.extensionInstallSpawner,
62
67
  });
63
68
  };
69
+ const piConfigurationOverlays = (plan, selectedAgent) => [...(plan.contributingAgents ?? [selectedAgent])].reverse().flatMap((agent) => agent.piConfigDirectories ?? []);
64
70
  export const executeRunAgentCommand = async (input) => {
65
71
  // Flush messages to the terminal (before launch); they are also returned so callers can inspect them.
66
72
  const emit = (messages) => {
@@ -86,25 +92,27 @@ export const executeRunAgentCommand = async (input) => {
86
92
  const { set, settings } = resolved;
87
93
  const agentSlug = resolveAgentSlug(settings.defaultAgent, input.agent);
88
94
  const harness = resolveHarness(settings.defaultHarness, input.harness);
89
- const composed = compose(set, agentSlug);
95
+ const composed = compose(set, agentSlug, { projectDirectory: input.projectDirectory });
90
96
  if (composed.plan === undefined) {
91
- const messages = [...setupMessages, ...composed.errors];
97
+ const messages = [...setupMessages, ...composed.warnings, ...composed.errors];
92
98
  emit(messages);
93
99
  return { exitCode: 1, messages };
94
100
  }
95
101
  // Install/cache the pi extensions into a shared XDG cache and load them at launch (pi only).
96
102
  const extensions = await resolvePiExtensions(input, harness, composed.plan.loadout.extensions);
97
103
  const selectedAgent = findResource(set, 'agent', agentSlug);
104
+ const configurationOverlays = piConfigurationOverlays(composed.plan, selectedAgent);
98
105
  const rootDirectory = mkdtempSync(join(tmpdir(), `outfitter-${agentSlug}-${harness}-`));
99
106
  try {
100
107
  const projection = projectComposition(composed.plan, {
101
108
  harness,
102
109
  rootDirectory,
103
110
  homeDirectory: input.homeDirectory,
111
+ sessionDirectory: resolveSessionDirectory(input, harness),
104
112
  passThroughArgs: input.passThroughArgs,
105
113
  extensionLoadDirs: harness === 'pi' ? extensions.loadDirs : undefined,
106
114
  // ProjectHarness only overlays these for the pi harness, so pass them through unconditionally.
107
- configurationOverlayDirectories: selectedAgent.piConfigDirectories,
115
+ configurationOverlayDirectories: configurationOverlays,
108
116
  });
109
117
  // Composition warnings, unsupported harness elements, and extension-install failures are all
110
118
  // advisory; --strict makes the combined set fatal before launch.
@@ -1 +1 @@
1
- {"version":3,"file":"RunAgentCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/RunAgentCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RunAgentCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/RunAgentCommand.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAE1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA8C7C,8GAA8G;AAC9G,mGAAmG;AACnG,MAAM,sBAAsB,GAAgB,KAAK,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE,EAAE,EAAE,CACxF,QAAQ,CAAC,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAChD,oBAAoB;AAEpB,MAAM,gBAAgB,GAAG,CAAC,eAAmC,EAAE,SAA6B,EAAU,EAAE;IACtG,MAAM,IAAI,GAAG,SAAS,IAAI,eAAe,CAAC;IAE1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAC;IACjH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,eAAoC,EAAE,SAA6B,EAAW,EAAE;IACtG,MAAM,OAAO,GAAG,SAAS,IAAI,eAAe,IAAI,IAAI,CAAC;IAErD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAkB,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,0CAA0C,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,OAAkB,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,MAA+C,EAAQ,EAAE;IACvF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC;AACH,CAAC,CAAC;AAEF,qGAAqG;AACrG,oGAAoG;AACpG,oBAAoB;AACpB,MAAM,+BAA+B,GAAG,KAAK,EAC3C,KAAoB,EACpB,OAAgB,EAChB,aAAqB,EACrB,MAAuB,EACN,EAAE;IACnB,MAAM,oBAAoB,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,2BAA2B,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7G,IAAI,oBAAoB,KAAK,SAAS;QAAE,iBAAiB,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IAE/F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,oBAAoB,KAAK,SAAS;QAAE,oBAAoB,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IAElG,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,kGAAkG;AAClG,mGAAmG;AACnG,8FAA8F;AAC9F,MAAM,uBAAuB,GAAG,CAAC,KAAoB,EAAE,OAAgB,EAAsB,EAAE,CAC7F,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAErH,6FAA6F;AAC7F,MAAM,mBAAmB,GAAG,KAAK,EAC/B,KAAoB,EACpB,OAAgB,EAChB,cAAiC,EACwD,EAAE;IAC3F,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5D,OAAO,kBAAkB,CAAC,cAAc,EAAE;QACxC,aAAa,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,eAAe,CAAC;QAChG,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,MAAM;QAC5E,KAAK,EAAE,KAAK,CAAC,uBAAuB;KACrC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC9B,IAAqD,EACrD,aAA2D,EACxC,EAAE,CACrB,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;AAElH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,KAAoB,EAA2B,EAAE;IAC5F,sGAAsG;IACtG,MAAM,IAAI,GAAG,CAAC,QAA2B,EAAQ,EAAE;QACjD,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,KAAK,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,IAAI,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,sBAAsB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC;IAEhE,uFAAuF;IACvF,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC3G,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC;YACpC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;SACzC,CAAC,CAAC;QAEH,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,aAAa,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC5C,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACtC,sBAAsB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IACnC,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAEvF,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9E,IAAI,CAAC,QAAQ,CAAC,CAAC;QACf,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnC,CAAC;IAED,6FAA6F;IAC7F,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/F,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAE,CAAC;IAC7D,MAAM,qBAAqB,GAAG,uBAAuB,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAEpF,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,SAAS,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IAExF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE;YACnD,OAAO;YACP,aAAa;YACb,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,gBAAgB,EAAE,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC;YACzD,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,iBAAiB,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACrE,+FAA+F;YAC/F,+BAA+B,EAAE,qBAAqB;SACvD,CAAC,CAAC;QAEH,6FAA6F;QAC7F,iEAAiE;QACjE,MAAM,QAAQ,GAAG;YACf,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ;YACzB,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,OAAO,qCAAqC,OAAO,IAAI,CAAC;YAC/G,GAAG,UAAU,CAAC,QAAQ;SACvB,CAAC;QAEF,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG;gBACf,GAAG,aAAa;gBAChB,GAAG,QAAQ;gBACX,uEAAuE;aACxE,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,CAAC;YACf,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;QACnC,CAAC;QAED,gGAAgG;QAChG,MAAM,QAAQ,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEf,oFAAoF;QACpF,MAAM,MAAM,GAAG,wBAAwB,CAAC,UAAU,CAAC,MAAM,EAAE;YACzD,gBAAgB,EAAE,oBAAoB,EAAE;YACxC,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YAC/D,aAAa;SACd,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,+BAA+B,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAE9F,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACpD,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACpC,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,wFAAwF;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,oGAAoG;AACpG,MAAM,eAAe,GAAyB,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAEhG,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,eAAqC,EAAE,EAAiB,EAAE,CAAC,CAAC;IAChG,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,gEAAgE;IAC7E,QAAQ,CAAC,OAAgB;QACvB,OAAO;aACJ,OAAO,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;aACnC,WAAW,CAAC,gEAAgE,CAAC;aAC7E,QAAQ,CAAC,SAAS,EAAE,sDAAsD,CAAC;aAC3E,QAAQ,CAAC,WAAW,EAAE,mDAAmD,CAAC;aAC1E,SAAS,CAAC,IAAI,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;aAC1F,MAAM,CAAC,UAAU,EAAE,uEAAuE,CAAC;aAC3F,kBAAkB,CAAC,IAAI,CAAC;aACxB,MAAM,CACL,KAAK,EACH,KAAyB,EACzB,eAAkC,EAClC,OAA+C,EAC/C,EAAE;YACF,wGAAwG;YACxG,MAAM,aAAa,GAAG,oBAAoB,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YACvE,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;YAChF,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,IAAI,eAAe,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;gBAC1C,aAAa;gBACb,gBAAgB;gBAChB,KAAK;gBACL,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,eAAe;gBACf,QAAQ;gBACR,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,sBAAsB;gBACnD,2EAA2E;gBAC3E,6FAA6F;gBAC7F,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK;aACnD,CAAC,CAAC;YAEH,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACrC,CAAC,CACF,CAAC;IACN,CAAC;CACF,CAAC,CAAC"}
@@ -10,7 +10,7 @@ export const executeValidateCommand = (input) => {
10
10
  const findings = [
11
11
  ...settingsFindings(settingsIssues.map(formatSettingsIssue)),
12
12
  ...warnings.map((message) => ({ severity: 'warning', resource: 'settings', message })),
13
- ...validateEffectiveSet(set),
13
+ ...validateEffectiveSet(set, input.projectDirectory),
14
14
  ];
15
15
  const hasErrors = findings.some((finding) => finding.severity === 'error');
16
16
  const hasWarnings = findings.some((finding) => finding.severity === 'warning');
@@ -1 +1 @@
1
- {"version":3,"file":"ValidateCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/ValidateCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ValidateCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/ValidateCommand.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import type { EffectiveResourceSet } from '../resolver/Resource.js';
2
2
  import type { CompositionPlan } from './Composition.js';
3
+ export interface ComposeOptions {
4
+ /** Active repository root for `repo_file` prompt references. */
5
+ readonly projectDirectory?: string;
6
+ }
3
7
  export interface ComposeResult {
4
8
  readonly plan?: CompositionPlan;
5
9
  readonly errors: readonly string[];
10
+ readonly warnings: readonly string[];
6
11
  }
7
- /**
8
- * Composes the selected agent into a CompositionPlan. Returns an error when the agent slug does not
9
- * resolve or its definition is invalid; loadout slugs that do not resolve are non-fatal warnings.
10
- */
11
- export declare const compose: (set: EffectiveResourceSet, agentSlug: string) => ComposeResult;
12
+ /** Composes one selected agent from the shared effective resource set. */
13
+ export declare const compose: (set: EffectiveResourceSet, agentSlug: string, options?: ComposeOptions) => ComposeResult;
@@ -4,22 +4,148 @@ import { join } from 'node:path';
4
4
  import { escapesRoots } from '../dump/Containment.js';
5
5
  import { isAgentDefinitionIssue, readAgentDefinition } from '../resolver/AgentDefinition.js';
6
6
  import { findLoadoutResource, findResource } from '../resolver/Resource.js';
7
+ import { agentBodyFragment, promptSourceKey, resolvePromptSource, rootPromptFragment } from './PromptSource.js';
7
8
  /** Reads the highest-precedence tree-root file (e.g. system-prompt.md) across layers, or undefined. */
8
9
  const readRootFile = (set, fileName) => {
9
10
  for (const layer of set.layers) {
10
11
  const candidate = join(layer.root, fileName);
11
12
  if (existsSync(candidate)) {
12
- return readFileSync(candidate, 'utf8');
13
+ return rootPromptFragment({ fileName, layer, content: readFileSync(candidate, 'utf8') });
13
14
  }
14
15
  }
15
16
  return undefined;
16
17
  };
17
- const resolveSlugs = (set, agentSlug, kind, reference, slugs, warnings) => {
18
+ const readValidAgent = (agent) => {
19
+ const definition = readAgentDefinition(agent.winner.path, agent.configPaths);
20
+ if (isAgentDefinitionIssue(definition))
21
+ return definition.message;
22
+ if (definition.name !== agent.slug)
23
+ return `agent.md name '${definition.name}' must match its directory.`;
24
+ return definition;
25
+ };
26
+ const resolveInheritanceChain = (set, agentSlug) => {
27
+ const entries = [];
28
+ const composed = new Set();
29
+ const visiting = [];
30
+ const errors = [];
31
+ const visit = (slug) => {
32
+ if (composed.has(slug))
33
+ return;
34
+ const cycleIndex = visiting.indexOf(slug);
35
+ if (cycleIndex !== -1) {
36
+ errors.push(`Agent inheritance cycle detected: ${[...visiting.slice(cycleIndex), slug].join(' -> ')}.`);
37
+ return;
38
+ }
39
+ const resource = findResource(set, 'agent', slug);
40
+ if (resource === undefined) {
41
+ errors.push(`Agent inheritance references unknown parent '${slug}' in chain ${[...visiting, slug].join(' -> ')}.`);
42
+ return;
43
+ }
44
+ const definition = readValidAgent(resource);
45
+ if (typeof definition === 'string') {
46
+ errors.push(`Agent '${slug}' is invalid: ${definition}`);
47
+ return;
48
+ }
49
+ visiting.push(slug);
50
+ for (const parent of definition.inherits)
51
+ visit(parent);
52
+ visiting.pop();
53
+ if (!composed.has(slug)) {
54
+ composed.add(slug);
55
+ entries.push({ resource, definition });
56
+ }
57
+ };
58
+ visit(agentSlug);
59
+ return errors.length > 0 ? { errors } : { entries, errors: [] };
60
+ };
61
+ const stablePush = (items, keySet, key, value) => {
62
+ if (!keySet.has(key)) {
63
+ keySet.add(key);
64
+ items.push(value);
65
+ }
66
+ };
67
+ const union = (values = [], next = []) => {
68
+ const merged = [];
69
+ const seen = new Set();
70
+ for (const value of [...values, ...next])
71
+ stablePush(merged, seen, value, value);
72
+ return merged.length > 0 ? merged : undefined;
73
+ };
74
+ const uniqueStrings = (values) => [...new Set(values)];
75
+ const declaredSelections = (chain, select) => {
76
+ const selections = [];
77
+ const seen = new Set();
78
+ for (const entry of chain) {
79
+ for (const slug of select(entry.definition)) {
80
+ stablePush(selections, seen, slug, { slug, owner: entry.resource.slug });
81
+ }
82
+ }
83
+ return selections;
84
+ };
85
+ const appendPromptSelections = (chain) => {
86
+ const selections = [];
87
+ const seen = new Set();
88
+ for (const entry of chain) {
89
+ entry.definition.promptControls.appendSystemPrompt.forEach((source, index) => {
90
+ stablePush(selections, seen, promptSourceKey(source), { source, owner: entry.resource.slug, index });
91
+ });
92
+ }
93
+ return selections;
94
+ };
95
+ const nearest = (chain, select) => {
96
+ for (const entry of [...chain].reverse()) {
97
+ const value = select(entry.definition);
98
+ if (value !== undefined)
99
+ return value;
100
+ }
101
+ return undefined;
102
+ };
103
+ const composeTools = (chain) => {
104
+ const allow = union([], chain.flatMap((entry) => entry.definition.loadout.tools?.allow ?? []));
105
+ const deny = union([], chain.flatMap((entry) => entry.definition.loadout.tools?.deny ?? []));
106
+ return allow === undefined && deny === undefined ? undefined : { allow, deny };
107
+ };
108
+ const nearestPrompt = (chain, select) => {
109
+ for (const entry of [...chain].reverse()) {
110
+ const source = select(entry.definition);
111
+ if (source !== undefined)
112
+ return { source, owner: entry.resource.slug };
113
+ }
114
+ return undefined;
115
+ };
116
+ const composeEffectiveControls = (chain) => {
117
+ const skills = declaredSelections(chain, (definition) => definition.loadout.skills);
118
+ const subagents = declaredSelections(chain, (definition) => definition.loadout.subagents);
119
+ const mcp = declaredSelections(chain, (definition) => definition.loadout.mcp);
120
+ const model = nearest(chain, (definition) => definition.loadout.model);
121
+ const thinking = nearest(chain, (definition) => definition.loadout.thinking);
122
+ return {
123
+ skillSelections: skills,
124
+ subagentSelections: subagents,
125
+ mcpSelections: mcp,
126
+ appendPromptSelections: appendPromptSelections(chain),
127
+ systemPrompt: nearestPrompt(chain, (definition) => definition.promptControls.systemPrompt),
128
+ promptTemplate: nearestPrompt(chain, (definition) => definition.promptControls.promptTemplate),
129
+ label: nearest(chain, (definition) => definition.label),
130
+ description: nearest(chain, (definition) => definition.description),
131
+ loadout: {
132
+ skills: skills.map((selection) => selection.slug),
133
+ subagents: subagents.map((selection) => selection.slug),
134
+ mcp: mcp.map((selection) => selection.slug),
135
+ extensions: uniqueStrings(chain.flatMap((entry) => entry.definition.loadout.extensions)),
136
+ plugins: uniqueStrings(chain.flatMap((entry) => entry.definition.loadout.plugins)),
137
+ model,
138
+ thinking,
139
+ tools: composeTools(chain),
140
+ },
141
+ };
142
+ };
143
+ const resolveDeclaredSlugs = (set, kind, reference, selections, warnings) => {
18
144
  const resolved = [];
19
- for (const slug of slugs) {
20
- const resource = findLoadoutResource(set, agentSlug, kind, slug);
145
+ for (const selection of selections) {
146
+ const resource = findLoadoutResource(set, selection.owner, kind, selection.slug);
21
147
  if (resource === undefined) {
22
- warnings.push(`${reference} references unknown ${kind} '${slug}'.`);
148
+ warnings.push(`${reference} references unknown ${kind} '${selection.slug}'.`);
23
149
  }
24
150
  else {
25
151
  resolved.push(resource);
@@ -45,33 +171,47 @@ const readMcpServers = (path, warnings) => {
45
171
  }
46
172
  return servers;
47
173
  };
48
- const composeMcpServers = (set, agent, selectedIds, warnings) => {
49
- if (selectedIds.length === 0) {
174
+ const composeMcpServers = (set, selections, warnings) => {
175
+ if (selections.length === 0)
50
176
  return {};
51
- }
52
177
  const rootPaths = set.layers.map((layer) => join(layer.root, 'mcp.json')).filter((path) => existsSync(path));
53
- const pathsByPrecedence = [
54
- ...rootPaths.reverse(),
55
- // Resolver annotates every agent resource with mcpPaths, including an empty array.
56
- ...[...agent.mcpPaths].reverse(),
57
- ];
58
- const available = {};
59
178
  const roots = set.layers.map((layer) => layer.root);
60
- for (const path of pathsByPrecedence) {
179
+ const cache = new Map();
180
+ const serversAt = (path) => {
181
+ const cached = cache.get(path);
182
+ if (cached !== undefined)
183
+ return cached;
184
+ let servers;
61
185
  if (escapesRoots(path, roots)) {
62
186
  warnings.push(`MCP configuration '${path}' resolves outside the resource layers and was skipped.`);
63
- continue;
64
- }
65
- Object.assign(available, readMcpServers(path, warnings));
66
- }
67
- const selected = {};
68
- for (const id of selectedIds) {
69
- if (Object.hasOwn(available, id)) {
70
- selected[id] = available[id];
187
+ servers = {};
71
188
  }
72
189
  else {
73
- warnings.push(`loadout mcp references unknown server '${id}'.`);
190
+ servers = readMcpServers(path, warnings);
191
+ }
192
+ cache.set(path, servers);
193
+ return servers;
194
+ };
195
+ const selected = {};
196
+ for (const selection of selections) {
197
+ // MCP selections are created only from entries in the resolved inheritance chain.
198
+ const owner = findResource(set, 'agent', selection.owner);
199
+ // Root definitions are shared; only the declaring agent's overlays may override its selection.
200
+ const ownerPaths = [...owner.mcpPaths].reverse();
201
+ const pathsByPrecedence = [...rootPaths].reverse().concat(ownerPaths);
202
+ let definition;
203
+ let found = false;
204
+ for (const path of pathsByPrecedence) {
205
+ const servers = serversAt(path);
206
+ if (Object.hasOwn(servers, selection.slug)) {
207
+ definition = servers[selection.slug];
208
+ found = true;
209
+ }
74
210
  }
211
+ if (found)
212
+ selected[selection.slug] = definition;
213
+ else
214
+ warnings.push(`loadout mcp references unknown server '${selection.slug}'.`);
75
215
  }
76
216
  return selected;
77
217
  };
@@ -80,14 +220,15 @@ const resolveDelegateSkills = (set, subagents, leaderSkills, warnings) => {
80
220
  const delegateSkills = [];
81
221
  const roots = set.layers.map((layer) => layer.root);
82
222
  for (const subagent of subagents) {
83
- const definitionPaths = [subagent.winner.path, ...(subagent.configPaths ?? [])];
223
+ // Resolver annotates every agent resource with configPaths, including an empty array.
224
+ const definitionPaths = [subagent.winner.path, ...subagent.configPaths];
84
225
  if (definitionPaths.some((path) => escapesRoots(path, roots)))
85
226
  continue;
86
- const definition = readAgentDefinition(subagent.winner.path, subagent.configPaths);
87
- if (isAgentDefinitionIssue(definition) || definition.name !== subagent.slug) {
227
+ const chain = resolveInheritanceChain(set, subagent.slug);
228
+ if (chain.entries === undefined)
88
229
  continue;
89
- }
90
- for (const skill of resolveSlugs(set, subagent.slug, 'skill', `subagent '${subagent.slug}' loadout skills`, definition.loadout.skills, warnings)) {
230
+ const controls = composeEffectiveControls(chain.entries);
231
+ for (const skill of resolveDeclaredSlugs(set, 'skill', `subagent '${subagent.slug}' loadout skills`, controls.skillSelections, warnings)) {
91
232
  const selected = skills.get(skill.slug);
92
233
  if (selected === undefined) {
93
234
  skills.set(skill.slug, skill);
@@ -100,54 +241,129 @@ const resolveDelegateSkills = (set, subagents, leaderSkills, warnings) => {
100
241
  }
101
242
  return delegateSkills;
102
243
  };
103
- const composeLoadout = (set, agent, loadout, warnings) => {
104
- const subagents = resolveSlugs(set, agent.slug, 'agent', 'loadout subagents', loadout.subagents, warnings);
105
- const skills = resolveSlugs(set, agent.slug, 'skill', 'loadout skills', loadout.skills, warnings);
244
+ const composeLoadout = (set, controls, warnings) => {
245
+ const subagents = resolveDeclaredSlugs(set, 'agent', 'loadout subagents', controls.subagentSelections, warnings);
246
+ const skills = resolveDeclaredSlugs(set, 'skill', 'loadout skills', controls.skillSelections, warnings);
106
247
  return {
107
248
  skills,
108
249
  delegateSkills: resolveDelegateSkills(set, subagents, skills, warnings),
109
250
  subagents,
110
- mcp: loadout.mcp,
111
- mcpServers: composeMcpServers(set, agent, loadout.mcp, warnings),
112
- extensions: loadout.extensions,
113
- plugins: loadout.plugins,
114
- model: loadout.model,
115
- thinking: loadout.thinking,
116
- tools: loadout.tools,
251
+ mcp: controls.loadout.mcp,
252
+ mcpServers: composeMcpServers(set, controls.mcpSelections, warnings),
253
+ extensions: controls.loadout.extensions,
254
+ plugins: controls.loadout.plugins,
255
+ model: controls.loadout.model,
256
+ thinking: controls.loadout.thinking,
257
+ tools: controls.loadout.tools,
117
258
  };
118
259
  };
119
- /**
120
- * Composes the selected agent into a CompositionPlan. Returns an error when the agent slug does not
121
- * resolve or its definition is invalid; loadout slugs that do not resolve are non-fatal warnings.
122
- */
123
- export const compose = (set, agentSlug) => {
124
- const agent = findResource(set, 'agent', agentSlug);
125
- if (agent === undefined) {
126
- return { errors: [`Unknown agent '${agentSlug}'. Run 'outfitter list agents' to see resolvable agents.`] };
260
+ const resolvePromptSelection = (set, selection, options, label, warnings, errors) => {
261
+ // Prompt selections are created only from entries in the resolved inheritance chain.
262
+ const owner = findResource(set, 'agent', selection.owner);
263
+ const resolved = resolvePromptSource({
264
+ source: selection.source,
265
+ declaringAgent: selection.owner,
266
+ layer: owner.winner.layer,
267
+ projectDirectory: options.projectDirectory,
268
+ optionalRepoFile: true,
269
+ label,
270
+ });
271
+ if (resolved.warning !== undefined)
272
+ warnings.push(resolved.warning);
273
+ if (resolved.error !== undefined)
274
+ errors.push(resolved.error);
275
+ return resolved.fragment;
276
+ };
277
+ const resolveOptionalPrompt = (set, selection, options, label, warnings, errors) => selection === undefined ? undefined : resolvePromptSelection(set, selection, options, label, warnings, errors);
278
+ const composeIdentity = (set, chain, controls, options, warnings, errors) => {
279
+ const declaredSystemPrompt = resolveOptionalPrompt(set, controls.systemPrompt, options, 'system-prompt', warnings, errors);
280
+ if (declaredSystemPrompt?.kind === 'repo_file') {
281
+ warnings.push(`agent '${controls.systemPrompt.owner}' uses untrusted repo_file '${declaredSystemPrompt.reference}' as system_prompt.`);
127
282
  }
128
- const definition = readAgentDefinition(agent.winner.path, agent.configPaths);
129
- if (isAgentDefinitionIssue(definition)) {
130
- return { errors: [`Agent '${agentSlug}' is invalid: ${definition.message}`] };
283
+ const systemPrompt = declaredSystemPrompt ?? readRootFile(set, 'system-prompt.md');
284
+ const sharedContext = readRootFile(set, 'agents.md');
285
+ const appendSystemPrompts = controls.appendPromptSelections
286
+ .map((selection) => resolvePromptSelection(set, selection, options, `append-${selection.owner}-${selection.index + 1}`, warnings, errors))
287
+ .filter((fragment) => fragment !== undefined);
288
+ const promptTemplate = resolveOptionalPrompt(set, controls.promptTemplate, options, 'prompt-template', warnings, errors);
289
+ const agentBodies = chain.map((entry) => agentBodyFragment({
290
+ agent: entry.resource.slug,
291
+ layer: entry.resource.winner.layer,
292
+ path: entry.resource.winner.path,
293
+ content: entry.definition.body,
294
+ }));
295
+ return {
296
+ systemPrompt: systemPrompt?.content,
297
+ systemPromptFragment: systemPrompt,
298
+ sharedContext: sharedContext?.content,
299
+ sharedContextFragment: sharedContext,
300
+ appendSystemPrompts,
301
+ agentBodies,
302
+ promptTemplate,
303
+ agentBody: agentBodies.map((fragment) => fragment.content).join('\n'),
304
+ label: controls.label,
305
+ description: controls.description,
306
+ };
307
+ };
308
+ const composeSubagents = (set, subagents, options, warnings, errors) => {
309
+ const composed = [];
310
+ const roots = set.layers.map((layer) => layer.root);
311
+ for (const resource of subagents) {
312
+ const definitionPaths = [resource.winner.path, ...resource.configPaths];
313
+ if (definitionPaths.some((path) => escapesRoots(path, roots)))
314
+ continue;
315
+ const chainResult = resolveInheritanceChain(set, resource.slug);
316
+ if (chainResult.entries === undefined) {
317
+ errors.push(...chainResult.errors.map((error) => `Subagent '${resource.slug}' is invalid: ${error}`));
318
+ continue;
319
+ }
320
+ const controls = composeEffectiveControls(chainResult.entries);
321
+ const identity = composeIdentity(set, chainResult.entries, controls, options, warnings, errors);
322
+ const skills = resolveDeclaredSlugs(set, 'skill', `subagent '${resource.slug}' loadout skills`, controls.skillSelections, warnings);
323
+ composed.push({
324
+ resource,
325
+ identity,
326
+ skills,
327
+ extensions: controls.loadout.extensions,
328
+ model: controls.loadout.model,
329
+ thinking: controls.loadout.thinking,
330
+ tools: controls.loadout.tools,
331
+ });
131
332
  }
132
- // A name/directory mismatch is an invalid agent (OFTR-003.2) and must fail composition.
133
- if (definition.name !== agentSlug) {
333
+ return composed;
334
+ };
335
+ /** Composes one selected agent from the shared effective resource set. */
336
+ export const compose = (set, agentSlug, options = {}) => {
337
+ if (findResource(set, 'agent', agentSlug) === undefined) {
134
338
  return {
135
- errors: [`Agent '${agentSlug}' is invalid: agent.md name '${definition.name}' must match its directory.`],
339
+ errors: [`Unknown agent '${agentSlug}'. Run 'outfitter list agents' to see resolvable agents.`],
340
+ warnings: [],
136
341
  };
137
342
  }
343
+ const chainResult = resolveInheritanceChain(set, agentSlug);
344
+ if (chainResult.entries === undefined)
345
+ return { errors: chainResult.errors, warnings: [] };
346
+ const chain = chainResult.entries;
138
347
  const warnings = [];
139
- const plan = {
140
- agent: agentSlug,
141
- identity: {
142
- systemPrompt: readRootFile(set, 'system-prompt.md'),
143
- sharedContext: readRootFile(set, 'agents.md'),
144
- agentBody: definition.body,
145
- label: definition.label,
146
- description: definition.description,
348
+ const errors = [];
349
+ const controls = composeEffectiveControls(chain);
350
+ const identity = composeIdentity(set, chain, controls, options, warnings, errors);
351
+ const loadout = composeLoadout(set, controls, warnings);
352
+ const composedSubagents = composeSubagents(set, loadout.subagents, options, warnings, errors);
353
+ const uniqueWarnings = uniqueStrings(warnings);
354
+ if (errors.length > 0)
355
+ return { errors, warnings: uniqueWarnings };
356
+ return {
357
+ plan: {
358
+ agent: agentSlug,
359
+ identity,
360
+ loadout: { ...loadout, composedSubagents },
361
+ contributingAgents: chain.map((entry) => entry.resource),
362
+ inheritanceChain: chain.map((entry) => entry.resource.slug),
363
+ warnings: uniqueWarnings,
147
364
  },
148
- loadout: composeLoadout(set, agent, definition.loadout, warnings),
149
- warnings,
365
+ errors: [],
366
+ warnings: uniqueWarnings,
150
367
  };
151
- return { plan, errors: [] };
152
368
  };
153
369
  //# sourceMappingURL=Composer.js.map