@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.
- package/README.md +142 -6
- package/dist/agent.d.ts +80 -8
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +225 -25
- package/dist/agent.js.map +1 -1
- package/dist/engines/native.d.ts +5 -0
- package/dist/engines/native.d.ts.map +1 -1
- package/dist/engines/native.js +28 -10
- package/dist/engines/native.js.map +1 -1
- package/dist/engines/types.d.ts +19 -0
- package/dist/engines/types.d.ts.map +1 -1
- package/dist/events.d.ts +20 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +17 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/loop.d.ts +58 -11
- package/dist/loop.d.ts.map +1 -1
- package/dist/loop.js +7 -5
- package/dist/loop.js.map +1 -1
- package/dist/models/chat.d.ts +2 -1
- package/dist/models/chat.d.ts.map +1 -1
- package/dist/models/chat.js +20 -4
- package/dist/models/chat.js.map +1 -1
- package/dist/models/types.d.ts +16 -0
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js.map +1 -1
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +21 -0
- package/dist/private.js.map +1 -1
- package/dist/providers/anthropic.d.ts +27 -3
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +95 -29
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/index.d.ts +42 -6
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +132 -48
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/mock.d.ts +6 -3
- package/dist/providers/mock.d.ts.map +1 -1
- package/dist/providers/mock.js +8 -3
- package/dist/providers/mock.js.map +1 -1
- package/dist/providers/openai.d.ts +51 -7
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +128 -30
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/options.d.ts +162 -0
- package/dist/providers/options.d.ts.map +1 -0
- package/dist/providers/options.js +67 -0
- package/dist/providers/options.js.map +1 -0
- package/dist/providers/scripted.d.ts +49 -0
- package/dist/providers/scripted.d.ts.map +1 -0
- package/dist/providers/scripted.js +90 -0
- package/dist/providers/scripted.js.map +1 -0
- package/dist/providers/types.d.ts +34 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/tools/metadata.d.ts +24 -0
- package/dist/tools/metadata.d.ts.map +1 -1
- package/dist/tools/metadata.js +8 -0
- package/dist/tools/metadata.js.map +1 -1
- package/dist/tools/registry.d.ts +10 -3
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +9 -4
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/terminal.d.ts +33 -0
- package/dist/tools/terminal.d.ts.map +1 -0
- package/dist/tools/terminal.js +32 -0
- package/dist/tools/terminal.js.map +1 -0
- 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),
|
|
50
|
-
| **Agent loop** | `
|
|
51
|
-
| **Loop** | `Loop` + `nativeLoop` — the control loop as a seam; the kernel ships one and it is the loop `runAgent`
|
|
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
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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 {
|
|
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
|
-
|
|
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`
|
|
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
|
|
77
|
-
* come here, so
|
|
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
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|