@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
@@ -0,0 +1,99 @@
1
+ import type { RunSpec } from "./types.js";
2
+ /**
3
+ * A credential gateway: a host-side service that holds the run's real provider
4
+ * keys and injects them on the way out, so the run itself only ever holds a
5
+ * short-lived, attempt-bound run token.
6
+ *
7
+ * The mechanism is base-URL redirection, never interception: every supported
8
+ * harness and adapter honours a provider base URL, so a run is pointed at
9
+ * `<route>` with the run token in place of the API key, and the gateway swaps
10
+ * in the real key (and enforces its own budget) before forwarding. No CA, no
11
+ * TLS termination inside the sandbox.
12
+ *
13
+ * When a spec carries one, no engine puts a raw provider credential — the
14
+ * run's BYO keys or the host's own env keys — anywhere a harness can read it.
15
+ */
16
+ export interface RunGateway {
17
+ /** The gateway's base URL; a provider's default route is `<baseUrl>/p/<provider>`. */
18
+ baseUrl: string;
19
+ /** The attempt-bound token the gateway authenticates the run with. The only credential the run holds. */
20
+ runToken: string;
21
+ /** Per-provider base URLs, overriding the default route. */
22
+ routes?: Partial<Record<GatewayProvider, string>>;
23
+ }
24
+ export declare const GATEWAY_PROVIDERS: readonly ["anthropic", "openai", "openrouter"];
25
+ export type GatewayProvider = (typeof GATEWAY_PROVIDERS)[number];
26
+ /**
27
+ * Host env prefixes a harness must NOT inherit while a gateway is in use: a
28
+ * host `ANTHROPIC_BASE_URL` would route around the gateway, and a header or
29
+ * config var under these prefixes can carry a credential whose name the
30
+ * deny-list cannot spot (`ANTHROPIC_CUSTOM_HEADERS`).
31
+ */
32
+ export declare const GATEWAY_SHADOWED_PREFIXES: readonly ["ANTHROPIC_", "OPENAI_", "OPENROUTER_"];
33
+ /** The base URL a provider is reached through. */
34
+ export declare function gatewayRoute(gateway: RunGateway, provider: GatewayProvider): string;
35
+ /**
36
+ * The env that points a harness at the gateway for each of `providers`: the
37
+ * route as its base URL and the run token as its key. This is what a harness
38
+ * gets INSTEAD of a credential.
39
+ */
40
+ export declare function gatewayEnv(gateway: RunGateway, providers?: readonly GatewayProvider[]): Record<string, string>;
41
+ /**
42
+ * Drop the prefixes a gateway shadows from a harness's inherit list. A prefix
43
+ * overlapping one in either direction goes: `"ANTHROPIC_BASE"` sits inside a
44
+ * shadowed prefix, and a broader `"ANTHROPIC"` or `"A"` would match every
45
+ * shadowed var (and the host's `ANTHROPIC_CUSTOM_HEADERS`) just as well.
46
+ */
47
+ export declare function withoutShadowed(prefixes: readonly string[]): string[];
48
+ /**
49
+ * Why the spec's gateway cannot be used, or `undefined` when it can (or there
50
+ * is none). A malformed gateway is refused rather than ignored: ignoring it
51
+ * would fall back to raw credentials, which is the thing it exists to stop.
52
+ */
53
+ export declare function gatewayProblem(spec: Pick<RunSpec, "gateway">): string | undefined;
54
+ /**
55
+ * The refusal a microVM lane relies on: a run the caller placed on `vm`
56
+ * isolation must not carry raw model credentials into the
57
+ * guest. It reaches models through a gateway or not at all.
58
+ *
59
+ * "Raw" is any non-empty `provider.credentials` slot, and any of `hostKeys`
60
+ * (the env keys this engine would otherwise fall back to) set on the host. The
61
+ * reason names the slots, never their values. A gateway exempts only what it
62
+ * replaces: the routed providers' slots and host keys, for which the engine
63
+ * sends the run token instead. Anything else it does not route (the local
64
+ * provider's key, say) is still raw, and still refused.
65
+ */
66
+ export declare function refuseRawCredentialsInVm(engine: string, spec: Pick<RunSpec, "isolation" | "gateway" | "provider">, hostKeys?: readonly string[], env?: NodeJS.ProcessEnv): {
67
+ ok: false;
68
+ reason: string;
69
+ } | undefined;
70
+ /**
71
+ * The other half of the microVM rule: credentials the guest would hold in the
72
+ * clear that are NOT model keys. A gateway cannot inject these, so they are
73
+ * "exposed" — the run's `secrets` (they become the agent's env), and any
74
+ * connector credential the harness would carry itself (a bearer `auth.token`,
75
+ * or `headers` / `env` values a caller's connector shape adds).
76
+ *
77
+ * Under `vm` they are refused unless the spec says
78
+ * `exposedCredentials: "allowed"`, which only the caller's policy may set
79
+ * (the owner has not decided when exposed credentials are acceptable in a
80
+ * microVM, so the default is refuse). A connector whose token IS the
81
+ * gateway's run token is not exposed: that is a connector routed through the
82
+ * gateway, which injects the real credential host-side. The reason names
83
+ * secrets and connectors, never values.
84
+ */
85
+ export declare function refuseExposedCredentialsInVm(engine: string, spec: Pick<RunSpec, "isolation" | "gateway" | "secrets" | "connectors" | "exposedCredentials">): {
86
+ ok: false;
87
+ reason: string;
88
+ } | undefined;
89
+ /** Every credential refusal a `vm` run gets: raw model keys first, then exposed credentials. */
90
+ export declare function refuseCredentialsInVm(engine: string, spec: Pick<RunSpec, "isolation" | "gateway" | "provider" | "secrets" | "connectors" | "exposedCredentials">, hostKeys?: readonly string[], env?: NodeJS.ProcessEnv): {
91
+ ok: false;
92
+ reason: string;
93
+ } | undefined;
94
+ /** The refusal for a spec whose gateway is unusable, in `supports()` shape. */
95
+ export declare function refuseBadGateway(engine: string, spec: Pick<RunSpec, "gateway">): {
96
+ ok: false;
97
+ reason: string;
98
+ } | undefined;
99
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/engines/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,UAAU;IACzB,sFAAsF;IACtF,OAAO,EAAE,MAAM,CAAA;IACf,yGAAyG;IACzG,QAAQ,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAA;CAClD;AAED,eAAO,MAAM,iBAAiB,gDAAiD,CAAA;AAC/E,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAA;AAShE;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,mDAAoD,CAAA;AAE1F,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,GAAG,MAAM,CAEnF;AASD;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,UAAU,EACnB,SAAS,GAAE,SAAS,eAAe,EAAsB,GACxD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAIrE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAwBjF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC,EACzD,QAAQ,GAAE,SAAS,MAAM,EAAO,EAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAyB3C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,oBAAoB,CAAC,GAC7F;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAoC3C;AAED,gGAAgG;AAChG,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,CACR,OAAO,EACP,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,oBAAoB,CACvF,EACD,QAAQ,GAAE,SAAS,MAAM,EAAO,EAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAK3C;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAK3C"}
@@ -0,0 +1,181 @@
1
+ export const GATEWAY_PROVIDERS = ["anthropic", "openai", "openrouter"];
2
+ /** The env var each provider's harness reads its base URL and key from. */
3
+ const PROVIDER_ENV = {
4
+ anthropic: { baseUrl: "ANTHROPIC_BASE_URL", key: "ANTHROPIC_API_KEY" },
5
+ openai: { baseUrl: "OPENAI_BASE_URL", key: "OPENAI_API_KEY" },
6
+ openrouter: { baseUrl: "OPENROUTER_BASE_URL", key: "OPENROUTER_API_KEY" },
7
+ };
8
+ /**
9
+ * Host env prefixes a harness must NOT inherit while a gateway is in use: a
10
+ * host `ANTHROPIC_BASE_URL` would route around the gateway, and a header or
11
+ * config var under these prefixes can carry a credential whose name the
12
+ * deny-list cannot spot (`ANTHROPIC_CUSTOM_HEADERS`).
13
+ */
14
+ export const GATEWAY_SHADOWED_PREFIXES = ["ANTHROPIC_", "OPENAI_", "OPENROUTER_"];
15
+ /** The base URL a provider is reached through. */
16
+ export function gatewayRoute(gateway, provider) {
17
+ return gateway.routes?.[provider] ?? `${withoutTrailingSlashes(gateway.baseUrl)}/p/${provider}`;
18
+ }
19
+ // A loop, not `/\/+$/`: that regex backtracks polynomially on a run of slashes.
20
+ function withoutTrailingSlashes(url) {
21
+ let end = url.length;
22
+ while (end > 0 && url[end - 1] === "/")
23
+ end--;
24
+ return url.slice(0, end);
25
+ }
26
+ /**
27
+ * The env that points a harness at the gateway for each of `providers`: the
28
+ * route as its base URL and the run token as its key. This is what a harness
29
+ * gets INSTEAD of a credential.
30
+ */
31
+ export function gatewayEnv(gateway, providers = GATEWAY_PROVIDERS) {
32
+ const env = {};
33
+ for (const provider of providers) {
34
+ env[PROVIDER_ENV[provider].baseUrl] = gatewayRoute(gateway, provider);
35
+ env[PROVIDER_ENV[provider].key] = gateway.runToken;
36
+ }
37
+ return env;
38
+ }
39
+ /**
40
+ * Drop the prefixes a gateway shadows from a harness's inherit list. A prefix
41
+ * overlapping one in either direction goes: `"ANTHROPIC_BASE"` sits inside a
42
+ * shadowed prefix, and a broader `"ANTHROPIC"` or `"A"` would match every
43
+ * shadowed var (and the host's `ANTHROPIC_CUSTOM_HEADERS`) just as well.
44
+ */
45
+ export function withoutShadowed(prefixes) {
46
+ return prefixes.filter((p) => !GATEWAY_SHADOWED_PREFIXES.some((s) => p.startsWith(s) || s.startsWith(p)));
47
+ }
48
+ /**
49
+ * Why the spec's gateway cannot be used, or `undefined` when it can (or there
50
+ * is none). A malformed gateway is refused rather than ignored: ignoring it
51
+ * would fall back to raw credentials, which is the thing it exists to stop.
52
+ */
53
+ export function gatewayProblem(spec) {
54
+ const gateway = spec.gateway;
55
+ if (gateway === undefined)
56
+ return undefined;
57
+ if (typeof gateway.runToken !== "string" || gateway.runToken === "") {
58
+ return "gateway has no run token";
59
+ }
60
+ const urls = [
61
+ ["baseUrl", gateway.baseUrl],
62
+ ...Object.entries(gateway.routes ?? {}).map(([p, url]) => [
63
+ `routes.${p}`,
64
+ url,
65
+ ]),
66
+ ];
67
+ for (const [field, url] of urls) {
68
+ if (typeof url !== "string" || !/^https?:\/\/[^/\s]+/.test(url)) {
69
+ return `gateway ${field} is not an http(s) URL`;
70
+ }
71
+ }
72
+ for (const provider of Object.keys(gateway.routes ?? {})) {
73
+ if (!GATEWAY_PROVIDERS.includes(provider)) {
74
+ return `gateway routes a provider this kernel does not know: ${provider}`;
75
+ }
76
+ }
77
+ return undefined;
78
+ }
79
+ /**
80
+ * The refusal a microVM lane relies on: a run the caller placed on `vm`
81
+ * isolation must not carry raw model credentials into the
82
+ * guest. It reaches models through a gateway or not at all.
83
+ *
84
+ * "Raw" is any non-empty `provider.credentials` slot, and any of `hostKeys`
85
+ * (the env keys this engine would otherwise fall back to) set on the host. The
86
+ * reason names the slots, never their values. A gateway exempts only what it
87
+ * replaces: the routed providers' slots and host keys, for which the engine
88
+ * sends the run token instead. Anything else it does not route (the local
89
+ * provider's key, say) is still raw, and still refused.
90
+ */
91
+ export function refuseRawCredentialsInVm(engine, spec, hostKeys = [], env = process.env) {
92
+ if (spec.isolation !== "vm")
93
+ return undefined;
94
+ const routed = spec.gateway !== undefined;
95
+ // CODEX_API_KEY is codex's alias for OPENAI_API_KEY; its engine sets it to
96
+ // the run token under a gateway too. No other engine passes it as a host key.
97
+ const routedKeys = [
98
+ ...GATEWAY_PROVIDERS.map((p) => PROVIDER_ENV[p].key),
99
+ "CODEX_API_KEY",
100
+ ];
101
+ const raw = [
102
+ ...Object.entries(spec.provider.credentials ?? {})
103
+ .filter(([, value]) => typeof value === "string" && value !== "")
104
+ .filter(([slot]) => !(routed && GATEWAY_PROVIDERS.includes(slot)))
105
+ .map(([slot]) => `provider.credentials.${slot}`),
106
+ ...hostKeys
107
+ .filter((key) => Boolean(env[key]) && !(routed && routedKeys.includes(key)))
108
+ .map((key) => `host ${key}`),
109
+ ];
110
+ if (raw.length === 0)
111
+ return undefined;
112
+ return {
113
+ ok: false,
114
+ reason: `${engine} engine refuses a vm run holding raw model credentials (${raw.join(", ")}); ` +
115
+ "route it through a credential gateway (RunSpec.gateway) instead",
116
+ };
117
+ }
118
+ /**
119
+ * The other half of the microVM rule: credentials the guest would hold in the
120
+ * clear that are NOT model keys. A gateway cannot inject these, so they are
121
+ * "exposed" — the run's `secrets` (they become the agent's env), and any
122
+ * connector credential the harness would carry itself (a bearer `auth.token`,
123
+ * or `headers` / `env` values a caller's connector shape adds).
124
+ *
125
+ * Under `vm` they are refused unless the spec says
126
+ * `exposedCredentials: "allowed"`, which only the caller's policy may set
127
+ * (the owner has not decided when exposed credentials are acceptable in a
128
+ * microVM, so the default is refuse). A connector whose token IS the
129
+ * gateway's run token is not exposed: that is a connector routed through the
130
+ * gateway, which injects the real credential host-side. The reason names
131
+ * secrets and connectors, never values.
132
+ */
133
+ export function refuseExposedCredentialsInVm(engine, spec) {
134
+ if (spec.isolation !== "vm" || spec.exposedCredentials === "allowed")
135
+ return undefined;
136
+ const runToken = spec.gateway?.runToken;
137
+ const exposed = [
138
+ ...Object.entries(spec.secrets ?? {})
139
+ .filter(([, value]) => typeof value === "string" && value !== "")
140
+ .map(([name]) => `secret ${name}`),
141
+ ...(spec.connectors ?? []).flatMap((connector) => {
142
+ const found = [];
143
+ const token = connector.auth?.token;
144
+ if (typeof token === "string" && token !== "" && token !== runToken) {
145
+ found.push(`connector ${connector.name} auth.token`);
146
+ }
147
+ // Not part of ConnectorConfig, but a caller's connector may carry them,
148
+ // and whatever is there reaches the harness.
149
+ const extra = connector;
150
+ for (const field of ["headers", "env"]) {
151
+ const values = extra[field];
152
+ if (values &&
153
+ typeof values === "object" &&
154
+ Object.values(values).some((v) => v !== "" && v != null)) {
155
+ found.push(`connector ${connector.name} ${field}`);
156
+ }
157
+ }
158
+ return found;
159
+ }),
160
+ ];
161
+ if (exposed.length === 0)
162
+ return undefined;
163
+ return {
164
+ ok: false,
165
+ reason: `${engine} engine refuses a vm run holding exposed credentials (${exposed.join(", ")}); ` +
166
+ 'they reach the guest in the clear, so they need exposedCredentials: "allowed" from policy',
167
+ };
168
+ }
169
+ /** Every credential refusal a `vm` run gets: raw model keys first, then exposed credentials. */
170
+ export function refuseCredentialsInVm(engine, spec, hostKeys = [], env = process.env) {
171
+ return (refuseRawCredentialsInVm(engine, spec, hostKeys, env) ??
172
+ refuseExposedCredentialsInVm(engine, spec));
173
+ }
174
+ /** The refusal for a spec whose gateway is unusable, in `supports()` shape. */
175
+ export function refuseBadGateway(engine, spec) {
176
+ const problem = gatewayProblem(spec);
177
+ return problem
178
+ ? { ok: false, reason: `${engine} engine cannot use this run's gateway: ${problem}` }
179
+ : undefined;
180
+ }
181
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/engines/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { RunSpec } from "./types.js";
2
+ /**
3
+ * The task prompt an out-of-process harness (Claude Code, codex, an ACP agent)
4
+ * is handed: the workflow prompt, the run's inputs, the caller's pre-assembled
5
+ * context when there is any, and a closing instruction.
6
+ *
7
+ * These harnesses explore the working tree with their own tools, but that is no
8
+ * reason to drop `spec.context`: it can carry material that is not on disk at
9
+ * all (curated notes, assembled memory), which is exactly what the native loop
10
+ * bakes into its own prompt. An empty context adds nothing, so a run without one
11
+ * gets the prompt it always had. `instructions` is for a harness with no
12
+ * system-prompt slot of its own; absent, it adds nothing either.
13
+ */
14
+ export declare function harnessPrompt(spec: RunSpec, instructions?: string): string;
15
+ //# sourceMappingURL=harnessPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessPrompt.d.ts","sourceRoot":"","sources":["../../src/engines/harnessPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAmB1E"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The task prompt an out-of-process harness (Claude Code, codex, an ACP agent)
3
+ * is handed: the workflow prompt, the run's inputs, the caller's pre-assembled
4
+ * context when there is any, and a closing instruction.
5
+ *
6
+ * These harnesses explore the working tree with their own tools, but that is no
7
+ * reason to drop `spec.context`: it can carry material that is not on disk at
8
+ * all (curated notes, assembled memory), which is exactly what the native loop
9
+ * bakes into its own prompt. An empty context adds nothing, so a run without one
10
+ * gets the prompt it always had. `instructions` is for a harness with no
11
+ * system-prompt slot of its own; absent, it adds nothing either.
12
+ */
13
+ export function harnessPrompt(spec, instructions) {
14
+ const inputs = JSON.stringify(spec.inputs ?? {}, null, 2);
15
+ const context = spec.context?.trim() ? ["## Workspace context", spec.context, ""] : [];
16
+ // For a harness with no system-prompt slot: instructions lead the prompt.
17
+ const preamble = instructions ? ["## Instructions", instructions, ""] : [];
18
+ return [
19
+ ...preamble,
20
+ spec.workflow.prompt ?? `Execute the "${spec.workflow.name ?? spec.workflowPath}" workflow.`,
21
+ "",
22
+ "## Inputs",
23
+ "```json",
24
+ inputs,
25
+ "```",
26
+ "",
27
+ ...context,
28
+ "You are running as an autonomous workflow. The current working directory is the",
29
+ "workspace — inspect and edit its files directly with your tools. When finished,",
30
+ "reply with the workflow's output as Markdown.",
31
+ ].join("\n");
32
+ }
33
+ //# sourceMappingURL=harnessPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessPrompt.js","sourceRoot":"","sources":["../../src/engines/harnessPrompt.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,IAAa,EAAE,YAAqB;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACtF,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1E,OAAO;QACL,GAAG,QAAQ;QACX,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,gBAAgB,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,aAAa;QAC5F,EAAE;QACF,WAAW;QACX,SAAS;QACT,MAAM;QACN,KAAK;QACL,EAAE;QACF,GAAG,OAAO;QACV,iFAAiF;QACjF,iFAAiF;QACjF,+CAA+C;KAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
@@ -65,4 +65,19 @@ export declare class NativeEngine implements AgentEngine {
65
65
  */
66
66
  private buildContext;
67
67
  }
68
+ /**
69
+ * The provider selection the run resolves against. With a gateway, every
70
+ * cloud adapter is pointed at its gateway route and keyed with the run token,
71
+ * replacing the run's BYO keys — and, because a key is now always present, the
72
+ * host's env keys are never reached either. The `local` provider is not
73
+ * routed: private inference never leaves the host anyway.
74
+ *
75
+ * Because the run token keys every cloud adapter, a run with no preference
76
+ * would always resolve to the first one in order. So the preference is pinned
77
+ * to the provider the run would have resolved without the gateway (its BYO
78
+ * key, else the host's), keeping an OpenAI-only run on OpenAI. When none
79
+ * would resolve, the run token is not handed out, and the selection fails
80
+ * exactly as it would have without the gateway.
81
+ */
82
+ export declare function providerSelection(spec: RunSpec, env?: NodeJS.ProcessEnv): RunSpec["provider"];
68
83
  //# sourceMappingURL=native.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/engines/native.ts"],"names":[],"mappings":"AACA,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1F,OAAO,EAA6B,KAAK,IAAI,EAAE,MAAM,YAAY,CAAA;AAMjE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAElG;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAA;AAE9D,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;IACpC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AAED;;;;;;GAMG;AACH,qBAAa,YAAa,YAAW,WAAW;IAC9C,QAAQ,CAAC,IAAI,YAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;gBAEf,OAAO,GAAE,mBAAwB;IAM7C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,aAAa;IAMjC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YA+BrD,OAAO;IA+FrB;;;;;OAKG;YACW,YAAY;CAY3B"}
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/engines/native.ts"],"names":[],"mappings":"AACA,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1F,OAAO,EAA6B,KAAK,IAAI,EAAE,MAAM,YAAY,CAAA;AAMjE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AASlG;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAA;AAE9D,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;IACpC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AAED;;;;;;GAMG;AACH,qBAAa,YAAa,YAAW,WAAW;IAC9C,QAAQ,CAAC,IAAI,YAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;gBAEf,OAAO,GAAE,mBAAwB;IAM7C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,aAAa;IAajC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YA+BrD,OAAO;IAwGrB;;;;;OAKG;YACW,YAAY;CAY3B;AAeD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,EACb,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,UAAU,CAAC,CAyBrB"}
@@ -7,6 +7,8 @@ import { providerAvailability, selectProvider } from "../providers/index.js";
7
7
  import { secretsToEnv } from "../secrets.js";
8
8
  import { primitiveTools, connectorTools } from "../tools/registry.js";
9
9
  import { PrivateRunError, privateRunChannels } from "../private.js";
10
+ import { environmentInstructions } from "./environment.js";
11
+ import { GATEWAY_PROVIDERS, gatewayRoute, refuseBadGateway, refuseCredentialsInVm, } from "./gateway.js";
10
12
  /**
11
13
  * The in-process native engine: the provider-neutral tool-use loop over the
12
14
  * general-purpose primitives (run_code, read_file, list_files, http_fetch) plus
@@ -39,9 +41,16 @@ export class NativeEngine {
39
41
  supports(spec) {
40
42
  if (!spec)
41
43
  return { ok: true };
44
+ // Before the private branch: a private run is held to local inference, but
45
+ // a vm run must still carry no raw or exposed credentials, and a
46
+ // malformed gateway is refused whatever the run is.
47
+ const refusal = refuseBadGateway("native", spec) ?? refuseCredentialsInVm("native", spec, HOST_MODEL_KEYS);
48
+ if (refusal)
49
+ return refusal;
42
50
  if (spec.private)
43
51
  return privateProviderSupport(spec);
44
- return providerAvailability(spec.provider.preferred, spec.provider);
52
+ const selection = providerSelection(spec);
53
+ return providerAvailability(selection.preferred, selection);
45
54
  }
46
55
  async run(spec, ctx) {
47
56
  if (!spec.private)
@@ -86,7 +95,8 @@ export class NativeEngine {
86
95
  // The whole selection, not a hand-picked subset: `supports()` judged the
87
96
  // run on `spec.provider` (including `allowMockFallback`), so `run()` must
88
97
  // resolve it from the same object or the two can disagree.
89
- const provider = selectProvider(spec.provider.preferred, spec.provider);
98
+ const selection = providerSelection(spec);
99
+ const provider = selectProvider(selection.preferred, selection);
90
100
  // Belt and braces for the private path: whatever selection did, a private
91
101
  // run proceeds on the local provider or not at all.
92
102
  if (spec.private && provider.name !== "local") {
@@ -136,7 +146,11 @@ export class NativeEngine {
136
146
  const model = asChatModel(provider);
137
147
  const result = await runWithEvents(this.loop, {
138
148
  model,
139
- system: buildSystemPrompt(spec.workflow, spec.workspaceId, spec.workflowPath),
149
+ system: buildSystemPrompt(spec.workflow, spec.workspaceId, spec.workflowPath,
150
+ // The loop has no AGENTS.md discovery and no skills tool, so both
151
+ // ride in the system prompt; the skill files themselves are on
152
+ // disk for read_file.
153
+ environmentInstructions(spec, { agentsMd: true, skillsIndex: true })),
140
154
  messages: [{ role: "user", text: buildUserPrompt(spec.workflow, context, spec.inputs) }],
141
155
  tools,
142
156
  limits: resolveLoopLimits(spec.limits),
@@ -186,6 +200,55 @@ export class NativeEngine {
186
200
  return spec.context ? `${spec.context}\n\n${assembled}` : assembled;
187
201
  }
188
202
  }
203
+ /** The host env keys the cloud adapters fall back to, in `selectProvider`'s order. */
204
+ const CLOUD_ENV_KEYS = {
205
+ anthropic: "ANTHROPIC_API_KEY",
206
+ openai: "OPENAI_API_KEY",
207
+ openrouter: "OPENROUTER_API_KEY",
208
+ };
209
+ /**
210
+ * Every host env key a native run can end up holding: the cloud fallbacks and
211
+ * the local provider's optional key, which `selectProvider` also reads.
212
+ */
213
+ const HOST_MODEL_KEYS = [...Object.values(CLOUD_ENV_KEYS), "LOCAL_MODEL_API_KEY"];
214
+ /**
215
+ * The provider selection the run resolves against. With a gateway, every
216
+ * cloud adapter is pointed at its gateway route and keyed with the run token,
217
+ * replacing the run's BYO keys — and, because a key is now always present, the
218
+ * host's env keys are never reached either. The `local` provider is not
219
+ * routed: private inference never leaves the host anyway.
220
+ *
221
+ * Because the run token keys every cloud adapter, a run with no preference
222
+ * would always resolve to the first one in order. So the preference is pinned
223
+ * to the provider the run would have resolved without the gateway (its BYO
224
+ * key, else the host's), keeping an OpenAI-only run on OpenAI. When none
225
+ * would resolve, the run token is not handed out, and the selection fails
226
+ * exactly as it would have without the gateway.
227
+ */
228
+ export function providerSelection(spec, env = process.env) {
229
+ const gateway = spec.gateway;
230
+ if (!gateway)
231
+ return spec.provider;
232
+ const baseURLs = Object.fromEntries(GATEWAY_PROVIDERS.map((p) => [p, gatewayRoute(gateway, p)]));
233
+ const local = spec.provider.credentials?.local;
234
+ const localOnly = local !== undefined ? { local } : {};
235
+ let preferred = spec.provider.preferred;
236
+ if (typeof preferred !== "string" || preferred.trim() === "") {
237
+ const configured = GATEWAY_PROVIDERS.find((p) => spec.provider.credentials?.[p] ?? env[CLOUD_ENV_KEYS[p]]);
238
+ // Nothing would resolve, so every cloud slot is absent or deliberately
239
+ // empty; keep them as sent, since an empty slot is what stops the host key.
240
+ if (!configured)
241
+ return { ...spec.provider, baseURLs };
242
+ preferred = configured;
243
+ }
244
+ const token = gateway.runToken;
245
+ return {
246
+ ...spec.provider,
247
+ preferred,
248
+ credentials: { anthropic: token, openai: token, openrouter: token, ...localOnly },
249
+ baseURLs,
250
+ };
251
+ }
189
252
  /**
190
253
  * Whether a private run can be held to local inference on this host. Only an
191
254
  * explicit `preferred: "local"` with `LOCAL_MODEL_BASE_URL` set qualifies; every
@@ -233,8 +296,13 @@ function untilAborted(work, signal) {
233
296
  work.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
234
297
  });
235
298
  }
236
- function buildSystemPrompt(workflow, workspaceId, workflowPath) {
237
- return [
299
+ /**
300
+ * The loop's system prompt. `instructions` (the run's environment, when it has
301
+ * one) goes last, after the kernel's own framing, so a run without one gets
302
+ * exactly the prompt it always had.
303
+ */
304
+ function buildSystemPrompt(workflow, workspaceId, workflowPath, instructions) {
305
+ const base = [
238
306
  "You are an autonomous workflow executing in an isolated workspace sandbox.",
239
307
  `Workspace: ${workspaceId}`,
240
308
  `Workflow: ${workflow.name ?? workflowPath}`,
@@ -244,6 +312,7 @@ function buildSystemPrompt(workflow, workspaceId, workflowPath) {
244
312
  "than doing it yourself. When finished, reply with the workflow's output as",
245
313
  "Markdown and no further tool calls.",
246
314
  ].join("\n");
315
+ return instructions ? `${base}\n\n${instructions}` : base;
247
316
  }
248
317
  function buildUserPrompt(workflow, context, inputs) {
249
318
  const inputsJson = JSON.stringify(inputs ?? {}, null, 2);
@@ -1 +1 @@
1
- {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/engines/native.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/engines/native.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@ import type { ProviderOptions } from "../providers/options.js";
4
4
  import type { FinishReason } from "../providers/types.js";
5
5
  import type { ConnectorConfig, Permissions, WorkflowDefinition } from "../types.js";
6
6
  import type { Isolation } from "./isolation.js";
7
+ import type { EnvironmentFile, RunInstructions, RunSkill, RunSource } from "./environment.js";
8
+ import type { RunGateway } from "./gateway.js";
7
9
  /**
8
10
  * The provider-neutral, harness-neutral description of one workflow run, handed
9
11
  * to an {@link AgentEngine}. It carries the *materials* (a prepared on-disk
@@ -24,8 +26,10 @@ export interface RunSpec {
24
26
  workflow: WorkflowDefinition;
25
27
  /** The run's structured inputs (context_bundle.inputs). */
26
28
  inputs: Record<string, unknown>;
27
- /** Pre-assembled curated context text. The native loop bakes it into the
28
- * prompt; a filesystem-native engine (Claude Code) may ignore it and explore. */
29
+ /** Pre-assembled curated context text. Every engine puts it in the task
30
+ * prompt — the native loop always, an out-of-process harness (Claude Code,
31
+ * codex, ACP) whenever it is non-empty — since it may carry material that is
32
+ * not on disk for the harness to find. */
29
33
  context: string;
30
34
  /** Absolute path to the prepared sandbox working tree (the engine edits here). */
31
35
  workdir: string;
@@ -71,6 +75,45 @@ export interface RunSpec {
71
75
  * nothing. The returned `EngineResult.text` is still the caller's to place.
72
76
  */
73
77
  private?: boolean;
78
+ /**
79
+ * Instructions on top of the harness's own defaults (see `environment.ts`).
80
+ * `system` reaches every engine through its system-prompt slot or nearest
81
+ * equivalent; `agentsMd` is the workdir root's `AGENTS.md`, which the caller
82
+ * materializes and an engine whose harness does not read `AGENTS.md` also
83
+ * puts in its prompt. Absent changes nothing.
84
+ */
85
+ instructions?: RunInstructions;
86
+ /** Nested `AGENTS.md` files, materialized by the caller. Absent changes nothing. */
87
+ agentFiles?: EnvironmentFile[];
88
+ /**
89
+ * Agent Skills, materialized by the caller under `.agents/skills/<name>/`.
90
+ * Claude Code also gets them as a local plugin; every other engine is told
91
+ * where they are. Absent changes nothing.
92
+ */
93
+ skills?: RunSkill[];
94
+ /**
95
+ * Run inputs that are not workspace content (inline files today), written by
96
+ * the caller before setup and removed before the change set is computed.
97
+ * Absent changes nothing.
98
+ */
99
+ sources?: RunSource[];
100
+ /**
101
+ * A credential gateway for the run's model calls (see `gateway.ts`). When
102
+ * present, every engine reaches its provider through the gateway's route
103
+ * with `runToken` as the key, and no raw credential — `provider.credentials`
104
+ * or the host's env keys — reaches a harness. A malformed gateway is
105
+ * refused in `supports()`, never ignored. Absent changes nothing, except
106
+ * that a `vm` run holding raw credentials is refused.
107
+ */
108
+ gateway?: RunGateway;
109
+ /**
110
+ * Whether a `vm` run may hold exposed credentials — `secrets`, or a
111
+ * connector credential the harness carries itself — which reach the guest
112
+ * in the clear because no gateway can inject them. Absent (or anything but
113
+ * `"allowed"`) refuses such a run; only the caller's policy should set it,
114
+ * never a workflow author. Ignored below `vm`.
115
+ */
116
+ exposedCredentials?: "allowed" | "refused";
74
117
  }
75
118
  export interface EngineContext {
76
119
  /** Append a timestamped line to the run's logs. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engines/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engines/types.ts"],"names":[],"mappings":"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"}