@rarebit-one/harness-kernel 0.11.0-next.1 → 0.12.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 (59) hide show
  1. package/README.md +66 -0
  2. package/dist/engines/acp.d.ts.map +1 -1
  3. package/dist/engines/acp.js +34 -19
  4. package/dist/engines/acp.js.map +1 -1
  5. package/dist/engines/claudeCode.d.ts +23 -1
  6. package/dist/engines/claudeCode.d.ts.map +1 -1
  7. package/dist/engines/claudeCode.js +49 -18
  8. package/dist/engines/claudeCode.js.map +1 -1
  9. package/dist/engines/claudeCodeDriver.d.ts +9 -1
  10. package/dist/engines/claudeCodeDriver.d.ts.map +1 -1
  11. package/dist/engines/claudeCodeDriver.js +30 -0
  12. package/dist/engines/claudeCodeDriver.js.map +1 -1
  13. package/dist/engines/codex.d.ts +7 -1
  14. package/dist/engines/codex.d.ts.map +1 -1
  15. package/dist/engines/codex.js +31 -19
  16. package/dist/engines/codex.js.map +1 -1
  17. package/dist/engines/codexDriver.d.ts +1 -1
  18. package/dist/engines/codexDriver.d.ts.map +1 -1
  19. package/dist/engines/codexDriver.js +6 -0
  20. package/dist/engines/codexDriver.js.map +1 -1
  21. package/dist/engines/environment.d.ts +121 -0
  22. package/dist/engines/environment.d.ts.map +1 -0
  23. package/dist/engines/environment.js +318 -0
  24. package/dist/engines/environment.js.map +1 -0
  25. package/dist/engines/gateway.d.ts +99 -0
  26. package/dist/engines/gateway.d.ts.map +1 -0
  27. package/dist/engines/gateway.js +181 -0
  28. package/dist/engines/gateway.js.map +1 -0
  29. package/dist/engines/harnessPrompt.d.ts +15 -0
  30. package/dist/engines/harnessPrompt.d.ts.map +1 -0
  31. package/dist/engines/harnessPrompt.js +33 -0
  32. package/dist/engines/harnessPrompt.js.map +1 -0
  33. package/dist/engines/native.d.ts +15 -0
  34. package/dist/engines/native.d.ts.map +1 -1
  35. package/dist/engines/native.js +74 -5
  36. package/dist/engines/native.js.map +1 -1
  37. package/dist/engines/types.d.ts +45 -2
  38. package/dist/engines/types.d.ts.map +1 -1
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +4 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/providers/anthropic.d.ts +3 -1
  44. package/dist/providers/anthropic.d.ts.map +1 -1
  45. package/dist/providers/anthropic.js +4 -1
  46. package/dist/providers/anthropic.js.map +1 -1
  47. package/dist/providers/index.d.ts +10 -0
  48. package/dist/providers/index.d.ts.map +1 -1
  49. package/dist/providers/index.js +3 -3
  50. package/dist/providers/index.js.map +1 -1
  51. package/dist/providers/openai.d.ts +3 -1
  52. package/dist/providers/openai.d.ts.map +1 -1
  53. package/dist/providers/openai.js +4 -2
  54. package/dist/providers/openai.js.map +1 -1
  55. package/dist/providers/openrouter.d.ts +3 -1
  56. package/dist/providers/openrouter.d.ts.map +1 -1
  57. package/dist/providers/openrouter.js +4 -2
  58. package/dist/providers/openrouter.js.map +1 -1
  59. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  import { refusePrivateRun } from "../private.js";
2
2
  import { refuseUnisolated } from "./isolation.js";
3
- import { mkdtemp, rm, stat } from "node:fs/promises";
3
+ import { mkdtemp, rm, stat, writeFile } from "node:fs/promises";
4
4
  import { tmpdir } from "node:os";
5
5
  import path from "node:path";
6
6
  import { harnessOutcome } from "../signals.js";
@@ -8,6 +8,9 @@ import { CAPABILITY_SERVER_NAME } from "./capabilityMcp.js";
8
8
  import { connectorServers, writeCodexConfig } from "./connectorMcp.js";
9
9
  import { readEmissions } from "./capabilityEmissions.js";
10
10
  import { defaultCodexDriver } from "./codexDriver.js";
11
+ import { harnessPrompt } from "./harnessPrompt.js";
12
+ import { environmentInstructions } from "./environment.js";
13
+ import { gatewayEnv, refuseBadGateway, refuseCredentialsInVm } from "./gateway.js";
11
14
  const DEFAULT_MODEL = "gpt-5-codex";
12
15
  const LOG_TRUNCATE = 2000;
13
16
  /** The runner-hosted capability MCP server the codex `config.toml` points at. */
@@ -52,10 +55,15 @@ export class CodexEngine {
52
55
  reason: "codex engine requires the ephemeral runner profile (per-run container isolation)",
53
56
  };
54
57
  }
55
- return refuseUnisolated("codex", spec) ?? { ok: true };
58
+ return (refuseUnisolated("codex", spec) ??
59
+ refuseBadGateway("codex", spec) ??
60
+ refuseCredentialsInVm("codex", spec, ["OPENAI_API_KEY", "CODEX_API_KEY"]) ?? { ok: true });
56
61
  }
57
62
  async run(spec, ctx) {
58
- const apiKey = spec.provider.credentials?.openai ?? process.env.OPENAI_API_KEY;
63
+ // With a gateway the harness holds the run token and nothing else.
64
+ const apiKey = spec.gateway
65
+ ? undefined
66
+ : (spec.provider.credentials?.openai ?? process.env.OPENAI_API_KEY);
59
67
  const model = spec.provider.model || DEFAULT_MODEL;
60
68
  // Emissions land OUTSIDE the sandbox so the bookkeeping file is never captured
61
69
  // by the change set; the capability server (an external process) writes here and
@@ -92,13 +100,32 @@ export class CodexEngine {
92
100
  },
93
101
  };
94
102
  await writeCodexConfig(codexHome, servers);
103
+ // The environment, compiled for codex. Codex reads the workdir's own
104
+ // AGENTS.md (the caller materialized the environment's into it) and also
105
+ // `$CODEX_HOME/AGENTS.md` as global instructions, which is where the
106
+ // system instructions and the skills index go. Not written when there is
107
+ // nothing to say, so a run without an environment gets the same CODEX_HOME.
108
+ const instructions = environmentInstructions(spec, { agentsMd: false, skillsIndex: true });
109
+ if (instructions) {
110
+ await writeFile(path.join(codexHome, "AGENTS.md"), `${instructions}\n`);
111
+ ctx.log("codex: environment instructions written to CODEX_HOME/AGENTS.md");
112
+ }
95
113
  const options = {
96
- prompt: buildPrompt(spec),
114
+ prompt: harnessPrompt(spec),
97
115
  cwd: spec.workdir,
98
116
  model,
99
117
  codexHome,
100
118
  capabilityEnv,
101
119
  ...(apiKey ? { apiKey } : {}),
120
+ ...(spec.gateway
121
+ ? {
122
+ gatewayEnv: {
123
+ ...gatewayEnv(spec.gateway, ["openai"]),
124
+ // `codex exec` prefers CODEX_API_KEY over OPENAI_API_KEY.
125
+ CODEX_API_KEY: spec.gateway.runToken,
126
+ },
127
+ }
128
+ : {}),
102
129
  ...(spec.limits?.maxDurationMs !== undefined
103
130
  ? { maxDurationMs: spec.limits.maxDurationMs }
104
131
  : {}),
@@ -155,21 +182,6 @@ export class CodexEngine {
155
182
  };
156
183
  }
157
184
  }
158
- function buildPrompt(spec) {
159
- const inputs = JSON.stringify(spec.inputs ?? {}, null, 2);
160
- return [
161
- spec.workflow.prompt ?? `Execute the "${spec.workflow.name ?? spec.workflowPath}" workflow.`,
162
- "",
163
- "## Inputs",
164
- "```json",
165
- inputs,
166
- "```",
167
- "",
168
- "You are running as an autonomous workflow. The current working directory is the",
169
- "workspace — inspect and edit its files directly with your tools. When finished,",
170
- "reply with the workflow's output as Markdown.",
171
- ].join("\n");
172
- }
173
185
  function truncate(text, max) {
174
186
  return text.length <= max ? text : `${text.slice(0, max)}…`;
175
187
  }
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/engines/codex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/engines/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,cAAc,EAAkB,MAAM,eAAe,CAAA;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAA8B,MAAM,mBAAmB,CAAA;AAClG,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AA8DlF,MAAM,aAAa,GAAG,aAAa,CAAA;AACnC,MAAM,YAAY,GAAG,IAAI,CAAA;AAEzB,iFAAiF;AAEjF;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,OAAO,CAAA;IAEN,KAAK,CAAa;IAClB,sBAAsB,CAAQ;IAE/C;;;;;OAKG;IACH,YAAY,QAAqB,kBAAkB,EAAE,sBAA8B;QACjF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;IACtD,CAAC;IAED,QAAQ,CAAC,IAAa;QACpB,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAC/C,IAAI,OAAO;YAAE,OAAO,OAAO,CAAA;QAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;YAC5C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sDAAsD,EAAE,CAAA;QACtF,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;YAClD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,kFAAkF;aAC3F,CAAA;QACH,CAAC;QACD,OAAO,CACL,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC;YAC/B,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC;YAC/B,qBAAqB,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAC1F,CAAA;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAa,EAAE,GAAkB;QACzC,mEAAmE;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAA;QAElD,+EAA+E;QAC/E,iFAAiF;QACjF,iCAAiC;QACjC,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAA;QACxE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAA;QAE/D,iFAAiF;QACjF,mFAAmF;QACnF,0CAA0C;QAC1C,EAAE;QACF,+EAA+E;QAC/E,+EAA+E;QAC/E,8EAA8E;QAC9E,8EAA8E;QAC9E,8EAA8E;QAC9E,+EAA+E;QAC/E,8DAA8D;QAC9D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAA;QAC3E,8EAA8E;QAC9E,4EAA4E;QAC5E,qEAAqE;QACrE,MAAM,aAAa,GAA2B;YAC5C,oBAAoB,EAAE,IAAI,CAAC,WAAW;YACtC,eAAe,EAAE,IAAI,CAAC,OAAO;YAC7B,sBAAsB,EAAE,aAAa;SACtC,CAAA;QACD,MAAM,OAAO,GAA0C;YACrD,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;YACpC,CAAC,sBAAsB,CAAC,EAAE;gBACxB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,IAAI,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC;gBACnC,GAAG,EAAE,aAAa;aACnB;SACF,CAAA;QACD,MAAM,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC1C,qEAAqE;QACrE,yEAAyE;QACzE,qEAAqE;QACrE,yEAAyE;QACzE,4EAA4E;QAC5E,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1F,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,GAAG,YAAY,IAAI,CAAC,CAAA;YACvE,GAAG,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAA;QAC5E,CAAC;QAED,MAAM,OAAO,GAAiB;YAC5B,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;YAC3B,GAAG,EAAE,IAAI,CAAC,OAAO;YACjB,KAAK;YACL,SAAS;YACT,aAAa;YACb,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,OAAO;gBACd,CAAC,CAAC;oBACE,UAAU,EAAE;wBACV,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;wBACvC,0DAA0D;wBAC1D,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;qBACrC;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,KAAK,SAAS;gBAC1C,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;gBAC9C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAA;QAED,GAAG,CAAC,GAAG,CAAC,wBAAwB,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QAE3D,IAAI,SAAS,GAAG,EAAE,CAAA;QAClB,IAAI,OAAO,GAAe,WAAW,CAAA;QACrC,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChD,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACjC,IAAI,OAAO,CAAC,IAAI;wBAAE,GAAG,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,CAAA;gBAC7E,CAAC;qBAAM,CAAC;oBACN,SAAS,GAAG,OAAO,CAAC,IAAI,CAAA;oBACxB,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;oBAC5D,IAAI,OAAO,CAAC,SAAS;wBAAE,GAAG,CAAC,GAAG,CAAC,mBAAmB,OAAO,GAAG,CAAC,CAAA;yBACxD,IAAI,OAAO,CAAC,OAAO;wBAAE,GAAG,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;gBACvE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6EAA6E;YAC7E,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO;gBAAE,MAAM,GAAG,CAAA;YACnC,OAAO,GAAG,UAAU,CAAA;YACpB,GAAG,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;QACtC,CAAC;gBAAS,CAAC;YACT,+DAA+D;YAC/D,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACvD,CAAC;QAED,2EAA2E;QAC3E,wEAAwE;QACxE,sEAAsE;QACtE,yEAAyE;QACzE,+CAA+C;QAC/C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAClD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EACV,GAAG,EAAE,CAAC,SAAS,CAChB,CAAA;QACD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAA;QACpD,2EAA2E;QAC3E,4EAA4E;QAC5E,4EAA4E;QAC5E,sCAAsC;QACtC,GAAG,CAAC,GAAG,CACL,sCAAsC,aAAa,CAAC,CAAC,CAAC,YAAY,aAAa,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;YACxG,GAAG,aAAa,IAAI,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CACtE,CAAA;QACD,MAAM,EAAE,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAExD,OAAO;YACL,IAAI,EAAE,SAAS,IAAI,aAAa;YAChC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO;SACR,CAAA;IACH,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAW;IACzC,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAA;AAC7D,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { CodexMessage, CodexOptions } from "./codex.js";
2
2
  /** The codex process environment: an allowlist, never the host's whole one (see `childEnv`). */
3
- export declare function codexEnv(opts: Pick<CodexOptions, "codexHome" | "capabilityEnv" | "apiKey">, env?: NodeJS.ProcessEnv): Record<string, string>;
3
+ export declare function codexEnv(opts: Pick<CodexOptions, "codexHome" | "capabilityEnv" | "apiKey" | "gatewayEnv">, env?: NodeJS.ProcessEnv): Record<string, string>;
4
4
  /**
5
5
  * The default codex driver: the single integration boundary to the OpenAI Codex
6
6
  * CLI, mirroring claudeCodeDriver's injectable shape. It runs codex
@@ -1 +1 @@
1
- {"version":3,"file":"codexDriver.d.ts","sourceRoot":"","sources":["../../src/engines/codexDriver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAM5D,gGAAgG;AAChG,wBAAgB,QAAQ,CACtB,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,eAAe,GAAG,QAAQ,CAAC,EAClE,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAuB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,CAiGzF"}
1
+ {"version":3,"file":"codexDriver.d.ts","sourceRoot":"","sources":["../../src/engines/codexDriver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO5D,gGAAgG;AAChG,wBAAgB,QAAQ,CACtB,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,eAAe,GAAG,QAAQ,GAAG,YAAY,CAAC,EACjF,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAuB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,CAiGzF"}
@@ -5,10 +5,16 @@ import path from "node:path";
5
5
  import { DEFAULT_STOP_GRACE_MS, terminateProcessGroup } from "../processGroup.js";
6
6
  import { runStop } from "../signals.js";
7
7
  import { childEnv } from "./isolation.js";
8
+ import { withoutShadowed } from "./gateway.js";
8
9
  /** Host env the codex CLI may inherit: its own and its provider's settings. */
9
10
  const CODEX_ENV_PREFIXES = ["OPENAI_", "CODEX_"];
10
11
  /** The codex process environment: an allowlist, never the host's whole one (see `childEnv`). */
11
12
  export function codexEnv(opts, env = process.env) {
13
+ // Through a gateway: the run token and route only, never a key, and none of
14
+ // the host's OPENAI_* settings.
15
+ if (opts.gatewayEnv) {
16
+ return childEnv(withoutShadowed(CODEX_ENV_PREFIXES), { CODEX_HOME: opts.codexHome, ...opts.capabilityEnv, ...opts.gatewayEnv }, env);
17
+ }
12
18
  return childEnv(CODEX_ENV_PREFIXES, {
13
19
  CODEX_HOME: opts.codexHome,
14
20
  // The capability stdio MCP server reads these from its env; set them on the
@@ -1 +1 @@
1
- {"version":3,"file":"codexDriver.js","sourceRoot":"","sources":["../../src/engines/codexDriver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codexDriver.js","sourceRoot":"","sources":["../../src/engines/codexDriver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import type { RunSpec } from "./types.js";
2
+ /**
3
+ * A run's environment: the instructions, instruction files, skills and input
4
+ * files a caller wants every harness to start from, whatever engine runs it.
5
+ *
6
+ * Two halves, with a strict split between them:
7
+ *
8
+ * - **Workdir files** — `AGENTS.md`, nested instruction files, skill
9
+ * directories and inline sources. These are the caller's to put on disk,
10
+ * with {@link materializeEnvironment}, because the caller owns the working
11
+ * tree's lifecycle: it runs setup before the engine (setup may need a
12
+ * source) and diffs the tree after it (none of these files may leak into
13
+ * the change set). An engine never writes them.
14
+ * - **Harness configuration** — whatever lives outside the tree: a system
15
+ * prompt, a skills plugin, a transient config home. Each engine compiles
16
+ * that from the spec itself, because each harness takes it differently.
17
+ *
18
+ * Every field is optional, and a spec carrying none of them runs exactly as it
19
+ * did before they existed.
20
+ */
21
+ /** One file's content. Text is UTF-8 unless `encoding` says otherwise. */
22
+ export interface EnvironmentFile {
23
+ /** Relative path (to the workdir, or to a skill's own directory). */
24
+ path: string;
25
+ content: string;
26
+ encoding?: "utf8" | "base64";
27
+ }
28
+ /** Instructions handed to every harness on top of its own defaults. */
29
+ export interface RunInstructions {
30
+ /** System-level instructions: the harness's system prompt or nearest equivalent. */
31
+ system?: string;
32
+ /** The workdir root's `AGENTS.md`, merged ahead of the workspace's own if it has one. */
33
+ agentsMd?: string;
34
+ }
35
+ /**
36
+ * An Agent Skill: a directory whose `SKILL.md` (with `name` / `description`
37
+ * frontmatter) says when and how to use it, plus any files it refers to.
38
+ */
39
+ export interface RunSkill {
40
+ /** Lowercase letters, digits and hyphens; also the directory name. */
41
+ name: string;
42
+ /** Paths relative to the skill's directory; must include `SKILL.md`. */
43
+ files: EnvironmentFile[];
44
+ }
45
+ /**
46
+ * A run input that is not workspace content. Only `inline` exists today; a
47
+ * kind this kernel does not know fails the run rather than being skipped.
48
+ */
49
+ export type RunSource = {
50
+ kind: "inline";
51
+ } & EnvironmentFile;
52
+ /** Where skills are materialized in the workdir: the cross-harness convention. */
53
+ export declare const SKILLS_DIR = ".agents/skills";
54
+ /** Whether the spec carries any environment field at all. */
55
+ export declare function hasEnvironment(spec: Pick<RunSpec, "instructions" | "agentFiles" | "skills" | "sources">): boolean;
56
+ /**
57
+ * What {@link MaterializedEnvironment.restore} could not undo: files the
58
+ * harness changed after they were written, kept as the harness left them.
59
+ */
60
+ export interface RestoreReport {
61
+ kept: string[];
62
+ }
63
+ /** The environment as written into a workdir, and the way to take it back out. */
64
+ export interface MaterializedEnvironment {
65
+ /** Every workdir-relative path written or merged, in write order. */
66
+ paths: string[];
67
+ /**
68
+ * Return the tree to how it was: created files removed, merged files back to
69
+ * their original content, created directories removed when empty. A file the
70
+ * harness rewrote is left alone and reported, never clobbered — its new
71
+ * content is the run's work. Call it before computing a change set.
72
+ */
73
+ restore(): Promise<RestoreReport>;
74
+ }
75
+ /**
76
+ * Write the spec's workdir-bound environment into `spec.workdir`:
77
+ *
78
+ * - `instructions.agentsMd` → `AGENTS.md` at the root;
79
+ * - `agentFiles` → nested `AGENTS.md` files;
80
+ * - `skills` → `.agents/skills/<name>/…`;
81
+ * - `sources` → their own paths.
82
+ *
83
+ * An instruction file that already exists keeps its content after the
84
+ * environment's, so a workspace's own conventions still apply. A skill or
85
+ * source must not overwrite anything: that collision fails, because silently
86
+ * replacing a workspace file with a run input would put the input in the
87
+ * change set.
88
+ *
89
+ * Everything is validated before anything is written, so a bad spec leaves the
90
+ * tree untouched. Paths must stay inside the workdir and may not pass through a
91
+ * symlink — a snapshot can carry one, and writing through it would leave the
92
+ * sandbox.
93
+ */
94
+ export declare function materializeEnvironment(spec: Pick<RunSpec, "workdir" | "instructions" | "agentFiles" | "skills" | "sources">): Promise<MaterializedEnvironment>;
95
+ /**
96
+ * Write skills as `<dir>/<name>/…` in a directory the caller owns outside the
97
+ * workdir (a harness's plugin or config home), with the same validation
98
+ * {@link materializeEnvironment} applies. Nothing to restore: the caller
99
+ * deletes `dir` itself.
100
+ */
101
+ export declare function writeSkills(dir: string, skills: RunSkill[]): Promise<void>;
102
+ /**
103
+ * The skills index an engine without native skill discovery puts in front of
104
+ * the model: one line per skill with where its `SKILL.md` was materialized and
105
+ * what its frontmatter says it is for. Undefined when the run has no skills.
106
+ */
107
+ export declare function skillsIndex(skills: RunSkill[] | undefined): string | undefined;
108
+ /** A single-line scalar from a Markdown file's YAML frontmatter, if present. */
109
+ export declare function frontmatterField(markdown: string, field: string): string | undefined;
110
+ /**
111
+ * The instructions block an engine hands its harness, from whichever of these
112
+ * the harness cannot already find on disk: the system instructions, the root
113
+ * `AGENTS.md` text (for a harness that does not read `AGENTS.md`), and the
114
+ * skills index (for one without skill discovery). Undefined when empty, so a
115
+ * spec without an environment adds nothing.
116
+ */
117
+ export declare function environmentInstructions(spec: Pick<RunSpec, "instructions" | "agentFiles" | "skills">, include: {
118
+ agentsMd: boolean;
119
+ skillsIndex: boolean;
120
+ }): string | undefined;
121
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/engines/environment.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAC7B;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAA;IACZ,wEAAwE;IACxE,KAAK,EAAE,eAAe,EAAE,CAAA;CACzB;AAED;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,eAAe,CAAA;AAE5D,kFAAkF;AAClF,eAAO,MAAM,UAAU,mBAAmB,CAAA;AAO1C,6DAA6D;AAC7D,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC,GACxE,OAAO,CAOT;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED,kFAAkF;AAClF,MAAM,WAAW,uBAAuB;IACtC,qEAAqE;IACrE,KAAK,EAAE,MAAM,EAAE,CAAA;IACf;;;;;OAKG;IACH,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,CAAA;CAClC;AAcD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,cAAc,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC,GACpF,OAAO,CAAC,uBAAuB,CAAC,CA8BlC;AAuKD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAShF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAe9E;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBpF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,GAAG,QAAQ,CAAC,EAC7D,OAAO,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,GACnD,MAAM,GAAG,SAAS,CAQpB"}
@@ -0,0 +1,318 @@
1
+ import { constants } from "node:fs";
2
+ import { lstat, mkdir, open, rm, rmdir, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { resolveWithin } from "./capability.js";
5
+ /** Where skills are materialized in the workdir: the cross-harness convention. */
6
+ export const SKILLS_DIR = ".agents/skills";
7
+ const SKILL_NAME = /^[a-z0-9][a-z0-9-]{0,63}$/;
8
+ const AGENTS_MD = "AGENTS.md";
9
+ /** Separates environment instructions from the workspace's own `AGENTS.md`. */
10
+ const MERGE_SEPARATOR = "\n\n";
11
+ /** Whether the spec carries any environment field at all. */
12
+ export function hasEnvironment(spec) {
13
+ return (Boolean(spec.instructions?.system || spec.instructions?.agentsMd) ||
14
+ (spec.agentFiles?.length ?? 0) > 0 ||
15
+ (spec.skills?.length ?? 0) > 0 ||
16
+ (spec.sources?.length ?? 0) > 0);
17
+ }
18
+ /**
19
+ * Write the spec's workdir-bound environment into `spec.workdir`:
20
+ *
21
+ * - `instructions.agentsMd` → `AGENTS.md` at the root;
22
+ * - `agentFiles` → nested `AGENTS.md` files;
23
+ * - `skills` → `.agents/skills/<name>/…`;
24
+ * - `sources` → their own paths.
25
+ *
26
+ * An instruction file that already exists keeps its content after the
27
+ * environment's, so a workspace's own conventions still apply. A skill or
28
+ * source must not overwrite anything: that collision fails, because silently
29
+ * replacing a workspace file with a run input would put the input in the
30
+ * change set.
31
+ *
32
+ * Everything is validated before anything is written, so a bad spec leaves the
33
+ * tree untouched. Paths must stay inside the workdir and may not pass through a
34
+ * symlink — a snapshot can carry one, and writing through it would leave the
35
+ * sandbox.
36
+ */
37
+ export async function materializeEnvironment(spec) {
38
+ const plan = planEnvironment(spec);
39
+ const applied = [];
40
+ const createdDirs = [];
41
+ try {
42
+ for (const entry of plan) {
43
+ await assertNoSymlink(spec.workdir, entry.rel);
44
+ const existing = await readExisting(entry.abs, entry.rel);
45
+ if (existing !== undefined && entry.mode === "create") {
46
+ throw new Error(`environment file would overwrite a workspace file: ${entry.rel}`);
47
+ }
48
+ createdDirs.push(...(await mkdirTracked(spec.workdir, path.dirname(entry.abs))));
49
+ if (existing === undefined) {
50
+ await writeFile(entry.abs, entry.content, { flag: "wx" });
51
+ applied.push({ kind: "created", rel: entry.rel, abs: entry.abs, content: entry.content });
52
+ }
53
+ else {
54
+ const prefix = Buffer.concat([entry.content, Buffer.from(MERGE_SEPARATOR)]);
55
+ await writeFile(entry.abs, Buffer.concat([prefix, existing]));
56
+ applied.push({ kind: "merged", rel: entry.rel, abs: entry.abs, prefix, original: existing });
57
+ }
58
+ }
59
+ }
60
+ catch (err) {
61
+ // Half an environment is worse than none: undo what was written.
62
+ await undo(spec.workdir, applied, createdDirs);
63
+ throw err;
64
+ }
65
+ return {
66
+ paths: applied.map((a) => a.rel),
67
+ restore: () => undo(spec.workdir, applied, createdDirs),
68
+ };
69
+ }
70
+ /** The validated write list, or a throw naming the first problem. */
71
+ function planEnvironment(spec) {
72
+ const plan = [];
73
+ const seen = new Set();
74
+ const add = (rel, file, mode) => {
75
+ const normalized = normalizeRel(rel);
76
+ if (seen.has(normalized))
77
+ throw new Error(`environment writes ${normalized} twice`);
78
+ seen.add(normalized);
79
+ plan.push({
80
+ rel: normalized,
81
+ abs: resolveWithin(spec.workdir, normalized),
82
+ content: decode(file, normalized),
83
+ mode,
84
+ });
85
+ };
86
+ if (spec.instructions?.agentsMd)
87
+ add(AGENTS_MD, { content: spec.instructions.agentsMd }, "merge");
88
+ for (const file of spec.agentFiles ?? []) {
89
+ if (path.posix.basename(normalizeRel(file.path)) !== AGENTS_MD) {
90
+ throw new Error(`agent file must be named ${AGENTS_MD}: ${file.path}`);
91
+ }
92
+ add(file.path, file, "merge");
93
+ }
94
+ for (const skill of spec.skills ?? []) {
95
+ if (!SKILL_NAME.test(skill.name)) {
96
+ throw new Error(`skill name must match ${SKILL_NAME.source}: ${JSON.stringify(skill.name)}`);
97
+ }
98
+ if (!skill.files.some((f) => normalizeRel(f.path) === "SKILL.md")) {
99
+ throw new Error(`skill ${skill.name} has no SKILL.md`);
100
+ }
101
+ for (const file of skill.files) {
102
+ add(path.posix.join(SKILLS_DIR, skill.name, normalizeRel(file.path)), file, "create");
103
+ }
104
+ }
105
+ for (const source of spec.sources ?? []) {
106
+ const kind = source.kind;
107
+ if (kind !== "inline") {
108
+ throw new Error(`unsupported source kind ${JSON.stringify(kind)}`);
109
+ }
110
+ add(source.path, source, "create");
111
+ }
112
+ return plan;
113
+ }
114
+ /** A relative POSIX path with no `.`/`..` segments, or a throw. */
115
+ function normalizeRel(rel) {
116
+ if (typeof rel !== "string" || rel === "" || rel.includes("\0")) {
117
+ throw new Error(`invalid environment path: ${JSON.stringify(rel)}`);
118
+ }
119
+ if (rel.startsWith("/") || /^[A-Za-z]:/.test(rel) || rel.includes("\\")) {
120
+ throw new Error(`environment path must be relative: ${rel}`);
121
+ }
122
+ const normalized = path.posix.normalize(rel);
123
+ if (normalized === "." || normalized.startsWith("../") || normalized === "..") {
124
+ throw new Error(`environment path escapes the workdir: ${rel}`);
125
+ }
126
+ return normalized;
127
+ }
128
+ function decode(file, rel) {
129
+ if (typeof file.content !== "string")
130
+ throw new Error(`environment file ${rel} has no content`);
131
+ if (file.encoding === undefined || file.encoding === "utf8")
132
+ return Buffer.from(file.content);
133
+ if (file.encoding === "base64")
134
+ return Buffer.from(file.content, "base64");
135
+ throw new Error(`environment file ${rel} has unknown encoding ${JSON.stringify(file.encoding)}`);
136
+ }
137
+ /** Throws when any existing segment of `rel` under `workdir` is a symlink. */
138
+ async function assertNoSymlink(workdir, rel) {
139
+ let current = path.resolve(workdir);
140
+ for (const segment of rel.split("/")) {
141
+ current = path.join(current, segment);
142
+ const st = await lstat(current).catch(() => undefined);
143
+ if (!st)
144
+ return;
145
+ if (st.isSymbolicLink())
146
+ throw new Error(`environment path passes through a symlink: ${rel}`);
147
+ }
148
+ }
149
+ async function readExisting(abs, rel) {
150
+ // Open once without following a final symlink, then stat and read the same
151
+ // handle, so the file checked is the file read.
152
+ let handle;
153
+ try {
154
+ handle = await open(abs, constants.O_RDONLY | constants.O_NOFOLLOW);
155
+ }
156
+ catch (err) {
157
+ const code = err.code;
158
+ if (code === "ENOENT")
159
+ return undefined;
160
+ if (code === "ELOOP") {
161
+ throw new Error(`environment path is not a regular file: ${rel}`, { cause: err });
162
+ }
163
+ throw err;
164
+ }
165
+ try {
166
+ if (!(await handle.stat()).isFile()) {
167
+ throw new Error(`environment path is not a regular file: ${rel}`);
168
+ }
169
+ return await handle.readFile();
170
+ }
171
+ finally {
172
+ await handle.close();
173
+ }
174
+ }
175
+ /** `mkdir -p`, returning the directories it created (shallowest first). */
176
+ async function mkdirTracked(workdir, dir) {
177
+ const created = [];
178
+ const base = path.resolve(workdir);
179
+ const missing = [];
180
+ for (let d = dir; d !== base && d.startsWith(base + path.sep); d = path.dirname(d)) {
181
+ const st = await lstat(d).catch(() => undefined);
182
+ if (st)
183
+ break;
184
+ missing.unshift(d);
185
+ }
186
+ for (const d of missing) {
187
+ await mkdir(d);
188
+ created.push(d);
189
+ }
190
+ return created;
191
+ }
192
+ async function undo(workdir, applied, createdDirs) {
193
+ const kept = [];
194
+ for (const entry of [...applied].reverse()) {
195
+ // The harness may have swapped the file or a parent for a symlink since we
196
+ // wrote it. Never follow one out of the workdir: leave it and report it.
197
+ const safe = await assertNoSymlink(workdir, entry.rel).then(() => true, () => false);
198
+ if (!safe) {
199
+ kept.push(entry.rel);
200
+ continue;
201
+ }
202
+ const current = await readExisting(entry.abs, entry.rel).catch(() => undefined);
203
+ if (current === undefined)
204
+ continue;
205
+ if (entry.kind === "created") {
206
+ if (current.equals(entry.content))
207
+ await rm(entry.abs, { force: true });
208
+ else
209
+ kept.push(entry.rel);
210
+ }
211
+ else if (current.subarray(0, entry.prefix.length).equals(entry.prefix)) {
212
+ // Our block is still on top: take it off, keeping anything the harness
213
+ // changed below it.
214
+ await writeFile(entry.abs, current.subarray(entry.prefix.length));
215
+ }
216
+ else {
217
+ kept.push(entry.rel);
218
+ }
219
+ }
220
+ for (const dir of [...createdDirs].reverse()) {
221
+ await rmdir(dir).catch(() => undefined);
222
+ }
223
+ applied.length = 0;
224
+ createdDirs.length = 0;
225
+ return { kept };
226
+ }
227
+ /**
228
+ * Write skills as `<dir>/<name>/…` in a directory the caller owns outside the
229
+ * workdir (a harness's plugin or config home), with the same validation
230
+ * {@link materializeEnvironment} applies. Nothing to restore: the caller
231
+ * deletes `dir` itself.
232
+ */
233
+ export async function writeSkills(dir, skills) {
234
+ const plan = planEnvironment({ workdir: dir, skills });
235
+ for (const entry of plan) {
236
+ // planEnvironment lays skills out under SKILLS_DIR; here they sit at the root.
237
+ const rel = path.posix.relative(SKILLS_DIR, entry.rel);
238
+ const abs = resolveWithin(dir, rel);
239
+ await mkdir(path.dirname(abs), { recursive: true });
240
+ await writeFile(abs, entry.content, { flag: "wx" });
241
+ }
242
+ }
243
+ /**
244
+ * The skills index an engine without native skill discovery puts in front of
245
+ * the model: one line per skill with where its `SKILL.md` was materialized and
246
+ * what its frontmatter says it is for. Undefined when the run has no skills.
247
+ */
248
+ export function skillsIndex(skills) {
249
+ if (!skills || skills.length === 0)
250
+ return undefined;
251
+ const lines = skills.map((skill) => {
252
+ const md = skill.files.find((f) => normalizeRel(f.path) === "SKILL.md");
253
+ const description = md
254
+ ? frontmatterField(decode(md, "SKILL.md").toString(), "description")
255
+ : undefined;
256
+ return `- ${skill.name} (${SKILLS_DIR}/${skill.name}/SKILL.md)${description ? `: ${description}` : ""}`;
257
+ });
258
+ return [
259
+ "## Skills",
260
+ "Each skill is a directory in the workspace. Before doing a task a skill covers, read",
261
+ "its SKILL.md and follow it.",
262
+ ...lines,
263
+ ].join("\n");
264
+ }
265
+ /** A single-line scalar from a Markdown file's YAML frontmatter, if present. */
266
+ export function frontmatterField(markdown, field) {
267
+ const match = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(markdown);
268
+ if (!match)
269
+ return undefined;
270
+ for (const line of match[1].split(/\r?\n/)) {
271
+ // Split at the first colon rather than with one regex: `key:\s*(.*)` backtracks
272
+ // polynomially on a long run of spaces.
273
+ const colon = line.indexOf(":");
274
+ if (colon <= 0 || line.slice(0, colon) !== field)
275
+ continue;
276
+ if (!/^[A-Za-z0-9_-]+$/.test(field))
277
+ continue;
278
+ const value = line
279
+ .slice(colon + 1)
280
+ .trim()
281
+ .replace(/^(["'])(.*)\1$/, "$2");
282
+ // A block scalar (`>` / `|`) spans lines this reader does not parse.
283
+ return value === "" || value === ">" || value === "|" ? undefined : value;
284
+ }
285
+ return undefined;
286
+ }
287
+ /**
288
+ * The instructions block an engine hands its harness, from whichever of these
289
+ * the harness cannot already find on disk: the system instructions, the root
290
+ * `AGENTS.md` text (for a harness that does not read `AGENTS.md`), and the
291
+ * skills index (for one without skill discovery). Undefined when empty, so a
292
+ * spec without an environment adds nothing.
293
+ */
294
+ export function environmentInstructions(spec, include) {
295
+ const parts = [
296
+ spec.instructions?.system,
297
+ include.agentsMd ? spec.instructions?.agentsMd : undefined,
298
+ ...(include.agentsMd ? scopedAgentFiles(spec.agentFiles) : []),
299
+ include.skillsIndex ? skillsIndex(spec.skills) : undefined,
300
+ ].filter((p) => typeof p === "string" && p.trim() !== "");
301
+ return parts.length > 0 ? parts.join("\n\n") : undefined;
302
+ }
303
+ /**
304
+ * Nested `AGENTS.md` files, inlined for a harness that does not discover them,
305
+ * each headed by the directory it governs.
306
+ */
307
+ function scopedAgentFiles(files) {
308
+ return (files ?? []).map((file) => {
309
+ const dir = path.posix.dirname(normalizeRel(file.path));
310
+ return [
311
+ `## Instructions for \`${dir}/\``,
312
+ `These apply when working in \`${dir}/\` and below.`,
313
+ "",
314
+ decode(file, file.path).toString().trim(),
315
+ ].join("\n");
316
+ });
317
+ }
318
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/engines/environment.ts"],"names":[],"mappings":"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"}