@rarebit-one/harness-kernel 0.10.0 → 0.11.0-next.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 (71) hide show
  1. package/README.md +142 -6
  2. package/dist/agent.d.ts +80 -8
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +225 -25
  5. package/dist/agent.js.map +1 -1
  6. package/dist/engines/native.d.ts +5 -0
  7. package/dist/engines/native.d.ts.map +1 -1
  8. package/dist/engines/native.js +28 -10
  9. package/dist/engines/native.js.map +1 -1
  10. package/dist/engines/types.d.ts +19 -0
  11. package/dist/engines/types.d.ts.map +1 -1
  12. package/dist/events.d.ts +20 -0
  13. package/dist/events.d.ts.map +1 -1
  14. package/dist/events.js.map +1 -1
  15. package/dist/index.d.ts +17 -11
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +7 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/loop.d.ts +58 -11
  20. package/dist/loop.d.ts.map +1 -1
  21. package/dist/loop.js +7 -5
  22. package/dist/loop.js.map +1 -1
  23. package/dist/models/chat.d.ts +2 -1
  24. package/dist/models/chat.d.ts.map +1 -1
  25. package/dist/models/chat.js +20 -4
  26. package/dist/models/chat.js.map +1 -1
  27. package/dist/models/types.d.ts +16 -0
  28. package/dist/models/types.d.ts.map +1 -1
  29. package/dist/models/types.js.map +1 -1
  30. package/dist/private.d.ts.map +1 -1
  31. package/dist/private.js +21 -0
  32. package/dist/private.js.map +1 -1
  33. package/dist/providers/anthropic.d.ts +27 -3
  34. package/dist/providers/anthropic.d.ts.map +1 -1
  35. package/dist/providers/anthropic.js +95 -29
  36. package/dist/providers/anthropic.js.map +1 -1
  37. package/dist/providers/index.d.ts +42 -6
  38. package/dist/providers/index.d.ts.map +1 -1
  39. package/dist/providers/index.js +132 -48
  40. package/dist/providers/index.js.map +1 -1
  41. package/dist/providers/mock.d.ts +6 -3
  42. package/dist/providers/mock.d.ts.map +1 -1
  43. package/dist/providers/mock.js +8 -3
  44. package/dist/providers/mock.js.map +1 -1
  45. package/dist/providers/openai.d.ts +51 -7
  46. package/dist/providers/openai.d.ts.map +1 -1
  47. package/dist/providers/openai.js +128 -30
  48. package/dist/providers/openai.js.map +1 -1
  49. package/dist/providers/options.d.ts +162 -0
  50. package/dist/providers/options.d.ts.map +1 -0
  51. package/dist/providers/options.js +67 -0
  52. package/dist/providers/options.js.map +1 -0
  53. package/dist/providers/scripted.d.ts +49 -0
  54. package/dist/providers/scripted.d.ts.map +1 -0
  55. package/dist/providers/scripted.js +90 -0
  56. package/dist/providers/scripted.js.map +1 -0
  57. package/dist/providers/types.d.ts +34 -0
  58. package/dist/providers/types.d.ts.map +1 -1
  59. package/dist/tools/metadata.d.ts +24 -0
  60. package/dist/tools/metadata.d.ts.map +1 -1
  61. package/dist/tools/metadata.js +8 -0
  62. package/dist/tools/metadata.js.map +1 -1
  63. package/dist/tools/registry.d.ts +10 -3
  64. package/dist/tools/registry.d.ts.map +1 -1
  65. package/dist/tools/registry.js +9 -4
  66. package/dist/tools/registry.js.map +1 -1
  67. package/dist/tools/terminal.d.ts +33 -0
  68. package/dist/tools/terminal.d.ts.map +1 -0
  69. package/dist/tools/terminal.js +32 -0
  70. package/dist/tools/terminal.js.map +1 -0
  71. package/package.json +5 -4
package/README.md CHANGED
@@ -46,9 +46,9 @@ ESM-only, Node >= 22.
46
46
  | Area | Exports |
47
47
  |------|---------|
48
48
  | **Model seam** | `ModelInvocation` — one arrow for every model kind, with declared capabilities, a uniform result envelope and `probe()` |
49
- | **Providers** | `Provider` interface + `selectProvider()` over Anthropic, OpenAI, OpenRouter, a self-hosted `local` (any OpenAI-compatible server), and an offline `mock`; `chatModel()` puts any of them on the seam |
50
- | **Agent loop** | `runAgent()` — a provider-neutral tool-use loop with step and wall-clock budgets, cancellable through an `AbortSignal` |
51
- | **Loop** | `Loop` + `nativeLoop` — the control loop as a seam; the kernel ships one and it is the loop `runAgent` has always run |
49
+ | **Providers** | `Provider` interface + `selectProvider()` over Anthropic, OpenAI, OpenRouter, a self-hosted `local` (any OpenAI-compatible server), an offline `mock` (by request) and a `ScriptedProvider` for recorded evals; `chatModel()` puts any of them on the seam; typed per-call `ProviderOptions` (prompt caching, token cap, response format, OpenRouter routing) |
50
+ | **Agent loop** | `runConversation()` — a provider-neutral tool-use loop over a seeded conversation, with step and wall-clock budgets, terminal (final-answer) tools, summed usage and the served model in the result; `runAgent()` is its one-prompt form |
51
+ | **Loop** | `Loop` + `nativeLoop` — the control loop as a seam; the kernel ships one and it is the loop `runAgent` and `runConversation` have always run |
52
52
  | **Run events** | `RunEvent` — an ordered, structured account of a run (turns, tool calls, budgets, outcome), emitted to an optional sink |
53
53
  | **Tools** | `Tool` (+ `ToolContext`), `primitiveTools()` (`run_code`, `read_file`, `list_files`, `http_fetch`), `connectorTools()`, `modelAsTool()`, metadata + projections (`replaySafeTools`, …) |
54
54
  | **Connectors** | `connectMcp()` — MCP clients over stdio / streamable HTTP / SSE |
@@ -297,9 +297,145 @@ const text = await runAgent({
297
297
  })
298
298
  ```
299
299
 
300
- With no provider API key configured, `selectProvider` falls back to the offline
301
- `mock` provider — so the whole loop runs end to end with no keys and no network.
302
- That is deliberate: the test suite depends on it, and so can yours.
300
+ **`selectProvider` fails loud.** A preferred provider with no credential, or no
301
+ preference and no credential at all, throws a `ProviderCredentialsError` naming
302
+ the env var and the BYO slot that would have satisfied it; it never falls
303
+ through to another configured provider, and a name it does not know (a typo, a
304
+ provider with no adapter) is refused the same way rather than read as "no
305
+ preference". `providerAvailability()` gives the same
306
+ answer as a reason instead of a throw, and `NativeEngine.supports()` uses it, so
307
+ a run with no key is refused before a sandbox is prepared. The offline `mock`
308
+ is reached only by request (`selectProvider("mock")`) or by explicit opt-in
309
+ (`{ allowMockFallback: true }`), which is what a keyless test rig sets. Until
310
+ 0.11 a keyless run landed on the mock silently and reported success; nothing on
311
+ the wire told that run from a real one.
312
+
313
+ ### Conversations and terminal tools
314
+
315
+ `runAgent` is single-shot. A conversational application seeds the loop with its
316
+ stored history and gets the whole transcript back:
317
+
318
+ ```ts
319
+ import { runConversation, terminalTool } from "@rarebit-one/harness-kernel"
320
+
321
+ const reply = terminalTool({
322
+ name: "reply",
323
+ description: "Send the final answer to the user.",
324
+ inputSchema: {
325
+ type: "object",
326
+ properties: { text: { type: "string" }, quick_replies: { type: "array", items: { type: "string" } } },
327
+ required: ["text"],
328
+ },
329
+ })
330
+
331
+ const result = await runConversation({
332
+ provider,
333
+ system,
334
+ messages: [...storedHistory, { role: "user", text: incoming }],
335
+ tools: [...lookupTools, reply],
336
+ providerOptions: { promptCache: {} },
337
+ })
338
+
339
+ result.stopReason // "end_turn" | "terminal_tool" | "steps_exhausted" | "timed_out" | "canceled"
340
+ result.terminal?.input // { text, quick_replies } when the model called `reply`
341
+ result.messages // store this; seed the next turn with it
342
+ result.usage // summed over every model call
343
+ result.provider, result.model // what actually served the run
344
+ ```
345
+
346
+ A tool with `meta.dispatch: "terminal"` is a **final-answer tool**: the loop
347
+ still runs its executor (so it can validate, or send), appends the tool result
348
+ so the transcript carries no dangling call, and then ends the run with
349
+ `stopReason: "terminal_tool"` and the call on `result.terminal`. An executor
350
+ that throws turns the call into an ordinary tool error the model gets to
351
+ correct. `terminalTool()` builds one with a no-op executor; the structured
352
+ answer is the call's `input`, which the kernel does not validate against the
353
+ schema (run your own validator on it, or supply an executor that throws).
354
+
355
+ The seed must end with a user message or with the tool results the model is
356
+ waiting for; the loop copies it and never mutates the array it was handed.
357
+ `result.events` is this call's event stream (the same events reached `emit`),
358
+ recorded for a caller with nowhere else to put them; the kernel still stores
359
+ nothing between calls.
360
+
361
+ `dispatch: "external"` is reserved for a tool the *caller* executes: the loop
362
+ would return the pending call and resume when given its result. The native
363
+ loop refuses it today (a custom `Loop` may honour it); native suspend/resume is
364
+ a later release.
365
+
366
+ ### Provider options and prompt caching
367
+
368
+ `providerOptions` rides on every model call a run makes and each adapter maps it
369
+ onto its own wire format. An option an adapter cannot honour throws a
370
+ `ProviderOptionsError` rather than being dropped.
371
+
372
+ ```ts
373
+ providerOptions: {
374
+ maxTokens: 1024, // per-call completion cap
375
+ promptCache: { ttl: "1h" }, // system + tools + last message cached
376
+ responseFormat: { type: "json_object" }, // OpenAI-compatible adapters only
377
+ openrouter: { // OpenRouter adapter only
378
+ models: ["anthropic/claude-sonnet-4.5", "openai/gpt-4.1"], // fallbacks
379
+ provider: { data_collection: "deny", zdr: true }, // data policy
380
+ usage: { include: true },
381
+ },
382
+ }
383
+ ```
384
+
385
+ `promptCache: {}` means "cache this prompt the usual way". On **Anthropic** that
386
+ is a `cache_control` breakpoint on the system prompt, the last tool definition
387
+ and the last message (`trailingMessages` up to 2, `ttl` `5m` or `1h`). On
388
+ **OpenRouter** the breakpoints go on the system prompt and the trailing
389
+ messages as content parts, which the upstreams that cache (Anthropic, Gemini)
390
+ honour. On **OpenAI** caching is automatic, so only `promptCache.key` does
391
+ anything (it becomes `prompt_cache_key`). The `local` adapter accepts it and
392
+ lets the server's own prefix cache do the work.
393
+
394
+ Every result reports what served it: `ConverseResult.model` is the model id the
395
+ response named (with a fallback list it can differ from the one requested),
396
+ `responseId` is the provider's own id for the response (a generation id on
397
+ OpenRouter), and, behind OpenRouter, `upstream` names who actually processed the
398
+ prompt, which is what a zero-data-retention audit needs. `model.turn` events
399
+ carry `model`, `responseId` and `upstream` too; `ConversationResult.responseIds`
400
+ lists every id in call order and `ConversationResult.upstream` names who served
401
+ the last turn, so a cross-vendor fallback chain can still be audited.
402
+
403
+ The package also exports its own `package.json`
404
+ (`import pkg from "@rarebit-one/harness-kernel/package.json" with { type: "json" }`)
405
+ so a service can report the kernel version it runs.
406
+
407
+ Usage carries what the provider prices: beside the token counts, `TokenUsage`
408
+ has `cacheWriteTokens`, `reasoningTokens` and `reportedCost`
409
+ (`{ amount, currency: "USD" }`, from OpenRouter's `usage.cost`) when the
410
+ response reports them, on every `model.turn` event and summed by amount on the
411
+ result, so a per-turn cost cap can abort the run through its `signal`. Absent
412
+ means unknown, never free.
413
+
414
+ Two more per-call knobs: `maxRetries` overrides the SDK retry count for one
415
+ call (set `0` alongside an OpenRouter `models` chain, or the SDK and the router
416
+ both retry), and the `openai` adapter sends the cap as `max_completion_tokens`
417
+ (its current field; reasoning models reject `max_tokens`) while OpenRouter and
418
+ local servers get `max_tokens`. `connectorTools(..., { toolName })` names MCP
419
+ tools your way when the default `<connector>__<tool>` prefix is in the way.
420
+
421
+ ### Recorded evals with `ScriptedProvider`
422
+
423
+ ```ts
424
+ import { ScriptedProvider } from "@rarebit-one/harness-kernel"
425
+
426
+ const provider = new ScriptedProvider([
427
+ { text: "", toolCalls: [{ id: "c1", name: "lookup", input: { q: "balance" } }] },
428
+ (req) => ({ text: "", toolCalls: [{ id: "r1", name: "reply", input: { text: "S$120" } }] }),
429
+ ])
430
+ const result = await runConversation({ provider, system, messages, tools })
431
+ provider.requests // every request the loop built, for assertions
432
+ provider.remaining // 0 when the whole script was consumed; a longer loop throws
433
+ ```
434
+
435
+ It plays a recorded script of model turns in order, records each request it was
436
+ given, honours `signal`, and throws `ScriptExhaustedError` rather than invent a
437
+ turn, so an eval that drifts from its recording fails instead of passing
438
+ quietly.
303
439
 
304
440
  **Self-hosted (`local`).** `selectProvider("local")` runs against any
305
441
  OpenAI-compatible server — llama-server, vLLM, LM Studio, Ollama's OpenAI
package/dist/agent.d.ts CHANGED
@@ -1,9 +1,12 @@
1
- import { type RunEventSink } from "./events.js";
2
- import { type LoopContext, type LoopRequest, type LoopResult } from "./loop.js";
1
+ import { type RunEvent, type RunEventSink, type RunOutcome, type StopReason } from "./events.js";
2
+ import { type LoopContext, type LoopRequest, type LoopResult, type TerminalCall } from "./loop.js";
3
3
  import { type ChatModel } from "./models/chat.js";
4
- import type { Provider } from "./providers/types.js";
4
+ import type { TokenUsage } from "./models/types.js";
5
+ import type { ProviderOptions } from "./providers/options.js";
6
+ import type { AgentMessage, Provider } from "./providers/types.js";
5
7
  import { type Tool } from "./tools/registry.js";
6
- export interface RunAgentOptions {
8
+ /** What {@link runAgent} and {@link runConversation} share. */
9
+ export interface LoopRunOptions {
7
10
  /**
8
11
  * The chat model driving the loop. A bare {@link Provider} is accepted and
9
12
  * adapted onto the model seam internally, so existing callers are unaffected;
@@ -12,8 +15,13 @@ export interface RunAgentOptions {
12
15
  */
13
16
  provider: Provider | ChatModel;
14
17
  system: string;
15
- userPrompt: string;
16
18
  tools: Tool[];
19
+ /**
20
+ * Per-call provider options — token cap, prompt caching, response format,
21
+ * OpenRouter routing — sent on every model call the run makes. See
22
+ * `providers/options.ts`.
23
+ */
24
+ providerOptions?: ProviderOptions;
17
25
  maxSteps?: number;
18
26
  /**
19
27
  * Wall-clock budget for the whole loop in ms. Enforced both between steps and
@@ -39,13 +47,62 @@ export interface RunAgentOptions {
39
47
  */
40
48
  emit?: RunEventSink;
41
49
  }
50
+ /** A single-shot run: one user prompt in, the final prose out. */
51
+ export interface RunAgentOptions extends LoopRunOptions {
52
+ userPrompt: string;
53
+ }
54
+ /** A conversational run: the history so far in, the whole transcript out. */
55
+ export interface RunConversationOptions extends LoopRunOptions {
56
+ /**
57
+ * The conversation so far, oldest first, ending with the new user message
58
+ * (or with the tool results the model is waiting for). The array is not
59
+ * mutated; the result carries a new one.
60
+ */
61
+ messages: AgentMessage[];
62
+ }
63
+ /**
64
+ * What {@link runConversation} returns: everything a conversational caller
65
+ * needs to store the turn, bill it, and answer with it.
66
+ */
67
+ export interface ConversationResult {
68
+ /** The final assistant prose. Empty when a terminal tool answered without prose. */
69
+ text: string;
70
+ /** The seed followed by every message the loop appended. Store this; seed the next turn with it. */
71
+ messages: AgentMessage[];
72
+ /**
73
+ * This run's full event stream, in order. The same events reached `emit` as
74
+ * they happened; this is a per-call recording for a caller with nowhere else
75
+ * to put them, not a store — nothing is kept between calls.
76
+ */
77
+ events: RunEvent[];
78
+ /** Token usage summed over every model call that reported it; absent if none did. */
79
+ usage?: TokenUsage;
80
+ steps: number;
81
+ outcome: RunOutcome;
82
+ stopReason: StopReason;
83
+ /** The terminal-tool call that ended the run, when one did. Its `input` is the structured answer. */
84
+ terminal?: TerminalCall;
85
+ /** Which adapter served the run (`"anthropic"`, `"openrouter"`, `"mock"`, a custom model's id). */
86
+ provider: string;
87
+ /** The model id the last response named, else the adapter's configured model. */
88
+ model?: string;
89
+ /** Every response id the provider reported, in call order. */
90
+ responseIds: string[];
91
+ /**
92
+ * Behind an aggregator, who actually served the last response (OpenRouter's
93
+ * response-level `provider`, e.g. "Anthropic"). This is what a data-policy
94
+ * audit reads: `provider` names the adapter, `upstream` names the vendor the
95
+ * prompt reached. Absent for direct adapters.
96
+ */
97
+ upstream?: string;
98
+ }
42
99
  /**
43
100
  * Resolve a partial budget to the concrete numbers a {@link LoopRequest} needs.
44
101
  *
45
102
  * One place, deliberately. A {@link Loop} is handed numbers rather than
46
103
  * optionals, so if each caller resolved its own defaults a second loop
47
104
  * implementation could silently run to a different ceiling than the one the
48
- * kernel ships. `runAgent` and `NativeEngine` both come here.
105
+ * kernel ships. `runAgent`, `runConversation` and `NativeEngine` all come here.
49
106
  */
50
107
  export declare function resolveLoopLimits(limits?: {
51
108
  maxSteps?: number | undefined;
@@ -66,15 +123,30 @@ export declare function maxToolResultBytes(): number;
66
123
  * executes any requested tools in the sandbox, feeds the results back, and
67
124
  * repeats until the model stops calling tools (or the step budget is hit). The
68
125
  * model orchestrates; deterministic work happens in the tools.
126
+ *
127
+ * This is the single-shot form: one user prompt in, the final prose out. It is
128
+ * {@link runConversation} with a one-message seed, kept because most callers
129
+ * want exactly that and nothing more.
69
130
  */
70
131
  export declare function runAgent(options: RunAgentOptions): Promise<string>;
132
+ /**
133
+ * Run the tool-use loop over a conversation: the stored history plus the new
134
+ * user turn in, the whole transcript out, with the structured answer when a
135
+ * terminal tool gave one.
136
+ *
137
+ * The kernel stores nothing between calls. A conversational application keeps
138
+ * `result.messages` wherever it keeps its state and seeds the next call with
139
+ * it; what the kernel owes it is a faithful transcript, a summed bill, the
140
+ * reason the run stopped, and the name of what served it.
141
+ */
142
+ export declare function runConversation(options: RunConversationOptions): Promise<ConversationResult>;
71
143
  /**
72
144
  * The native tool-use loop, as a {@link Loop}.
73
145
  *
74
146
  * Exported for `loop.ts` to wrap; applications reach it through `nativeLoop`
75
147
  * rather than calling this directly. It is the whole of the kernel's control
76
- * flow, and the only place any of it lives — `runAgent` and `nativeLoop` both
77
- * come here, so the two cannot drift.
148
+ * flow, and the only place any of it lives — `runAgent`, `runConversation` and
149
+ * `nativeLoop` all come here, so they cannot drift.
78
150
  */
79
151
  export declare function runNativeLoop(req: LoopRequest, loopCtx: LoopContext): Promise<LoopResult>;
80
152
  //# sourceMappingURL=agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,aAAa,CAAA;AACpB,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAG9D,OAAO,KAAK,EAAgB,QAAQ,EAAc,MAAM,sBAAsB,CAAA;AAC9E,OAAO,EAAe,KAAK,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAG5D,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAYD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACnC,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAK9C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAqDD;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBxE;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAgP/F"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}